[Consensus] Bury CSV deployment height
Hard code CSV deployment height to 419328 for mainnet.
This commit is contained in:
parent
3862e473f0
commit
1c93b9b31c
8 changed files with 54 additions and 98 deletions
|
@ -69,6 +69,7 @@ public:
|
||||||
consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8");
|
consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8");
|
||||||
consensus.BIP65Height = 388381; // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0
|
consensus.BIP65Height = 388381; // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0
|
||||||
consensus.BIP66Height = 363725; // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931
|
consensus.BIP66Height = 363725; // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931
|
||||||
|
consensus.CSVHeight = 419328; // 000000000000000004a1b34462cb8aeebd5799177f7a29cf28f2d1961716b5b5
|
||||||
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||||
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
|
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
|
||||||
consensus.nPowTargetSpacing = 10 * 60;
|
consensus.nPowTargetSpacing = 10 * 60;
|
||||||
|
@ -80,11 +81,6 @@ public:
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
||||||
|
|
||||||
// Deployment of BIP68, BIP112, and BIP113.
|
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
|
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1462060800; // May 1st, 2016
|
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017
|
|
||||||
|
|
||||||
// Deployment of SegWit (BIP141, BIP143, and BIP147)
|
// Deployment of SegWit (BIP141, BIP143, and BIP147)
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;
|
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1479168000; // November 15th, 2016.
|
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1479168000; // November 15th, 2016.
|
||||||
|
@ -183,6 +179,7 @@ public:
|
||||||
consensus.BIP34Hash = uint256S("0x0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8");
|
consensus.BIP34Hash = uint256S("0x0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8");
|
||||||
consensus.BIP65Height = 581885; // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6
|
consensus.BIP65Height = 581885; // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6
|
||||||
consensus.BIP66Height = 330776; // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182
|
consensus.BIP66Height = 330776; // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182
|
||||||
|
consensus.CSVHeight = 770112; // 00000000025e930139bac5c6c31a403776da130831ab85be56578f3fa75369bb
|
||||||
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||||
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
|
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
|
||||||
consensus.nPowTargetSpacing = 10 * 60;
|
consensus.nPowTargetSpacing = 10 * 60;
|
||||||
|
@ -194,11 +191,6 @@ public:
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
||||||
|
|
||||||
// Deployment of BIP68, BIP112, and BIP113.
|
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
|
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1456790400; // March 1st, 2016
|
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017
|
|
||||||
|
|
||||||
// Deployment of SegWit (BIP141, BIP143, and BIP147)
|
// Deployment of SegWit (BIP141, BIP143, and BIP147)
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;
|
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1462060800; // May 1st 2016
|
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1462060800; // May 1st 2016
|
||||||
|
@ -275,6 +267,7 @@ public:
|
||||||
consensus.BIP34Hash = uint256();
|
consensus.BIP34Hash = uint256();
|
||||||
consensus.BIP65Height = 1351; // BIP65 activated on regtest (Used in functional tests)
|
consensus.BIP65Height = 1351; // BIP65 activated on regtest (Used in functional tests)
|
||||||
consensus.BIP66Height = 1251; // BIP66 activated on regtest (Used in functional tests)
|
consensus.BIP66Height = 1251; // BIP66 activated on regtest (Used in functional tests)
|
||||||
|
consensus.CSVHeight = 432; // CSV activated on regtest (Used in rpc activation tests)
|
||||||
consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||||
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
|
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
|
||||||
consensus.nPowTargetSpacing = 10 * 60;
|
consensus.nPowTargetSpacing = 10 * 60;
|
||||||
|
@ -285,9 +278,6 @@ public:
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 0;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 0;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
|
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 0;
|
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;
|
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE;
|
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
||||||
|
|
|
@ -16,7 +16,6 @@ namespace Consensus {
|
||||||
enum DeploymentPos
|
enum DeploymentPos
|
||||||
{
|
{
|
||||||
DEPLOYMENT_TESTDUMMY,
|
DEPLOYMENT_TESTDUMMY,
|
||||||
DEPLOYMENT_CSV, // Deployment of BIP68, BIP112, and BIP113.
|
|
||||||
DEPLOYMENT_SEGWIT, // Deployment of BIP141, BIP143, and BIP147.
|
DEPLOYMENT_SEGWIT, // Deployment of BIP141, BIP143, and BIP147.
|
||||||
// NOTE: Also add new deployments to VersionBitsDeploymentInfo in versionbits.cpp
|
// NOTE: Also add new deployments to VersionBitsDeploymentInfo in versionbits.cpp
|
||||||
MAX_VERSION_BITS_DEPLOYMENTS
|
MAX_VERSION_BITS_DEPLOYMENTS
|
||||||
|
@ -58,6 +57,8 @@ struct Params {
|
||||||
int BIP65Height;
|
int BIP65Height;
|
||||||
/** Block height at which BIP66 becomes active */
|
/** Block height at which BIP66 becomes active */
|
||||||
int BIP66Height;
|
int BIP66Height;
|
||||||
|
/** Block height at which CSV (BIP68, BIP112 and BIP113) becomes active */
|
||||||
|
int CSVHeight;
|
||||||
/**
|
/**
|
||||||
* Minimum blocks including miner confirmation of the total of 2016 blocks in a retargeting period,
|
* Minimum blocks including miner confirmation of the total of 2016 blocks in a retargeting period,
|
||||||
* (nPowTargetTimespan / nPowTargetSpacing) which is also used for BIP9 deployments.
|
* (nPowTargetTimespan / nPowTargetSpacing) which is also used for BIP9 deployments.
|
||||||
|
|
|
@ -1337,7 +1337,7 @@ UniValue getblockchaininfo(const JSONRPCRequest& request)
|
||||||
BuriedForkDescPushBack(softforks, "bip34", consensusParams.BIP34Height);
|
BuriedForkDescPushBack(softforks, "bip34", consensusParams.BIP34Height);
|
||||||
BuriedForkDescPushBack(softforks, "bip66", consensusParams.BIP66Height);
|
BuriedForkDescPushBack(softforks, "bip66", consensusParams.BIP66Height);
|
||||||
BuriedForkDescPushBack(softforks, "bip65", consensusParams.BIP65Height);
|
BuriedForkDescPushBack(softforks, "bip65", consensusParams.BIP65Height);
|
||||||
BIP9SoftForkDescPushBack(softforks, "csv", consensusParams, Consensus::DEPLOYMENT_CSV);
|
BuriedForkDescPushBack(softforks, "csv", consensusParams.CSVHeight);
|
||||||
BIP9SoftForkDescPushBack(softforks, "segwit", consensusParams, Consensus::DEPLOYMENT_SEGWIT);
|
BIP9SoftForkDescPushBack(softforks, "segwit", consensusParams, Consensus::DEPLOYMENT_SEGWIT);
|
||||||
BIP9SoftForkDescPushBack(softforks, "testdummy", consensusParams, Consensus::DEPLOYMENT_TESTDUMMY);
|
BIP9SoftForkDescPushBack(softforks, "testdummy", consensusParams, Consensus::DEPLOYMENT_TESTDUMMY);
|
||||||
obj.pushKV("softforks", softforks);
|
obj.pushKV("softforks", softforks);
|
||||||
|
|
|
@ -1644,8 +1644,8 @@ static unsigned int GetBlockScriptFlags(const CBlockIndex* pindex, const Consens
|
||||||
flags |= SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY;
|
flags |= SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start enforcing BIP68 (sequence locks) and BIP112 (CHECKSEQUENCEVERIFY) using versionbits logic.
|
// Start enforcing BIP112 (CHECKSEQUENCEVERIFY)
|
||||||
if (VersionBitsState(pindex->pprev, consensusparams, Consensus::DEPLOYMENT_CSV, versionbitscache) == ThresholdState::ACTIVE) {
|
if (pindex->nHeight >= consensusparams.CSVHeight) {
|
||||||
flags |= SCRIPT_VERIFY_CHECKSEQUENCEVERIFY;
|
flags |= SCRIPT_VERIFY_CHECKSEQUENCEVERIFY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1834,9 +1834,9 @@ bool CChainState::ConnectBlock(const CBlock& block, CValidationState& state, CBl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start enforcing BIP68 (sequence locks) and BIP112 (CHECKSEQUENCEVERIFY) using versionbits logic.
|
// Start enforcing BIP68 (sequence locks)
|
||||||
int nLockTimeFlags = 0;
|
int nLockTimeFlags = 0;
|
||||||
if (VersionBitsState(pindex->pprev, chainparams.GetConsensus(), Consensus::DEPLOYMENT_CSV, versionbitscache) == ThresholdState::ACTIVE) {
|
if (pindex->nHeight >= chainparams.GetConsensus().CSVHeight) {
|
||||||
nLockTimeFlags |= LOCKTIME_VERIFY_SEQUENCE;
|
nLockTimeFlags |= LOCKTIME_VERIFY_SEQUENCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3185,9 +3185,9 @@ static bool ContextualCheckBlock(const CBlock& block, CValidationState& state, c
|
||||||
{
|
{
|
||||||
const int nHeight = pindexPrev == nullptr ? 0 : pindexPrev->nHeight + 1;
|
const int nHeight = pindexPrev == nullptr ? 0 : pindexPrev->nHeight + 1;
|
||||||
|
|
||||||
// Start enforcing BIP113 (Median Time Past) using versionbits logic.
|
// Start enforcing BIP113 (Median Time Past).
|
||||||
int nLockTimeFlags = 0;
|
int nLockTimeFlags = 0;
|
||||||
if (VersionBitsState(pindexPrev, consensusParams, Consensus::DEPLOYMENT_CSV, versionbitscache) == ThresholdState::ACTIVE) {
|
if (nHeight >= consensusParams.CSVHeight) {
|
||||||
assert(pindexPrev != nullptr);
|
assert(pindexPrev != nullptr);
|
||||||
nLockTimeFlags |= LOCKTIME_MEDIAN_TIME_PAST;
|
nLockTimeFlags |= LOCKTIME_MEDIAN_TIME_PAST;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,10 +11,6 @@ const struct VBDeploymentInfo VersionBitsDeploymentInfo[Consensus::MAX_VERSION_B
|
||||||
/*.name =*/ "testdummy",
|
/*.name =*/ "testdummy",
|
||||||
/*.gbt_force =*/ true,
|
/*.gbt_force =*/ true,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
/*.name =*/ "csv",
|
|
||||||
/*.gbt_force =*/ true,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
/*.name =*/ "segwit",
|
/*.name =*/ "segwit",
|
||||||
/*.gbt_force =*/ true,
|
/*.gbt_force =*/ true,
|
||||||
|
|
|
@ -14,8 +14,8 @@ from test_framework.util import (
|
||||||
assert_equal,
|
assert_equal,
|
||||||
assert_greater_than,
|
assert_greater_than,
|
||||||
assert_raises_rpc_error,
|
assert_raises_rpc_error,
|
||||||
get_bip9_status,
|
|
||||||
satoshi_round,
|
satoshi_round,
|
||||||
|
softfork_active,
|
||||||
)
|
)
|
||||||
|
|
||||||
SEQUENCE_LOCKTIME_DISABLE_FLAG = (1<<31)
|
SEQUENCE_LOCKTIME_DISABLE_FLAG = (1<<31)
|
||||||
|
@ -52,7 +52,7 @@ class BIP68Test(BitcoinTestFramework):
|
||||||
self.log.info("Running test sequence-lock-unconfirmed-inputs")
|
self.log.info("Running test sequence-lock-unconfirmed-inputs")
|
||||||
self.test_sequence_lock_unconfirmed_inputs()
|
self.test_sequence_lock_unconfirmed_inputs()
|
||||||
|
|
||||||
self.log.info("Running test BIP68 not consensus before versionbits activation")
|
self.log.info("Running test BIP68 not consensus before activation")
|
||||||
self.test_bip68_not_consensus()
|
self.test_bip68_not_consensus()
|
||||||
|
|
||||||
self.log.info("Activating BIP68 (and 112/113)")
|
self.log.info("Activating BIP68 (and 112/113)")
|
||||||
|
@ -336,12 +336,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, prior to
|
# Make sure that BIP68 isn't being used to validate blocks prior to
|
||||||
# versionbits activation. If more blocks are mined prior to this test
|
# activation height. If more blocks are mined prior to this test
|
||||||
# being run, then it's possible the test has activated the soft fork, and
|
# being run, then it's possible the test has activated the soft fork, and
|
||||||
# this test should be moved to run earlier, or deleted.
|
# 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'
|
assert not softfork_active(self.nodes[0], 'csv')
|
||||||
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))
|
||||||
|
@ -391,9 +391,9 @@ class BIP68Test(BitcoinTestFramework):
|
||||||
height = self.nodes[0].getblockcount()
|
height = self.nodes[0].getblockcount()
|
||||||
assert_greater_than(min_activation_height - height, 2)
|
assert_greater_than(min_activation_height - height, 2)
|
||||||
self.nodes[0].generate(min_activation_height - height - 2)
|
self.nodes[0].generate(min_activation_height - height - 2)
|
||||||
assert_equal(get_bip9_status(self.nodes[0], 'csv')['status'], "locked_in")
|
assert not softfork_active(self.nodes[0], 'csv')
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
assert_equal(get_bip9_status(self.nodes[0], 'csv')['status'], "active")
|
assert softfork_active(self.nodes[0], 'csv')
|
||||||
self.sync_blocks()
|
self.sync_blocks()
|
||||||
|
|
||||||
# Use self.nodes[1] to test that version 2 transactions are standard.
|
# Use self.nodes[1] to test that version 2 transactions are standard.
|
||||||
|
|
|
@ -2,23 +2,17 @@
|
||||||
# Copyright (c) 2015-2019 The Bitcoin Core developers
|
# Copyright (c) 2015-2019 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 activation of the first version bits soft fork.
|
"""Test CSV soft fork activation.
|
||||||
|
|
||||||
This soft fork will activate the following BIPS:
|
This soft fork will activate the following BIPS:
|
||||||
BIP 68 - nSequence relative lock times
|
BIP 68 - nSequence relative lock times
|
||||||
BIP 112 - CHECKSEQUENCEVERIFY
|
BIP 112 - CHECKSEQUENCEVERIFY
|
||||||
BIP 113 - MedianTimePast semantics for nLockTime
|
BIP 113 - MedianTimePast semantics for nLockTime
|
||||||
|
|
||||||
regtest lock-in with 108/144 block signalling
|
|
||||||
activation after a further 144 blocks
|
|
||||||
|
|
||||||
mine 82 blocks whose coinbases will be used to generate inputs for our tests
|
mine 82 blocks whose coinbases will be used to generate inputs for our tests
|
||||||
mine 61 blocks to transition from DEFINED to STARTED
|
mine 345 blocks and seed block chain with the 82 inputs will use for our tests at height 427
|
||||||
mine 144 blocks only 100 of which are signaling readiness in order to fail to change state this period
|
mine 2 blocks and verify soft fork not yet activated
|
||||||
mine 144 blocks with 108 signaling and verify STARTED->LOCKED_IN
|
mine 1 block and test that soft fork is activated (rules enforced for next block)
|
||||||
mine 140 blocks and seed block chain with the 82 inputs will use for our tests at height 572
|
|
||||||
mine 3 blocks and verify still at LOCKED_IN and test that enforcement has not triggered
|
|
||||||
mine 1 block and test that enforcement has triggered (which triggers ACTIVE)
|
|
||||||
Test BIP 113 is enforced
|
Test BIP 113 is enforced
|
||||||
Mine 4 blocks so next height is 580 and test BIP 68 is enforced for time and height
|
Mine 4 blocks so next height is 580 and test BIP 68 is enforced for time and height
|
||||||
Mine 1 block so next height is 581 and test BIP 68 now passes time but not height
|
Mine 1 block so next height is 581 and test BIP 68 now passes time but not height
|
||||||
|
@ -58,11 +52,12 @@ from test_framework.script import (
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import (
|
from test_framework.util import (
|
||||||
assert_equal,
|
assert_equal,
|
||||||
get_bip9_status,
|
|
||||||
hex_str_to_bytes,
|
hex_str_to_bytes,
|
||||||
|
softfork_active,
|
||||||
)
|
)
|
||||||
|
|
||||||
BASE_RELATIVE_LOCKTIME = 10
|
BASE_RELATIVE_LOCKTIME = 10
|
||||||
|
CSV_ACTIVATION_HEIGHT = 432
|
||||||
SEQ_DISABLE_FLAG = 1 << 31
|
SEQ_DISABLE_FLAG = 1 << 31
|
||||||
SEQ_RANDOM_HIGH_BIT = 1 << 25
|
SEQ_RANDOM_HIGH_BIT = 1 << 25
|
||||||
SEQ_TYPE_FLAG = 1 << 22
|
SEQ_TYPE_FLAG = 1 << 22
|
||||||
|
@ -148,20 +143,19 @@ class BIP68_112_113Test(BitcoinTestFramework):
|
||||||
def skip_test_if_missing_module(self):
|
def skip_test_if_missing_module(self):
|
||||||
self.skip_if_no_wallet()
|
self.skip_if_no_wallet()
|
||||||
|
|
||||||
def generate_blocks(self, number, version, test_blocks=None):
|
def generate_blocks(self, number):
|
||||||
if test_blocks is None:
|
test_blocks = []
|
||||||
test_blocks = []
|
|
||||||
for i in range(number):
|
for i in range(number):
|
||||||
block = self.create_test_block([], version)
|
block = self.create_test_block([])
|
||||||
test_blocks.append(block)
|
test_blocks.append(block)
|
||||||
self.last_block_time += 600
|
self.last_block_time += 600
|
||||||
self.tip = block.sha256
|
self.tip = block.sha256
|
||||||
self.tipheight += 1
|
self.tipheight += 1
|
||||||
return test_blocks
|
return test_blocks
|
||||||
|
|
||||||
def create_test_block(self, txs, version=536870912):
|
def create_test_block(self, txs):
|
||||||
block = create_block(self.tip, create_coinbase(self.tipheight + 1), self.last_block_time + 600)
|
block = create_block(self.tip, create_coinbase(self.tipheight + 1), self.last_block_time + 600)
|
||||||
block.nVersion = version
|
block.nVersion = 4
|
||||||
block.vtx.extend(txs)
|
block.vtx.extend(txs)
|
||||||
block.hashMerkleRoot = block.calc_merkle_root()
|
block.hashMerkleRoot = block.calc_merkle_root()
|
||||||
block.rehash()
|
block.rehash()
|
||||||
|
@ -187,45 +181,14 @@ class BIP68_112_113Test(BitcoinTestFramework):
|
||||||
self.tip = int(self.nodes[0].getbestblockhash(), 16)
|
self.tip = int(self.nodes[0].getbestblockhash(), 16)
|
||||||
self.nodeaddress = self.nodes[0].getnewaddress()
|
self.nodeaddress = self.nodes[0].getnewaddress()
|
||||||
|
|
||||||
self.log.info("Test that the csv softfork is DEFINED")
|
# Activation height is hardcoded
|
||||||
assert_equal(get_bip9_status(self.nodes[0], 'csv')['status'], 'defined')
|
test_blocks = self.generate_blocks(345)
|
||||||
test_blocks = self.generate_blocks(61, 4)
|
|
||||||
self.send_blocks(test_blocks)
|
self.send_blocks(test_blocks)
|
||||||
|
assert not softfork_active(self.nodes[0], 'csv')
|
||||||
|
|
||||||
self.log.info("Advance from DEFINED to STARTED, height = 143")
|
# Inputs at height = 431
|
||||||
assert_equal(get_bip9_status(self.nodes[0], 'csv')['status'], 'started')
|
|
||||||
|
|
||||||
self.log.info("Fail to achieve LOCKED_IN")
|
|
||||||
# 100 out of 144 signal bit 0. Use a variety of bits to simulate multiple parallel softforks
|
|
||||||
|
|
||||||
test_blocks = self.generate_blocks(50, 536870913) # 0x20000001 (signalling ready)
|
|
||||||
test_blocks = self.generate_blocks(20, 4, test_blocks) # 0x00000004 (signalling not)
|
|
||||||
test_blocks = self.generate_blocks(50, 536871169, test_blocks) # 0x20000101 (signalling ready)
|
|
||||||
test_blocks = self.generate_blocks(24, 536936448, test_blocks) # 0x20010000 (signalling not)
|
|
||||||
self.send_blocks(test_blocks)
|
|
||||||
|
|
||||||
self.log.info("Failed to advance past STARTED, height = 287")
|
|
||||||
assert_equal(get_bip9_status(self.nodes[0], 'csv')['status'], 'started')
|
|
||||||
|
|
||||||
self.log.info("Generate blocks to achieve LOCK-IN")
|
|
||||||
# 108 out of 144 signal bit 0 to achieve lock-in
|
|
||||||
# using a variety of bits to simulate multiple parallel softforks
|
|
||||||
test_blocks = self.generate_blocks(58, 536870913) # 0x20000001 (signalling ready)
|
|
||||||
test_blocks = self.generate_blocks(26, 4, test_blocks) # 0x00000004 (signalling not)
|
|
||||||
test_blocks = self.generate_blocks(50, 536871169, test_blocks) # 0x20000101 (signalling ready)
|
|
||||||
test_blocks = self.generate_blocks(10, 536936448, test_blocks) # 0x20010000 (signalling not)
|
|
||||||
self.send_blocks(test_blocks)
|
|
||||||
|
|
||||||
self.log.info("Advanced from STARTED to LOCKED_IN, height = 431")
|
|
||||||
assert_equal(get_bip9_status(self.nodes[0], 'csv')['status'], 'locked_in')
|
|
||||||
|
|
||||||
# Generate 140 more version 4 blocks
|
|
||||||
test_blocks = self.generate_blocks(140, 4)
|
|
||||||
self.send_blocks(test_blocks)
|
|
||||||
|
|
||||||
# Inputs at height = 572
|
|
||||||
#
|
#
|
||||||
# Put inputs for all tests in the chain at height 572 (tip now = 571) (time increases by 600s per block)
|
# Put inputs for all tests in the chain at height 431 (tip now = 430) (time increases by 600s per block)
|
||||||
# Note we reuse inputs for v1 and v2 txs so must test these separately
|
# Note we reuse inputs for v1 and v2 txs so must test these separately
|
||||||
# 16 normal inputs
|
# 16 normal inputs
|
||||||
bip68inputs = []
|
bip68inputs = []
|
||||||
|
@ -255,7 +218,7 @@ class BIP68_112_113Test(BitcoinTestFramework):
|
||||||
bip113input = send_generic_input_tx(self.nodes[0], self.coinbase_blocks, self.nodeaddress)
|
bip113input = send_generic_input_tx(self.nodes[0], self.coinbase_blocks, self.nodeaddress)
|
||||||
|
|
||||||
self.nodes[0].setmocktime(self.last_block_time + 600)
|
self.nodes[0].setmocktime(self.last_block_time + 600)
|
||||||
inputblockhash = self.nodes[0].generate(1)[0] # 1 block generated for inputs to be in chain at height 572
|
inputblockhash = self.nodes[0].generate(1)[0] # 1 block generated for inputs to be in chain at height 431
|
||||||
self.nodes[0].setmocktime(0)
|
self.nodes[0].setmocktime(0)
|
||||||
self.tip = int(inputblockhash, 16)
|
self.tip = int(inputblockhash, 16)
|
||||||
self.tipheight += 1
|
self.tipheight += 1
|
||||||
|
@ -263,11 +226,12 @@ class BIP68_112_113Test(BitcoinTestFramework):
|
||||||
assert_equal(len(self.nodes[0].getblock(inputblockhash, True)["tx"]), 82 + 1)
|
assert_equal(len(self.nodes[0].getblock(inputblockhash, True)["tx"]), 82 + 1)
|
||||||
|
|
||||||
# 2 more version 4 blocks
|
# 2 more version 4 blocks
|
||||||
test_blocks = self.generate_blocks(2, 4)
|
test_blocks = self.generate_blocks(2)
|
||||||
self.send_blocks(test_blocks)
|
self.send_blocks(test_blocks)
|
||||||
|
|
||||||
self.log.info("Not yet advanced to ACTIVE, height = 574 (will activate for block 576, not 575)")
|
assert_equal(self.tipheight, CSV_ACTIVATION_HEIGHT - 2)
|
||||||
assert_equal(get_bip9_status(self.nodes[0], 'csv')['status'], 'locked_in')
|
self.log.info("Height = {}, CSV not yet active (will activate for block {}, not {})".format(self.tipheight, CSV_ACTIVATION_HEIGHT, CSV_ACTIVATION_HEIGHT - 1))
|
||||||
|
assert not softfork_active(self.nodes[0], 'csv')
|
||||||
|
|
||||||
# Test both version 1 and version 2 transactions for all tests
|
# Test both version 1 and version 2 transactions for all tests
|
||||||
# BIP113 test transaction will be modified before each use to put in appropriate block time
|
# BIP113 test transaction will be modified before each use to put in appropriate block time
|
||||||
|
@ -340,10 +304,11 @@ class BIP68_112_113Test(BitcoinTestFramework):
|
||||||
self.send_blocks([self.create_test_block(success_txs)])
|
self.send_blocks([self.create_test_block(success_txs)])
|
||||||
self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash())
|
self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash())
|
||||||
|
|
||||||
# 1 more version 4 block to get us to height 575 so the fork should now be active for the next block
|
# 1 more version 4 block to get us to height 432 so the fork should now be active for the next block
|
||||||
test_blocks = self.generate_blocks(1, 4)
|
assert not softfork_active(self.nodes[0], 'csv')
|
||||||
|
test_blocks = self.generate_blocks(1)
|
||||||
self.send_blocks(test_blocks)
|
self.send_blocks(test_blocks)
|
||||||
assert_equal(get_bip9_status(self.nodes[0], 'csv')['status'], 'active')
|
assert softfork_active(self.nodes[0], 'csv')
|
||||||
|
|
||||||
self.log.info("Post-Soft Fork Tests.")
|
self.log.info("Post-Soft Fork Tests.")
|
||||||
|
|
||||||
|
@ -364,8 +329,8 @@ class BIP68_112_113Test(BitcoinTestFramework):
|
||||||
self.send_blocks([self.create_test_block([bip113tx])])
|
self.send_blocks([self.create_test_block([bip113tx])])
|
||||||
self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash())
|
self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash())
|
||||||
|
|
||||||
# Next block height = 580 after 4 blocks of random version
|
# Next block height = 437 after 4 blocks of random version
|
||||||
test_blocks = self.generate_blocks(4, 1234)
|
test_blocks = self.generate_blocks(4)
|
||||||
self.send_blocks(test_blocks)
|
self.send_blocks(test_blocks)
|
||||||
|
|
||||||
self.log.info("BIP 68 tests")
|
self.log.info("BIP 68 tests")
|
||||||
|
@ -392,8 +357,8 @@ class BIP68_112_113Test(BitcoinTestFramework):
|
||||||
for tx in bip68heighttxs:
|
for tx in bip68heighttxs:
|
||||||
self.send_blocks([self.create_test_block([tx])], success=False)
|
self.send_blocks([self.create_test_block([tx])], success=False)
|
||||||
|
|
||||||
# Advance one block to 581
|
# Advance one block to 438
|
||||||
test_blocks = self.generate_blocks(1, 1234)
|
test_blocks = self.generate_blocks(1)
|
||||||
self.send_blocks(test_blocks)
|
self.send_blocks(test_blocks)
|
||||||
|
|
||||||
# Height txs should fail and time txs should now pass 9 * 600 > 10 * 512
|
# Height txs should fail and time txs should now pass 9 * 600 > 10 * 512
|
||||||
|
@ -403,8 +368,8 @@ class BIP68_112_113Test(BitcoinTestFramework):
|
||||||
for tx in bip68heighttxs:
|
for tx in bip68heighttxs:
|
||||||
self.send_blocks([self.create_test_block([tx])], success=False)
|
self.send_blocks([self.create_test_block([tx])], success=False)
|
||||||
|
|
||||||
# Advance one block to 582
|
# Advance one block to 439
|
||||||
test_blocks = self.generate_blocks(1, 1234)
|
test_blocks = self.generate_blocks(1)
|
||||||
self.send_blocks(test_blocks)
|
self.send_blocks(test_blocks)
|
||||||
|
|
||||||
# All BIP 68 txs should pass
|
# All BIP 68 txs should pass
|
||||||
|
|
|
@ -346,6 +346,10 @@ def get_bip9_status(node, key):
|
||||||
info = node.getblockchaininfo()
|
info = node.getblockchaininfo()
|
||||||
return info['softforks'][key]['bip9']
|
return info['softforks'][key]['bip9']
|
||||||
|
|
||||||
|
def softfork_active(node, key):
|
||||||
|
"""Return whether a softfork is active."""
|
||||||
|
return node.getblockchaininfo()['softforks'][key]['active']
|
||||||
|
|
||||||
def set_node_times(nodes, t):
|
def set_node_times(nodes, t):
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
node.setmocktime(t)
|
node.setmocktime(t)
|
||||||
|
|
Loading…
Reference in a new issue