mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-02-03 22:03:01 +01:00
RPC: augment getblockchaininfo bip9_softforks data
This commit is contained in:
@@ -105,6 +105,36 @@ ThresholdState AbstractThresholdConditionChecker::GetStateFor(const CBlockIndex*
|
||||
return state;
|
||||
}
|
||||
|
||||
int AbstractThresholdConditionChecker::GetStateSinceHeightFor(const CBlockIndex* pindexPrev, const Consensus::Params& params, ThresholdConditionCache& cache) const
|
||||
{
|
||||
const ThresholdState initialState = GetStateFor(pindexPrev, params, cache);
|
||||
|
||||
// BIP 9 about state DEFINED: "The genesis block is by definition in this state for each deployment."
|
||||
if (initialState == THRESHOLD_DEFINED) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const int nPeriod = Period(params);
|
||||
|
||||
// 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.
|
||||
// To ease understanding of the following height calculation, it helps to remember that
|
||||
// right now pindexPrev points to the block prior to the block that we are computing for, thus:
|
||||
// if we are computing for the last block of a period, then pindexPrev points to the second to last block of the period, and
|
||||
// if we are computing for the first block of a period, then pindexPrev points to the last block of the previous period.
|
||||
// The parent of the genesis block is represented by NULL.
|
||||
pindexPrev = pindexPrev->GetAncestor(pindexPrev->nHeight - ((pindexPrev->nHeight + 1) % nPeriod));
|
||||
|
||||
const CBlockIndex* previousPeriodParent = pindexPrev->GetAncestor(pindexPrev->nHeight - nPeriod);
|
||||
|
||||
while (previousPeriodParent != NULL && GetStateFor(previousPeriodParent, params, cache) == initialState) {
|
||||
pindexPrev = previousPeriodParent;
|
||||
previousPeriodParent = pindexPrev->GetAncestor(pindexPrev->nHeight - nPeriod);
|
||||
}
|
||||
|
||||
// Adjust the result because right now we point to the parent block.
|
||||
return pindexPrev->nHeight + 1;
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
/**
|
||||
@@ -137,6 +167,11 @@ ThresholdState VersionBitsState(const CBlockIndex* pindexPrev, const Consensus::
|
||||
return VersionBitsConditionChecker(pos).GetStateFor(pindexPrev, params, cache.caches[pos]);
|
||||
}
|
||||
|
||||
int VersionBitsStateSinceHeight(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::DeploymentPos pos, VersionBitsCache& cache)
|
||||
{
|
||||
return VersionBitsConditionChecker(pos).GetStateSinceHeightFor(pindexPrev, params, cache.caches[pos]);
|
||||
}
|
||||
|
||||
uint32_t VersionBitsMask(const Consensus::Params& params, Consensus::DeploymentPos pos)
|
||||
{
|
||||
return VersionBitsConditionChecker(pos).Mask(params);
|
||||
|
||||
Reference in New Issue
Block a user