From 9fe43cdf868abfbf60b28b08aa0f51d5f675b2fc Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Fri, 31 May 2019 13:16:05 -0400 Subject: [PATCH] Introduce contextual block checks for dynafed --- src/validation.cpp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/validation.cpp b/src/validation.cpp index d507deb5ac..212a83b412 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -43,6 +43,7 @@ // ELEMENTS #include // CheckChallenge, CheckProof +#include #include #include @@ -3458,6 +3459,36 @@ std::vector GenerateCoinbaseCommitment(CBlock& block, const CBloc // ELEMENTS +static bool ContextualCheckDynaFedHeader(const CBlockHeader& block, CValidationState& state, const CChainParams& params, const CBlockIndex* pindexPrev) +{ + // When not active, it's a NOP + if (!IsDynaFedEnabled(pindexPrev, params.GetConsensus())) { + return true; + } + + const DynaFedParams& d_params = block.m_dyna_params; + + // Dynamic blocks must at least publish current signblockscript in full + if (d_params.m_current.IsNull()) { + return state.Invalid(false, REJECT_INVALID, "invalid-dyna-fed", "dynamic block headers must have non-empty current signblockscript field"); + } + + // Make sure extension bits aren't active, reserved for future HF + uint32_t reserved_mask = (1<<23) | (1<<24) | (1<<25) | (1<<26); + if ((block.nVersion & reserved_mask) != 0) { + return state.Invalid(false, REJECT_INVALID, "invalid-dyna-fed", "dynamic block header has unknown HF extension bits set"); + } + + const ConsensusParamEntry expected_current_params = ComputeNextBlockCurrentParameters(pindexPrev, params.GetConsensus()); + + if (expected_current_params != d_params.m_current) { + return state.Invalid(false, REJECT_INVALID, "invalid-dyna-fed", "dynamic block header's current parameters do not match expected"); + } + + return true; +} + + /** Context-dependent validity checks. * By "context", we mean only the previous block headers, but not the UTXO * set; UTXO-related validity checks are done in ConnectBlock(). @@ -3508,6 +3539,12 @@ static bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationSta return state.Invalid(false, REJECT_OBSOLETE, strprintf("bad-version(0x%08x)", block.nVersion), strprintf("rejected nVersion=0x%08x block", block.nVersion)); + // check for dynamic federations activation, then ensuring block header version + // bits are set. These bits drive serialization of the header. + if (!ContextualCheckDynaFedHeader(block, state, params, pindexPrev)) { + return false; + } + return true; }