|
|
|
@ -312,6 +312,9 @@ bool CheckSequenceLocks(const CTransaction &tx, int flags, LockPoints* lp, bool
@@ -312,6 +312,9 @@ bool CheckSequenceLocks(const CTransaction &tx, int flags, LockPoints* lp, bool
|
|
|
|
|
return EvaluateSequenceLocks(index, lockPair); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Returns the script flags which should be checked for a given block
|
|
|
|
|
static unsigned int GetBlockScriptFlags(const CBlockIndex* pindex, const Consensus::Params& chainparams); |
|
|
|
|
|
|
|
|
|
static void LimitMempoolSize(CTxMemPool& pool, size_t limit, unsigned long age) { |
|
|
|
|
int expired = pool.Expire(GetTime() - age); |
|
|
|
|
if (expired != 0) { |
|
|
|
@ -1475,6 +1478,41 @@ public:
@@ -1475,6 +1478,41 @@ public:
|
|
|
|
|
// Protected by cs_main
|
|
|
|
|
static ThresholdConditionCache warningcache[VERSIONBITS_NUM_BITS]; |
|
|
|
|
|
|
|
|
|
static unsigned int GetBlockScriptFlags(const CBlockIndex* pindex, const Consensus::Params& consensusparams) { |
|
|
|
|
AssertLockHeld(cs_main); |
|
|
|
|
|
|
|
|
|
// BIP16 didn't become active until Apr 1 2012
|
|
|
|
|
int64_t nBIP16SwitchTime = 1333238400; |
|
|
|
|
bool fStrictPayToScriptHash = (pindex->GetBlockTime() >= nBIP16SwitchTime); |
|
|
|
|
|
|
|
|
|
unsigned int flags = fStrictPayToScriptHash ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE; |
|
|
|
|
|
|
|
|
|
// Start enforcing the DERSIG (BIP66) rule
|
|
|
|
|
if (pindex->nHeight >= consensusparams.BIP66Height) { |
|
|
|
|
flags |= SCRIPT_VERIFY_DERSIG; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Start enforcing CHECKLOCKTIMEVERIFY (BIP65) rule
|
|
|
|
|
if (pindex->nHeight >= consensusparams.BIP65Height) { |
|
|
|
|
flags |= SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Start enforcing BIP68 (sequence locks) and BIP112 (CHECKSEQUENCEVERIFY) using versionbits logic.
|
|
|
|
|
if (VersionBitsState(pindex->pprev, consensusparams, Consensus::DEPLOYMENT_CSV, versionbitscache) == THRESHOLD_ACTIVE) { |
|
|
|
|
flags |= SCRIPT_VERIFY_CHECKSEQUENCEVERIFY; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Start enforcing WITNESS rules using versionbits logic.
|
|
|
|
|
if (IsWitnessEnabled(pindex->pprev, consensusparams)) { |
|
|
|
|
flags |= SCRIPT_VERIFY_WITNESS; |
|
|
|
|
flags |= SCRIPT_VERIFY_NULLDUMMY; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return flags; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int64_t nTimeCheck = 0; |
|
|
|
|
static int64_t nTimeForks = 0; |
|
|
|
|
static int64_t nTimeVerify = 0; |
|
|
|
@ -1578,34 +1616,14 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd
@@ -1578,34 +1616,14 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// BIP16 didn't become active until Apr 1 2012
|
|
|
|
|
int64_t nBIP16SwitchTime = 1333238400; |
|
|
|
|
bool fStrictPayToScriptHash = (pindex->GetBlockTime() >= nBIP16SwitchTime); |
|
|
|
|
|
|
|
|
|
unsigned int flags = fStrictPayToScriptHash ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE; |
|
|
|
|
|
|
|
|
|
// Start enforcing the DERSIG (BIP66) rule
|
|
|
|
|
if (pindex->nHeight >= chainparams.GetConsensus().BIP66Height) { |
|
|
|
|
flags |= SCRIPT_VERIFY_DERSIG; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Start enforcing CHECKLOCKTIMEVERIFY (BIP65) rule
|
|
|
|
|
if (pindex->nHeight >= chainparams.GetConsensus().BIP65Height) { |
|
|
|
|
flags |= SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Start enforcing BIP68 (sequence locks) and BIP112 (CHECKSEQUENCEVERIFY) using versionbits logic.
|
|
|
|
|
int nLockTimeFlags = 0; |
|
|
|
|
if (VersionBitsState(pindex->pprev, chainparams.GetConsensus(), Consensus::DEPLOYMENT_CSV, versionbitscache) == THRESHOLD_ACTIVE) { |
|
|
|
|
flags |= SCRIPT_VERIFY_CHECKSEQUENCEVERIFY; |
|
|
|
|
nLockTimeFlags |= LOCKTIME_VERIFY_SEQUENCE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Start enforcing WITNESS rules using versionbits logic.
|
|
|
|
|
if (IsWitnessEnabled(pindex->pprev, chainparams.GetConsensus())) { |
|
|
|
|
flags |= SCRIPT_VERIFY_WITNESS; |
|
|
|
|
flags |= SCRIPT_VERIFY_NULLDUMMY; |
|
|
|
|
} |
|
|
|
|
// Get the script flags for this block
|
|
|
|
|
unsigned int flags = GetBlockScriptFlags(pindex, chainparams.GetConsensus()); |
|
|
|
|
|
|
|
|
|
int64_t nTime2 = GetTimeMicros(); nTimeForks += nTime2 - nTime1; |
|
|
|
|
LogPrint(BCLog::BENCH, " - Fork checks: %.2fms [%.2fs]\n", 0.001 * (nTime2 - nTime1), nTimeForks * 0.000001); |
|
|
|
|