Merge #12079: Improve prioritisetransaction test coverage
[bitcoinplatinum.git] / test / functional / signrawtransactions.py
blobdd0fa6c02cf029502ab6397d16a4828b87ea8eb9
1 #!/usr/bin/env python3
2 # Copyright (c) 2015-2017 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
14 self.num_nodes = 1
16 def successful_signing_test(self):
17 """Create and sign a valid raw transaction with one input.
19 Expected results:
21 1) The transaction has a complete set of signatures
22 2) No script verification error occurred"""
23 privKeys = ['cUeKHd5orzT3mz8P9pxyREHfsWtVfgsfDjiZZBcjUBAaGk1BTj7N', 'cVKpPfVKSJxKqVpE9awvXNWuLHCa5j5tiE7K6zbUSptFpTEtiFrA']
25 inputs = [
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.
48 Expected results:
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']
56 inputs = [
57 # Valid pay-to-pubkey script
58 {'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 0},
59 # Invalid script
60 {'txid': '5b8673686910442c644b1f4993d8f7753c7c8fcb5c87ee40d56eaeef25204547', 'vout': 7},
61 # Missing scriptPubKey
62 {'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 1},
65 scripts = [
66 # Valid pay-to-pubkey script
67 {'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 0,
68 'scriptPubKey': '76a91460baa0f494b38ce3c940dea67f3804dc52d1fb9488ac'},
69 # Invalid script
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_rpc_error(-22, "TX decode failed", 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']
137 def run_test(self):
138 self.successful_signing_test()
139 self.script_verification_error_test()
142 if __name__ == '__main__':
143 SignRawTransactionsTest().main()