2 # Copyright (c) 2015-2016 The Bitcoin Core developers
3 # Distributed under the MIT software license, see the accompanying
4 # file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 """Test transaction signing using the signrawtransaction RPC."""
7 from test_framework
.test_framework
import BitcoinTestFramework
8 from test_framework
.util
import *
11 class SignRawTransactionsTest(BitcoinTestFramework
):
12 def set_test_params(self
):
13 self
.setup_clean_chain
= True
16 def successful_signing_test(self
):
17 """Create and sign a valid raw transaction with one input.
21 1) The transaction has a complete set of signatures
22 2) No script verification error occurred"""
23 privKeys
= ['cUeKHd5orzT3mz8P9pxyREHfsWtVfgsfDjiZZBcjUBAaGk1BTj7N', 'cVKpPfVKSJxKqVpE9awvXNWuLHCa5j5tiE7K6zbUSptFpTEtiFrA']
26 # Valid pay-to-pubkey scripts
27 {'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 0,
28 'scriptPubKey': '76a91460baa0f494b38ce3c940dea67f3804dc52d1fb9488ac'},
29 {'txid': '83a4f6a6b73660e13ee6cb3c6063fa3759c50c9b7521d0536022961898f4fb02', 'vout': 0,
30 'scriptPubKey': '76a914669b857c03a5ed269d5d85a1ffac9ed5d663072788ac'},
33 outputs
= {'mpLQjfK79b7CCV4VMJWEWAj5Mpx8Up5zxB': 0.1}
35 rawTx
= self
.nodes
[0].createrawtransaction(inputs
, outputs
)
36 rawTxSigned
= self
.nodes
[0].signrawtransaction(rawTx
, inputs
, privKeys
)
38 # 1) The transaction has a complete set of signatures
39 assert 'complete' in rawTxSigned
40 assert_equal(rawTxSigned
['complete'], True)
42 # 2) No script verification error occurred
43 assert 'errors' not in rawTxSigned
45 def script_verification_error_test(self
):
46 """Create and sign a raw transaction with valid (vin 0), invalid (vin 1) and one missing (vin 2) input script.
50 3) The transaction has no complete set of signatures
51 4) Two script verification errors occurred
52 5) Script verification errors have certain properties ("txid", "vout", "scriptSig", "sequence", "error")
53 6) The verification errors refer to the invalid (vin 1) and missing input (vin 2)"""
54 privKeys
= ['cUeKHd5orzT3mz8P9pxyREHfsWtVfgsfDjiZZBcjUBAaGk1BTj7N']
57 # Valid pay-to-pubkey script
58 {'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 0},
60 {'txid': '5b8673686910442c644b1f4993d8f7753c7c8fcb5c87ee40d56eaeef25204547', 'vout': 7},
61 # Missing scriptPubKey
62 {'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 1},
66 # Valid pay-to-pubkey script
67 {'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 0,
68 'scriptPubKey': '76a91460baa0f494b38ce3c940dea67f3804dc52d1fb9488ac'},
70 {'txid': '5b8673686910442c644b1f4993d8f7753c7c8fcb5c87ee40d56eaeef25204547', 'vout': 7,
71 'scriptPubKey': 'badbadbadbad'}
74 outputs
= {'mpLQjfK79b7CCV4VMJWEWAj5Mpx8Up5zxB': 0.1}
76 rawTx
= self
.nodes
[0].createrawtransaction(inputs
, outputs
)
78 # Make sure decoderawtransaction is at least marginally sane
79 decodedRawTx
= self
.nodes
[0].decoderawtransaction(rawTx
)
80 for i
, inp
in enumerate(inputs
):
81 assert_equal(decodedRawTx
["vin"][i
]["txid"], inp
["txid"])
82 assert_equal(decodedRawTx
["vin"][i
]["vout"], inp
["vout"])
84 # Make sure decoderawtransaction throws if there is extra data
85 assert_raises(JSONRPCException
, self
.nodes
[0].decoderawtransaction
, rawTx
+ "00")
87 rawTxSigned
= self
.nodes
[0].signrawtransaction(rawTx
, scripts
, privKeys
)
89 # 3) The transaction has no complete set of signatures
90 assert 'complete' in rawTxSigned
91 assert_equal(rawTxSigned
['complete'], False)
93 # 4) Two script verification errors occurred
94 assert 'errors' in rawTxSigned
95 assert_equal(len(rawTxSigned
['errors']), 2)
97 # 5) Script verification errors have certain properties
98 assert 'txid' in rawTxSigned
['errors'][0]
99 assert 'vout' in rawTxSigned
['errors'][0]
100 assert 'witness' in rawTxSigned
['errors'][0]
101 assert 'scriptSig' in rawTxSigned
['errors'][0]
102 assert 'sequence' in rawTxSigned
['errors'][0]
103 assert 'error' in rawTxSigned
['errors'][0]
105 # 6) The verification errors refer to the invalid (vin 1) and missing input (vin 2)
106 assert_equal(rawTxSigned
['errors'][0]['txid'], inputs
[1]['txid'])
107 assert_equal(rawTxSigned
['errors'][0]['vout'], inputs
[1]['vout'])
108 assert_equal(rawTxSigned
['errors'][1]['txid'], inputs
[2]['txid'])
109 assert_equal(rawTxSigned
['errors'][1]['vout'], inputs
[2]['vout'])
110 assert not rawTxSigned
['errors'][0]['witness']
112 # Now test signing failure for transaction with input witnesses
113 p2wpkh_raw_tx
= "01000000000102fff7f7881a8099afa6940d42d1e7f6362bec38171ea3edf433541db4e4ad969f00000000494830450221008b9d1dc26ba6a9cb62127b02742fa9d754cd3bebf337f7a55d114c8e5cdd30be022040529b194ba3f9281a99f2b1c0a19c0489bc22ede944ccf4ecbab4cc618ef3ed01eeffffffef51e1b804cc89d182d279655c3aa89e815b1b309fe287d9b2b55d57b90ec68a0100000000ffffffff02202cb206000000001976a9148280b37df378db99f66f85c95a783a76ac7a6d5988ac9093510d000000001976a9143bde42dbee7e4dbe6a21b2d50ce2f0167faa815988ac000247304402203609e17b84f6a7d30c80bfa610b5b4542f32a8a0d5447a12fb1366d7f01cc44a0220573a954c4518331561406f90300e8f3358f51928d43c212a8caed02de67eebee0121025476c2e83188368da1ff3e292e7acafcdb3566bb0ad253f62fc70f07aeee635711000000"
115 rawTxSigned
= self
.nodes
[0].signrawtransaction(p2wpkh_raw_tx
)
117 # 7) The transaction has no complete set of signatures
118 assert 'complete' in rawTxSigned
119 assert_equal(rawTxSigned
['complete'], False)
121 # 8) Two script verification errors occurred
122 assert 'errors' in rawTxSigned
123 assert_equal(len(rawTxSigned
['errors']), 2)
125 # 9) Script verification errors have certain properties
126 assert 'txid' in rawTxSigned
['errors'][0]
127 assert 'vout' in rawTxSigned
['errors'][0]
128 assert 'witness' in rawTxSigned
['errors'][0]
129 assert 'scriptSig' in rawTxSigned
['errors'][0]
130 assert 'sequence' in rawTxSigned
['errors'][0]
131 assert 'error' in rawTxSigned
['errors'][0]
133 # Non-empty witness checked here
134 assert_equal(rawTxSigned
['errors'][1]['witness'], ["304402203609e17b84f6a7d30c80bfa610b5b4542f32a8a0d5447a12fb1366d7f01cc44a0220573a954c4518331561406f90300e8f3358f51928d43c212a8caed02de67eebee01", "025476c2e83188368da1ff3e292e7acafcdb3566bb0ad253f62fc70f07aeee6357"])
135 assert not rawTxSigned
['errors'][0]['witness']
138 self
.successful_signing_test()
139 self
.script_verification_error_test()
142 if __name__
== '__main__':
143 SignRawTransactionsTest().main()