Según la wiki de bitcoin :
La primera recompensa de bloque de 50 BTC se dirigió a la dirección 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa , aunque esta recompensa no se puede gastar debido a una peculiaridad en la forma en que el bloque de génesis se expresa en el código (esto puede haber sido intencional).
Pero, ¿dónde está esta peculiaridad? ¿Cómo lo cambiarías para permitir que se gaste?
Cuando un nodo se inicia, inicializa su copia de la base de datos de bloques junto con el bloque de génesis y luego comienza el proceso de sincronización. Por alguna razón, Satoshi decidió no agregar la transacción de la base de monedas del bloque de génesis a la base de datos de transacciones globales. Así todos los nodos de la red rechazarían el bloque.
No estoy seguro si esto fue hecho a propósito o si fue simplemente un descuido. En cualquier caso, está vinculado para siempre a 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa.
getrawtransaction 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
través de llamadas RPC, devuelve un error, aunque puede ir a un explorador de bloques (como aquí ) y ver que esta es la transacción de la base de monedas del bloque de génesis.-txindex=1
está habilitado)¿Cómo lo cambiarías para permitir que se gaste?
Para que la base de monedas sea gastable, se deben realizar los siguientes cambios en validation.cpp (v0.16.2). Nota : como se mencionó, esto se consideraría una bifurcación dura.
Paso 1 : deshabilite la omisión del bloque de génesis (que tiene como objetivo mantener el error como parte del consenso), Línea 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
}
Paso 2 : omita la afirmación del bloque anterior para el bloque de génesis, línea 1874 :
if (block.GetHash() != chainparams.GetConsensus().hashGenesisBlock) {
assert(pindex->pprev);
}
Paso 3 : omita la escritura de datos de deshacer para el bloque de génesis, Línea 1989 :
if (block.GetHash() != chainparams.GetConsensus().hashGenesisBlock)
{
if (!WriteUndoDataForBlock(blockundo, state, pindex, chainparams))
return false;
}
Al menos con las versiones actuales del cliente Bitcoin Core, el bloque Génesis está codificado en el cliente.
La parte del código que crea este bloque se encuentra aquí y he incluido un volcado JSON de la transacción de coinbase a continuación como referencia.
{
"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"
]
}
}
]
}
Esencia de referencia
EralpB
Entusiasta de la codificación