Replace size/weight estimate tuple with struct for named fields

This commit is contained in:
Gregory Sanders 2021-05-24 18:58:49 +08:00
parent 3ad1b8899b
commit 881a3e2e17
3 changed files with 17 additions and 13 deletions

View File

@ -190,7 +190,7 @@ Result CreateRateBumpTransaction(CWallet& wallet, const uint256& txid, const CCo
if (coin_control.m_feerate) { if (coin_control.m_feerate) {
// The user provided a feeRate argument. // The user provided a feeRate argument.
// We calculate this here to avoid compiler warning on the cs_wallet lock // We calculate this here to avoid compiler warning on the cs_wallet lock
const int64_t maxTxSize = CalculateMaximumSignedTxSize(*wtx.tx, &wallet).first; const int64_t maxTxSize{CalculateMaximumSignedTxSize(*wtx.tx, &wallet).vsize};
Result res = CheckFeeRate(wallet, wtx, *new_coin_control.m_feerate, maxTxSize, errors); Result res = CheckFeeRate(wallet, wtx, *new_coin_control.m_feerate, maxTxSize, errors);
if (res != Result::OK) { if (res != Result::OK) {
return res; return res;

View File

@ -1627,15 +1627,14 @@ bool CWallet::ImportScriptPubKeys(const std::string& label, const std::set<CScri
return true; return true;
} }
// Returns pair of vsize and weight TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, bool use_max_sig)
std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, bool use_max_sig)
{ {
std::vector<CTxOut> txouts; std::vector<CTxOut> txouts;
for (const CTxIn& input : tx.vin) { for (const CTxIn& input : tx.vin) {
const auto mi = wallet->mapWallet.find(input.prevout.hash); const auto mi = wallet->mapWallet.find(input.prevout.hash);
// Can not estimate size without knowing the input details // Can not estimate size without knowing the input details
if (mi == wallet->mapWallet.end()) { if (mi == wallet->mapWallet.end()) {
return std::make_pair(-1, -1); return TxSize{-1, -1};
} }
assert(input.prevout.n < mi->second.tx->vout.size()); assert(input.prevout.n < mi->second.tx->vout.size());
txouts.emplace_back(mi->second.tx->vout[input.prevout.n]); txouts.emplace_back(mi->second.tx->vout[input.prevout.n]);
@ -1644,16 +1643,16 @@ std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx,
} }
// txouts needs to be in the order of tx.vin // txouts needs to be in the order of tx.vin
std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector<CTxOut>& txouts, bool use_max_sig) TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector<CTxOut>& txouts, bool use_max_sig)
{ {
CMutableTransaction txNew(tx); CMutableTransaction txNew(tx);
if (!wallet->DummySignTx(txNew, txouts, use_max_sig)) { if (!wallet->DummySignTx(txNew, txouts, use_max_sig)) {
return std::make_pair(-1, -1); return TxSize{-1, -1};
} }
CTransaction ctx(txNew); CTransaction ctx(txNew);
int64_t vsize = GetVirtualTransactionSize(ctx); int64_t vsize = GetVirtualTransactionSize(ctx);
int64_t weight = GetTransactionWeight(ctx); int64_t weight = GetTransactionWeight(ctx);
return std::make_pair(vsize, weight); return TxSize{vsize, weight};
} }
int CalculateMaximumSignedInputSize(const CTxOut& txout, const CWallet* wallet, bool use_max_sig) int CalculateMaximumSignedInputSize(const CTxOut& txout, const CWallet* wallet, bool use_max_sig)
@ -2820,7 +2819,7 @@ bool CWallet::CreateTransactionInternal(
CMutableTransaction txNew; CMutableTransaction txNew;
FeeCalculation feeCalc; FeeCalculation feeCalc;
std::pair<int64_t, int64_t> tx_sizes; TxSize tx_sizes;
int nBytes; int nBytes;
{ {
std::set<CInputCoin> setCoins; std::set<CInputCoin> setCoins;
@ -2967,7 +2966,7 @@ bool CWallet::CreateTransactionInternal(
// Calculate the transaction fee // Calculate the transaction fee
tx_sizes = CalculateMaximumSignedTxSize(CTransaction(txNew), this, coin_control.fAllowWatchOnly); tx_sizes = CalculateMaximumSignedTxSize(CTransaction(txNew), this, coin_control.fAllowWatchOnly);
nBytes = tx_sizes.first; nBytes = tx_sizes.vsize;
if (nBytes < 0) { if (nBytes < 0) {
error = _("Signing transaction failed"); error = _("Signing transaction failed");
return false; return false;
@ -2992,7 +2991,7 @@ bool CWallet::CreateTransactionInternal(
// Because we have dropped this change, the tx size and required fee will be different, so let's recalculate those // Because we have dropped this change, the tx size and required fee will be different, so let's recalculate those
tx_sizes = CalculateMaximumSignedTxSize(CTransaction(txNew), this, coin_control.fAllowWatchOnly); tx_sizes = CalculateMaximumSignedTxSize(CTransaction(txNew), this, coin_control.fAllowWatchOnly);
nBytes = tx_sizes.first; nBytes = tx_sizes.vsize;
fee_needed = coin_selection_params.m_effective_feerate.GetFee(nBytes); fee_needed = coin_selection_params.m_effective_feerate.GetFee(nBytes);
} }
@ -3072,7 +3071,7 @@ bool CWallet::CreateTransactionInternal(
// Limit size // Limit size
if ((sign && GetTransactionWeight(*tx) > MAX_STANDARD_TX_WEIGHT) || if ((sign && GetTransactionWeight(*tx) > MAX_STANDARD_TX_WEIGHT) ||
(!sign && tx_sizes.second > MAX_STANDARD_TX_WEIGHT)) (!sign && tx_sizes.weight > MAX_STANDARD_TX_WEIGHT))
{ {
error = _("Transaction too large"); error = _("Transaction too large");
return false; return false;

View File

@ -1346,12 +1346,17 @@ public:
} }
}; };
struct TxSize {
int64_t vsize{-1};
int64_t weight{-1};
};
/** Calculate the size of the transaction assuming all signatures are max size /** Calculate the size of the transaction assuming all signatures are max size
* Use DummySignatureCreator, which inserts 71 byte signatures everywhere. * Use DummySignatureCreator, which inserts 71 byte signatures everywhere.
* NOTE: this requires that all inputs must be in mapWallet (eg the tx should * NOTE: this requires that all inputs must be in mapWallet (eg the tx should
* be IsAllFromMe). */ * be IsAllFromMe). */
std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, bool use_max_sig = false) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet); TxSize CalculateMaximumSignedTxSize(const CTransaction& tx, const CWallet* wallet, bool use_max_sig = false) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet);
std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector<CTxOut>& txouts, bool use_max_sig = false); TxSize CalculateMaximumSignedTxSize(const CTransaction& tx, const CWallet* wallet, const std::vector<CTxOut>& txouts, bool use_max_sig = false);
//! Add wallet name to persistent configuration so it will be loaded on startup. //! Add wallet name to persistent configuration so it will be loaded on startup.
bool AddWalletSetting(interfaces::Chain& chain, const std::string& wallet_name); bool AddWalletSetting(interfaces::Chain& chain, const std::string& wallet_name);