Es necesario leer primero nuestro artículo sobre funciones hash para que este artículo tenga sentido, pues facilitará mucho su comprensión.

Ya aprendimos en el artículo sobre mecanismos de consenso que no todas las cadenas de bloques tienen mineros, los cuales se encuentran solo en las cadenas PoW. Los mineros se dedican a defender la cadena de cualquier ataque y proteger el historial acumulado contra cualquier cambio. Hasta ahora, hemos hablado de cómo los mineros intentan resolver un “acertijo” o “problema” computacionalmente costoso; ahora finalmente describiremos la naturaleza de dicha tarea.

¿Qué hace un minero?

La labor fundamental del minero es la de recolectar todas las transacciones transmitidas a la red en el orden en el que fueron recibidas. El minero verifica la validez de cada transacción conforme al protocolo y luego las coloca en el contenedor de datos (el bloque) que describimos al hablar de la cadena de bloques como una estructura de datos. La primera transacción del bloque es especial, y se le llama transacción coinbase. En la transacción coinbase, el minero le da la recompensa de bloque a su propia dirección; 12.5 BTC y 12.5 ZEN que no existían antes (en realidad 7.5 ZEN, pues los operadores de los nodos seguros y súper nodos obtienen 10% de la recompensa, respectivamente, y la Tesorería Horizen el otro 20%). Generalmente, uno de los criterios empleados para confirmar la validez de una transacción es revisar que el remitente tenga los fondos suficientes en la dirección desde la que está creando la transacción. Las reglas para una transacción coinbase son ligeramente distintas. El protocolo permite que la primera transacción no contenga una entrada (input), lo cual en este contexto significa también que no hay remitente. De esta manera se minan nuevas monedas y el minero recibe una recompensa por su trabajo.

Una vez que el minero incluye la transacción coinbase, recolecta las transacciones que ha recibido de otros nodos y los coloca en el bloque que está trabajando. En general, el minero coloca las transacciones en el orden que las recibe. En momentos de mucha actividad en la red o cuando se llena un bloque (cada bloque tiene una capacidad de datos máxima, el límite del bloque) el minero puede decidir incluir solamente las transacciones con las tarifas de transacción más altas. Es por esto que estas tarifas se dispararon en diciembre de 2017; todos los usuarios querían ofrecer más por transacción para que la suya se incluyera primero en el próximo bloque. Esta es también la razón por la que en ocasiones la tarifa de transacción aparecerá con una denominación de ZEN sobre kilobyte, pues es la métrica que emplean los mineros para calcular qué transacciones les dejarán los mayores rendimientos.

Muchos mineros se encuentran trabajando en el bloque siguiente de manera simultánea. Cada uno puede tener una versión ligeramente diferente del bloque, ya sea porque el usuario recibió las transacciones en un orden diferente al de sus compañeros o porque decidió incluir un conjunto distinto de transacciones a partir de las tarifas de transacción adjuntas. El primer minero en resolver el acertijo tiene el derecho de extender la cadena de bloques con su versión del bloque, incluyendo la transacción coinbase que lo recompensa con las monedas recién creadas.

Miner Miner

Dificultad

¿De qué trata entonces el acertijo que los mineros están encargados de resolver? Como mencionamos en la introducción, entender el uso de las funciones hash ayudará también a entender su naturaleza.

Una de las propiedades importantes de las funciones hash criptográficas es su seudoaleatoriedad. No debe ser posible predecir un cambio en la salida que resulte de un cambio en la entrada. Por ejemplo, si el usuario introduce “1” a la función y obtiene de salida “00002”, es de esperarse que el resultado de introducir “2” no sea “00004”, sino más bien algo como “73968”; un número aparentemente aleatorio (en realidad seudoaleatorio).

El protocolo del minado exige que cada bloque alcance cierta meta. Esta meta es la medida de la dificultad resolver el bloque. Esto quiere decir que si se somete un bloque entero a una función hash con toda la información que contiene, la salida debe empezar con una cierta cantidad de ceros. La dificultad corresponde al número de ceros iniciales requeridos.

Imaginemos que el usuario quiere calcular el hash de una entrada aleatoria que debe empezar con un solo cero. Si la salida solo contuviera dígitos, la probabilidad de adivinar el hash al primera intento sería de 1 de 10. Si la dificultad requiriera que la salida empezara con dos ceros, la probabilidad de adivinar el hash al primero intento sería de 1 en 100. Si la meta es una dificultad de 6, la probabilidad sería de 1 de 1,000,000. Al incrementar la dificultad, resolver el reto se vuelve una verdadera labor, en especial porque no hay atajos para probar diferentes entradas a la vez. Si le gustaría experimentar con una función hash, puede hacerlo aquí.

Hay un campo de datos especial en el encabezado de cada bloque, el nonce (abreviatura de number used once), el cual no contiene información importante. Su único propósito es el de funcionar como una variable que el minero pueda sustituir por valores diferentes para cambiar la salida de la función hash. Lo que sigue es una larga serie de intentos de prueba y error para obtener el hash correcto del bloque. Cuando el minero intente resolver el bloque por primera vez, lo cual significa calcular el hash válido del bloque (con el número requerido de ceros) introducirá un valor aleatorio en el campo de datos nonce.

Por cuestiones de simplicidad, digamos que el valor nonce con el que decide empezar el minero es “0” y la dificultad es de 1, lo cual quiere decir que se requiere un cero inicial para que el hash del bloque sea válido. Supongamos también que la salida consiste únicamente de caracteres numéricos.

  • Primero, el minero ejecuta la función hash para calcular el valor hash del bloque. En el ejemplo a continuación, la salida no satisface dicha condición de dificultad tras el primer intento.
  • Ahora, el minero incrementa el nonce por uno y vuelve a ejecutar la función. El hash resultante aún no cumple con la condición, por lo que el minero debe pasar a otro intento.
  • Finalmente, cuando el minero introduce 8 como valor nonce, obtiene el resultado que busca, el hash del bloque empieza con un cero, por lo que el minero ha resuelto el bloque.

Mining nonce Mining nonce

En un caso real, la dificultad sería muchísimo mayor, por lo que el minero tendría que realizar una cantidad inimaginable de cálculos para obtener el hash válido del bloque. Al momento de escribir este artículo, el hash rate de la red de Bitcoin es de aproximadamente 41 millones de terahashes por segundo (Th/s). Esto quiere decir que los mineros combinados introducen 41,000,000,000,000,000,000 valores diferentes del nonce cada segundo. La dificultad actual de la cadena de bloques de Horizen puede consultarse aquí, mientras que el hash rate de la red al momento de redacción era de 208.68 Mh/s y el valor actual puede consultarse aquí.

Todo esto funciona gracias a las propiedades de las funciones hash criptográficas. Retomemos la siguiente imagen del artículo sobre funciones hash.

Hash function Hash function

No hay manera de calcular un nonce válido a partir de la salida deseada porque la función hash funciona en un solo sentido. También resulta inviable aproximar el nonce válido a partir de salidas anteriores dada la seudoaleatoriedad de la función y la imposibilidad de predecir cambios en la salida. Cualquier participante de la red puede verificar la solución una vez que se ha encontrado ya que la función hash es determinística, por lo que producirá el mismo resultado en todos los nodos que verifiquen el bloque.

Tiempo de bloque

Todo protocolo PoW define un tiempo de bloque (block time), un intervalo dentro del cual debe crearse un nuevo bloque. En el caso de Horizen, este es de 2.5 minutos, en el de Bitcoin es de 10. Cada vez que un minero resuelve un bloque lo propaga a la red de manera inmediata para recolectar su recompensa. Es por esto que no transcurren exactamente 2.5 minutos entre la creación de cada bloque, este número es solo el promedio del tiempo que se requiere para encontrar el nonce válido y convertirlo en el hash del bloque. Algunos bloques se resuelven antes de este lapso, otros después. Si se unen más mineros a la red e incrementa el hash rate, incrementará también en promedio la rapidez con la que se resuelve el bloque. El protocolo evalúa el tiempo de bloque promedio y ajusta la dificultad cada 2016 bloques. Si el tiempo promedio de resolución fue menor a 2.5 minutos, la dificultad incrementa, si fue mayor, la disminuye.

Hardware

Cuando se lanzó Bitcoin en 2009, los usuarios utilizaban el CPU (unidad de procesamiento central) de sus computadoras para minar bitcoins. El CPU es la unidad de procesamiento más versátil de la computadora, pero no la más eficiente. Después de un tiempo, los usuarios pasaron a utilizar el GPU (unidad de procesamiento gráfico) para el minado. Los GPU cuentan con funciones más adecuadas y eficientes para realizar ciertas tareas, pero con la desventaja de ser menos versátiles. Hoy en día la industria de minado se ejecuta con circuitos integrados de aplicación específica, o ASIC (application-specific integrated circuits). Estos son el hardware de minado criptomonetario más eficiente porque están diseñados con un solo propósito, el cálculo de valores hash con una función hash específica.

En el caso del hardware computacional, tanto la versatilidad como la eficiencia tienen sus desventajas. Si lo que el usuario desea es ejecutar múltiples tareas, obtendrá un hardware poco eficiente. En cambio, si desea un tipo de hardware muy efectivo para resolver un solo tipo de tarea, este será poco versátil. Si desea leer más, puede encontrar aquí un excelente artículo sobre hardware de minado escrito por David Vorick, el desarrollador principal de Sia.

¿Cómo ayuda todo esto a proteger la red?

Ya debe quedar claro que se necesita una cantidad enorme de trabajo para resolver un solo bloque de la cadena de bloques. Hemos aprendido también que cada bloque hace referencia al anterior incluyendo el hash de ese bloque para formar una cadena, y que el hecho de cambiar aunque sea un dígito de información en el bloque alterará también su hash.

Si un atacante quisiera modificar cualquier registro en la cadena de bloques, tendría que encontrar no solo un nonce válido para el bloque editado, sino también uno para todos los bloques subsecuentes. El atacante tendría que hacer todo esto por sí solo y a una velocidad mayor a la del proceso de minado. En nuestro artículo sobre mecanismos de consenso mencionamos que la regla de la cadena más larga determina qué ramificación de la cadena de bloques es la que se considera válida si la cadena llega a bifurcarse. El atacante tendría que superar a todos los otros mineros combinados para hacer de su cadena editada la más larga y, en consecuencia, la única válida. A esto se le llama un ataque del 51%, y le hemos dedicado todo el artículo siguiente al fenómeno.

Este tipo de ataques son muy costosos, tanto así que hasta la mayoría de los países del mundo no poseen los medios para llevarlos a cabo en la red de Bitcoin. Además, la probabilidad de éxito es también bastante baja. Es por esto que las cadenas de bloques resultan tan confiables. Los mineros comprueban que le dedican esfuerzo al aseguramiento de la red; un esfuerzo que consume recursos fuera del sistema (electricidad) y que por lo tanto no puede ser falsificado. El resultado es fascinante, una creación completamente abierta y transparente pero también resistente a casi cualquier ataque.

Una excelente herramienta para entender la naturaleza a prueba de modificaciones de la cadena de bloques es este demo de una blockchain. Lo exhortamos a que lo pruebe e internalice con la práctica los conceptos explicados a lo largo de este capítulo.

Resumen

Los mineros de una cadena de bloques PoW aseguran la red con su poder computacional. Agregar un bloque a la cadena requiere una cantidad enorme de intentos aleatorios por encontrar el nonce que producirá finalmente el hash válido del bloque. El hash del bloque debe satisfacer el nivel de dificultad actual de la red de la cadena de bloques. Esto hace muy difícil cualquier intento de modificar la información contenida en la cadena. Para lanzar un ataque, el atacante de una red debe volver a llevar a cabo por sí solo el trabajo de encontrar el nonce que resulte en un hash de bloque válido. Además, el atacante debe realizar esta operación no solo para el bloque que desea manipular, sino también para todos los bloques subsecuentes hasta que la cadena maliciosa resulte más larga y sea reconocida como válida por la red entera. Ya que este tipo de ataque resulta tan difícil, puede decirse que las cadenas de bloques son la estructura de datos más segura que tenemos a nuestra disposición hoy en día.

Este fue el último de nuestros artículos sobre el funcionamiento de la cadena de bloques. A continuación trataremos el tema de las billeteras digitales, una herramienta que ayuda al usuario a administrar sus llaves y crear transacciones.

Esperamos que haya aprendido algo (o mucho) en este capítulo y lo invitamos a compartirnos su retroalimentación. ¿Hubo algo que no incluimos o debemos clarificar? Háganoslo saber a la dirección de correo electrónico [email protected]