mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 20:12:57 +01:00
0cfbdeddc6
9cdddae3b4efee071d71ba3b6629a53017332f6f test: add rpc_signrawtransaction logging (Jon Atack)
4d6cde38cefa61209d307ed8015bdd40f2695668 test: refactor rpc_signrawtransaction witness script tests (Jon Atack)
Pull request description:
As a follow-up to #18484, the new tests are good but bury the one non-duplicate line in each test that sets the witness script, and there is no logging in the testfile. This PR makes it easy to see what is unique to each of the new tests and adds logging.
ACKs for top commit:
theStack:
ACK 9cdddae3b4
🥚 🐰
Tree-SHA512: 7b1ca303326658afb90b7635abc9fe8bb65f0be004124d4dcf38702bb6f38bc06ce33c0642be4ad5d511453d003cdefeea691e66e3b963a4feb66f6237a3c241
129 lines
5.7 KiB
Python
Executable File
129 lines
5.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Copyright (c) 2015-2016 The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
"""Test transaction signing using the signrawtransaction* RPCs."""
|
|
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
from test_framework.util import assert_equal, assert_raises_rpc_error
|
|
|
|
|
|
class SignRawTransactionsTest(BitcoinTestFramework):
|
|
def set_test_params(self):
|
|
self.setup_clean_chain = True
|
|
self.num_nodes = 1
|
|
|
|
def skip_test_if_missing_module(self):
|
|
self.skip_if_no_wallet()
|
|
|
|
def successful_signing_test(self):
|
|
"""Create and sign a valid raw transaction with one input.
|
|
|
|
Expected results:
|
|
|
|
1) The transaction has a complete set of signatures
|
|
2) No script verification error occurred"""
|
|
self.log.info("Test valid raw transaction with one input")
|
|
privKeys = ['cUeKHd5orzT3mz8P9pxyREHfsWtVfgsfDjiZZBcjUBAaGk1BTj7N', 'cVKpPfVKSJxKqVpE9awvXNWuLHCa5j5tiE7K6zbUSptFpTEtiFrA']
|
|
|
|
inputs = [
|
|
# Valid pay-to-pubkey scripts
|
|
{'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 0,
|
|
'scriptPubKey': '76a91460baa0f494b38ce3c940dea67f3804dc52d1fb9488ac'},
|
|
{'txid': '83a4f6a6b73660e13ee6cb3c6063fa3759c50c9b7521d0536022961898f4fb02', 'vout': 0,
|
|
'scriptPubKey': '76a914669b857c03a5ed269d5d85a1ffac9ed5d663072788ac'},
|
|
]
|
|
|
|
outputs = {'ycwedq2f3sz2Yf9JqZsBCQPxp18WU3Hp4J': 0.1}
|
|
|
|
rawTx = self.nodes[0].createrawtransaction(inputs, outputs)
|
|
rawTxSigned = self.nodes[0].signrawtransactionwithkey(rawTx, privKeys, inputs)
|
|
|
|
# 1) The transaction has a complete set of signatures
|
|
assert rawTxSigned['complete']
|
|
|
|
# 2) No script verification error occurred
|
|
assert 'errors' not in rawTxSigned
|
|
|
|
def test_with_lock_outputs(self):
|
|
self.log.info("Test correct error reporting when trying to sign a locked output")
|
|
self.nodes[0].encryptwallet("password")
|
|
|
|
rawTx = '020000000156b958f78e3f24e0b2f4e4db1255426b0902027cb37e3ddadb52e37c3557dddb0000000000ffffffff01c0a6b929010000001600149a2ee8c77140a053f36018ac8124a6ececc1668a00000000'
|
|
|
|
assert_raises_rpc_error(-13, "Please enter the wallet passphrase with walletpassphrase first", self.nodes[0].signrawtransactionwithwallet, rawTx)
|
|
|
|
def script_verification_error_test(self):
|
|
"""Create and sign a raw transaction with valid (vin 0), invalid (vin 1) and one missing (vin 2) input script.
|
|
|
|
Expected results:
|
|
|
|
3) The transaction has no complete set of signatures
|
|
4) Two script verification errors occurred
|
|
5) Script verification errors have certain properties ("txid", "vout", "scriptSig", "sequence", "error")
|
|
6) The verification errors refer to the invalid (vin 1) and missing input (vin 2)"""
|
|
self.log.info("Test script verification errors")
|
|
privKeys = ['cUeKHd5orzT3mz8P9pxyREHfsWtVfgsfDjiZZBcjUBAaGk1BTj7N']
|
|
|
|
inputs = [
|
|
# Valid pay-to-pubkey script
|
|
{'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 0},
|
|
# Invalid script
|
|
{'txid': '5b8673686910442c644b1f4993d8f7753c7c8fcb5c87ee40d56eaeef25204547', 'vout': 7},
|
|
# Missing scriptPubKey
|
|
{'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 1},
|
|
]
|
|
|
|
scripts = [
|
|
# Valid pay-to-pubkey script
|
|
{'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 0,
|
|
'scriptPubKey': '76a91460baa0f494b38ce3c940dea67f3804dc52d1fb9488ac'},
|
|
# Invalid script
|
|
{'txid': '5b8673686910442c644b1f4993d8f7753c7c8fcb5c87ee40d56eaeef25204547', 'vout': 7,
|
|
'scriptPubKey': 'badbadbadbad'}
|
|
]
|
|
|
|
outputs = {'ycwedq2f3sz2Yf9JqZsBCQPxp18WU3Hp4J': 0.1}
|
|
|
|
rawTx = self.nodes[0].createrawtransaction(inputs, outputs)
|
|
|
|
# Make sure decoderawtransaction is at least marginally sane
|
|
decodedRawTx = self.nodes[0].decoderawtransaction(rawTx)
|
|
for i, inp in enumerate(inputs):
|
|
assert_equal(decodedRawTx["vin"][i]["txid"], inp["txid"])
|
|
assert_equal(decodedRawTx["vin"][i]["vout"], inp["vout"])
|
|
|
|
# Make sure decoderawtransaction throws if there is extra data
|
|
assert_raises_rpc_error(-22, "TX decode failed", self.nodes[0].decoderawtransaction, rawTx + "00")
|
|
|
|
rawTxSigned = self.nodes[0].signrawtransactionwithkey(rawTx, privKeys, scripts)
|
|
|
|
# 3) The transaction has no complete set of signatures
|
|
assert not rawTxSigned['complete']
|
|
|
|
# 4) Two script verification errors occurred
|
|
assert 'errors' in rawTxSigned
|
|
assert_equal(len(rawTxSigned['errors']), 2)
|
|
|
|
# 5) Script verification errors have certain properties
|
|
assert 'txid' in rawTxSigned['errors'][0]
|
|
assert 'vout' in rawTxSigned['errors'][0]
|
|
assert 'scriptSig' in rawTxSigned['errors'][0]
|
|
assert 'sequence' in rawTxSigned['errors'][0]
|
|
assert 'error' in rawTxSigned['errors'][0]
|
|
|
|
# 6) The verification errors refer to the invalid (vin 1) and missing input (vin 2)
|
|
assert_equal(rawTxSigned['errors'][0]['txid'], inputs[1]['txid'])
|
|
assert_equal(rawTxSigned['errors'][0]['vout'], inputs[1]['vout'])
|
|
assert_equal(rawTxSigned['errors'][1]['txid'], inputs[2]['txid'])
|
|
assert_equal(rawTxSigned['errors'][1]['vout'], inputs[2]['vout'])
|
|
|
|
def run_test(self):
|
|
self.successful_signing_test()
|
|
self.script_verification_error_test()
|
|
self.test_with_lock_outputs()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
SignRawTransactionsTest().main()
|