10
10
11
11
from test_framework .address import address_to_scriptpubkey
12
12
from test_framework .blocktools import COINBASE_MATURITY
13
- from test_framework .authproxy import JSONRPCException
14
13
from test_framework .descriptors import descsum_create , drop_origins
15
14
from test_framework .key import ECPubKey
15
+ from test_framework .messages import COIN
16
16
from test_framework .test_framework import BitcoinTestFramework
17
17
from test_framework .util import (
18
18
assert_raises_rpc_error ,
@@ -34,19 +34,22 @@ def set_test_params(self):
34
34
self .supports_cli = False
35
35
self .enable_wallet_if_possible ()
36
36
37
- def get_keys (self ):
37
+ def create_keys (self , num_keys ):
38
38
self .pub = []
39
39
self .priv = []
40
- node0 , node1 , node2 = self .nodes
41
- for _ in range (self .nkeys ):
40
+ for _ in range (num_keys ):
42
41
privkey , pubkey = generate_keypair (wif = True )
43
42
self .pub .append (pubkey .hex ())
44
43
self .priv .append (privkey )
45
44
if self .is_bdb_compiled ():
46
- self .final = node2 .getnewaddress ()
45
+ self .final = self . nodes [ 2 ] .getnewaddress ()
47
46
else :
48
47
self .final = getnewdestination ('bech32' )[2 ]
49
48
49
+ def create_wallet (self , node , wallet_name ):
50
+ node .createwallet (wallet_name = wallet_name , disable_private_keys = True )
51
+ return node .get_wallet_rpc (wallet_name )
52
+
50
53
def run_test (self ):
51
54
node0 , node1 , node2 = self .nodes
52
55
self .wallet = MiniWallet (test_node = node0 )
@@ -57,12 +60,15 @@ def run_test(self):
57
60
self .log .info ('Generating blocks ...' )
58
61
self .generate (self .wallet , 149 )
59
62
63
+ wallet_multi = self .create_wallet (node1 , 'wmulti' ) if self ._requires_wallet else None
60
64
self .moved = 0
61
- for self .nkeys in [3 , 5 ]:
62
- for self .nsigs in [2 , 3 ]:
63
- for self .output_type in ["bech32" , "p2sh-segwit" , "legacy" ]:
64
- self .get_keys ()
65
- self .do_multisig ()
65
+ self .create_keys (5 )
66
+ for nkeys in [3 , 5 ]:
67
+ for nsigs in [2 , 3 ]:
68
+ for output_type in ["bech32" , "p2sh-segwit" , "legacy" ]:
69
+ self .do_multisig (nkeys , nsigs , output_type , wallet_multi )
70
+ if wallet_multi is not None :
71
+ wallet_multi .unloadwallet ()
66
72
if self .is_bdb_compiled ():
67
73
self .checkbalances ()
68
74
@@ -149,101 +155,85 @@ def checkbalances(self):
149
155
assert bal2 == self .moved
150
156
assert_equal (bal0 + bal1 + bal2 + balw , total )
151
157
152
- def do_multisig (self ):
158
+ def do_multisig (self , nkeys , nsigs , output_type , wallet_multi ):
153
159
node0 , node1 , node2 = self .nodes
154
-
155
- if self .is_bdb_compiled ():
156
- if 'wmulti' not in node1 .listwallets ():
157
- try :
158
- node1 .loadwallet ('wmulti' )
159
- except JSONRPCException as e :
160
- path = self .nodes [1 ].wallets_path / "wmulti"
161
- if e .error ['code' ] == - 18 and "Wallet file verification failed. Failed to load database path '{}'. Path does not exist." .format (path ) in e .error ['message' ]:
162
- node1 .createwallet (wallet_name = 'wmulti' , disable_private_keys = True )
163
- else :
164
- raise
165
- wmulti = node1 .get_wallet_rpc ('wmulti' )
160
+ pub_keys = self .pub [0 : nkeys ]
161
+ priv_keys = self .priv [0 : nkeys ]
166
162
167
163
# Construct the expected descriptor
168
- desc = 'multi({},{})' .format (self . nsigs , ',' .join (self . pub ))
169
- if self . output_type == 'legacy' :
164
+ desc = 'multi({},{})' .format (nsigs , ',' .join (pub_keys ))
165
+ if output_type == 'legacy' :
170
166
desc = 'sh({})' .format (desc )
171
- elif self . output_type == 'p2sh-segwit' :
167
+ elif output_type == 'p2sh-segwit' :
172
168
desc = 'sh(wsh({}))' .format (desc )
173
- elif self . output_type == 'bech32' :
169
+ elif output_type == 'bech32' :
174
170
desc = 'wsh({})' .format (desc )
175
171
desc = descsum_create (desc )
176
172
177
- msig = node2 .createmultisig (self . nsigs , self . pub , self . output_type )
173
+ msig = node2 .createmultisig (nsigs , pub_keys , output_type )
178
174
assert 'warnings' not in msig
179
175
madd = msig ["address" ]
180
176
mredeem = msig ["redeemScript" ]
181
177
assert_equal (desc , msig ['descriptor' ])
182
- if self . output_type == 'bech32' :
178
+ if output_type == 'bech32' :
183
179
assert madd [0 :4 ] == "bcrt" # actually a bech32 address
184
180
185
- if self . is_bdb_compiled () :
181
+ if wallet_multi is not None :
186
182
# compare against addmultisigaddress
187
- msigw = wmulti .addmultisigaddress (self . nsigs , self . pub , None , self . output_type )
183
+ msigw = wallet_multi .addmultisigaddress (nsigs , pub_keys , None , output_type )
188
184
maddw = msigw ["address" ]
189
185
mredeemw = msigw ["redeemScript" ]
190
186
assert_equal (desc , drop_origins (msigw ['descriptor' ]))
191
187
# addmultisigiaddress and createmultisig work the same
192
188
assert maddw == madd
193
189
assert mredeemw == mredeem
194
- wmulti .unloadwallet ()
195
190
196
191
spk = address_to_scriptpubkey (madd )
197
- txid = self .wallet .send_to (from_node = self .nodes [0 ], scriptPubKey = spk , amount = 1300 )["txid" ]
198
- tx = node0 .getrawtransaction (txid , True )
199
- vout = [v ["n" ] for v in tx ["vout" ] if madd == v ["scriptPubKey" ]["address" ]]
200
- assert len (vout ) == 1
201
- vout = vout [0 ]
202
- scriptPubKey = tx ["vout" ][vout ]["scriptPubKey" ]["hex" ]
203
- value = tx ["vout" ][vout ]["value" ]
204
- prevtxs = [{"txid" : txid , "vout" : vout , "scriptPubKey" : scriptPubKey , "redeemScript" : mredeem , "amount" : value }]
192
+ value = decimal .Decimal ("0.00001300" )
193
+ tx = self .wallet .send_to (from_node = self .nodes [0 ], scriptPubKey = spk , amount = int (value * COIN ))
194
+ prevtxs = [{"txid" : tx ["txid" ], "vout" : tx ["sent_vout" ], "scriptPubKey" : spk .hex (), "redeemScript" : mredeem , "amount" : value }]
205
195
206
196
self .generate (node0 , 1 )
207
197
208
198
outval = value - decimal .Decimal ("0.00001000" )
209
- rawtx = node2 .createrawtransaction ([{"txid" : txid , "vout" : vout }], [{self .final : outval }])
199
+ rawtx = node2 .createrawtransaction ([{"txid" : tx [ " txid" ] , "vout" : tx [ "sent_vout" ] }], [{self .final : outval }])
210
200
211
201
prevtx_err = dict (prevtxs [0 ])
212
202
del prevtx_err ["redeemScript" ]
213
203
214
- assert_raises_rpc_error (- 8 , "Missing redeemScript/witnessScript" , node2 .signrawtransactionwithkey , rawtx , self . priv [0 :self . nsigs - 1 ], [prevtx_err ])
204
+ assert_raises_rpc_error (- 8 , "Missing redeemScript/witnessScript" , node2 .signrawtransactionwithkey , rawtx , priv_keys [0 :nsigs - 1 ], [prevtx_err ])
215
205
216
206
# if witnessScript specified, all ok
217
207
prevtx_err ["witnessScript" ] = prevtxs [0 ]["redeemScript" ]
218
- node2 .signrawtransactionwithkey (rawtx , self . priv [0 :self . nsigs - 1 ], [prevtx_err ])
208
+ node2 .signrawtransactionwithkey (rawtx , priv_keys [0 :nsigs - 1 ], [prevtx_err ])
219
209
220
210
# both specified, also ok
221
211
prevtx_err ["redeemScript" ] = prevtxs [0 ]["redeemScript" ]
222
- node2 .signrawtransactionwithkey (rawtx , self . priv [0 :self . nsigs - 1 ], [prevtx_err ])
212
+ node2 .signrawtransactionwithkey (rawtx , priv_keys [0 :nsigs - 1 ], [prevtx_err ])
223
213
224
214
# redeemScript mismatch to witnessScript
225
215
prevtx_err ["redeemScript" ] = "6a" # OP_RETURN
226
- assert_raises_rpc_error (- 8 , "redeemScript does not correspond to witnessScript" , node2 .signrawtransactionwithkey , rawtx , self . priv [0 :self . nsigs - 1 ], [prevtx_err ])
216
+ assert_raises_rpc_error (- 8 , "redeemScript does not correspond to witnessScript" , node2 .signrawtransactionwithkey , rawtx , priv_keys [0 :nsigs - 1 ], [prevtx_err ])
227
217
228
218
# redeemScript does not match scriptPubKey
229
219
del prevtx_err ["witnessScript" ]
230
- assert_raises_rpc_error (- 8 , "redeemScript/witnessScript does not match scriptPubKey" , node2 .signrawtransactionwithkey , rawtx , self . priv [0 :self . nsigs - 1 ], [prevtx_err ])
220
+ assert_raises_rpc_error (- 8 , "redeemScript/witnessScript does not match scriptPubKey" , node2 .signrawtransactionwithkey , rawtx , priv_keys [0 :nsigs - 1 ], [prevtx_err ])
231
221
232
222
# witnessScript does not match scriptPubKey
233
223
prevtx_err ["witnessScript" ] = prevtx_err ["redeemScript" ]
234
224
del prevtx_err ["redeemScript" ]
235
- assert_raises_rpc_error (- 8 , "redeemScript/witnessScript does not match scriptPubKey" , node2 .signrawtransactionwithkey , rawtx , self . priv [0 :self . nsigs - 1 ], [prevtx_err ])
225
+ assert_raises_rpc_error (- 8 , "redeemScript/witnessScript does not match scriptPubKey" , node2 .signrawtransactionwithkey , rawtx , priv_keys [0 :nsigs - 1 ], [prevtx_err ])
236
226
237
- rawtx2 = node2 .signrawtransactionwithkey (rawtx , self . priv [0 :self . nsigs - 1 ], prevtxs )
238
- rawtx3 = node2 .signrawtransactionwithkey (rawtx2 ["hex" ], [self . priv [- 1 ]], prevtxs )
227
+ rawtx2 = node2 .signrawtransactionwithkey (rawtx , priv_keys [0 :nsigs - 1 ], prevtxs )
228
+ rawtx3 = node2 .signrawtransactionwithkey (rawtx2 ["hex" ], [priv_keys [- 1 ]], prevtxs )
239
229
240
230
self .moved += outval
241
231
tx = node0 .sendrawtransaction (rawtx3 ["hex" ], 0 )
242
232
blk = self .generate (node0 , 1 )[0 ]
243
233
assert tx in node0 .getblock (blk )["tx" ]
244
234
245
235
txinfo = node0 .getrawtransaction (tx , True , blk )
246
- self .log .info ("n/m=%d/%d %s size=%d vsize=%d weight=%d" % (self . nsigs , self . nkeys , self . output_type , txinfo ["size" ], txinfo ["vsize" ], txinfo ["weight" ]))
236
+ self .log .info ("n/m=%d/%d %s size=%d vsize=%d weight=%d" % (nsigs , nkeys , output_type , txinfo ["size" ], txinfo ["vsize" ], txinfo ["weight" ]))
247
237
248
238
249
239
if __name__ == '__main__' :
0 commit comments