Wo im Code im Satoshi-Client ist die Obergrenze von 21 Millionen implementiert?

Welches Fragment des Satoshi-Clients überprüft, ob der angekündigte Block eine gültige Belohnung hat?

Ich meine, wir leben jetzt in der 25-BTC-Belohnungsperiode. Ich schätze, der Kunde führt nach Erhalt eines neu geprägten Blocks Überprüfungen durch, wie zum Beispiel die Überprüfung, ob Ein- und Ausgänge ausgeglichen sind, und ich schätze, ob die Belohnung 25 BTC beträgt, richtig?

Wo ist also dieses Fragment des Codes?

Ich weiß, wo der Code ist, der das BTC-Angebot auf 21 Millionen begrenzt :

    int64 static GetBlockValue(int nHeight, int64 nFees)
    {
        int64 nSubsidy = 50 * COIN;

        // Subsidy is cut in half every 210000 blocks, which will occur approximately every 4 years
        nSubsidy >>= (nHeight / 210000);

        return nSubsidy + nFees;
    }

...und ich suche jemanden, der mich an die richtige Stelle weist, wo die Überprüfung durchgeführt wird.

Nur eine Anmerkung, dass sich der relevante Code jetzt hier befindet: github.com/bitcoin/bitcoin/blob/… (es ist auch ein Link, der für immer funktionieren sollte 🤞🏻).

Antworten (1)

Es gibt 3 Stellen, an denen GetBlockValue aufgerufen wird. Einer befindet sich auf eingehenden Blöcken, einer auf Blöcken, die wir abbauen, und einer ist eine Fehlermeldung. Dies ist derjenige für eingehende Blöcke:

if (vtx[0].GetValueOut() > GetBlockValue(pindex->nHeight, nFees))
    return state.DoS(100, error("ConnectBlock() : coinbase pays too much (actual=%"PRI64d" vs limit=%"PRI64d")", vtx[0].GetValueOut(), GetBlockValue(pindex->nHeight, nFees)));

Quelle

Dieser betrachtet die erste Transaktion (die Coinbase-Transaktion) und prüft den Wert. Wenn es größer ist als die Subvention plus die Gebühren, dann wird der Block abgelehnt und der Knoten, der den Block gesendet hat, wird auf die schwarze Liste gesetzt.

Schlagen Sie mich um eine Sekunde, als Sie dies posten.
@DavidOgren Wir waren alle schon einmal dort. :|
Deine war sowieso ausführlicher in der Erklärung als meine.