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?
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.
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.-txindex=1
aktiviert)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
EralpB
Coding-Enthusiast