Análisis Probabilístico de la Minería Bitcoin (Desentrañando los secretos de Bitcoin)

in #stem-espanol7 years ago (edited)

La minería bitcoin es el proceso mediante el cual se añaden nuevos bloques en los que se registran las transacciones recientes a la cadena de bloques, es la base del consenso distribuido de la red. El proceso de minería se encarga de validar que las transacciones estén correctamente firmadas con las claves criptográficas correspondientes a la vez que crea nuevos bitcoin (actualmente un máximo de 12,5 BTC por bloque).


Imagen N°1 Minero de Bitcoin Fuente

En el presente artículo se explicará el proceso de minería y se hará un análisis de las probabilidades de encontrar bloques válidos en función de las condiciones actuales de la red bitcoin.

Podemos entender la blockchain de bitcoin como un conjunto de bloques apilados uno sobre otro (por esta razón se suele hablar de altura del bloque), en los cuales se registran las transacciones, si un bloque X tiene muchos bloques apilados sobre él se vuelve prácticamente irreversible porque no existe la potencia computacional necesaria para generar una cadena de bloques más larga, por lo tanto las transacciones registradas en ese bloque también son consideradas irreversibles.

En relación a la recompensa recibida por los mineros se divide en dos fuentes de ingresos, la primera es la recompensa por bloque la cual actualmente es de un máximo de 12,5 BTC (un minero puede elegir cobrar un monto menor) la otra fuente de ingresos son las comisiones pagadas por los usuarios de bitcoin que han realizado transacciones recientemente.

En este sentido, ¿Que necesita un usuario para minar y recibir la tan ansiada recompensa?, debe realizar una gran cantidad de “trabajo” computacional, es decir resolver un problema de cálculo computacional bastante difícil, debido a esto el sistema se conoce como Prueba de Trabajo (Proof of Work), pero ¿de qué se trata este cálculo?

La prueba de trabajo de Bitcoin consiste en aplicar el algoritmo de hashing SHA256 a la cabecera del bloque que se está minando y obtener un resultado en formato hexadecimal menor al objetivo de dificultad de la red en ese momento. Los datos que conforman la cabecera del bloque son los siguientes:

1-Número de versión (4 bytes): Número referente a las actualizaciones de software y protocolo actualmente es 0x20000000

2-Hash del Bloque padre (32 bytes): El hash del bloque anterior.

3-Raíz Merkle (32 bytes): Es un hash de la raíz del árbol Merkle de las transacciones del bloque, el árbol Merkle es un árbol binario que resume las transacciones de cada bloque.

4-Hora (4 bytes): Tiempo de creación del bloque.

5-Objetivo de dificultad (4 bytes): Valor que representa la dificultad actual de la prueba de trabajo.

6-Nonce (4 bytes): Este campo representa un contador para la prueba de trabajo, generalmente los mineros lo inicializan en 1 y a partir de allí van aumentándolo hasta que el hash de la cabecera cumpla con el objetivo de dificultad requerida.


Cada minero (o pool de minería) calcula el hash de su bloque y va cambiando el valor del nonce para seguir iterando hasta cumplir con el objetivo o hasta que otro minero resuelve el bloque y en ese caso la red retransmite la solución y todos los mineros empiezan a calcular un nuevo bloque tomando como bloque padre al que acaban de encontrar.

En caso de que dos mineros encuentre un bloque al mismo tiempo cada nodo retransmitirá el bloque más cercano produciéndose una bifurcación temporal en la cadena de bloques la cual se resolverá cuando otro minero encuentre otro bloque a una altura superior, debido a que según el protocolo los nodos deben aceptar solamente la cadena más larga, el bloque que no es aceptado se convierte en un bloque huérfano y el minero que lo encontró no recibe recompensa.

En cuanto al objetivo de dificultad se suele representar en formato hexadecimal y lo podemos consultar en blockexplorer.com (denominado bits), el formato en que se representa posee las siguientes características las primeras dos cifras hexadecimales representan un valor que permite calcular el exponente de una potencia en base 2 y las últimas seis el coeficiente por el que se multiplica la potencia, por ejemplo actualmente la dificultad es la siguiente 0x176c2146 para convertir esta cifra con el fin de obtener el valor numérico del objetivo de dificultad a calcular, se aplica la siguiente fórmula:

Cuyo resultado es

10.356.793.971.791.534.424.976.101.420.669.664.288.187.918.308.140.384.256

Al convertirlo a hexadecimal

obj_dificultad=0000000000000000006c21460000000000000000000000000000000000000000

Esto quiere decir que un bloque es válido solo si el hash encontrado es menor a este valor, una vez explicado el objetivo de la dificultad se puede desarrollar un análisis de las probabilidades de acertar el hash válido (también llamado número mágico).

Análisis Probabilístico


Imagen N°2 Fuente

Al analizar las probabilidades de encontrar un bloque debemos tener en cuenta la probabilidad de acertar el número mágico al realizar un solo hash, la cual viene dada por la siguiente fórmula

formprob.png

Como el algoritmo de hashing SHA256 genera salidas de 256 bits, el número de salidas posibles es igual a 2256 , entonces al sustituir en la fórmula obtenemos:

forcal.png

Podemos apreciar que la probabilidad de acertar el hash válido es de 1 en cada 11.180 trillones de intentos realizados una probabilidad bastante pequeña que nos muestra lo mucho que se ha complicado la minería bitcoin en los últimos años, debido a esto la potencia de la red también ha subido hasta los 20.186.349.216 GigaHash/segundo en la actualidad.

Ahora analizaremos el tiempo promedio que tardaríamos para tener un 50% de probabilidad de acertar el hash con la potencia de la red y la dificultad actual, recordemos que la probabilidad de acertar el número mágico al realizar un solo hash es:

for4.png

Para calcular la probabilidad de acertar el hash en n intentos, se debe calcular primero la probabilidad inversa, es decir, la probabilidad de que al realizar n intentos no se acierte ninguno, luego se calcula la probabilidad inversa obteniendose el resultado deseado. En base a esto, la probabilidad de no encontrar el hash válido al primer intento es igual a

for5.png

La probabilidad de realizar dos intentos y fallar en ambos es igual a

for6.png

La probabilidad de no acertar realizando n intentos es

for7.png

Por lo tanto la probabilidad de encontrar el hash válido en n intentos es igual a

for8.png

Calculamos el número de intentos que necesitamos para obtener una probabilidad de 50% de acertar el hash

for9.png

Luego dividimos este valor entre la potencia de la red Bitcoin

fr10.png

Con lo cual hemos obtenido un tiempo promedio de 384 (6 minutos y 24 segundos)segundos para tener un 50% de probabilidad de acertar el número mágico del hash con la potencia y dificultad actuales.

Pero ¿Qué pasa si la potencia de la red aumenta en poco tiempo?, en este caso los bloques se resolverían en un tiempo menor a los 10 minutos, pero en algunos días la red reajustaría la dificultad (en este caso aumentándola) para que el tiempo promedio se aproximara nuevamente a los 10 minutos, el recálculo de la dificultad se realiza cada 2016 bloques (aproximadamente 2 semanas) mediante la siguiente fórmula:

for11.png

El factor de incremento o disminución de la dificultad no puede ser mayor a 4, es decir la dificultad como máximo puede cuadruplicarse y como mínimo ser la cuarta parte de la dificultad anterior, esta restricción evita la volatilidad extrema de la dificultad, aunque con la potencia de la red actualmente es difícil imaginar que este escenario pueda suceder.

Sort:  

Excelente tu análisis mi estimado @ydavgonzalez
Esperamos que sigas compartiendo tus conocimientos en esta comunidad científica de habla hispana #stem-espanol y que los usuarios aprovechen al máximo tu potencial.
No me voy a dedicar a minar, aunque tenga cierta probabilidad de acertar el hash válido, sino que seguiré publicando en steemit.com para compartir conocimientos!

Gracias por el apoyo @iamphysical , yo también me dedicare a publicar en steemit teniendo en cuenta que mis probabilidades de obtener recompensas son mayores a las que tendría minando bitcoin.

Me cuesta digerir, pero hay que estudiar. Obligado seguirte, aportas mucho. Gracias.

Muchas gracias por el apoyo, es cuestión de estudiar el artículo con detenimiento, seguiré aportando a esta comunidad.

lo que mas disfrute de tu post fue las probabilidades, sin duda alguna. gracias por instruirnos y no llevarnos a la desesperanza aprendida

Gracias por el apoyo, me alegra mucho que lo hayas disfrutado

Mano todo bien?

muy buena la combinación entre conocimiento de blockchain y las probabilidades gracias @ydavgonzalez te sigo

Gracias por el apoyo, me alegra que te pareciera interesante éxito

Excelente aporte @ydavgonzalez. Una pregunta: como se estima la potencia de bitcoin

Muchas gracias por tu valoración @jga, en relacion a la potencia total de la red bitcoin la podemos consultar aquí:

https://blockchain.info/es/charts/hash-rate

Respecto a la forma de calcularla, debemos recordar que se hace una estimación, imagino que sumado la potencia de cada uno de los pools de minería (la potencia de cada pool se calcula mediante los shares que son hash casi válidos que se usan para determinar la cuota de trabajo que cada participante aporta al pool y así poder repartir la recompensa de manera equitativa, de esta forma los shares tambien permiten tener una aproximación de cual es la potencia del pool), la determinación de la potencia exacta de la red es prácticamente imposible.

Felicidades!

Gracias por el apoyo @carloserp-2000 , espero seguir aportando buen contenido a la comunidad con mis publicaciones.

Muy buen análisis para comprender mejor la tecnología, y sin embargo, a pesar de que todo es muy instructivo, el cálculo de la probabilidad del número de intentos para tener un 50% de probabilidad de acertar puede llevar a equivocaciones. Simplemente porque ese no será el número medio de intentos que tendrán los nodos para resolver el proof-of-work para esa dificultad. Para ello deberías utilizar una distribución de Bernouilli y obtener el número medio de intentos para una media de 1 acierto. Curiosamente te saldrán 1/p intentos de media en lugar de la fórmula logarítmica. A pesar de eso, me ha ayudado con el diseño de un proyecto privado de cadena de bloques. Gracias y saludos!