Bitcon1O1

Bitcoin Halving

2022/01/23

1. El minado

Los mineros corren un proceso llamado mining que es la ejecución de una función en particular llamada Hashing, utilizando la función SHA256 (Secure Hash Algorithm por sus siglas en inglés), que funciona en una sola dirección, es decir se introduce un conjunto de datos de cualquier dimensión y regresa un número siempre de un mismo tamaño (256 bits, 32 bytes) y además determinístico, es decir siempre que se introduzcan los mismos datos, devolverá el mismo número. Esta función también tiene la particularidad de que no es posible llevar a cabo el proceso inverso, esto es, obtener los datos originales, a través del número de 32 bytes. La única opción es prueba y error. El mining consiste en que los mineros corran esta función SHA256 para encontrar un número menor a un target definido llamado dificultad.

0000000000000000000133e7bffe43530e508183ec48a89bad23a370692b16e8

Ejemplo del target de dificultad

2. La recompensa

Si el minero logra obtener un numero menor al target, obtiene una recompensa. Esta recompensa se entrega con la nueva emisión de bitcoins frescos. La recompensa se entrega en lo que se denomina una coinbase transaction que siempre es la primera transacción de un bloque.

La red de Bitcoin experimenta cada 210,000 bloques, aproximadamente cada 4 años, una reducción en la recompensa entregada a los mineros por encontrar un nuevo bloque. Esta reducción en la recompensa, que determina la cantidad de bitcoins que son minados por los mineros, es a lo que se le llama el halving.

3. La funcion getBlockSubsydy()

La funcion getBlockSubsydy() es la responsable de que la magia del halving suceda.

Esta función se encuentra en el archivo src/validation.cpp

Aquí el código:

CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
    int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
    // Force block reward to zero when right shift is undefined.
    if (halvings >= 64)
        return 0;

    CAmount nSubsidy = 50 * COIN;
    // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
    nSubsidy >>= halvings;
    return nSubsidy;
}

Analicemos el código empezando por la primera línea:

int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;

nHeight se refiere a la altura actual de los bloques, a Enero 23 de 2022 la altura actual equivale a 720100 bloques. consensusParams.nSubsidyHalvingInterval esta definido en el archivo src/chainparams.cpp, aquí la definición:

consensus.nSubsidyHalvingInterval = 210000;

Esto quiere decir que halvings = 720100 / 210000 , halvings = 3.42, pero como halvings es un entero, el valor final se ajusta al entero (equivalente a un truncate) halvings = 3.

sigamos, el siguiente bloque:

    // Force block reward to zero when right shift is undefined.
    if (halvings >= 64)
        return 0;

es únicamente una validación para devolver 0 si el número de halvings es mayor o igual a 64, esto es porque el valor del subsidio sería indefinido si pretendemos hacer un right shift mayor a 63.

La siguiente línea:

CAmount nSubsidy = 50 * COIN;

define el subsidio nSubsidy como 50 multiplicado por COIN en donde COIN es igual a 100,000,000 (cien millones de satoshis) la unidad en la que están representados los bitcoins dentro del código de Bitcoin. Esto quiere decir que nSubsidy = 50 * 100000000 es igual a 5,000,000,000 (5 mil millones de satoshis).

las últimas 2 líneas:

    // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
    nSubsidy >>= halvings;
    return nSubsidy;

si escribimos el nSubsidy que calculamos (5 mil millones de satoshis) en binario obtenemos:

100101010000001011111001000000000

si tenemos que halvings = 3 entonces realizamos la operación de mover » 3 bits a la derecha (implica descartar los primeros 3 bits y recorrer los demás a la derecha) nSubsidy y obtenemos:

100101010000001011111001000000

que en decimal corresponde a 625,000,000 que entre 100,000,000 corresponde a 6.25 Bitcoins que es el halving actual en el año 2022. El hacer el right shift para cada época equivale a dividir los 5,000,000,000 de satoshis por 2 elevado al número de época.

\[ nSubsidy = \frac{\text{5,000,0000,000}} {2^{halvings}} \]

Por lo tanto, en la ultima línea el programa regresa nSubsidy = 625,000,000 que es equivalente a 6.25 bitcoins.

Con esta explicación ya conoces internamente lo que hace Bitcoin aproximadamente cada cuatro años (210,000 bloques) para controlar la emisión de nuevos bitcoins. Y puedes en todo momento auditar el código en el repositorio de Github.