Dificultad del minado
La dificultad es un valor que se usa para mostrar cuán difícil es encontrar un hash que sea más bajo que el objetivo definido por el sistema.
La red de bitcoin tiene una dificultad de bloque global. Los bloques válidos deben tener un hash por debajo de este objetivo. Los pools de minería también tienen una dificultad de compartir en un grupo o pool específico que establece un límite inferior para las acciones.
Contenido
Principios fundamentales
En la red de Bitcoin hay una dificultad global establecida para todos los bloques. Para que un bloque se considere legítimo, tiene que tener un valor de hash más bajo que el objetivo establecido.
La dificultad se cambia cada 2016 bloques (cada dos semanas aproximadamente). Esto se calcula usando la siguiente fórmula:
difficulty = difficulty_1_target / current_target
donde el objetivo (target) es un número de 256 bits.
difficulty_1_ target puede asumir varios valores. Tradicionalmente se trata de una función hash, en primer lugar 32 bits de los cuales son igual a 0, mientras que el resto son igual a 1 (también se llama dificultad pdiff o de pool). El protocolo Bitcoin proporciona el objetivo como un tipo con punto flotante y precisión limitada. Distintos clientes de Bitcoin a menudo determinan la dificultad en función de estos datos.
Dificultad de almacenamiento en bloques
Cada bloque contiene una versión empaquetada (llamada “Bits”) de objetivo hexadecimal.
Se puede obtener al usar el siguiente objetivo de fórmula desde cualquier bloque. Por ejemplo, si un objetivo empaquetado en un bloque aparece como 0x1b0404cb, su versión hexadecimal tendrá el siguiente aspecto:
0x0404cb * 2**(8*(0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000
El valor máximo para este campo es 0x7fffffff, mientras que el mínimo es 0x008000.
El objetivo máximo posible (con dificultad igual a 1) se define como 0x1d00ffff que aparece como siguiente en la numeración hexadecimal:
0x00ffff * 2**(8*(0x1d - 3)) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000
El siguiente es una forma fácil de cálculo de dificultad. Utiliza una versión alterada de la serie de Taylor para el logaritmo y se basa en los registros para transformar el cálculo de la dificultad.
#include <iostream> #include <cmath> inline float fast_log(float val) { int * const exp_ptr = reinterpret_cast <int *>(&val); int x = *exp_ptr; const int log_2 = ((x >> 23) & 255) - 128; x &= ~(255 << 23); x += 127 << 23; *exp_ptr = x; val = ((-1.0f/3) * val + 2) * val - 2.0f/3; return ((val + log_2) * 0.69314718f); } float difficulty(unsigned int bits) { static double max_body = fast_log(0x00ffff), scaland = fast_log(256); return exp(max_body - fast_log(bits & 0x00ffffff) + scaland * (0x1d - ((bits & 0xff000000) >> 24))); } int main() { std::cout << difficulty(0x1b0404cb) << std::endl; return 0; }
Dificultad máxima, actual y mínima
La dificultad actual se puede descubrir usando la línea de comando de Bitcoin ‘getDifficulty’.
Debido a que la función objetivo no tiene un valor mínimo, la dificultad máxima se puede calcular solo aproximadamente de la siguiente manera:
maximum_target / 1 (como 0 llevaría la ecuación a ser infinitamente grande) que es un número inconcebible (~ 2 a 224).
La dificultad mínima es igual a 1.
Cambios en la dificultad
La dificultad se cambia cada 2016 bloques basándose en el tiempo que le llevó a conocer los bloques 2016 anteriores. Si se encuentra un bloque cada 10 minutos (como se pretendía inicialmente para una emisión homogénea), la búsqueda de 2016 bloques llevará exactamente 2 semanas. Si se encontraron los 2016 bloques anteriores en más de dos semanas, la dificultad se reducirá, y si se extrae de forma más rápida entonces ésta aumentará. Mientras más (o menos) tiempo se haya gastado en encontrar los 2016 bloques anteriores, más se reducirá (o aumentará) la dificultad.
Para extraer un hash de bloque debe ser menor que el objetivo (PoW). La función hash es un número aleatorio entre 0 y 2 * 256-1.
El cambio para dificultad de 1: 0xffff * 2 ** 208 Para la dificultad D: (0xffff * 2 ** 208) / D La cantidad de funciones hash debe resolverse para que se encuentre un bloque en dificultad D: D * 2 ** 256 / (0xffff * 2 ** 208) O simplemente: D * 2 ** 48 / 0xffff
La dificultad se establece como si encontramos los 2016 bloques anteriores a la velocidad de un bloque por cada 10 minutos
De acuerdo con esto, calculamos (D * 2 ** 48 / 0xffff) funciones hash cada 600 segundos. La tasa de hash de nuestra red para los 2016 bloques anteriores fue: D * 2 ** 32 / 0xffff / 600. Sin pérdida significativa de precisión, podemos simplificarlo hasta: D * 2 ** 32/600. A una dificultad de 1 que es aproximadamente 7 funciones hash M / s.
El tiempo promedio para encontrar un solo bloque se puede calcular usando esta fórmula: tiempo = dificultad * 2 ** 32 / hashrate donde ‘dificultad’ es el nivel de dificultad actual de la red Bitcoin y ‘la tasa de hash’ es la cantidad de funciones hash que un minero encuentra por segundo.
¿Cuál es la dificultad actual?
Dificultad actual como resultado del comando “getDifficulty” de Bitcoin.
¿Cuál es la dificultad máxima?
No hay un objetivo mínimo. La dificultad máxima es aproximadamente: maximum_target / 1 (ya que 0 daría como resultado infinito), el cual es un número ridículamente enorme (alrededor de 2 ^ 224).
La dificultad máxima real es cuando el current_objective (objetivo actual) = 0, pero no podríamos calcular la dificultad si eso sucediera. (Afortunadamente nunca lo hará, así que no hay problemas.)
¿Se puede reducir la dificultad de la red?
Si, se puede reducir. Este es un proceso que la red realiza de manera automática dependiendo de cuanto tiempo tomo resolver 2016 bloques. En otras palabras, y como se menciona anteriormente, es un proceso que sucede cada dos semanas aproximadamente.
¿Cuál es la dificultad mínima?
La dificultad mínima, cuando el objetivo está en el valor máximo permitido, es 1.
¿Qué tasa de hash de red da como resultado una dificultad determinada?
La dificultad se ajusta cada 2016 bloques en función del tiempo que llevó encontrar los 2016 bloques previos. A la velocidad deseada de un bloque cada 10 minutos, los 2016 bloques tardarían exactamente dos semanas en lograrlo. Si los 2016 bloques anteriores tardaron más de dos semanas en hacerlo, la dificultad se reduce. Si demoraron menos de dos semanas, la dificultad aumenta. El cambio en la dificultad es proporcional a la cantidad de tiempo durante o por debajo de las dos semanas que tomaron los 2016 bloques anteriores.
Para encontrar un bloque, el hash debe ser menor que el objetivo. El hash es efectivamente un número aleatorio entre 0 y 2 ** 256-1. El intérvalo para la dificultad 1 es
0xffff * 2**208
y para la dificultad D es
(0xffff * 2**208)/D
El número esperado de funciones hash que necesitamos calcular para encontrar un bloque con dificultad D es por lo tanto
D * 2**256 / (0xffff * 2**208)
o solo
D * 2**48 / 0xffff
La dificultad se establece de modo que los 2016 bloques anteriores se hubieran encontrado a la proporción de uno cada 10 minutos, por lo que calculamos (D * 2 ** 48 / 0xffff) funciones hash en 600 segundos. Eso significa que la tasa de hash de la red era
D * 2**48 / 0xffff / 600
Sobre los 2016 bloques anteriores. Se puede simplificar aún más para
D * 2**32 / 600
sin mucha pérdida de precisión.
En la dificultad 1, eso es alrededor de 7 funciones hash M por segundo.
En el momento de escribir, la dificultad es 22012.4941572, lo que significa que en comparación con el conjunto anterior de 2016 bloques , se encontró que la tasa promedio de hash de la red era
22012.4941572 * 2 ** 32/600 = alrededor de 157 funciones hash G por segundo.
¿Qué tan pronto se podría generar un bloque?
El tiempo promedio para encontrar un bloque se puede aproximar calculando:
tiempo = dificultad * 2 ** 32 / tasa de hash
donde la dificultad es la dificultad actual, el hash es el número de funciones hash que calcula tu minero por segundo, y el tiempo es el promedio en segundos entre los bloques que encuentras.
Por ejemplo, usando Python calculamos el tiempo promedio para generar un bloque usando una plataforma de extracción 1Ghash / s cuando la dificultad es 20000:
$ python -c "print 20000 * 2**32 / 10**9 / 60 / 60.0" 23.85
Y descubres que toma poco menos de 24 horas en promedio.
- Cualquiera que triture el hash tiene la misma posibilidad de “ganar” que cualquier otro. El juego de números es la cantidad de intentos que su hardware puede hacer por segundo.
- Necesitas saber la dificultad (arriba) y tu tasa de hash K / seg (reportada por el cliente).
- Véase el artículo que habla sobre hardware de minería para mas información
- Utilice una calculadora o realice las matemáticas usted mismo,
- ¡Recuerda que es solo un asunto de probabilidad! No hay garantías de que ganes cada cierta cantidad de días.