diff options
Diffstat (limited to 'src/wallet/wallet.cpp')
-rw-r--r-- | src/wallet/wallet.cpp | 90 |
1 files changed, 0 insertions, 90 deletions
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index e77dd676e0..6f5248efaf 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -1703,96 +1703,6 @@ void CWallet::InitWalletFlags(uint64_t flags) if (!LoadWalletFlags(flags)) assert(false); } -// Helper for producing a max-sized low-S low-R signature (eg 71 bytes) -// or a max-sized low-S signature (e.g. 72 bytes) depending on coin_control -bool DummySignInput(const SigningProvider& provider, CTxIn &tx_in, const CTxOut &txout, bool can_grind_r, const CCoinControl* coin_control) -{ - // Fill in dummy signatures for fee calculation. - const CScript& scriptPubKey = txout.scriptPubKey; - SignatureData sigdata; - - // Use max sig if watch only inputs were used, if this particular input is an external input, - // or if this wallet uses an external signer, to ensure a sufficient fee is attained for the requested feerate. - const bool use_max_sig = coin_control && (coin_control->fAllowWatchOnly || coin_control->IsExternalSelected(tx_in.prevout) || !can_grind_r); - if (!ProduceSignature(provider, use_max_sig ? DUMMY_MAXIMUM_SIGNATURE_CREATOR : DUMMY_SIGNATURE_CREATOR, scriptPubKey, sigdata)) { - return false; - } - UpdateInput(tx_in, sigdata); - return true; -} - -bool FillInputToWeight(CTxIn& txin, int64_t target_weight) -{ - assert(txin.scriptSig.empty()); - assert(txin.scriptWitness.IsNull()); - - int64_t txin_weight = GetTransactionInputWeight(txin); - - // Do nothing if the weight that should be added is less than the weight that already exists - if (target_weight < txin_weight) { - return false; - } - if (target_weight == txin_weight) { - return true; - } - - // Subtract current txin weight, which should include empty witness stack - int64_t add_weight = target_weight - txin_weight; - assert(add_weight > 0); - - // We will want to subtract the size of the Compact Size UInt that will also be serialized. - // However doing so when the size is near a boundary can result in a problem where it is not - // possible to have a stack element size and combination to exactly equal a target. - // To avoid this possibility, if the weight to add is less than 10 bytes greater than - // a boundary, the size will be split so that 2/3rds will be in one stack element, and - // the remaining 1/3rd in another. Using 3rds allows us to avoid additional boundaries. - // 10 bytes is used because that accounts for the maximum size. This does not need to be super precise. - if ((add_weight >= 253 && add_weight < 263) - || (add_weight > std::numeric_limits<uint16_t>::max() && add_weight <= std::numeric_limits<uint16_t>::max() + 10) - || (add_weight > std::numeric_limits<uint32_t>::max() && add_weight <= std::numeric_limits<uint32_t>::max() + 10)) { - int64_t first_weight = add_weight / 3; - add_weight -= first_weight; - - first_weight -= GetSizeOfCompactSize(first_weight); - txin.scriptWitness.stack.emplace(txin.scriptWitness.stack.end(), first_weight, 0); - } - - add_weight -= GetSizeOfCompactSize(add_weight); - txin.scriptWitness.stack.emplace(txin.scriptWitness.stack.end(), add_weight, 0); - assert(GetTransactionInputWeight(txin) == target_weight); - - return true; -} - -// Helper for producing a bunch of max-sized low-S low-R signatures (eg 71 bytes) -bool CWallet::DummySignTx(CMutableTransaction &txNew, const std::vector<CTxOut> &txouts, const CCoinControl* coin_control) const -{ - // Fill in dummy signatures for fee calculation. - int nIn = 0; - const bool can_grind_r = CanGrindR(); - for (const auto& txout : txouts) - { - CTxIn& txin = txNew.vin[nIn]; - // If weight was provided, fill the input to that weight - if (coin_control && coin_control->HasInputWeight(txin.prevout)) { - if (!FillInputToWeight(txin, coin_control->GetInputWeight(txin.prevout))) { - return false; - } - nIn++; - continue; - } - const std::unique_ptr<SigningProvider> provider = GetSolvingProvider(txout.scriptPubKey); - if (!provider || !DummySignInput(*provider, txin, txout, can_grind_r, coin_control)) { - if (!coin_control || !DummySignInput(coin_control->m_external_provider, txin, txout, can_grind_r, coin_control)) { - return false; - } - } - - nIn++; - } - return true; -} - bool CWallet::ImportScripts(const std::set<CScript> scripts, int64_t timestamp) { auto spk_man = GetLegacyScriptPubKeyMan(); |