Skip to content

Commit 0bd1860

Browse files
committed
Avoid dumpprivkey and watchonly behavior in rpc_signrawtransaction.py
dumpprivkey and watchonly behavior don't work with descriptor wallets. Test for multisigs is modified to not rely on watchonly behavior for those multisigs. This has a side effect of removing listunspent, but that's not the target of this test, so that's fine.
1 parent 08067ae commit 0bd1860

File tree

1 file changed

+21
-13
lines changed

1 file changed

+21
-13
lines changed

test/functional/rpc_signrawtransaction.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
"""Test transaction signing using the signrawtransaction* RPCs."""
66

77
from test_framework.address import check_script, script_to_p2sh
8+
from test_framework.key import ECKey
89
from test_framework.test_framework import BitcoinTestFramework
910
from test_framework.util import assert_equal, assert_raises_rpc_error, find_vout_for_address, hex_str_to_bytes
1011
from test_framework.messages import sha256
1112
from test_framework.script import CScript, OP_0, OP_CHECKSIG
13+
from test_framework.script_util import key_to_p2pkh_script, script_to_p2sh_p2wsh_script, script_to_p2wsh_script
14+
from test_framework.wallet_util import bytes_to_wif
1215

1316
from decimal import Decimal
1417

@@ -151,21 +154,24 @@ def script_verification_error_test(self):
151154
def witness_script_test(self):
152155
self.log.info("Test signing transaction to P2SH-P2WSH addresses without wallet")
153156
# Create a new P2SH-P2WSH 1-of-1 multisig address:
154-
embedded_address = self.nodes[1].getaddressinfo(self.nodes[1].getnewaddress())
155-
embedded_privkey = self.nodes[1].dumpprivkey(embedded_address["address"])
156-
p2sh_p2wsh_address = self.nodes[1].addmultisigaddress(1, [embedded_address["pubkey"]], "", "p2sh-segwit")
157+
eckey = ECKey()
158+
eckey.generate()
159+
embedded_privkey = bytes_to_wif(eckey.get_bytes())
160+
embedded_pubkey = eckey.get_pubkey().get_bytes().hex()
161+
p2sh_p2wsh_address = self.nodes[1].createmultisig(1, [embedded_pubkey], "p2sh-segwit")
157162
# send transaction to P2SH-P2WSH 1-of-1 multisig address
158163
self.nodes[0].generate(101)
159164
self.nodes[0].sendtoaddress(p2sh_p2wsh_address["address"], 49.999)
160165
self.nodes[0].generate(1)
161166
self.sync_all()
162-
# Find the UTXO for the transaction node[1] should have received, check witnessScript matches
163-
unspent_output = self.nodes[1].listunspent(0, 999999, [p2sh_p2wsh_address["address"]])[0]
164-
assert_equal(unspent_output["witnessScript"], p2sh_p2wsh_address["redeemScript"])
165-
p2sh_redeemScript = CScript([OP_0, sha256(hex_str_to_bytes(p2sh_p2wsh_address["redeemScript"]))])
166-
assert_equal(unspent_output["redeemScript"], p2sh_redeemScript.hex())
167+
# Get the UTXO info from scantxoutset
168+
unspent_output = self.nodes[1].scantxoutset('start', [p2sh_p2wsh_address['descriptor']])['unspents'][0]
169+
spk = script_to_p2sh_p2wsh_script(p2sh_p2wsh_address['redeemScript']).hex()
170+
unspent_output['witnessScript'] = p2sh_p2wsh_address['redeemScript']
171+
unspent_output['redeemScript'] = script_to_p2wsh_script(unspent_output['witnessScript']).hex()
172+
assert_equal(spk, unspent_output['scriptPubKey'])
167173
# Now create and sign a transaction spending that output on node[0], which doesn't know the scripts or keys
168-
spending_tx = self.nodes[0].createrawtransaction([unspent_output], {self.nodes[1].getnewaddress(): Decimal("49.998")})
174+
spending_tx = self.nodes[0].createrawtransaction([unspent_output], {self.nodes[1].get_wallet_rpc(self.default_wallet_name).getnewaddress(): Decimal("49.998")})
169175
spending_tx_signed = self.nodes[0].signrawtransactionwithkey(spending_tx, [embedded_privkey], [unspent_output])
170176
# Check the signing completed successfully
171177
assert 'complete' in spending_tx_signed
@@ -177,11 +183,13 @@ def witness_script_test(self):
177183

178184
def verify_txn_with_witness_script(self, tx_type):
179185
self.log.info("Test with a {} script as the witnessScript".format(tx_type))
180-
embedded_addr_info = self.nodes[1].getaddressinfo(self.nodes[1].getnewaddress('', 'legacy'))
181-
embedded_privkey = self.nodes[1].dumpprivkey(embedded_addr_info['address'])
186+
eckey = ECKey()
187+
eckey.generate()
188+
embedded_privkey = bytes_to_wif(eckey.get_bytes())
189+
embedded_pubkey = eckey.get_pubkey().get_bytes().hex()
182190
witness_script = {
183-
'P2PKH': embedded_addr_info['scriptPubKey'],
184-
'P2PK': CScript([hex_str_to_bytes(embedded_addr_info['pubkey']), OP_CHECKSIG]).hex()
191+
'P2PKH': key_to_p2pkh_script(embedded_pubkey).hex(),
192+
'P2PK': CScript([hex_str_to_bytes(embedded_pubkey), OP_CHECKSIG]).hex()
185193
}.get(tx_type, "Invalid tx_type")
186194
redeem_script = CScript([OP_0, sha256(check_script(witness_script))]).hex()
187195
addr = script_to_p2sh(redeem_script)

0 commit comments

Comments
 (0)