|
|
@ -4,7 +4,7 @@ |
|
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
|
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
|
|
|
|
|
|
|
|
|
|
|
# |
|
|
|
# |
|
|
|
# Test BIP68 implementation (mempool only) |
|
|
|
# Test BIP68 implementation |
|
|
|
# |
|
|
|
# |
|
|
|
|
|
|
|
|
|
|
|
from test_framework.test_framework import BitcoinTestFramework |
|
|
|
from test_framework.test_framework import BitcoinTestFramework |
|
|
@ -26,8 +26,10 @@ class BIP68Test(BitcoinTestFramework): |
|
|
|
def setup_network(self): |
|
|
|
def setup_network(self): |
|
|
|
self.nodes = [] |
|
|
|
self.nodes = [] |
|
|
|
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug", "-blockprioritysize=0"])) |
|
|
|
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug", "-blockprioritysize=0"])) |
|
|
|
|
|
|
|
self.nodes.append(start_node(1, self.options.tmpdir, ["-debug", "-blockprioritysize=0", "-acceptnonstdtxn=0"])) |
|
|
|
self.is_network_split = False |
|
|
|
self.is_network_split = False |
|
|
|
self.relayfee = self.nodes[0].getnetworkinfo()["relayfee"] |
|
|
|
self.relayfee = self.nodes[0].getnetworkinfo()["relayfee"] |
|
|
|
|
|
|
|
connect_nodes(self.nodes[0], 1) |
|
|
|
|
|
|
|
|
|
|
|
def run_test(self): |
|
|
|
def run_test(self): |
|
|
|
# Generate some coins |
|
|
|
# Generate some coins |
|
|
@ -42,10 +44,18 @@ class BIP68Test(BitcoinTestFramework): |
|
|
|
print "Running test sequence-lock-unconfirmed-inputs" |
|
|
|
print "Running test sequence-lock-unconfirmed-inputs" |
|
|
|
self.test_sequence_lock_unconfirmed_inputs() |
|
|
|
self.test_sequence_lock_unconfirmed_inputs() |
|
|
|
|
|
|
|
|
|
|
|
# This test needs to change when BIP68 becomes consensus |
|
|
|
print "Running test BIP68 not consensus before versionbits activation" |
|
|
|
print "Running test BIP68 not consensus" |
|
|
|
|
|
|
|
self.test_bip68_not_consensus() |
|
|
|
self.test_bip68_not_consensus() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print "Verifying nVersion=2 transactions aren't standard" |
|
|
|
|
|
|
|
self.test_version2_relay(before_activation=True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print "Activating BIP68 (and 112/113)" |
|
|
|
|
|
|
|
self.activateCSV() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print "Verifying nVersion=2 transactions are now standard" |
|
|
|
|
|
|
|
self.test_version2_relay(before_activation=False) |
|
|
|
|
|
|
|
|
|
|
|
print "Passed\n" |
|
|
|
print "Passed\n" |
|
|
|
|
|
|
|
|
|
|
|
# Test that BIP68 is not in effect if tx version is 1, or if |
|
|
|
# Test that BIP68 is not in effect if tx version is 1, or if |
|
|
@ -333,8 +343,12 @@ class BIP68Test(BitcoinTestFramework): |
|
|
|
self.nodes[0].invalidateblock(self.nodes[0].getblockhash(cur_height+1)) |
|
|
|
self.nodes[0].invalidateblock(self.nodes[0].getblockhash(cur_height+1)) |
|
|
|
self.nodes[0].generate(10) |
|
|
|
self.nodes[0].generate(10) |
|
|
|
|
|
|
|
|
|
|
|
# Make sure that BIP68 isn't being used to validate blocks. |
|
|
|
# Make sure that BIP68 isn't being used to validate blocks, prior to |
|
|
|
|
|
|
|
# versionbits activation. If more blocks are mined prior to this test |
|
|
|
|
|
|
|
# being run, then it's possible the test has activated the soft fork, and |
|
|
|
|
|
|
|
# this test should be moved to run earlier, or deleted. |
|
|
|
def test_bip68_not_consensus(self): |
|
|
|
def test_bip68_not_consensus(self): |
|
|
|
|
|
|
|
assert(get_bip9_status(self.nodes[0], 'csv')['status'] != 'active') |
|
|
|
txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 2) |
|
|
|
txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 2) |
|
|
|
|
|
|
|
|
|
|
|
tx1 = FromHex(CTransaction(), self.nodes[0].getrawtransaction(txid)) |
|
|
|
tx1 = FromHex(CTransaction(), self.nodes[0].getrawtransaction(txid)) |
|
|
@ -381,6 +395,30 @@ class BIP68Test(BitcoinTestFramework): |
|
|
|
self.nodes[0].submitblock(ToHex(block)) |
|
|
|
self.nodes[0].submitblock(ToHex(block)) |
|
|
|
assert_equal(self.nodes[0].getbestblockhash(), block.hash) |
|
|
|
assert_equal(self.nodes[0].getbestblockhash(), block.hash) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def activateCSV(self): |
|
|
|
|
|
|
|
# activation should happen at block height 432 (3 periods) |
|
|
|
|
|
|
|
min_activation_height = 432 |
|
|
|
|
|
|
|
height = self.nodes[0].getblockcount() |
|
|
|
|
|
|
|
assert(height < 432) |
|
|
|
|
|
|
|
self.nodes[0].generate(432-height) |
|
|
|
|
|
|
|
assert(get_bip9_status(self.nodes[0], 'csv')['status'] == 'active') |
|
|
|
|
|
|
|
sync_blocks(self.nodes) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Use self.nodes[1] to test standardness relay policy |
|
|
|
|
|
|
|
def test_version2_relay(self, before_activation): |
|
|
|
|
|
|
|
inputs = [ ] |
|
|
|
|
|
|
|
outputs = { self.nodes[1].getnewaddress() : 1.0 } |
|
|
|
|
|
|
|
rawtx = self.nodes[1].createrawtransaction(inputs, outputs) |
|
|
|
|
|
|
|
rawtxfund = self.nodes[1].fundrawtransaction(rawtx)['hex'] |
|
|
|
|
|
|
|
tx = FromHex(CTransaction(), rawtxfund) |
|
|
|
|
|
|
|
tx.nVersion = 2 |
|
|
|
|
|
|
|
tx_signed = self.nodes[1].signrawtransaction(ToHex(tx))["hex"] |
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
tx_id = self.nodes[1].sendrawtransaction(tx_signed) |
|
|
|
|
|
|
|
assert(before_activation == False) |
|
|
|
|
|
|
|
except: |
|
|
|
|
|
|
|
assert(before_activation) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
if __name__ == '__main__': |
|
|
|
BIP68Test().main() |
|
|
|
BIP68Test().main() |
|
|
|