Warum kann die Coinbase des Genesis-Blocks nicht ausgegeben werden?

Laut Bitcoin-Wiki :

Die erste 50-BTC-Block-Belohnung ging an die Adresse 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa , obwohl diese Belohnung aufgrund einer Eigenart in der Art und Weise, wie der Genesis-Block im Code ausgedrückt wird, nicht ausgegeben werden kann (dies könnte beabsichtigt gewesen sein).

Aber wo ist diese Macke? Wie würden Sie es ändern, damit es ausgegeben werden kann?

Man muss bedenken, dass 50 BTC damals buchstäblich 0 Cent kosteten. Ich bezweifle, dass er sich Gedanken darüber gemacht hat, ob dies beabsichtigt ist oder nicht.
Vielleicht liegt es daran, dass die 50 BTC-Belohnung technisch vorgeprägt ist, da der Code 6 Tage später veröffentlicht wurde. Technisch gesehen wäre es also unfair gewesen, wenn Satoshi diese Münzen ausgeben könnte. Meiner Meinung nach ist das eine weitere Schönheit von Bitcoin.

Antworten (3)

Wenn ein Knoten gestartet wird, initialisiert er seine Kopie der Blockdatenbank zusammen mit dem Genesis-Block und beginnt dann mit dem Synchronisationsprozess. Aus irgendeinem Grund entschied sich Satoshi, die Coinbase-Transaktion aus dem Genesis-Block nicht zur globalen Transaktionsdatenbank hinzuzufügen. Somit würden alle Knoten im Netzwerk die Sperre ablehnen.

Ich bin mir nicht sicher, ob dies absichtlich getan wurde oder ob es einfach ein Versehen war. Auf jeden Fall ist es für immer an 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa gebunden.

Wie würden Sie es ändern, damit es ausgegeben werden kann? Fügen Sie dies der Hardfork-Liste hinzu
Woher wissen wir davon, wenn es nicht in der Datenbank ist?
Wir wissen, dass es nicht in der Datenbank ist, denn wenn Sie es getrawtransaction 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33büber RPC-Aufrufe tun, gibt es einen Fehler zurück, obwohl Sie zu einem Block-Explorer gehen können (wie hier ) und sehen können, dass dies die Coinbase-Transaktion des Genesis-Blocks ist.
(Auch wenn -txindex=1aktiviert)

Wie würden Sie es ändern, damit es ausgegeben werden kann?

Um die Coinbase ausgabefähig zu machen, müssen die folgenden Änderungen an der Validation.cpp (v0.16.2) vorgenommen werden. Hinweis : Wie bereits erwähnt, würde dies als Hard Fork angesehen werden.

Schritt 1 - Deaktivieren Sie das Überspringen des Genesis-Blocks (der den Fehler als Teil des Konsens behalten soll), Zeile 1818 :

// Special case for the genesis block, skipping connection of its transactions
    // (its coinbase is unspendable)
    if (block.GetHash() == chainparams.GetConsensus().hashGenesisBlock) {
        if (!fJustCheck)
            view.SetBestBlock(pindex->GetBlockHash());
        // return true; <- comment this line out
}

Schritt 2 – Überspringe die Behauptung des vorherigen Blocks für den Genesis-Block, Zeile 1874 :

if (block.GetHash() != chainparams.GetConsensus().hashGenesisBlock) {
    assert(pindex->pprev);
}

Schritt 3 - Überspringen Sie das Schreiben von Undo-Daten für den Genesis-Block, Zeile 1989 :

if (block.GetHash() != chainparams.GetConsensus().hashGenesisBlock)
{
    if (!WriteUndoDataForBlock(blockundo, state, pindex, chainparams))
        return false;
} 

Zumindest bei aktuellen Versionen des Bitcoin Core-Clients ist der Genesis-Block tatsächlich fest in den Client codiert.

Der Teil des Codes, der diesen Block erstellt, befindet sich hier und ich habe unten einen JSON-Dump der Coinbase-Transaktion als Referenz beigefügt.

{
    "txid" : "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
    "version" : 1,
    "locktime" : 0,
    "vin" : [
        {
            "coinbase" : "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73",
            "sequence" : 4294967295
        }
    ],
    "vout" : [
        {
            "value" : 50.00000000,
            "n" : 0,
            "scriptPubKey" : {
                "asm" : "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG",
                "hex" : "4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac",
                "reqSigs" : 1,
                "type" : "pubkey",
                "addresses" : [
                    "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"
                ]
            }
        }
    ]
}

Referenz Gist

Diese Antwort könnte verbessert werden, indem angesprochen wird, warum die Ausgabe des Genesis-Blocks nicht ausgegeben werden kann.