Changeset View
Changeset View
Standalone View
Standalone View
test/functional/bip65-cltv-p2p.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2015-2016 The Bitcoin Core developers | # Copyright (c) 2015-2016 The Bitcoin Core developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
"""Test BIP65 (CHECKLOCKTIMEVERIFY). | """Test BIP65 (CHECKLOCKTIMEVERIFY). | ||||
Test that the CHECKLOCKTIMEVERIFY soft-fork activates at (regtest) block height | Test that the CHECKLOCKTIMEVERIFY soft-fork activates at (regtest) block height | ||||
1351. | 1351. | ||||
""" | """ | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import * | from test_framework.util import * | ||||
from test_framework.mininode import * | from test_framework.mininode import * | ||||
from test_framework.blocktools import create_coinbase, create_block | from test_framework.blocktools import create_coinbase, create_block | ||||
from test_framework.script import CScript, CScriptNum, OP_1NEGATE, OP_CHECKLOCKTIMEVERIFY, OP_DROP, OP_TRUE | from test_framework.script import CScript, CScriptNum, OP_1NEGATE, OP_CHECKLOCKTIMEVERIFY, OP_DROP, OP_TRUE | ||||
from test_framework.txtools import pad_tx | |||||
CLTV_HEIGHT = 1351 | CLTV_HEIGHT = 1351 | ||||
# far in the future | |||||
MAGNETIC_ANOMALY_START_TIME = 2000000000 | |||||
# Reject codes that we might receive in this test | # Reject codes that we might receive in this test | ||||
REJECT_INVALID = 16 | REJECT_INVALID = 16 | ||||
REJECT_OBSOLETE = 17 | REJECT_OBSOLETE = 17 | ||||
REJECT_NONSTANDARD = 64 | REJECT_NONSTANDARD = 64 | ||||
def cltv_lock_to_height(node, tx, height=-1): | def cltv_lock_to_height(node, tx, height=-1): | ||||
'''Modify the scriptPubKey to add an OP_CHECKLOCKTIMEVERIFY | '''Modify the scriptPubKey to add an OP_CHECKLOCKTIMEVERIFY | ||||
Show All 14 Lines | def cltv_lock_to_height(node, tx, height=-1): | ||||
tx.vout[0].scriptPubKey = CScript( | tx.vout[0].scriptPubKey = CScript( | ||||
[height_op, OP_CHECKLOCKTIMEVERIFY, OP_DROP, OP_TRUE]) | [height_op, OP_CHECKLOCKTIMEVERIFY, OP_DROP, OP_TRUE]) | ||||
tx.rehash() | tx.rehash() | ||||
signed_result = node.signrawtransaction(ToHex(tx)) | signed_result = node.signrawtransaction(ToHex(tx)) | ||||
new_tx = FromHex(CTransaction(), signed_result['hex']) | new_tx = FromHex(CTransaction(), signed_result['hex']) | ||||
pad_tx(new_tx) | |||||
new_tx.rehash() | new_tx.rehash() | ||||
return new_tx | return new_tx | ||||
def create_transaction(node, coinbase, to_address, amount): | def create_transaction(node, coinbase, to_address, amount): | ||||
from_txid = node.getblock(coinbase)['tx'][0] | from_txid = node.getblock(coinbase)['tx'][0] | ||||
inputs = [{"txid": from_txid, "vout": 0}] | inputs = [{"txid": from_txid, "vout": 0}] | ||||
outputs = {to_address: amount} | outputs = {to_address: amount} | ||||
rawtx = node.createrawtransaction(inputs, outputs) | rawtx = node.createrawtransaction(inputs, outputs) | ||||
signresult = node.signrawtransaction(rawtx) | signresult = node.signrawtransaction(rawtx) | ||||
tx = FromHex(CTransaction(), signresult['hex']) | tx = FromHex(CTransaction(), signresult['hex']) | ||||
return tx | return tx | ||||
class BIP65Test(BitcoinTestFramework): | class BIP65Test(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
self.extra_args = [ | self.extra_args = [ | ||||
['-promiscuousmempoolflags=1', '-whitelist=127.0.0.1', '-magneticanomalyactivationtime=%d' % MAGNETIC_ANOMALY_START_TIME]] | ['-promiscuousmempoolflags=1', '-whitelist=127.0.0.1']] | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
def run_test(self): | def run_test(self): | ||||
node0 = NodeConnCB() | node0 = NodeConnCB() | ||||
connections = [] | connections = [] | ||||
connections.append( | connections.append( | ||||
NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], node0)) | NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], node0)) | ||||
node0.add_connection(connections[0]) | node0.add_connection(connections[0]) | ||||
▲ Show 20 Lines • Show All 81 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
rejectedtx_raw = self.nodes[0].createrawtransaction(inputs, output) | rejectedtx_raw = self.nodes[0].createrawtransaction(inputs, output) | ||||
rejectedtx_signed = self.nodes[0].signrawtransaction(rejectedtx_raw) | rejectedtx_signed = self.nodes[0].signrawtransaction(rejectedtx_raw) | ||||
#!Couldn't complete signature due to CLTV | #!Couldn't complete signature due to CLTV | ||||
assert(rejectedtx_signed['errors'][0]['error'] == 'Negative locktime') | assert(rejectedtx_signed['errors'][0]['error'] == 'Negative locktime') | ||||
rejectedtx = FromHex(CTransaction(), rejectedtx_signed['hex']) | rejectedtx = FromHex(CTransaction(), rejectedtx_signed['hex']) | ||||
pad_tx(rejectedtx) | |||||
rejectedtx.rehash() | rejectedtx.rehash() | ||||
tip = block.sha256 | tip = block.sha256 | ||||
block_time += 1 | block_time += 1 | ||||
block = create_block(tip, create_coinbase(CLTV_HEIGHT+1), block_time) | block = create_block(tip, create_coinbase(CLTV_HEIGHT+1), block_time) | ||||
block.nVersion = 4 | block.nVersion = 4 | ||||
block.vtx.append(rejectedtx) | block.vtx.append(rejectedtx) | ||||
block.hashMerkleRoot = block.calc_merkle_root() | block.hashMerkleRoot = block.calc_merkle_root() | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
validtx_raw = self.nodes[0].createrawtransaction( | validtx_raw = self.nodes[0].createrawtransaction( | ||||
inputs, output, CLTV_HEIGHT) | inputs, output, CLTV_HEIGHT) | ||||
validtx = FromHex(CTransaction(), validtx_raw) | validtx = FromHex(CTransaction(), validtx_raw) | ||||
# Signrawtransaction won't sign a non standard tx. | # Signrawtransaction won't sign a non standard tx. | ||||
# But the prevout being anyoncanpay, scriptsig can be left empty | # But the prevout being anyoncanpay, scriptsig can be left empty | ||||
validtx.vin[0].scriptSig = CScript() | validtx.vin[0].scriptSig = CScript() | ||||
pad_tx(validtx) | |||||
validtx.rehash() | validtx.rehash() | ||||
tip = block.sha256 | tip = block.sha256 | ||||
block_time += 1 | block_time += 1 | ||||
block = create_block(tip, create_coinbase(CLTV_HEIGHT+3), block_time) | block = create_block(tip, create_coinbase(CLTV_HEIGHT+3), block_time) | ||||
block.nVersion = 4 | block.nVersion = 4 | ||||
block.vtx.append(validtx) | block.vtx.append(validtx) | ||||
block.hashMerkleRoot = block.calc_merkle_root() | block.hashMerkleRoot = block.calc_merkle_root() | ||||
Show All 9 Lines |