mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-10 22:18:54 +01:00
Merge bitcoin/bitcoin#25590: wallet: Precompute Txdata after setting PSBT inputs' UTXOs
d2ed97656bwallet: Precompute Txdata after setting PSBT inputs' UTXOs (Andrew Chow) Pull request description: If we are given a PSBT that is missing one or more input UTXOs, our PrecomputedTransactionData will be incorrect and missing information that it should otherwise have, and therefore we may not produce a signature when we should. To avoid this problem, we can do the precomputation after we have set the UTXOs the wallet is able to set for the PSBT. Also adds a test for this behavior. ACKs for top commit: instagibbs: reACKd2ed97656bSjors: ACKd2ed97656baureleoules: ACKd2ed97656b. Tree-SHA512: 71beb6c7946096e82cfca83f36277302aa9e69d27b4f6d73d7d8f2f9f0ea1c0d653e846fa6aebee5e4763f56f950b4481240e953f6a2412caa84908d519171e1
This commit is contained in:
@@ -1984,7 +1984,6 @@ TransactionError CWallet::FillPSBT(PartiallySignedTransaction& psbtx, bool& comp
|
|||||||
if (n_signed) {
|
if (n_signed) {
|
||||||
*n_signed = 0;
|
*n_signed = 0;
|
||||||
}
|
}
|
||||||
const PrecomputedTransactionData txdata = PrecomputePSBTData(psbtx);
|
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
// Get all of the previous transactions
|
// Get all of the previous transactions
|
||||||
for (unsigned int i = 0; i < psbtx.tx->vin.size(); ++i) {
|
for (unsigned int i = 0; i < psbtx.tx->vin.size(); ++i) {
|
||||||
@@ -2008,6 +2007,8 @@ TransactionError CWallet::FillPSBT(PartiallySignedTransaction& psbtx, bool& comp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const PrecomputedTransactionData txdata = PrecomputePSBTData(psbtx);
|
||||||
|
|
||||||
// Fill in information from ScriptPubKeyMans
|
// Fill in information from ScriptPubKeyMans
|
||||||
for (ScriptPubKeyMan* spk_man : GetAllScriptPubKeyMans()) {
|
for (ScriptPubKeyMan* spk_man : GetAllScriptPubKeyMans()) {
|
||||||
int n_signed_this_spkm = 0;
|
int n_signed_this_spkm = 0;
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ from test_framework.util import (
|
|||||||
assert_greater_than,
|
assert_greater_than,
|
||||||
assert_raises_rpc_error,
|
assert_raises_rpc_error,
|
||||||
find_output,
|
find_output,
|
||||||
|
find_vout_for_address,
|
||||||
)
|
)
|
||||||
from test_framework.wallet_util import bytes_to_wif
|
from test_framework.wallet_util import bytes_to_wif
|
||||||
|
|
||||||
@@ -764,5 +765,15 @@ class PSBTTest(BitcoinTestFramework):
|
|||||||
psbt = self.nodes[0].walletprocesspsbt(psbt)["psbt"]
|
psbt = self.nodes[0].walletprocesspsbt(psbt)["psbt"]
|
||||||
self.nodes[0].sendrawtransaction(self.nodes[0].finalizepsbt(psbt)["hex"])
|
self.nodes[0].sendrawtransaction(self.nodes[0].finalizepsbt(psbt)["hex"])
|
||||||
|
|
||||||
|
self.log.info("Test that walletprocesspsbt both updates and signs a non-updated psbt containing Taproot inputs")
|
||||||
|
addr = self.nodes[0].getnewaddress("", "bech32m")
|
||||||
|
txid = self.nodes[0].sendtoaddress(addr, 1)
|
||||||
|
vout = find_vout_for_address(self.nodes[0], txid, addr)
|
||||||
|
psbt = self.nodes[0].createpsbt([{"txid": txid, "vout": vout}], [{self.nodes[0].getnewaddress(): 0.9999}])
|
||||||
|
signed = self.nodes[0].walletprocesspsbt(psbt)
|
||||||
|
rawtx = self.nodes[0].finalizepsbt(signed["psbt"])["hex"]
|
||||||
|
self.nodes[0].sendrawtransaction(rawtx)
|
||||||
|
self.generate(self.nodes[0], 1)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
PSBTTest().main()
|
PSBTTest().main()
|
||||||
|
|||||||
Reference in New Issue
Block a user