|
|
|
@ -4,16 +4,17 @@
|
|
|
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
|
"""Test transaction signing using the signrawtransaction* RPCs."""
|
|
|
|
|
|
|
|
|
|
from test_framework.address import check_script, script_to_p2sh
|
|
|
|
|
from test_framework.address import check_script, script_to_p2sh, script_to_p2wsh
|
|
|
|
|
from test_framework.key import ECKey
|
|
|
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
|
|
|
from test_framework.util import assert_equal, assert_raises_rpc_error, find_vout_for_address, hex_str_to_bytes
|
|
|
|
|
from test_framework.messages import sha256
|
|
|
|
|
from test_framework.script import CScript, OP_0, OP_CHECKSIG
|
|
|
|
|
from test_framework.messages import sha256, CTransaction, CTxInWitness
|
|
|
|
|
from test_framework.script import CScript, OP_0, OP_CHECKSIG, OP_CHECKSEQUENCEVERIFY, OP_CHECKLOCKTIMEVERIFY, OP_DROP, OP_TRUE
|
|
|
|
|
from test_framework.script_util import key_to_p2pkh_script, script_to_p2sh_p2wsh_script, script_to_p2wsh_script
|
|
|
|
|
from test_framework.wallet_util import bytes_to_wif
|
|
|
|
|
|
|
|
|
|
from decimal import Decimal
|
|
|
|
|
from decimal import Decimal, getcontext
|
|
|
|
|
from io import BytesIO
|
|
|
|
|
|
|
|
|
|
class SignRawTransactionsTest(BitcoinTestFramework):
|
|
|
|
|
def set_test_params(self):
|
|
|
|
@ -238,6 +239,78 @@ class SignRawTransactionsTest(BitcoinTestFramework):
|
|
|
|
|
txn = self.nodes[0].signrawtransactionwithwallet(hex_str, prev_txs)
|
|
|
|
|
assert txn["complete"]
|
|
|
|
|
|
|
|
|
|
def test_signing_with_csv(self):
|
|
|
|
|
self.log.info("Test signing a transaction containing a fully signed CSV input")
|
|
|
|
|
self.nodes[0].walletpassphrase("password", 9999)
|
|
|
|
|
getcontext().prec = 8
|
|
|
|
|
|
|
|
|
|
# Make sure CSV is active
|
|
|
|
|
self.nodes[0].generate(500)
|
|
|
|
|
|
|
|
|
|
# Create a P2WSH script with CSV
|
|
|
|
|
script = CScript([1, OP_CHECKSEQUENCEVERIFY, OP_DROP])
|
|
|
|
|
address = script_to_p2wsh(script)
|
|
|
|
|
|
|
|
|
|
# Fund that address and make the spend
|
|
|
|
|
txid = self.nodes[0].sendtoaddress(address, 1)
|
|
|
|
|
vout = find_vout_for_address(self.nodes[0], txid, address)
|
|
|
|
|
self.nodes[0].generate(1)
|
|
|
|
|
utxo = self.nodes[0].listunspent()[0]
|
|
|
|
|
amt = Decimal(1) + utxo["amount"] - Decimal(0.00001)
|
|
|
|
|
tx = self.nodes[0].createrawtransaction(
|
|
|
|
|
[{"txid": txid, "vout": vout, "sequence": 1},{"txid": utxo["txid"], "vout": utxo["vout"]}],
|
|
|
|
|
[{self.nodes[0].getnewaddress(): amt}],
|
|
|
|
|
self.nodes[0].getblockcount()
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Set the witness script
|
|
|
|
|
ctx = CTransaction()
|
|
|
|
|
ctx.deserialize(BytesIO(hex_str_to_bytes(tx)))
|
|
|
|
|
ctx.wit.vtxinwit.append(CTxInWitness())
|
|
|
|
|
ctx.wit.vtxinwit[0].scriptWitness.stack = [CScript([OP_TRUE]), script]
|
|
|
|
|
tx = ctx.serialize_with_witness().hex()
|
|
|
|
|
|
|
|
|
|
# Sign and send the transaction
|
|
|
|
|
signed = self.nodes[0].signrawtransactionwithwallet(tx)
|
|
|
|
|
assert_equal(signed["complete"], True)
|
|
|
|
|
self.nodes[0].sendrawtransaction(signed["hex"])
|
|
|
|
|
|
|
|
|
|
def test_signing_with_cltv(self):
|
|
|
|
|
self.log.info("Test signing a transaction containing a fully signed CLTV input")
|
|
|
|
|
self.nodes[0].walletpassphrase("password", 9999)
|
|
|
|
|
getcontext().prec = 8
|
|
|
|
|
|
|
|
|
|
# Make sure CSV is active
|
|
|
|
|
self.nodes[0].generate(1500)
|
|
|
|
|
|
|
|
|
|
# Create a P2WSH script with CLTV
|
|
|
|
|
script = CScript([1000, OP_CHECKLOCKTIMEVERIFY, OP_DROP])
|
|
|
|
|
address = script_to_p2wsh(script)
|
|
|
|
|
|
|
|
|
|
# Fund that address and make the spend
|
|
|
|
|
txid = self.nodes[0].sendtoaddress(address, 1)
|
|
|
|
|
vout = find_vout_for_address(self.nodes[0], txid, address)
|
|
|
|
|
self.nodes[0].generate(1)
|
|
|
|
|
utxo = self.nodes[0].listunspent()[0]
|
|
|
|
|
amt = Decimal(1) + utxo["amount"] - Decimal(0.00001)
|
|
|
|
|
tx = self.nodes[0].createrawtransaction(
|
|
|
|
|
[{"txid": txid, "vout": vout},{"txid": utxo["txid"], "vout": utxo["vout"]}],
|
|
|
|
|
[{self.nodes[0].getnewaddress(): amt}],
|
|
|
|
|
self.nodes[0].getblockcount()
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Set the witness script
|
|
|
|
|
ctx = CTransaction()
|
|
|
|
|
ctx.deserialize(BytesIO(hex_str_to_bytes(tx)))
|
|
|
|
|
ctx.wit.vtxinwit.append(CTxInWitness())
|
|
|
|
|
ctx.wit.vtxinwit[0].scriptWitness.stack = [CScript([OP_TRUE]), script]
|
|
|
|
|
tx = ctx.serialize_with_witness().hex()
|
|
|
|
|
|
|
|
|
|
# Sign and send the transaction
|
|
|
|
|
signed = self.nodes[0].signrawtransactionwithwallet(tx)
|
|
|
|
|
assert_equal(signed["complete"], True)
|
|
|
|
|
self.nodes[0].sendrawtransaction(signed["hex"])
|
|
|
|
|
|
|
|
|
|
def run_test(self):
|
|
|
|
|
self.successful_signing_test()
|
|
|
|
|
self.script_verification_error_test()
|
|
|
|
@ -245,6 +318,8 @@ class SignRawTransactionsTest(BitcoinTestFramework):
|
|
|
|
|
self.OP_1NEGATE_test()
|
|
|
|
|
self.test_with_lock_outputs()
|
|
|
|
|
self.test_fully_signed_tx()
|
|
|
|
|
self.test_signing_with_csv()
|
|
|
|
|
self.test_signing_with_cltv()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|