1
1
#!/usr/bin/env python3
2
- # Copyright (c) 2015-2018 The Bitcoin Core developers
2
+ # Copyright (c) 2015-2019 The Bitcoin Core developers
3
3
# Distributed under the MIT software license, see the accompanying
4
4
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
- """Test transaction signing using the signrawtransaction* RPCs. """
5
+ """Test multisig RPCs"""
6
6
7
7
from test_framework .test_framework import BitcoinTestFramework
8
+ from test_framework .util import (
9
+ assert_raises_rpc_error ,
10
+ )
8
11
import decimal
9
12
13
+
10
14
class RpcCreateMultiSigTest (BitcoinTestFramework ):
11
15
def set_test_params (self ):
12
16
self .setup_clean_chain = True
@@ -17,29 +21,40 @@ def skip_test_if_missing_module(self):
17
21
18
22
def get_keys (self ):
19
23
node0 , node1 , node2 = self .nodes
20
- self . add = [node1 .getnewaddress () for _ in range (self .nkeys )]
21
- self .pub = [node1 .getaddressinfo (a )["pubkey" ] for a in self . add ]
22
- self .priv = [node1 .dumpprivkey (a ) for a in self . add ]
24
+ add = [node1 .getnewaddress () for _ in range (self .nkeys )]
25
+ self .pub = [node1 .getaddressinfo (a )["pubkey" ] for a in add ]
26
+ self .priv = [node1 .dumpprivkey (a ) for a in add ]
23
27
self .final = node2 .getnewaddress ()
24
28
25
29
def run_test (self ):
26
- node0 ,node1 ,node2 = self .nodes
30
+ node0 , node1 , node2 = self .nodes
27
31
28
- # 50 BTC each, rest will be 25 BTC each
32
+ self .check_addmultisigaddress_errors ()
33
+
34
+ self .log .info ('Generating blocks ...' )
29
35
node0 .generate (149 )
30
36
self .sync_all ()
31
37
32
38
self .moved = 0
33
- for self .nkeys in [3 ,5 ]:
34
- for self .nsigs in [2 ,3 ]:
39
+ for self .nkeys in [3 , 5 ]:
40
+ for self .nsigs in [2 , 3 ]:
35
41
for self .output_type in ["bech32" , "p2sh-segwit" , "legacy" ]:
36
42
self .get_keys ()
37
43
self .do_multisig ()
38
44
39
45
self .checkbalances ()
40
46
47
+ def check_addmultisigaddress_errors (self ):
48
+ self .log .info ('Check that addmultisigaddress fails when the private keys are missing' )
49
+ addresses = [self .nodes [1 ].getnewaddress (address_type = 'legacy' ) for _ in range (2 )]
50
+ assert_raises_rpc_error (- 5 , 'no full public key for address' , lambda : self .nodes [0 ].addmultisigaddress (nrequired = 1 , keys = addresses ))
51
+ for a in addresses :
52
+ # Importing all addresses should not change the result
53
+ self .nodes [0 ].importaddress (a )
54
+ assert_raises_rpc_error (- 5 , 'no full public key for address' , lambda : self .nodes [0 ].addmultisigaddress (nrequired = 1 , keys = addresses ))
55
+
41
56
def checkbalances (self ):
42
- node0 ,node1 ,node2 = self .nodes
57
+ node0 , node1 , node2 = self .nodes
43
58
node0 .generate (100 )
44
59
self .sync_all ()
45
60
@@ -49,13 +64,13 @@ def checkbalances(self):
49
64
50
65
height = node0 .getblockchaininfo ()["blocks" ]
51
66
assert 150 < height < 350
52
- total = 149 * 50 + (height - 149 - 100 )* 25
67
+ total = 149 * 50 + (height - 149 - 100 ) * 25
53
68
assert bal1 == 0
54
69
assert bal2 == self .moved
55
- assert bal0 + bal1 + bal2 == total
70
+ assert bal0 + bal1 + bal2 == total
56
71
57
72
def do_multisig (self ):
58
- node0 ,node1 ,node2 = self .nodes
73
+ node0 , node1 , node2 = self .nodes
59
74
60
75
msig = node2 .createmultisig (self .nsigs , self .pub , self .output_type )
61
76
madd = msig ["address" ]
@@ -74,7 +89,7 @@ def do_multisig(self):
74
89
txid = node0 .sendtoaddress (madd , 40 )
75
90
76
91
tx = node0 .getrawtransaction (txid , True )
77
- vout = [v ["n" ] for v in tx ["vout" ] if madd in v ["scriptPubKey" ].get ("addresses" ,[])]
92
+ vout = [v ["n" ] for v in tx ["vout" ] if madd in v ["scriptPubKey" ].get ("addresses" , [])]
78
93
assert len (vout ) == 1
79
94
vout = vout [0 ]
80
95
scriptPubKey = tx ["vout" ][vout ]["scriptPubKey" ]["hex" ]
@@ -86,7 +101,7 @@ def do_multisig(self):
86
101
outval = value - decimal .Decimal ("0.00001000" )
87
102
rawtx = node2 .createrawtransaction ([{"txid" : txid , "vout" : vout }], [{self .final : outval }])
88
103
89
- rawtx2 = node2 .signrawtransactionwithkey (rawtx , self .priv [0 :self .nsigs - 1 ], prevtxs )
104
+ rawtx2 = node2 .signrawtransactionwithkey (rawtx , self .priv [0 :self .nsigs - 1 ], prevtxs )
90
105
rawtx3 = node2 .signrawtransactionwithkey (rawtx2 ["hex" ], [self .priv [- 1 ]], prevtxs )
91
106
92
107
self .moved += outval
@@ -97,5 +112,6 @@ def do_multisig(self):
97
112
txinfo = node0 .getrawtransaction (tx , True , blk )
98
113
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" ]))
99
114
115
+
100
116
if __name__ == '__main__' :
101
117
RpcCreateMultiSigTest ().main ()
0 commit comments