wo ist die Anpassungsrechnung für den Zielwert im Quellcode?

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.

Antworten (1)

Die Funktion ist CalculateNextWorkRequiredin pow.cppL#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)

Danke. Wann wird Retargeting deaktiviert? Wie kommt das rein?
Und wo in diesem Code ist der legendäre defekte und nicht behobene Fehler, der alle 2015 statt 2016-Blöcke aktualisiert?