mirror of
https://github.com/kvazar-network/kevacoin.git
synced 2025-02-04 03:04:27 +00:00
Merge #11389: Support having SegWit always active in regtest (sipa, ajtowns, jnewbery)
d61845818 Have SegWit active by default (Pieter Wuille) 4bd89210a Unit tests for always-active versionbits. (Anthony Towns) d07ee77ab Always-active versionbits support (Pieter Wuille) 18e071841 [consensus] Pin P2SH activation to block 173805 on mainnet (John Newbery) 526023aa7 Improve handling of BIP9Deployment limits (Anthony Towns) Pull request description: Most tests shouldn't have to deal with the now-historical SegWit activation transition (and other deployments, but SegWit is certainly the hardest one to accomodate). This PR makes a versionbits starttime of -1 equal to "always active", and enables it by default for SegWit on regtest. Individual tests can override this by using the existing `-vbparams` option. A few unit tests and functional tests are adapted to indeed override vbparams, as they specifically test the transition. This is in preparation for wallet SegWit support, but I thought having earlier eyes on it would be useful. Tree-SHA512: 3f07a7b41cf46476e6c7a5c43244e68c9f41d223482cedaa4c02a3a7b7cd0e90cbd06b84a1f3704620559636a2268f5767d4c52d09c1b354945737046f618fe5
This commit is contained in:
commit
dd561667cb
@ -75,6 +75,7 @@ public:
|
|||||||
CMainParams() {
|
CMainParams() {
|
||||||
strNetworkID = "main";
|
strNetworkID = "main";
|
||||||
consensus.nSubsidyHalvingInterval = 210000;
|
consensus.nSubsidyHalvingInterval = 210000;
|
||||||
|
consensus.BIP16Height = 173805; // 00000000000000ce80a7e057163a4db1d5ad7b20fb6f598c9597b9665c8fb0d4 - April 1, 2012
|
||||||
consensus.BIP34Height = 227931;
|
consensus.BIP34Height = 227931;
|
||||||
consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8");
|
consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8");
|
||||||
consensus.BIP65Height = 388381; // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0
|
consensus.BIP65Height = 388381; // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0
|
||||||
@ -181,6 +182,7 @@ public:
|
|||||||
CTestNetParams() {
|
CTestNetParams() {
|
||||||
strNetworkID = "test";
|
strNetworkID = "test";
|
||||||
consensus.nSubsidyHalvingInterval = 210000;
|
consensus.nSubsidyHalvingInterval = 210000;
|
||||||
|
consensus.BIP16Height = 514; // 00000000040b4e986385315e14bee30ad876d8b47f748025b26683116d21aa65
|
||||||
consensus.BIP34Height = 21111;
|
consensus.BIP34Height = 21111;
|
||||||
consensus.BIP34Hash = uint256S("0x0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8");
|
consensus.BIP34Hash = uint256S("0x0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8");
|
||||||
consensus.BIP65Height = 581885; // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6
|
consensus.BIP65Height = 581885; // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6
|
||||||
@ -270,6 +272,7 @@ public:
|
|||||||
CRegTestParams() {
|
CRegTestParams() {
|
||||||
strNetworkID = "regtest";
|
strNetworkID = "regtest";
|
||||||
consensus.nSubsidyHalvingInterval = 150;
|
consensus.nSubsidyHalvingInterval = 150;
|
||||||
|
consensus.BIP16Height = 0; // always enforce P2SH BIP16 on regtest
|
||||||
consensus.BIP34Height = 100000000; // BIP34 has not activated on regtest (far in the future so block v1 are not rejected in tests)
|
consensus.BIP34Height = 100000000; // BIP34 has not activated on regtest (far in the future so block v1 are not rejected in tests)
|
||||||
consensus.BIP34Hash = uint256();
|
consensus.BIP34Hash = uint256();
|
||||||
consensus.BIP65Height = 1351; // BIP65 activated on regtest (Used in rpc activation tests)
|
consensus.BIP65Height = 1351; // BIP65 activated on regtest (Used in rpc activation tests)
|
||||||
@ -283,13 +286,13 @@ public:
|
|||||||
consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016)
|
consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016)
|
||||||
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 = 999999999999ULL;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
|
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 0;
|
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 0;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 999999999999ULL;
|
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 = 0;
|
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = 999999999999ULL;
|
consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
||||||
|
|
||||||
// The best chain should have at least this much work.
|
// The best chain should have at least this much work.
|
||||||
consensus.nMinimumChainWork = uint256S("0x00");
|
consensus.nMinimumChainWork = uint256S("0x00");
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#define BITCOIN_CONSENSUS_PARAMS_H
|
#define BITCOIN_CONSENSUS_PARAMS_H
|
||||||
|
|
||||||
#include "uint256.h"
|
#include "uint256.h"
|
||||||
|
#include <limits>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@ -31,6 +32,15 @@ struct BIP9Deployment {
|
|||||||
int64_t nStartTime;
|
int64_t nStartTime;
|
||||||
/** Timeout/expiry MedianTime for the deployment attempt. */
|
/** Timeout/expiry MedianTime for the deployment attempt. */
|
||||||
int64_t nTimeout;
|
int64_t nTimeout;
|
||||||
|
|
||||||
|
/** Constant for nTimeout very far in the future. */
|
||||||
|
static constexpr int64_t NO_TIMEOUT = std::numeric_limits<int64_t>::max();
|
||||||
|
|
||||||
|
/** Special value for nStartTime indicating that the deployment is always active.
|
||||||
|
* This is useful for testing, as it means tests don't need to deal with the activation
|
||||||
|
* process (which takes at least 3 BIP9 intervals). Only tests that specifically test the
|
||||||
|
* behaviour during activation cannot use this. */
|
||||||
|
static constexpr int64_t ALWAYS_ACTIVE = -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -39,6 +49,8 @@ struct BIP9Deployment {
|
|||||||
struct Params {
|
struct Params {
|
||||||
uint256 hashGenesisBlock;
|
uint256 hashGenesisBlock;
|
||||||
int nSubsidyHalvingInterval;
|
int nSubsidyHalvingInterval;
|
||||||
|
/** Block height at which BIP16 becomes active */
|
||||||
|
int BIP16Height;
|
||||||
/** Block height and hash at which BIP34 becomes active */
|
/** Block height and hash at which BIP34 becomes active */
|
||||||
int BIP34Height;
|
int BIP34Height;
|
||||||
uint256 BIP34Hash;
|
uint256 BIP34Hash;
|
||||||
|
@ -335,23 +335,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|||||||
BOOST_CHECK_THROW(AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
|
BOOST_CHECK_THROW(AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
|
||||||
mempool.clear();
|
mempool.clear();
|
||||||
|
|
||||||
// invalid (pre-p2sh) txn in mempool, template creation fails
|
|
||||||
tx.vin[0].prevout.hash = txFirst[0]->GetHash();
|
|
||||||
tx.vin[0].prevout.n = 0;
|
|
||||||
tx.vin[0].scriptSig = CScript() << OP_1;
|
|
||||||
tx.vout[0].nValue = BLOCKSUBSIDY-LOWFEE;
|
|
||||||
script = CScript() << OP_0;
|
|
||||||
tx.vout[0].scriptPubKey = GetScriptForDestination(CScriptID(script));
|
|
||||||
hash = tx.GetHash();
|
|
||||||
mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
|
|
||||||
tx.vin[0].prevout.hash = hash;
|
|
||||||
tx.vin[0].scriptSig = CScript() << std::vector<unsigned char>(script.begin(), script.end());
|
|
||||||
tx.vout[0].nValue -= LOWFEE;
|
|
||||||
hash = tx.GetHash();
|
|
||||||
mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(false).FromTx(tx));
|
|
||||||
BOOST_CHECK_THROW(AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
|
|
||||||
mempool.clear();
|
|
||||||
|
|
||||||
// double spend txn pair in mempool, template creation fails
|
// double spend txn pair in mempool, template creation fails
|
||||||
tx.vin[0].prevout.hash = txFirst[0]->GetHash();
|
tx.vin[0].prevout.hash = txFirst[0]->GetHash();
|
||||||
tx.vin[0].scriptSig = CScript() << OP_1;
|
tx.vin[0].scriptSig = CScript() << OP_1;
|
||||||
@ -391,6 +374,24 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|||||||
chainActive.SetTip(next);
|
chainActive.SetTip(next);
|
||||||
}
|
}
|
||||||
BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey));
|
BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey));
|
||||||
|
|
||||||
|
// invalid p2sh txn in mempool, template creation fails
|
||||||
|
tx.vin[0].prevout.hash = txFirst[0]->GetHash();
|
||||||
|
tx.vin[0].prevout.n = 0;
|
||||||
|
tx.vin[0].scriptSig = CScript() << OP_1;
|
||||||
|
tx.vout[0].nValue = BLOCKSUBSIDY-LOWFEE;
|
||||||
|
script = CScript() << OP_0;
|
||||||
|
tx.vout[0].scriptPubKey = GetScriptForDestination(CScriptID(script));
|
||||||
|
hash = tx.GetHash();
|
||||||
|
mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
|
||||||
|
tx.vin[0].prevout.hash = hash;
|
||||||
|
tx.vin[0].scriptSig = CScript() << std::vector<unsigned char>(script.begin(), script.end());
|
||||||
|
tx.vout[0].nValue -= LOWFEE;
|
||||||
|
hash = tx.GetHash();
|
||||||
|
mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(false).FromTx(tx));
|
||||||
|
BOOST_CHECK_THROW(AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
|
||||||
|
mempool.clear();
|
||||||
|
|
||||||
// Delete the dummy blocks again.
|
// Delete the dummy blocks again.
|
||||||
while (chainActive.Tip()->nHeight > nHeight) {
|
while (chainActive.Tip()->nHeight > nHeight) {
|
||||||
CBlockIndex* del = chainActive.Tip();
|
CBlockIndex* del = chainActive.Tip();
|
||||||
|
@ -118,6 +118,9 @@ TestingSetup::~TestingSetup()
|
|||||||
|
|
||||||
TestChain100Setup::TestChain100Setup() : TestingSetup(CBaseChainParams::REGTEST)
|
TestChain100Setup::TestChain100Setup() : TestingSetup(CBaseChainParams::REGTEST)
|
||||||
{
|
{
|
||||||
|
// CreateAndProcessBlock() does not support building SegWit blocks, so don't activate in these tests.
|
||||||
|
// TODO: fix the code to support SegWit blocks.
|
||||||
|
UpdateVersionBitsParameters(Consensus::DEPLOYMENT_SEGWIT, 0, Consensus::BIP9Deployment::NO_TIMEOUT);
|
||||||
// Generate a 100-block chain:
|
// Generate a 100-block chain:
|
||||||
coinbaseKey.MakeNewKey(true);
|
coinbaseKey.MakeNewKey(true);
|
||||||
CScript scriptPubKey = CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG;
|
CScript scriptPubKey = CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG;
|
||||||
|
@ -32,6 +32,12 @@ public:
|
|||||||
int GetStateSinceHeightFor(const CBlockIndex* pindexPrev) const { return AbstractThresholdConditionChecker::GetStateSinceHeightFor(pindexPrev, paramsDummy, cache); }
|
int GetStateSinceHeightFor(const CBlockIndex* pindexPrev) const { return AbstractThresholdConditionChecker::GetStateSinceHeightFor(pindexPrev, paramsDummy, cache); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class TestAlwaysActiveConditionChecker : public TestConditionChecker
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int64_t BeginTime(const Consensus::Params& params) const override { return Consensus::BIP9Deployment::ALWAYS_ACTIVE; }
|
||||||
|
};
|
||||||
|
|
||||||
#define CHECKERS 6
|
#define CHECKERS 6
|
||||||
|
|
||||||
class VersionBitsTester
|
class VersionBitsTester
|
||||||
@ -43,6 +49,8 @@ class VersionBitsTester
|
|||||||
// The first one performs all checks, the second only 50%, the third only 25%, etc...
|
// The first one performs all checks, the second only 50%, the third only 25%, etc...
|
||||||
// This is to test whether lack of cached information leads to the same results.
|
// This is to test whether lack of cached information leads to the same results.
|
||||||
TestConditionChecker checker[CHECKERS];
|
TestConditionChecker checker[CHECKERS];
|
||||||
|
// Another 6 that assume always active activation
|
||||||
|
TestAlwaysActiveConditionChecker checker_always[CHECKERS];
|
||||||
|
|
||||||
// Test counter (to identify failures)
|
// Test counter (to identify failures)
|
||||||
int num;
|
int num;
|
||||||
@ -56,6 +64,7 @@ public:
|
|||||||
}
|
}
|
||||||
for (unsigned int i = 0; i < CHECKERS; i++) {
|
for (unsigned int i = 0; i < CHECKERS; i++) {
|
||||||
checker[i] = TestConditionChecker();
|
checker[i] = TestConditionChecker();
|
||||||
|
checker_always[i] = TestAlwaysActiveConditionChecker();
|
||||||
}
|
}
|
||||||
vpblock.clear();
|
vpblock.clear();
|
||||||
return *this;
|
return *this;
|
||||||
@ -82,6 +91,7 @@ public:
|
|||||||
for (int i = 0; i < CHECKERS; i++) {
|
for (int i = 0; i < CHECKERS; i++) {
|
||||||
if (InsecureRandBits(i) == 0) {
|
if (InsecureRandBits(i) == 0) {
|
||||||
BOOST_CHECK_MESSAGE(checker[i].GetStateSinceHeightFor(vpblock.empty() ? nullptr : vpblock.back()) == height, strprintf("Test %i for StateSinceHeight", num));
|
BOOST_CHECK_MESSAGE(checker[i].GetStateSinceHeightFor(vpblock.empty() ? nullptr : vpblock.back()) == height, strprintf("Test %i for StateSinceHeight", num));
|
||||||
|
BOOST_CHECK_MESSAGE(checker_always[i].GetStateSinceHeightFor(vpblock.empty() ? nullptr : vpblock.back()) == 0, strprintf("Test %i for StateSinceHeight (always active)", num));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
num++;
|
num++;
|
||||||
@ -92,6 +102,7 @@ public:
|
|||||||
for (int i = 0; i < CHECKERS; i++) {
|
for (int i = 0; i < CHECKERS; i++) {
|
||||||
if (InsecureRandBits(i) == 0) {
|
if (InsecureRandBits(i) == 0) {
|
||||||
BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_DEFINED, strprintf("Test %i for DEFINED", num));
|
BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_DEFINED, strprintf("Test %i for DEFINED", num));
|
||||||
|
BOOST_CHECK_MESSAGE(checker_always[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_ACTIVE, strprintf("Test %i for ACTIVE (always active)", num));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
num++;
|
num++;
|
||||||
@ -102,6 +113,7 @@ public:
|
|||||||
for (int i = 0; i < CHECKERS; i++) {
|
for (int i = 0; i < CHECKERS; i++) {
|
||||||
if (InsecureRandBits(i) == 0) {
|
if (InsecureRandBits(i) == 0) {
|
||||||
BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_STARTED, strprintf("Test %i for STARTED", num));
|
BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_STARTED, strprintf("Test %i for STARTED", num));
|
||||||
|
BOOST_CHECK_MESSAGE(checker_always[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_ACTIVE, strprintf("Test %i for ACTIVE (always active)", num));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
num++;
|
num++;
|
||||||
@ -112,6 +124,7 @@ public:
|
|||||||
for (int i = 0; i < CHECKERS; i++) {
|
for (int i = 0; i < CHECKERS; i++) {
|
||||||
if (InsecureRandBits(i) == 0) {
|
if (InsecureRandBits(i) == 0) {
|
||||||
BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_LOCKED_IN, strprintf("Test %i for LOCKED_IN", num));
|
BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_LOCKED_IN, strprintf("Test %i for LOCKED_IN", num));
|
||||||
|
BOOST_CHECK_MESSAGE(checker_always[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_ACTIVE, strprintf("Test %i for ACTIVE (always active)", num));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
num++;
|
num++;
|
||||||
@ -122,6 +135,7 @@ public:
|
|||||||
for (int i = 0; i < CHECKERS; i++) {
|
for (int i = 0; i < CHECKERS; i++) {
|
||||||
if (InsecureRandBits(i) == 0) {
|
if (InsecureRandBits(i) == 0) {
|
||||||
BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_ACTIVE, strprintf("Test %i for ACTIVE", num));
|
BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_ACTIVE, strprintf("Test %i for ACTIVE", num));
|
||||||
|
BOOST_CHECK_MESSAGE(checker_always[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_ACTIVE, strprintf("Test %i for ACTIVE (always active)", num));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
num++;
|
num++;
|
||||||
@ -132,6 +146,7 @@ public:
|
|||||||
for (int i = 0; i < CHECKERS; i++) {
|
for (int i = 0; i < CHECKERS; i++) {
|
||||||
if (InsecureRandBits(i) == 0) {
|
if (InsecureRandBits(i) == 0) {
|
||||||
BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_FAILED, strprintf("Test %i for FAILED", num));
|
BOOST_CHECK_MESSAGE(checker[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_FAILED, strprintf("Test %i for FAILED", num));
|
||||||
|
BOOST_CHECK_MESSAGE(checker_always[i].GetStateFor(vpblock.empty() ? nullptr : vpblock.back()) == THRESHOLD_ACTIVE, strprintf("Test %i for ACTIVE (always active)", num));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
num++;
|
num++;
|
||||||
|
@ -1611,11 +1611,12 @@ static ThresholdConditionCache warningcache[VERSIONBITS_NUM_BITS];
|
|||||||
static unsigned int GetBlockScriptFlags(const CBlockIndex* pindex, const Consensus::Params& consensusparams) {
|
static unsigned int GetBlockScriptFlags(const CBlockIndex* pindex, const Consensus::Params& consensusparams) {
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
|
|
||||||
// BIP16 didn't become active until Apr 1 2012
|
unsigned int flags = SCRIPT_VERIFY_NONE;
|
||||||
int64_t nBIP16SwitchTime = 1333238400;
|
|
||||||
bool fStrictPayToScriptHash = (pindex->GetBlockTime() >= nBIP16SwitchTime);
|
|
||||||
|
|
||||||
unsigned int flags = fStrictPayToScriptHash ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE;
|
// Start enforcing P2SH (BIP16)
|
||||||
|
if (pindex->nHeight >= consensusparams.BIP16Height) {
|
||||||
|
flags |= SCRIPT_VERIFY_P2SH;
|
||||||
|
}
|
||||||
|
|
||||||
// Start enforcing the DERSIG (BIP66) rule
|
// Start enforcing the DERSIG (BIP66) rule
|
||||||
if (pindex->nHeight >= consensusparams.BIP66Height) {
|
if (pindex->nHeight >= consensusparams.BIP66Height) {
|
||||||
|
@ -27,6 +27,11 @@ ThresholdState AbstractThresholdConditionChecker::GetStateFor(const CBlockIndex*
|
|||||||
int64_t nTimeStart = BeginTime(params);
|
int64_t nTimeStart = BeginTime(params);
|
||||||
int64_t nTimeTimeout = EndTime(params);
|
int64_t nTimeTimeout = EndTime(params);
|
||||||
|
|
||||||
|
// Check if this deployment is always active.
|
||||||
|
if (nTimeStart == Consensus::BIP9Deployment::ALWAYS_ACTIVE) {
|
||||||
|
return THRESHOLD_ACTIVE;
|
||||||
|
}
|
||||||
|
|
||||||
// A block's state is always the same as that of the first of its period, so it is computed based on a pindexPrev whose height equals a multiple of nPeriod - 1.
|
// A block's state is always the same as that of the first of its period, so it is computed based on a pindexPrev whose height equals a multiple of nPeriod - 1.
|
||||||
if (pindexPrev != nullptr) {
|
if (pindexPrev != nullptr) {
|
||||||
pindexPrev = pindexPrev->GetAncestor(pindexPrev->nHeight - ((pindexPrev->nHeight + 1) % nPeriod));
|
pindexPrev = pindexPrev->GetAncestor(pindexPrev->nHeight - ((pindexPrev->nHeight + 1) % nPeriod));
|
||||||
@ -136,6 +141,11 @@ BIP9Stats AbstractThresholdConditionChecker::GetStateStatisticsFor(const CBlockI
|
|||||||
|
|
||||||
int AbstractThresholdConditionChecker::GetStateSinceHeightFor(const CBlockIndex* pindexPrev, const Consensus::Params& params, ThresholdConditionCache& cache) const
|
int AbstractThresholdConditionChecker::GetStateSinceHeightFor(const CBlockIndex* pindexPrev, const Consensus::Params& params, ThresholdConditionCache& cache) const
|
||||||
{
|
{
|
||||||
|
int64_t start_time = BeginTime(params);
|
||||||
|
if (start_time == Consensus::BIP9Deployment::ALWAYS_ACTIVE) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
const ThresholdState initialState = GetStateFor(pindexPrev, params, cache);
|
const ThresholdState initialState = GetStateFor(pindexPrev, params, cache);
|
||||||
|
|
||||||
// BIP 9 about state DEFINED: "The genesis block is by definition in this state for each deployment."
|
// BIP 9 about state DEFINED: "The genesis block is by definition in this state for each deployment."
|
||||||
|
@ -40,7 +40,9 @@ class NULLDUMMYTest(BitcoinTestFramework):
|
|||||||
def set_test_params(self):
|
def set_test_params(self):
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.extra_args = [['-whitelist=127.0.0.1', '-walletprematurewitness']]
|
# This script tests NULLDUMMY activation, which is part of the 'segwit' deployment, so we go through
|
||||||
|
# normal segwit activation here (and don't use the default always-on behaviour).
|
||||||
|
self.extra_args = [['-whitelist=127.0.0.1', '-walletprematurewitness', '-vbparams=segwit:0:999999999999']]
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
self.address = self.nodes[0].getnewaddress()
|
self.address = self.nodes[0].getnewaddress()
|
||||||
|
@ -93,7 +93,9 @@ class CompactBlocksTest(BitcoinTestFramework):
|
|||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
# Node0 = pre-segwit, node1 = segwit-aware
|
# Node0 = pre-segwit, node1 = segwit-aware
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.extra_args = [["-vbparams=segwit:0:0"], ["-txindex"]]
|
# This test was written assuming SegWit is activated using BIP9 at height 432 (3x confirmation window).
|
||||||
|
# TODO: Rewrite this test to support SegWit being always active.
|
||||||
|
self.extra_args = [["-vbparams=segwit:0:0"], ["-vbparams=segwit:0:999999999999", "-txindex"]]
|
||||||
self.utxos = []
|
self.utxos = []
|
||||||
|
|
||||||
def build_block_on_tip(self, node, segwit=False):
|
def build_block_on_tip(self, node, segwit=False):
|
||||||
|
@ -111,7 +111,8 @@ class SegWitTest(BitcoinTestFramework):
|
|||||||
def set_test_params(self):
|
def set_test_params(self):
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
self.extra_args = [["-whitelist=127.0.0.1"], ["-whitelist=127.0.0.1", "-acceptnonstdtxn=0"], ["-whitelist=127.0.0.1", "-vbparams=segwit:0:0"]]
|
# This test tests SegWit both pre and post-activation, so use the normal BIP9 activation.
|
||||||
|
self.extra_args = [["-whitelist=127.0.0.1", "-vbparams=segwit:0:999999999999"], ["-whitelist=127.0.0.1", "-acceptnonstdtxn=0", "-vbparams=segwit:0:999999999999"], ["-whitelist=127.0.0.1", "-vbparams=segwit:0:0"]]
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
self.setup_nodes()
|
self.setup_nodes()
|
||||||
@ -1493,7 +1494,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
# Restart with the new binary
|
# Restart with the new binary
|
||||||
self.stop_node(node_id)
|
self.stop_node(node_id)
|
||||||
self.start_node(node_id, extra_args=[])
|
self.start_node(node_id, extra_args=["-vbparams=segwit:0:999999999999"])
|
||||||
connect_nodes(self.nodes[0], node_id)
|
connect_nodes(self.nodes[0], node_id)
|
||||||
|
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(self.nodes)
|
||||||
|
@ -77,9 +77,10 @@ class SegWitTest(BitcoinTestFramework):
|
|||||||
def set_test_params(self):
|
def set_test_params(self):
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
self.extra_args = [["-walletprematurewitness", "-rpcserialversion=0"],
|
# This test tests SegWit both pre and post-activation, so use the normal BIP9 activation.
|
||||||
["-blockversion=4", "-promiscuousmempoolflags=517", "-prematurewitness", "-walletprematurewitness", "-rpcserialversion=1"],
|
self.extra_args = [["-walletprematurewitness", "-rpcserialversion=0", "-vbparams=segwit:0:999999999999"],
|
||||||
["-blockversion=536870915", "-promiscuousmempoolflags=517", "-prematurewitness", "-walletprematurewitness"]]
|
["-blockversion=4", "-promiscuousmempoolflags=517", "-prematurewitness", "-walletprematurewitness", "-rpcserialversion=1", "-vbparams=segwit:0:999999999999"],
|
||||||
|
["-blockversion=536870915", "-promiscuousmempoolflags=517", "-prematurewitness", "-walletprematurewitness", "-vbparams=segwit:0:999999999999"]]
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
super().setup_network()
|
super().setup_network()
|
||||||
|
@ -215,7 +215,7 @@ class SendHeadersTest(BitcoinTestFramework):
|
|||||||
connections.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], inv_node))
|
connections.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], inv_node))
|
||||||
# Set nServices to 0 for test_node, so no block download will occur outside of
|
# Set nServices to 0 for test_node, so no block download will occur outside of
|
||||||
# direct fetching
|
# direct fetching
|
||||||
connections.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test_node, services=0))
|
connections.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test_node, services=NODE_WITNESS))
|
||||||
inv_node.add_connection(connections[0])
|
inv_node.add_connection(connections[0])
|
||||||
test_node.add_connection(connections[1])
|
test_node.add_connection(connections[1])
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ class BlockStore():
|
|||||||
def get_blocks(self, inv):
|
def get_blocks(self, inv):
|
||||||
responses = []
|
responses = []
|
||||||
for i in inv:
|
for i in inv:
|
||||||
if (i.type == 2): # MSG_BLOCK
|
if (i.type == 2 or i.type == (2 | (1 << 30))): # MSG_BLOCK or MSG_WITNESS_BLOCK
|
||||||
data = self.get(i.hash)
|
data = self.get(i.hash)
|
||||||
if data is not None:
|
if data is not None:
|
||||||
# Use msg_generic to avoid re-serialization
|
# Use msg_generic to avoid re-serialization
|
||||||
@ -153,7 +153,7 @@ class TxStore():
|
|||||||
def get_transactions(self, inv):
|
def get_transactions(self, inv):
|
||||||
responses = []
|
responses = []
|
||||||
for i in inv:
|
for i in inv:
|
||||||
if (i.type == 1): # MSG_TX
|
if (i.type == 1 or i.type == (1 | (1 << 30))): # MSG_TX or MSG_WITNESS_TX
|
||||||
tx = self.get(i.hash)
|
tx = self.get(i.hash)
|
||||||
if tx is not None:
|
if tx is not None:
|
||||||
responses.append(msg_generic(b"tx", tx))
|
responses.append(msg_generic(b"tx", tx))
|
||||||
|
@ -80,9 +80,9 @@ class TestNode(NodeConnCB):
|
|||||||
[conn.send_message(r) for r in self.tx_store.get_transactions(message.inv)]
|
[conn.send_message(r) for r in self.tx_store.get_transactions(message.inv)]
|
||||||
|
|
||||||
for i in message.inv:
|
for i in message.inv:
|
||||||
if i.type == 1:
|
if i.type == 1 or i.type == 1 | (1 << 30): # MSG_TX or MSG_WITNESS_TX
|
||||||
self.tx_request_map[i.hash] = True
|
self.tx_request_map[i.hash] = True
|
||||||
elif i.type == 2:
|
elif i.type == 2 or i.type == 2 | (1 << 30): # MSG_BLOCK or MSG_WITNESS_BLOCK
|
||||||
self.block_request_map[i.hash] = True
|
self.block_request_map[i.hash] = True
|
||||||
|
|
||||||
def on_inv(self, conn, message):
|
def on_inv(self, conn, message):
|
||||||
|
@ -949,7 +949,7 @@ class msg_version():
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.nVersion = MY_VERSION
|
self.nVersion = MY_VERSION
|
||||||
self.nServices = 1
|
self.nServices = NODE_NETWORK | NODE_WITNESS
|
||||||
self.nTime = int(time.time())
|
self.nTime = int(time.time())
|
||||||
self.addrTo = CAddress()
|
self.addrTo = CAddress()
|
||||||
self.addrFrom = CAddress()
|
self.addrFrom = CAddress()
|
||||||
@ -1649,7 +1649,7 @@ class NodeConn(asyncore.dispatcher):
|
|||||||
"regtest": b"\xfa\xbf\xb5\xda", # regtest
|
"regtest": b"\xfa\xbf\xb5\xda", # regtest
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, dstaddr, dstport, rpc, callback, net="regtest", services=NODE_NETWORK, send_version=True):
|
def __init__(self, dstaddr, dstport, rpc, callback, net="regtest", services=NODE_NETWORK|NODE_WITNESS, send_version=True):
|
||||||
asyncore.dispatcher.__init__(self, map=mininode_socket_map)
|
asyncore.dispatcher.__init__(self, map=mininode_socket_map)
|
||||||
self.dstaddr = dstaddr
|
self.dstaddr = dstaddr
|
||||||
self.dstport = dstport
|
self.dstport = dstport
|
||||||
|
@ -8,10 +8,12 @@ import os
|
|||||||
import struct
|
import struct
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework, SkipTest
|
from test_framework.test_framework import BitcoinTestFramework, SkipTest
|
||||||
|
from test_framework.mininode import CTransaction
|
||||||
from test_framework.util import (assert_equal,
|
from test_framework.util import (assert_equal,
|
||||||
bytes_to_hex_str,
|
bytes_to_hex_str,
|
||||||
hash256,
|
hash256,
|
||||||
)
|
)
|
||||||
|
from io import BytesIO
|
||||||
|
|
||||||
class ZMQSubscriber:
|
class ZMQSubscriber:
|
||||||
def __init__(self, socket, topic):
|
def __init__(self, socket, topic):
|
||||||
@ -93,7 +95,10 @@ class ZMQTest (BitcoinTestFramework):
|
|||||||
|
|
||||||
# Should receive the coinbase raw transaction.
|
# Should receive the coinbase raw transaction.
|
||||||
hex = self.rawtx.receive()
|
hex = self.rawtx.receive()
|
||||||
assert_equal(hash256(hex), txid)
|
tx = CTransaction()
|
||||||
|
tx.deserialize(BytesIO(hex))
|
||||||
|
tx.calc_sha256()
|
||||||
|
assert_equal(tx.hash, bytes_to_hex_str(txid))
|
||||||
|
|
||||||
# Should receive the generated block hash.
|
# Should receive the generated block hash.
|
||||||
hash = bytes_to_hex_str(self.hashblock.receive())
|
hash = bytes_to_hex_str(self.hashblock.receive())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user