¿Dónde, en el código, en el cliente Satoshi se implementa un límite de 21 millones?

¿Qué fragmento del cliente Satoshi está verificando si el bloque anunciado tiene una recompensa válida?

Quiero decir, ahora vivimos en el período de recompensa de 25 BTC. Supongo que el cliente después de recibir un bloque recién acuñado, hace verificaciones, como comprobar si las entradas y salidas están equilibradas, por ejemplo, y supongo que si la recompensa es de 25 BTC, ¿verdad?

Entonces, ¿dónde está este fragmento del código?

Sé dónde está el código que limita el suministro de BTC a 21 millones :

    int64 static GetBlockValue(int nHeight, int64 nFees)
    {
        int64 nSubsidy = 50 * COIN;

        // Subsidy is cut in half every 210000 blocks, which will occur approximately every 4 years
        nSubsidy >>= (nHeight / 210000);

        return nSubsidy + nFees;
    }

...y estoy buscando a alguien que me indique el lugar correcto, donde se realiza la verificación.

Solo una nota de que el código relevante reside aquí ahora: github.com/bitcoin/bitcoin/blob/… (también es un enlace que debería funcionar para siempre 🤞🏻).

Respuestas (1)

Hay 3 lugares donde se llama a GetBlockValue. Uno está en los bloques entrantes, uno está en los bloques que estamos extrayendo y el otro es un mensaje de error. Este es el de los bloques entrantes:

if (vtx[0].GetValueOut() > GetBlockValue(pindex->nHeight, nFees))
    return state.DoS(100, error("ConnectBlock() : coinbase pays too much (actual=%"PRI64d" vs limit=%"PRI64d")", vtx[0].GetValueOut(), GetBlockValue(pindex->nHeight, nFees)));

Fuente

Esto analiza la primera transacción (la transacción de base de monedas) y verifica el valor. Si es mayor que el subsidio más las tarifas, el bloque se rechaza y el nodo que envió el bloque se incluye en la lista negra.

Ganame por un segundo al publicar esto.
@DavidOgren Todos hemos estado allí en un momento u otro. :|
La tuya fue más detallada en la explicación que la mía de todos modos.