La red de Bitcoin cuenta con un conjunto de nodos llamados mineros que utilizan equipos especializados ASICS (application-specific integrated circuit) para resolver algoritmos criptográficos. Si tienen éxito, los mineros tendrán la oportunidad de añadir un nuevo bloque a la cadena de Bitcoin y recibir una recompensa en bitcoins.
Específicamente en Bitcoin ese algoritmo es la función hash SHA256. La función hash SHA256 genera, a través de introducir cualquier dato, una salida de 64 caracteres compuesta por letras y números, con una codificación de 32 bytes.
Ejemplo del uso de la función SHA256 para obtener el hash de un mensaje:
import hashlib
message="este mensaje contiene información importante y privada"
hashed_message = hashlib.sha256(message.encode('utf-8')).hexdigest()
print (hashed_message)
e9a7cfea0707cffec7f0d63e0ed63441111927224e28bff8708fce19865a647b
El proceso de minado funciona de la siguiente manera:
- El minero valida las transacciones y las agrega a un espacio en memoria de transacciones validas, pero no confirmadas, llamado mempool.
- El minero selecciona transacciones que se encuentran en espera en el mempool (espacio en la memoria de cada nodo en el que se encuentran las transacciones candidatas a ser minadas) y construye un bloque candidato.
- El minero construye el header del bloque, que es un resumen del bloque y sus transacciones. El header entre otros datos, incluye un número aleatorio llamado nonce, este número aleatorio se genera y posteriormente se procede a hacer un hash del header del bloque utilizando la función SHA256. Este proceso de generar el número aleatorio y realizar el hash del header, se repite hasta lograr el objetivo del paso 4.
- Este nuevo hash tiene que ser menor que un valor particular objetivo denominado (target).
- Una vez que un minero encuentra el target puede generar un nuevo bloque y recibe una recompansa por haberlo logrado, para mayor detalle puedes consultar Bitcoin Halving, posteriormente notifica al resto de los nodos de su hallazgo y el ciclo de minado comienza nuevamente para todos los nodos mineros.
- La Dificultad es una medida que representa que tan difícil es encontrar el valor de un hash menor al objetivo (target) establecido.
Antes de agregar las transacciones al mempool, se hace una validación exhaustiva que comprende: estructura de la transacción, datos de entradas y salidas, que no exista mas de una transacción cuyo input haga referencia al mismo output de salida de una transacción anterior (para evitar el doble gasto), validación de tarifas, que el script de apertura (ScriptSig) corresponda al mecanismo de bloqueo del output de la transacción anterior (ScriptPubKey), etc.
El bloque que construyen los mineros es candidato porque aún no ha sido minado. A este bloque se anexan las transacciones seleccionadas del mempool, estas transacciones son seleccionadas dando prioridad a las que tienen tarifas mas altas, que es el incentivo principal de los mineros, después de la recompensa por minar un bloque nuevo. Por ahora la recompensa Coinbase tiende a ser mayor a la suma de las comidsiones de las transacciones incluidas en un bloque, pero se espera que con el tiempo se equiparen, e inclusive superen en cantidad a la recompensa por producir un bloque nuevo. Recordemos que el proceso de halving reduce la recompensa por emitir un bloque nuevo cada 210,000 bloques o aproximadamente cada 4 años. Para mayor información del proceso de Halving ver Bitcoin Halving
Al construir el header del bloque el minero genera una estructura con la siguiente información:
Tamaño | Campo | Descripción |
---|---|---|
4 bytes | versión | número de versión que sirve para llevar un registro de cambios al protocolo |
32 bytes | previous block hash | referencia del hash del bloque anterior en la cadena |
32 bytes | merkle root | hash de la raiz del árbol merkle de las transacciones de este bloque |
4 bytes | timestamp | el momento aproximado de la creación de este bloque (en segundos, tiempo unix) |
4 bytes | target | el target codificado del algoritmo de prueba de trabajo para este bloque |
4 bytes | nonce | El número utilizado por el algoritmo de la prueba de trabajo |
Esta estructura resume el contenido del bloque, importante notar que el hash del bloque anterior (previous block hash) es el elemento que le da nombre a la cadena de bloques, ya que es la referencia que establece una relación inmutable con el bloque anterior y sus transacciones. Del mismo modo la raíz del arbol merkle (merkle root) es la estructura que permite resumir en un solo hash raíz, los hashes de todo el árbol de las transacciones incluidas en este bloque. El nonce es el número que se generará para cada ciclo de hash del header del bloque en la búsqueda del target, como se especificó en el paso 3 y que debe de producir un número menor al target como también se especificó en el paso 4.
El proceso de generar un hash del header del bloque modificando el nonce en cada ciclo es un proceso aleatorio, por lo que generar un número menor a un target definido es una función de probabilidad. El problema con los objetivos (targets) es que son números muy complejos para que la gente los comprenda fácilmente. La Dificultad es inversamente proporcional al objetivo (target) y es mas fácil de comprender. Partiendo de que la Dificultad de generar el bloque génesis de Bitcoin equivaldría a 1, la nueva Dificultad puede escribirse como que tanto mas difícil es producir un bloque válido, generando un número menor a un target definido. Para darnos una idea la dificultad actual es:
\[ \ (28.6)10^{12} \]
dificultad actual = 28,600,000,000,000.0
o bien, 28.6 trillones
La Dificultad se puede consultar en todo momento en el Dashboard de Clark Moody
La fórmula específica para calcular la Dificultad es:
\[ Difficulty = \frac{\text{dificultad del bloque génesis}} {target} \]
\[ Difficulty = \frac{(0xFFFF) 256^{(0x1D - 3)}} {target} \]
O bien:
\[ Difficulty = \frac{(65,535) 256^{26}} {target} \]
Dificultad del bloque génesis = 0xffff0000000000000000000000000000000000000000000000000000
o en decimal:
Dificultad del bloque génesis = 26959535291011309493156476344723991336010898738574164086137773096960
De la fórmula podemos inferir que entre mas pequeño sea el target la dificultad será mayor, entre mas pequeño el número target, la probabilidad de que aleatoriamente generemos un hash mas pequeño a ese número es menor y por lo tanto la Dificultad es mayor, a continuación, una gráfica del crecimiento de la dificultad de los últimos 5 años:
Dificultad de la red
La Dificultad de Bitcoin cambia cada 2016 bloques o aproximadamente cada 2 semanas. El nivel de dificultad de minado se incrementa o decrementa, de acuerdo al ritmo de minado del protocolo. Esto funciona como el sistema cardiovascular de Bitcoin, recordemos que se espera que los bloques se generen en promedio cada 10 minutos. De esta forma, la Dificultad se ajusta cada 2016 bloques para mantener el mismo ritmo de pulsaciones, emitiendo bloques cada 10 minutos en promedio.