Kann mir jemand den Quellcode zeigen und erklären, wie der Durchschnitt für die Schwierigkeitsanpassung berechnet wird, die jedes Jahr 2016 stattfindet? Update: Ich habe frühere Fragen konsultiert, aber es wurde nicht richtig dokumentiert, und ich bin kein Experte, also wäre ich sehr dankbar.
Die Funktion ist CalculateNextWorkRequired
in pow.cpp
L#49 :
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
{
if (params.fPowNoRetargeting)
return pindexLast->nBits;
// Limit adjustment step
int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
if (nActualTimespan < params.nPowTargetTimespan/4)
nActualTimespan = params.nPowTargetTimespan/4;
if (nActualTimespan > params.nPowTargetTimespan*4)
nActualTimespan = params.nPowTargetTimespan*4;
// Retarget
const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
arith_uint256 bnNew;
bnNew.SetCompact(pindexLast->nBits);
bnNew *= nActualTimespan;
bnNew /= params.nPowTargetTimespan;
if (bnNew > bnPowLimit)
bnNew = bnPowLimit;
return bnNew.GetCompact();
}
Erläuterung :
1. Wenn Retargeting deaktiviert ist, geben Sie die letzte Schwierigkeit zurück.
2. Berechnen Sie die Zeitspanne zwischen dem letzten Block und vor 2016 Blöcken
. 3. Kürzen Sie die Zeitspanne auf nicht weniger als 1/4 der Zielzeitspanne (3,5 Tage) oder nicht mehr als das 4-fache der Zielzeitspanne (8 Wochen).
4. Multiplizieren Sie das letzte Schwierigkeitsziel mit dem Verhältnis actualTimespan:targetTimespan
5. Kürzen Sie auf das maximal zulässige Ziel (bnPowLimit), wenn das resultierende Ziel zu hoch ist (sehr niedriger Schwierigkeitsgrad)
Fritz
Fritz
JBaczuk
JBaczuk