Capítulo 07 de 10 · 11 min de lectura
De dónde salen las monedas
Toda la política monetaria de Bitcoin cabe en una línea de código. No hay banco central, ni comité, ni reunión: hay una fórmula que cualquiera puede leer, y una red que rechaza cualquier bloque que no la cumpla.
La excepción a “no se crea dinero”
En el capítulo 4 la regla era tajante: de una transacción no puede salir más de lo que entra. Si fuera la única regla, nunca habría existido la primera moneda. Tiene que haber una forma de crear dinero, y solo una.
Es la coinbase: la primera transacción de cada bloque. No tiene entradas de verdad —su única entrada apunta a la nada— y tiene salidas que pagan al minero. En xavicoin se construye así:
// internal/core/params.go
func NewCoinbase(height uint32, extraNonce uint64, message string, value uint64, to [20]byte) *Tx {
return &Tx{
Version: 1,
Inputs: []TxIn{{
PrevOut: OutPoint{Index: CoinbaseIndex}, // no gasta nada
Signature: CoinbaseData(height, extraNonce, message),
}},
Outputs: []TxOut{{Value: value, PubKeyHash: to}},
}
}
Donde en una transacción normal iría la firma, la coinbase lleva datos libres: la altura del bloque, el extra nonce del capítulo anterior y un mensaje opcional. El del génesis de Bitcoin era un titular de periódico; el de xavicoin, aprender construyendo.
¿Y cuánto puede pagarse el minero? Eso lo decide la regla más importante de este capítulo.
La regla: subsidio más comisiones
Cada nodo, al conectar un bloque, suma lo que cobra la coinbase y lo compara con un máximo:
// internal/chain/validate.go — connectBlock (fragmento)
// La coinbase puede repartirse como mucho el subsidio más las comisiones.
// Esta línea es toda la política monetaria: no hay otro sitio por el que
// pueda entrar dinero nuevo en el sistema.
var reward uint64
for _, out := range coinbase.Outputs {
reward += out.Value
}
if limit := p.Subsidy(height) + fees; reward > limit {
return ruleErrorf("la coinbase cobra %d y el máximo es %d", reward, limit)
}
Dos sumandos:
- El subsidio: monedas nuevas, que no existían. Depende solo de la altura del bloque.
- Las comisiones: la suma de lo que dejaron sin gastar todas las transacciones del bloque (capítulo 4). No son dinero nuevo: cambian de manos.
Un minero que se pague más de eso ha fabricado un bloque inválido, y todos los nodos lo tiran, por mucho trabajo que lleve encima. Pruébalo:
Subsidio a esa altura
+ comisiones
= máximo que puede cobrar
Fíjate en que cobrar de menos sí está permitido. Ha pasado varias veces en Bitcoin por errores de configuración: esas monedas simplemente no llegaron a existir.
El subsidio se divide por dos
El subsidio empieza en 50 monedas por bloque y cada cierto número de bloques se reduce a la mitad: 50, 25, 12,5, 6,25… Es el famoso halving. La función que lo calcula es esta, entera:
// internal/core/params.go
func (p *Params) Subsidy(height uint32) uint64 {
halvings := height / p.HalvingInterval
if halvings >= 64 {
return 0
}
return p.InitialSubsidy >> halvings
}
>> desplaza los bits a la derecha, que es dividir entre dos redondeando hacia abajo. Como los importes son enteros (capítulo 4), al cabo de unas cuantas divisiones el subsidio llega a una sola unidad, y en la siguiente, a cero. Ahí termina la emisión para siempre.
Y ahora la consecuencia que da nombre a Bitcoin como “oro digital”: la suma de 50 + 25 + 12,5 + … converge. Multiplicada por los bloques de cada era, la emisión total es aproximadamente 2 × subsidio inicial × intervalo de halving. Con los parámetros de Bitcoin, 2 × 50 × 210.000 = 21 millones. Juega con los dos parámetros y mira cómo cambia el total:
- Emisión total, para siempre
- De los cuales, en la primera era
- Halvings hasta que el subsidio es 0
- A 10 min por bloque, la emisión dura
- en circulación
- subsidio por bloque
Ver las eras como tabla
| Era | Bloques | Subsidio | Emitido en la era | Acumulado |
|---|
Tres cosas para observar:
- La mitad de todo el dinero se emite en la primera era, la cuarta parte en la segunda, y así. Con Bitcoin, el 50 % ya estaba en circulación a finales de 2012, y hoy más del 94 %.
- El total no depende de la potencia de minado. Gracias al ajuste de dificultad del capítulo anterior, los bloques salen al mismo ritmo haya diez mineros o diez millones. Minar más no crea más monedas.
- Bitcoin no llegará exactamente a 21 millones, sino a 20.999.999,9769. El redondeo hacia abajo de cada halving se come la diferencia. Cambia el subsidio inicial a 1 moneda y verás el mismo efecto a lo bruto.
Para qué sirven las comisiones
Si el subsidio se acaba, ¿quién mina? De ahí el segundo sumando. Las comisiones tienen dos funciones, y cambian de peso con el tiempo:
- Priorizar. El espacio de un bloque es limitado. El minero de xavicoin (y el de Bitcoin) llena su bloque con las transacciones que más pagan por byte, en ese orden, hasta que no cabe ninguna más. Cuando hay más demanda que sitio, las comisiones suben; cuando no, bajan casi a cero. Es un mercado sin intermediario.
- Sostener la seguridad cuando el subsidio ya no lo haga. En la primera era el subsidio es casi todo el ingreso del minero. En 2140 será cero, y solo quedarán las comisiones. Que sean suficientes para que minar siga compensando, y por tanto para que atacar la cadena siga siendo caro, es una de las preguntas abiertas de Bitcoin. Nadie sabe la respuesta todavía.
En xavicoin el minero hace las cuentas al preparar su bloque candidato: recorre la mempool de mayor a menor comisión por byte, va sumando lo que cobrará, y se lo paga todo en la coinbase:
// internal/miner/miner.go — BuildTemplate (fragmento)
coinbase := core.NewCoinbase(height, m.extraNonce.Add(1), m.Message, params.Subsidy(height)+fees, payTo)
La madurez: monedas recién nacidas que no se pueden gastar
Hay un detalle más. Una moneda salida de una coinbase no se puede gastar hasta que su bloque tiene encima cierto número de bloques: 100 en Bitcoin, 10 en la red de pruebas de xavicoin. Es la madurez.
// internal/chain/validate.go — CheckTxInputs (fragmento)
if utxo.Coinbase && spendHeight-utxo.Height < p.CoinbaseMaturity {
return 0, ruleErrorf("la entrada %d gasta una coinbase de hace %d bloques (mínimo %d)",
i, spendHeight-utxo.Height, p.CoinbaseMaturity)
}
La razón la veremos en el capítulo 9: a veces un bloque válido acaba fuera de la cadena, y su coinbase desaparece con él, como si nunca hubiera existido. Si esa recompensa ya se hubiera gastado, todos los pagos que dependieran de ella se esfumarían en cascada. Con la madurez, para cuando una recompensa se puede mover, el bloque que la creó ya está tan enterrado que eso no va a ocurrir.
Es por lo que bin/cli balance separa las monedas «inmaduras»: en la prueba real de xavicoin, tras 42 bloques minados, había 1.650 monedas gastables y 450 (las 9 últimas coinbases) esperando.
Lo que viene
Tenemos monedas, dueños, transacciones, bloques, minería y un motivo para minar. Todo ello dentro de un solo ordenador. Falta lo que convierte esto en una red: cómo se enteran miles de nodos que no se conocen de que existe un pago nuevo o un bloque nuevo, y cómo consiguen tener todos la misma cadena.