- decentralizedb
¿Qué es la dificultad y el target en Bitcoin? (y, de paso, hablaremos de nonce y PoW).
El termino de dificultad dentro de Bitcoin es una representación que pretende facilitar el entendimiento, al usuario común, de un concepto denominado target (objetivo), que es un tanto más complejo que solo el de establecer un tiempo de minado entre bloques, como a veces se suele decir. Voy a intentar explicarlo sin entrar en el detalle técnico.
Partiré definiendo Target: es un número muy grande (de 256 bits) que todos los clientes de Bitcoin comparten. Como comenté, no voy a entrar en el detalle técnico y por ende no voy a explicar cómo se calcula, pero si deseas indagar más te dejo este link.
Para que un bloque sea aceptado por la red el resultado de la función SHA-256, sobre la cabecera de un bloque, debe dar como resultado el ser igual o menor que el target con el que la red esta trabajando al momento de validar el bloque.
(Cabecera de un bloque)
Haremos un pequeño paréntesis para revisar el concepto de PoW.
El proceso de encontrar el hash valido de un bloque es como una lotería, los mineros están tratando de descubrir ese hash en base a prueba y error a través de la Proof of Work.
La PoW consiste en la obtención de ese hash previamente mencionado, el cual es obtenido a través de un proceso que consiste en ir aplicando una función hash sha256 a la cabecera del bloque a resolver. La magia ocurre porque, dentro de la cabecera del bloque, hay un campo denominado nonce, el cual, como decía, es parte del bloque a resolver y es el único cuyo valor puede ser modificado.
¡Si no existiera esta posibilidad de ir modificando ese campo, el valor de la funciona hash 256 sobre la cabecera del bloque, siempre sería el mismo!!!
Así que los mineros van ajustando este valor nonce hasta obtener aquel hash de la cabecera de un bloque que este por debajo del TARGET de la red, es decir van cambiando ese número, aplicándole la función sha256 y el resultado lo comparan con el target sucesivamente hasta que obtienen un valor válido, esto lo tiene que hacer contra reloj, ya que el target esta ajustado de tal forma que pueda resolverse en un intervalo de hasta 10 minutos y, además, compite contra otros mineros.
Una vez que encuentra ese número, el minero puede enviarlo a los demás nodos de la red, que lo revisaran y, si es un valor válido, (esta por debajo del target) entonces toda la red lo agregará a sus blockchains. Llegado a este punto el minero es el ganador de la “lotería” y podrá tomar la recompensa del bloque, que está en el campo llamado coinbase y, además, cobrará todas las comisiones de las transacciones incluidas en ese bloque.
Pasado nuestro pequeño paréntesis y continuando con el tema del target, diré que por temas de estabilidad en la red y de latencia (para efectos de la red de Bitcoin, diremos que latencia es el intervalo de tiempo que la red tarda en propagar los bloques entre los nodos) es necesario establecer un periodo de tiempo para que cada bloque sea generado, es decir es necesario asegurar un tiempo que permita la transferencia de bloques en la red de manera segura y que garantice que no hay pérdidas de información o generación de demasiados bloques.
Por ello se ha establecido, como parte de las reglas de consenso de Bitcoin, que cada 2016 bloques las marcas de tiempo que los bloques almacenan son comparados, para determinar cuánto tiempo llevó encontrar esos 2016 bloques. El resultado es un número que mide los segundos transcurridos entre la generación del primer bloque y del último de esos 2016 bloques que se están comparando. El valor ideal esperado es 1.209.600 segundos transcurridos (que son el equivalente a dos semanas). Es decir queremos que los 2016 bloques demoren 2 semanas en ser generados (y eso nos daría que cada 10 minutos un bloque debería ser generado).
Entonces, para poder ir ajustando el target, se estableció el concepto de la Dificultad, que representa cuanto trabajo debe aportar un minero para resolver un bloque, con el target actual. Me explico:
- La dificultad en Bitcoin comenzó con un valor de 1 (y nunca podrá ser menor que 1).
- Al momento de escribir este artículo la dificultad es de 16,553×10¹², lo cual significa que en promedio tomaría ~16.5 millones de veces más tiempo el poder encontrar un bloque válido que si la dificultad fuera de 1, como cuando se minó el primer bloque.
Hablando de como se ajusta la dificultad para obtener el target deseado, diríamos que el tiempo aproximado que se tarda en obtener 2016 bloques se revisaría, y si se encuentra que tomó menos de las 2 semanas entonces el valor se aumentaría proporcionalmente, de forma que los siguientes 2016 bloques se demoren exactamente dos semanas.
Por el contrario, si se revisa que esa medición tomó más de dos semanas para generar los 2016 bloques, el valor de dificultad se reduce proporcionalmente, para poder ajustar y llegar al número de 2016 bloques en 2 semanas (recordar que en realidad la medición es de 1.209.600 segundos, pero para efectos prácticos hablamos de semanas).
La formula para el cálculo de la dificultad es: difficulty = difficulty_1_target / current_target
Nota curiosa: Debido a un bug en la implementación de Bitcoin Core, en realidad el cálculo se hace usando las marcas de tiempo de solo 2015 bloques, en lugar de los 2016 bloques, pero la comunidad ha determinado que el riesgo que este bug en el código es ínfimo, comparado con el riesgo del hard-fork que requiere la implementación de la corrección.
En resumen podemos decir que lo importante es el target, el cual define la cadencia en que los bloques deben ser minados y, para mantener esa cadencia, se realiza el proceso de cálculo de tiempo entre bloques. El concepto que engloba una explicación más sencilla de como esto se consigue, es el de la dificultad.
Después de ver estos conceptos y esta explicación, me viene a la mente una de las preguntas que veo de forma más recurrente y que es ¿qué pasaría si en los próximos años la dificultad aumentará tanto que la minería dejara de ser rentable?.
Con lo explicado hasta aquí, creo que podríamos responder que es el target el responsable de medir el poder de computo de la red de Bitcoin y, además, también es el responsable de establecer el poder de computo que un minero debe usar para poder resolver y encontrar un bloque en un periodo de 10 minutos aproximadamente. Por lo que, si un porcentaje X de los mineros desapareciera (porque ya no les es rentable) el target se ajustaría y la dificultad disminuiría para que sea rentable nuevamente.
Ahora voy a hablar brevemente sobre el Coinbase.
¿Sabías qué?, un bloque de Bitcoin, a pesar de que se diga que puede ir vacío en realidad siempre tendrá por lo menos una transacción y esa transacción es la Transacción de Coinbase. Esta transacción siempre es la primera y es usada para que el minero pueda reclamar la recompensa en bitcoin que obtiene al minar un bloque. Si ese bloque tuviera más transacciones, las incluiría dentro de esta transacción en una campo denominado, también coinbase.
Un par de datos curiosos:
- De nada le sirve a un minero tratar de minar bloques sin transacciones, ya que el tiempo que le lleva obtener el hash que esta por debajo del target de la red, es el mismo que le llevará hacerlo con un bloque que tuviera o no transacciones, por lo que su incentivo se incrementa si trata de incluir transacciones, ya que podrá, además de la recompensa, cobrar las comisiones.
- El otro dato es que el minero solo podrá gastar los bitcoins que ha obtenido de la Coinbase una vez que haya 100 confirmaciones sobre el bloque minado, a este concepto se le denomina Coinbase_Maturity
Bueno, espero que el contenido te haya aclarado, y como digo en todos mis artículos, si ves algún error o tienes algún comentario o duda, por favor no dudes en dejarme tus comentarios, yo aprendo de lo que me van anotando además de lo que voy investigando.
Te agradezco mucho el tiempo que te has tomado en leerme.
Puedes dejar una propina con el botón «Invítame un café».
O mediante Lightning network:
También puedes hacerlo onchain, vía Paynyms de Samourai Wallet:
PayNym: +decentralized