¿Cómo se calcula la dificultad?

¿Alguien puede explicarme en un lenguaje sencillo cómo se calcula la dificultad? Tengo un entendimiento muy aproximado de que se calcula en función de la cantidad de poder hash en toda la comunidad bitcoin durante un período de tiempo específico. Pero esto es muy vago.

También entiendo que puede cambiar muy rápidamente. ¿Solo puede aumentar? ¿Existe alguna fórmula para calcularlo o predecirlo?

Gracias por una respuesta detallada, Meni Rosenfeld. Solo para asegurarme de que hice todo bien. Estoy resumiendo todo el tiempo, se tardó en generar los últimos bloques de 2016. Y luego aplica la fórmula.

Comentarios

  • Creo que las preguntas de seguimiento son mejores como comentarios a la respuesta. Básicamente, sí, pero en realidad no se necesita una suma: solo puede tomar las marcas de tiempo del último bloque y del bloque 2016 anterior, y restar.

Respuesta

La dificultad de Bitcoin comenzó en 1 (y nunca puede bajar de eso). Luego, por cada 2016 bloques que se encuentran, las marcas de tiempo de los bloques se comparan para averiguar cuánto tiempo tomó encontrar los bloques 2016, llámelo T. Queremos que los bloques 2016 demoren 2 semanas, así que si T es diferente, multiplicamos la dificultad por (2 semanas / T) – de esta manera, si el hashrate continúa como estaba, ahora tomará 2 semanas encontrar bloques de 2016.

Por ejemplo, si solo tomó 10 días significa que la dificultad es demasiado baja y, por lo tanto, se incrementará en un 40%.

La dificultad puede aumentar o disminuir dependiendo de si tomó menos o más de 2 semanas para encontrar bloques de 2016. Por lo general, la dificultad disminuirá después de que baje el hashrate de la red.

Si el factor de corrección es mayor que 4 (o menos de 1/4), entonces se usa 4 o 1/4 en su lugar para evitar el cambio para ser demasiado abrupto.

Hay un error en la implementación, debido a que el cálculo se basa en el tiempo para encontrar los últimos bloques de 2015 en lugar de 2016. Arreglarlo requeriría una bifurcación dura y, por lo tanto, diferido por ahora.

Es posible dar una estimación aproximada del próximo cambio de dificultad, basado en el tiempo para encontrar los bloques recientes. Nadie puede hacer predicciones a largo plazo para la dificultad futura de manera confiable, pero cualquiera es libre de especular sobre la base de las tendencias del tipo de cambio, la ley de Moore y otros avances de hardware.

Comentarios

  • @StevenRoose: AFAIK, pero dejaré que las personas que están más involucradas con el código central comenten … Esto es adecuado para una pregunta SE separada.
  • Buena respuesta, pero se elude un punto pequeño, pero capital: ¿cómo se ponen de acuerdo los nodos de la red sobre cuál es la dificultad?
  • @deadalnix: La dificultad de un bloque es un cálculo determinista basado en los datos de los bloques anteriores. Todos los nodos hacen el mismo cálculo de forma independiente y obtienen el mismo resultado.
  • @deadalnix: La marca de tiempo es parte del bloque, lo que significa que quien haya encontrado el bloque decide qué poner en él . La marca de tiempo no debe ser anterior a la mediana de los últimos 11 bloques. Además, si un nodo recibe un bloque con una marca de tiempo de más de 2 horas en el futuro, volverá a úsalo y no lo propagues.
  • @tobi: Oh, está bien. Los comentarios anteriores se referían al error y los » errores » insinuaban que ‘ es el error, así que asumí que ‘ estamos hablando de eso. Entonces sí. Si asumimos que alrededor de 2140 la tasa de hash será alrededor de * 1B de lo que es ahora, el calendario se adelantará 96 semanas, o casi dos años. Pero hay otro efecto más: un retraso causado por el hecho de que al principio, la dificultad era 1 a pesar de que el hashrate no era ‘ suficiente para justificarlo.

Respuesta

La respuesta de Meni es buena. Solo quiero dar un método de detalle práctico sobre el cálculo de la dificultad, quizás útil para el futuro vistas de la respuesta de esta pregunta.

Echemos un vistazo al encabezado del bloque génesis de Satoshi (parte de la información relacionada):

$ bitcoin-cli getblockhash 0 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f $ bitcoin-cli getblockheader 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f { ... "height": 0, ... "bits": "1d00ffff", "difficulty": 1, ... } 

Como podemos ver arriba, el bloque génesis tiene una dificultad «1» y bits «1d00ffff». Los bitcoin bits significan el valor hash «objetivo», el nuevo bloque generado debe cumplir una condición: el valor hash SHA-256 doble del encabezado del bloque debe ser menor que esto valor «objetivo».

El valor de bits «1d00ffff» en el bloque génesis significa el valor «objetivo»:

[0x00000000,0xffff,{0x00..0x00}] {0x00..0x00} at above has 26 bytes 0x00. 

Luego, para Para encontrar un nuevo bloque, debe buscar ese valor nNonce de 32 bits (y nTimes y hashMerkleRoot también) hasta que el valor hash del bloque tenga 4 bytes de cero a la izquierda.Por cierto, nNonce es uno de los campos en la estructura del encabezado del bloque:

 struct header_structure{ // BYTES NAME uint32_t nVersion; // 4 version uint8_t hashPrevBlock[32]; // 32 previous block header hash uint8_t hashMerkleRoot[32]; // 32 merkle root hash uint32_t nTime; // 4 time uint32_t nBits; // 4 target uint32_t nNonce; // 4 nonce }; 

Porque el algoritmo SHA-256 (así como cualquier algoritmo hash criptográficamente seguro) produce una salida que aparecerá como una secuencia uniformemente aleatoria , el método práctico de «prueba y error» es la única forma de encontrar un nuevo bloque que cumpla la condición. La probabilidad de encontrar un bloque con el valor hash inicial cero de 4 bytes es 1 / (2 ^ 32), lo que significa que los números promedio de «prueba y error» son exactamente 2 ^ 32 (es decir, 4G).

Para que los humanos comprendan fácilmente este valor hash «objetivo», definimos el término «dificultad», que significa los números promedio de «prueba y error» para encontrar un bloque que cumpla con la condición «objetivo». Y definimos la unidad de «dificultad»: 1 «dificultad» = hashes 4G

Entonces, hasta hoy, la altura de la cadena de bloques de bitcoin alcanza 501509, echemos un vistazo a su encabezado:

$ bitcoin-cli getblockheader 0000000000000000006c5532f4fd9ee03e07f94df165c556b89c495e97680147 { ... "height": 501509, ... "bits": "18009645", "difficulty": 1873105475221.611, ... } 

El bloque 501509 «s bits = 0x18009645, es el formato compacto de un entero de 256 bits, su formato de 256 bits es:

[0x00000000,0x00000000,0x009645,{0x00..0x00}] {0x00..0x00} at above has 21 bytes 0x00. that is 0x009645 * (256 ^ 21) The genesis block"s target is ( 0x00ffff * 256 ^ 26 )which is the difficulty unit "1.0". So, the difficulty = (0x00ffff * 256 ^ 26)/ (0x009645 * 256 ^ 21) = 65535/38469 * (256^5) = 1.703579505575918 * 2^40 = 1873105475221.611 

Hasta ahora, tienes todos los detalles sobre cómo calcular la» dificultad «. En algunos casos, también usamos el formato simple 1.7T para decir la dificultad, en el ejemplo anterior:

 (1.703579505575918 * 2^40) = 1.703579505575918T 1T = 2^40 = 1024^4 

Comentarios

  • 1d es 29 en diciembre (no 26). SHS es SHA
  • gracias @BorisIvanov, el error tipográfico SHS ha sido corregido. Pero 1d de hecho significa 26 bytes de cola cero en lugar de 29, lea el detalle del ejemplo que se muestra arriba.
  • ah sí. Significativo

Respuesta

Me gustaría dar mi 2 centavos aquí, al explicar la relación entre la probabilidad de extraer un bloque dado el objetivo actual t y la dificultad correspondiente d tal como se calcula en el núcleo de bitcoin.

De modo que las funciones de hash criptográficas se idealizan mediante la abstracción aleatoria de Oracle [ https://en.wikipedia.org/wiki/Random_oracle] . Por lo tanto, podemos modelar la salida de la función hash doubleSHA256 utilizada en PoW como una variable uniforme en el espacio {0,1}^256, es decir, matrices de 256 bits . Por lo tanto, la probabilidad de que un solo hash h sea un hash válido es:

p = P(h < t) = t /( 2^{256} - 1 ) 

Por otro lado d se calcula de la siguiente manera, tal como @gary explicó antes solo transformado en decimales:

d = ( (2^{16} - 1) * 2^{8*26} ) / t = ( (2^{16} -1) * 2^{208} ) / t 

La implementación está en [ https://github.com/bitcoin/bitcoin/blob/master/src/rpc/blockchain.cpp] , línea 60, función GetDifficulty. En realidad, si alguien puede explicar cómo se corresponde exactamente el código con la fórmula anterior, sería útil. Combinando esas dos fórmulas obtenemos:

d = ( (2^{16} -1) * 2^{208} ) / ( p * (2^{256} - 1) ) ~ 2^{-32} / p 

Analizando esta última expresión la dificultad es la relación entre la probabilidad de obtener un hash menor que 2^{224} (que es el número decimal más bajo que tiene una representación binaria usando 256 bits comenzando con 32 bits cero) y la probabilidad de obtener un hash válido basado en el objetivo actual t. Esta es una implicación directa de definir, en el bloque de génesis, como dificultad 1 la asociada al objetivo hexadecimal 0x1d00ffff , expresado en lo que creo que se llama la forma compacta de 32 bits para números de 256 bits.

A Buena pregunta Creo que es por qué se eligió esta forma compacta específica para representar el objetivo.

Comentarios

  • ¡Voto a favor! La forma compacta proporciona los 3 bytes más significativos para el objetivo, en la dificultad mínima los 3 bytes más significativos son 00ffff.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *