¿Por qué no se puede gastar la base de monedas del bloque de génesis?

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?

Uno tiene que tener en cuenta en ese momento que 50 BTC costaban como... literalmente 0 centavos. Dudo que haya pensado en hacer esto intencional o no.
Tal vez sea porque la recompensa de 50 BTC está técnicamente preminada ya que el código se lanzó 6 días después. Así que técnicamente hubiera sido injusto si Satoshi pudiera gastar esas monedas. En mi opinión, esa es otra belleza de Bitcoin.

Respuestas (3)

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.

¿Cómo lo cambiarías para permitir que se gaste? Agregue esto a la lista de bifurcaciones
¿Cómo lo sabemos si no está en la base de datos?
Sabemos que no está en la base de datos porque si lo hace a getrawtransaction 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33btravé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.
(Incluso cuando -txindex=1está 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

Esta respuesta podría mejorarse al abordar por qué no se puede gastar la producción del Bloque Génesis.