mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-06-02 23:42:33 +02:00
feat: 2 types of timespan for ASERT
This commit is contained in:
parent
dfa35b361e
commit
be8a325252
@ -78,6 +78,8 @@ public:
|
||||
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||
consensus.nPowTargetTimespan = 24 * 60 * 60; // one day
|
||||
consensus.nPowTargetSpacing = 30;
|
||||
consensus.nPowTargetSpacingLegacy = 45;
|
||||
consensus.nPowTargetSpacingAuxPow = 90;
|
||||
consensus.fPowAllowMinDifficultyBlocks = false;
|
||||
consensus.fPowNoRetargeting = false;
|
||||
consensus.nRuleChangeActivationThreshold = 2592; // 90% of 2880
|
||||
@ -102,16 +104,15 @@ public:
|
||||
consensus.nMinimumChainWork = uint256S("");
|
||||
consensus.defaultAssumeValid = uint256S("");
|
||||
|
||||
consensus.nAuxpowChainId = 0x0003;
|
||||
consensus.nAuxpowStartHeight = 3;
|
||||
consensus.nAuxpowChainId = 0x2024;
|
||||
consensus.fStrictChainId = true;
|
||||
|
||||
// Anchor params: Note that the block after this height *must* also be checkpointed below.
|
||||
consensus.asertAnchorParams = Consensus::Params::ASERTAnchor{
|
||||
1, // anchor block height
|
||||
0x1804dafe, // anchor block nBits
|
||||
0x1804dafe, // anchor block nBits for auxpow
|
||||
1605447844, // anchor block previous block timestamp
|
||||
0x1d00ffff, // anchor block nBits
|
||||
0x1d00ffff, // anchor block nBits for auxpow
|
||||
1721369687, // anchor block previous block timestamp
|
||||
};
|
||||
|
||||
/**
|
||||
@ -160,7 +161,7 @@ public:
|
||||
checkpointData = {
|
||||
{
|
||||
{0, uint256S("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")},
|
||||
{1, uint256S("00000000067e53da31878d29e76cc124468892658f1c763ab047c0c1fcfc73f5")},
|
||||
{1, uint256S("000000008fbbbe27a3e408afd8178e22de95253b52f7fc4372cb6e3cd5aa0ebc")},
|
||||
}
|
||||
};
|
||||
|
||||
@ -199,6 +200,8 @@ public:
|
||||
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||
consensus.nPowTargetTimespan = 24 * 60 * 60; // one day
|
||||
consensus.nPowTargetSpacing = 30;
|
||||
consensus.nPowTargetSpacingLegacy = 45;
|
||||
consensus.nPowTargetSpacingAuxPow = 90;
|
||||
consensus.fPowAllowMinDifficultyBlocks = true;
|
||||
consensus.fPowNoRetargeting = false;
|
||||
consensus.nRuleChangeActivationThreshold = 2160; // 75% for testchains
|
||||
@ -223,16 +226,15 @@ public:
|
||||
consensus.nMinimumChainWork = uint256S("");
|
||||
consensus.defaultAssumeValid = uint256S("");
|
||||
|
||||
consensus.nAuxpowStartHeight = 3;
|
||||
consensus.nAuxpowChainId = 0x0003;
|
||||
consensus.nAuxpowChainId = 0x2024;
|
||||
consensus.fStrictChainId = false;
|
||||
|
||||
// Anchor params: Note that the block after this height *must* also be checkpointed below.
|
||||
consensus.asertAnchorParams = Consensus::Params::ASERTAnchor{
|
||||
1, // anchor block height
|
||||
1, // anchor block height
|
||||
0x1d00ffff, // anchor block nBits
|
||||
0x1d00ffff, // anchor block nBits for auxpow
|
||||
1605445400, // anchor block previous block timestamp
|
||||
1721369687, // anchor block previous block timestamp
|
||||
};
|
||||
|
||||
pchMessageStart[0] = 0x0b;
|
||||
@ -346,6 +348,8 @@ public:
|
||||
consensus.SegwitHeight = 1;
|
||||
consensus.nPowTargetTimespan = 24 * 60 * 60; // one day
|
||||
consensus.nPowTargetSpacing = 30;
|
||||
consensus.nPowTargetSpacingLegacy = 45;
|
||||
consensus.nPowTargetSpacingAuxPow = 90;
|
||||
consensus.fPowAllowMinDifficultyBlocks = false;
|
||||
consensus.fPowNoRetargeting = false;
|
||||
consensus.nRuleChangeActivationThreshold = 2592; // 90% of 2880
|
||||
@ -369,8 +373,7 @@ public:
|
||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay
|
||||
|
||||
consensus.nAuxpowStartHeight = 3;
|
||||
consensus.nAuxpowChainId = 0x0003;
|
||||
consensus.nAuxpowChainId = 0x2024;
|
||||
consensus.fStrictChainId = true;
|
||||
|
||||
// Anchor params: Note that the block after this height *must* also be checkpointed below.
|
||||
@ -378,7 +381,7 @@ public:
|
||||
1, // anchor block height
|
||||
0x1d00ffff, // anchor block nBits
|
||||
0x1d00ffff, // anchor block nBits for auxpow
|
||||
1605445400, // anchor block previous block timestamp
|
||||
1721369687, // anchor block previous block timestamp
|
||||
};
|
||||
|
||||
|
||||
@ -435,6 +438,8 @@ public:
|
||||
consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||
consensus.nPowTargetTimespan = 24 * 60 * 60; // one day
|
||||
consensus.nPowTargetSpacing = 30;
|
||||
consensus.nPowTargetSpacingLegacy = 45;
|
||||
consensus.nPowTargetSpacingAuxPow = 90;
|
||||
consensus.fPowAllowMinDifficultyBlocks = true;
|
||||
consensus.fPowNoRetargeting = true;
|
||||
consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains
|
||||
@ -458,8 +463,7 @@ public:
|
||||
consensus.nMinimumChainWork = uint256{};
|
||||
consensus.defaultAssumeValid = uint256{};
|
||||
|
||||
consensus.nAuxpowStartHeight = 3;
|
||||
consensus.nAuxpowChainId = 0x0003;
|
||||
consensus.nAuxpowChainId = 0x2024;
|
||||
consensus.fStrictChainId = true;
|
||||
|
||||
// RegTest has no hard-coded anchor block
|
||||
|
@ -109,6 +109,8 @@ struct Params {
|
||||
bool fPowAllowMinDifficultyBlocks;
|
||||
bool fPowNoRetargeting;
|
||||
int64_t nPowTargetSpacing;
|
||||
int64_t nPowTargetSpacingLegacy;
|
||||
int64_t nPowTargetSpacingAuxPow;
|
||||
int64_t nASERTHalfLife;
|
||||
int64_t nPowTargetTimespan;
|
||||
std::chrono::seconds PowTargetSpacing() const
|
||||
@ -124,7 +126,7 @@ struct Params {
|
||||
/** Used by the ASERT DAA activated */
|
||||
struct ASERTAnchor {
|
||||
int nHeight;
|
||||
uint32_t nBits;
|
||||
uint32_t nBitsLegacy;
|
||||
uint32_t nBitsAuxPow;
|
||||
int64_t nBlockTime;
|
||||
};
|
||||
@ -158,7 +160,6 @@ struct Params {
|
||||
|
||||
/** Auxpow parameters */
|
||||
int32_t nAuxpowChainId;
|
||||
int nAuxpowStartHeight;
|
||||
bool fStrictChainId;
|
||||
};
|
||||
|
||||
|
30
src/pow.cpp
30
src/pow.cpp
@ -39,7 +39,13 @@ static uint32_t GetNextASERTWorkRequired(const CBlockIndex *pindexPrev,
|
||||
// as per the formula the timestamp of block M-1 must be used if the anchor is M.
|
||||
assert(pindexPrev->pprev != nullptr);
|
||||
|
||||
const arith_uint256 refBlockTarget = arith_uint256().SetCompact(anchorParams.nBits);
|
||||
uint32_t anchornBits = anchorParams.nBitsLegacy;
|
||||
int64_t nPowTargetSpacing = params.nPowTargetSpacingLegacy;
|
||||
if (pblock->IsAuxpow()) {
|
||||
anchornBits = anchorParams.nBitsAuxPow;
|
||||
nPowTargetSpacing = params.nPowTargetSpacingAuxPow;
|
||||
}
|
||||
const arith_uint256 refBlockTarget = arith_uint256().SetCompact(anchornBits);
|
||||
|
||||
// Time difference is from anchor block's timestamp
|
||||
const int64_t nTimeDiff = pindexPrev->GetBlockTime() - anchorParams.nBlockTime;
|
||||
@ -49,7 +55,7 @@ static uint32_t GetNextASERTWorkRequired(const CBlockIndex *pindexPrev,
|
||||
// Do the actual target adaptation calculation in separate
|
||||
// CalculateASERT() function
|
||||
arith_uint256 nextTarget = CalculateASERT(refBlockTarget,
|
||||
params.nPowTargetSpacing,
|
||||
nPowTargetSpacing,
|
||||
nTimeDiff,
|
||||
nHeightDiff,
|
||||
powLimit,
|
||||
@ -158,7 +164,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead
|
||||
|
||||
assert(params.asertAnchorParams.nHeight > 0);
|
||||
if (pindexLast->nHeight <= params.asertAnchorParams.nHeight) {
|
||||
return params.asertAnchorParams.nBits;
|
||||
return params.asertAnchorParams.nBitsLegacy;
|
||||
}
|
||||
|
||||
// Special difficulty rule for testnet
|
||||
@ -166,11 +172,25 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead
|
||||
// mining of a min-difficulty block.
|
||||
if (params.fPowAllowMinDifficultyBlocks &&
|
||||
(pblock->GetBlockTime() >
|
||||
pindexLast->GetBlockTime() + 2 * params.nPowTargetSpacing)) {
|
||||
pindexLast->GetBlockTime() + 2 * params.nPowTargetSpacingAuxPow)) {
|
||||
return UintToArith256(params.powLimit).GetCompact();
|
||||
}
|
||||
|
||||
return GetNextASERTWorkRequired(pindexLast, pblock, params);
|
||||
// Slow path: walk back until we find the first same version block
|
||||
const CBlockIndex *pindexPrev = pindexLast;
|
||||
|
||||
while (pindexPrev->GetPureHeader().IsAuxpow() != pblock->IsAuxpow()) {
|
||||
if (pindexPrev->nHeight <= params.asertAnchorParams.nHeight) {
|
||||
if (pblock->IsAuxpow()) {
|
||||
return params.asertAnchorParams.nBitsAuxPow;
|
||||
} else {
|
||||
return params.asertAnchorParams.nBitsLegacy;
|
||||
}
|
||||
}
|
||||
pindexPrev = pindexPrev->pprev;
|
||||
}
|
||||
|
||||
return GetNextASERTWorkRequired(pindexPrev, pblock, params);
|
||||
}
|
||||
|
||||
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
|
||||
|
Loading…
Reference in New Issue
Block a user