Merge #11737: Document partial validation in ConnectBlock()
9d811dc
Document partial validation in ConnectBlock() (Suhas Daftuar)
Pull request description:
`ConnectBlock()` relies on validation that happens in `ContextualCheckBlock()` and
`ContextualCheckBlockHeader()`. This has implications for implementing consensus
changes and handling software upgrade to ensure that nodes upgrading their
software end up enforcing all the consensus rules.
Tree-SHA512: 36a252af2221b0e5d5d6f8d5f8b16f8b566ca0db2d56242130a5523302c8757599ac234594a6a946c1689b260d18a32c2c7f8c3831304e78b9832e2ce5ac435a
This commit is contained in:
commit
46d1ebfcf8
1 changed files with 25 additions and 1 deletions
|
@ -1667,6 +1667,18 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd
|
||||||
int64_t nTimeStart = GetTimeMicros();
|
int64_t nTimeStart = GetTimeMicros();
|
||||||
|
|
||||||
// Check it again in case a previous version let a bad block in
|
// Check it again in case a previous version let a bad block in
|
||||||
|
// NOTE: We don't currently (re-)invoke ContextualCheckBlock() or
|
||||||
|
// ContextualCheckBlockHeader() here. This means that if we add a new
|
||||||
|
// consensus rule that is enforced in one of those two functions, then we
|
||||||
|
// may have let in a block that violates the rule prior to updating the
|
||||||
|
// software, and we would NOT be enforcing the rule here. Fully solving
|
||||||
|
// upgrade from one software version to the next after a consensus rule
|
||||||
|
// change is potentially tricky and issue-specific (see RewindBlockIndex()
|
||||||
|
// for one general approach that was used for BIP 141 deployment).
|
||||||
|
// Also, currently the rule against blocks more than 2 hours in the future
|
||||||
|
// is enforced in ContextualCheckBlockHeader(); we wouldn't want to
|
||||||
|
// re-enforce that rule here (at least until we make it impossible for
|
||||||
|
// GetAdjustedTime() to go backward).
|
||||||
if (!CheckBlock(block, state, chainparams.GetConsensus(), !fJustCheck, !fJustCheck))
|
if (!CheckBlock(block, state, chainparams.GetConsensus(), !fJustCheck, !fJustCheck))
|
||||||
return error("%s: Consensus::CheckBlock: %s", __func__, FormatStateMessage(state));
|
return error("%s: Consensus::CheckBlock: %s", __func__, FormatStateMessage(state));
|
||||||
|
|
||||||
|
@ -2952,7 +2964,13 @@ std::vector<unsigned char> GenerateCoinbaseCommitment(CBlock& block, const CBloc
|
||||||
|
|
||||||
/** Context-dependent validity checks.
|
/** Context-dependent validity checks.
|
||||||
* By "context", we mean only the previous block headers, but not the UTXO
|
* By "context", we mean only the previous block headers, but not the UTXO
|
||||||
* set; UTXO-related validity checks are done in ConnectBlock(). */
|
* set; UTXO-related validity checks are done in ConnectBlock().
|
||||||
|
* NOTE: This function is not currently invoked by ConnectBlock(), so we
|
||||||
|
* should consider upgrade issues if we change which consensus rules are
|
||||||
|
* enforced in this function (eg by adding a new consensus rule). See comment
|
||||||
|
* in ConnectBlock().
|
||||||
|
* Note that -reindex-chainstate skips the validation that happens here!
|
||||||
|
*/
|
||||||
static bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, const CChainParams& params, const CBlockIndex* pindexPrev, int64_t nAdjustedTime)
|
static bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, const CChainParams& params, const CBlockIndex* pindexPrev, int64_t nAdjustedTime)
|
||||||
{
|
{
|
||||||
assert(pindexPrev != nullptr);
|
assert(pindexPrev != nullptr);
|
||||||
|
@ -2992,6 +3010,12 @@ static bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationSta
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** NOTE: This function is not currently invoked by ConnectBlock(), so we
|
||||||
|
* should consider upgrade issues if we change which consensus rules are
|
||||||
|
* enforced in this function (eg by adding a new consensus rule). See comment
|
||||||
|
* in ConnectBlock().
|
||||||
|
* Note that -reindex-chainstate skips the validation that happens here!
|
||||||
|
*/
|
||||||
static bool ContextualCheckBlock(const CBlock& block, CValidationState& state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)
|
static bool ContextualCheckBlock(const CBlock& block, CValidationState& state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)
|
||||||
{
|
{
|
||||||
const int nHeight = pindexPrev == nullptr ? 0 : pindexPrev->nHeight + 1;
|
const int nHeight = pindexPrev == nullptr ? 0 : pindexPrev->nHeight + 1;
|
||||||
|
|
Loading…
Add table
Reference in a new issue