Sobre el Bloque Génesis

Poca gente se ha parado a curiosear el código del nodo de Bitcoin. Cuando se leen cosas por ahí y uno no está seguro, acudir a la fuente es la mejor opción. En este post quiero traer al foro algunas curiosidades sobre el Supply y el Bloque Génesis.

Os remito a un post anterior en el que hemos dicho donde conseguir el código oficial desde el Github del proyecto BitcoinSV.

La primera curiosidad es que el nodo génesis no fue minado. Tal vez lo veas evidente pero no hayas visto donde se crea. He extractado del código fuente el siguiente bloque (fuente aquí):

/**
 * Build the genesis block. Note that the output of its generation transaction
 * cannot be spent since it did not originally exist in the database.
 *
 * CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000,
 * hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893,
 * vtx=1)
 *   CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0)
 *     CTxIn(COutPoint(000000, -1), coinbase
 * 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73)
 *     CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
 *   vMerkleTree: 4a5e1e
 */
static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce,
                                 uint32_t nBits, int32_t nVersion,
                                 const Amount genesisReward) {
    const char *pszTimestamp =
        "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
    const CScript genesisOutputScript =
        CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909"
                              "a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112"
                              "de5c384df7ba0b8d578a4c702b6bf11d5f")
                  << OP_CHECKSIG;
    return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce,
                              nBits, nVersion, genesisReward);
}

Te resultará familiar el mensaje “The Times …” como el que fue incluido en el primer bloque. En efecto, el primer bloque lo inyecta el propio código con todos los parámetros estáticos que necesita (versión dificultad, etc…). En ese mismo fichero vemos el siguiente código:

 genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1,
                                     50 * COIN);
        consensus.hashGenesisBlock = genesis.GetHash();
        assert(consensus.hashGenesisBlock ==
               uint256S("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1"
                        "b60a8ce26f"));

En este segundo fragmento se está invocando la función anterior para crear el bloque génesis. Se ve que la recompensa a pagar es de 50 Bitcoins (recuerda este dato para luego). También se ve que se fija un blocktime de “1231006505”, es decir, se data su creación en “3/01/2009, 6:15pm (UTC)” (3 de Enero de 2009, a las 18:15:05 horas (GMT)) Para evitar sustos, y como se sabe de antemano el hash que va a tener el bloque, el software de nodo hace un “assert” que comprueba que el resultado del hash del mismo es "“000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f”. Rigor ante todo. Si esa pieza está bien, la cadena empieza como debe y se pueden validar los restantes bloques en orden. Con el paso del tiempo se ha revisado y mejorado el código y eso ha permitido que, ya que conocemos el hash de otros bloques más avanzados, se hayan incluido una pequeña lista de hashes que permite a un nodo chequear que el hash de algunos bloques en alturas intermedias de la cadena es correcto.

Hay que preguntarse si este bloque que se ha generado de un forma diferente al resto está en la base de datos de bloques. La respuesta es NO. Esa base de datos empieza en el bloque 1. Quizá has pasado por alto que en el primer trozo de código que he pegado hay un comentario del programador que dice:

“Build the genesis block. Note that the output of its generation transaction cannot be spent since it did not originally exist in the database.”.

Se da la curiosa circunstancia de que si no alteramos con código esa primera voluntad, el supply de Bitcoins que podría circular sería de 20.999.950 Bitcoins y no 21 millones, incluidos los que se hayan perdido o quemado. Alguien tendrá la clave privada (o no) que permitiría gastar ese primer UTXO, pero los nodos mineros no deberían validar esa transacción con el código actual.

7 Likes