Warum ändert sich durch das Ändern von MAX_MONEY nicht die maximale Anzahl an Coins?

Ich habe MAX_MONEY geändert , um die Anzahl der in meinem Altcoin ausgegebenen Münzen zu verringern, aber es funktioniert nicht.

Warum?

Überprüfen Sie, wo MAX_MONEY verwendet wird, und Sie werden sehen, dass dies keinen Einfluss auf die Subvention hat. Es begrenzt nur die Werte, die in Transaktionen zulässig sind.

Antworten (1)

Trotz des Namens wird die MAX_MONEYKonstante nicht zur Bestimmung der maximalen Gesamtzahl von Münzen verwendet. Vielmehr wird es nur für eine Plausibilitätsprüfung verwendet: Jede Transaktionsausgabe, die größer als MAX_MONEYist, wird automatisch als ungültig zurückgewiesen. Sie setzen diese neue Konstante einfach gleich der eventuellen maximalen Anzahl von Bitcoins, da dies ein Wert ist, der sicherlich von keiner Ausgabe überschritten werden sollte. Dies war Teil der Behebung eines frühen Fehlers , bei dem nur die Summe aller Ausgaben für eine Transaktion überprüft wurde, was zu der Möglichkeit führte, dass die Addition überlaufen könnte.

Die Blocksubvention (auch bekannt als Belohnung) wird in der GetBlockSubsidyFunktion in berechnet validation.cpp.

CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
    int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
    // Force block reward to zero when right shift is undefined.
    if (halvings >= 64)
        return 0;

    CAmount nSubsidy = 50 * COIN;
    // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
    nSubsidy >>= halvings;
    return nSubsidy;
}

Hier können Sie sehen, dass die anfängliche Blockbelohnung von 50 Münzen fest codiert ist. Das Halbierungsintervall consensusParams.nSubsidyHalvingIntervalwird chainparams.cppin den Konstruktoren für bzw. CMainParamsgesetzt (die jeweiligen Standardwerte sind 210000, 210000, 150). Beachten Sie, dass nicht angezeigt wird.CTestNetParamsCRegTestParamsMAX_MONEY

Um also die Gesamtgeldmenge Ihrer Münze zu ändern, müssen Sie ein wenig rechnen, um zu entscheiden, wie die anfängliche Blockbelohnung und das Halbierungsintervall aussehen sollten, und sie entsprechend ändern. Wenn Sie möchten, dass die Belohnung durch einen anderen Mechanismus angepasst wird als „halbieren Sie weiter, bis die Belohnung Null erreicht“, dann müssen Sie die GetBlockSubsidyFunktion neu schreiben. (Und Sie sollten auch zu einem geeigneten Wert wechseln MAX_MONEY, der niemals von einer Transaktionsausgabe überschritten werden sollte.)