Supongo que la dificultad tiene un "objetivo" de 10 minutos porque el coeficiente que satoshi eligió se multiplica por una variable para ayudar a que la red permanezca en proporción. Es decir, si el hashrate de la red es 2 veces el hashrate de la red anterior, bnProofOfWorkLimit
se multiplica por la dificultad anterior y también por 2, que es la medida de cuánto más rápido produce hashes la red.
Esto es bastante simple de entender. Sin embargo, me he estado preguntando cómo se eligió la dificultad original para que el objetivo sea de 10 minutos.
Me he encontrado con este código en chainparams.h
línea 113
:
bnProofOfWorkLimit = CBigNum(~uint256(0) >> 32);
~uint256(0)
significa en C++? Sé que eso ~uint256(0) >> 32
significa 1 / 2^24
en términos legibles por humanos.~uint256(0)
usa la función en lugar de simplemente 256
?256 >> 32
en lugar de 1 >> 24
? ¿Hay alguna buena razón para esto?Cualquier dirección para aprender más sobre esto también sería apreciada .
Nota: no estoy preguntando por qué la cantidad de tiempo elegida fue igual a 10 minutos, estoy preguntando cómo 1 / 2^24
se llegó al número para estimar 10 minutos en términos de cuánto tiempo lleva calcular un resumen sha256.
No estoy seguro de que lo fuera. Cuando la red comenzó a funcionar (y Satoshi era prácticamente el único que extraía), no se encontraban bloques cada 10 minutos. Por ejemplo, los primeros bloques de 2016 se encontraron en 24 días en lugar de 2 semanas. Normalmente, esto haría que el objetivo suba, pero no puede superar el objetivo máximo codificado, por lo que solo en el bloque 32256 el 30 de diciembre de 2009 comenzamos a ver el mecanismo de retarget y los bloques llegaban cada 10 minutos.
Sin embargo, al ver que salió cerca de los 10 minutos, es posible que Satoshi descubriera el hashrate de su propia máquina y eligiera el parámetro como un número redondo cercano a lo que se necesitaría para encontrar un bloque cada 10 minutos en su hardware.
Creo que no entendiste bien esta línea de código. Los valores hash se representan como enteros sin signo de 256 bits. uint256(0) da la representación de 0 en este tipo de datos. ~ es lógico no y ~uint256(0) invierte todos los bits, dando el entero más alto posible, 2^256-1. El desplazamiento a la derecha de 32 bits da 2^224-1, de modo que cada hash tiene una probabilidad de 1/2^32 de ser inferior al objetivo máximo.
Luego, el valor se convierte a la forma de "bits" más compacta, lo que también hace que se redondee a (2^16-1)*2^208.
Hacer 256>>32 o 1>>24 habría resultado en 0 ya que los tipos enteros no pueden contener fracciones.
La primera dificultad fue simplemente el mínimo codificado de 1. Inicialmente, esto no correspondía a diez minutos, en realidad era demasiado alto para el poder de hash de las redes. La dificultad aumentó por primera vez casi un año después, el 30 de diciembre de 2009.
Para obtener una descripción general del ajuste de dificultad, puede consultar esta tabla: Ajustes de dificultad de Bitcoin
bvpx
2^224-1
comobnProofOfWorkLimit
resultado que cada hash tenga la posibilidad de1/2^32
ser más bajo que el objetivo máximo?Meni Rosenfeld
bvpx
Meni Rosenfeld
Meni Rosenfeld
bvpx
1/(2^32)
posibilidad de encontrar un bloque significativo de alguna manera, tal vez debido a la velocidad de la luz, la transferencia de datos está limitada en el hardware, por lo que no es posible calcular un hash más rápido de lo esperado? Supongo que otras monedas alternativas cambian el temporizador de bloque simplemente multiplicando o dividiendo este valor por lo que quieran para aproximar un nuevo temporizador de bloque.Meni Rosenfeld