¿Cómo se determinó exactamente el coeficiente original de dificultad?

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, bnProofOfWorkLimitse 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.

  • ¿Se basa en algún límite físico duro de la informática?

Me he encontrado con este código en chainparams.hlínea 113:

bnProofOfWorkLimit = CBigNum(~uint256(0) >> 32);
  1. ¿Qué ~uint256(0)significa en C++? Sé que eso ~uint256(0) >> 32significa 1 / 2^24en términos legibles por humanos.
  2. ¿Por qué se ~uint256(0)usa la función en lugar de simplemente 256?
  3. ¿Por qué se eligió expresarlo como 256 >> 32en 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^24se llegó al número para estimar 10 minutos en términos de cuánto tiempo lleva calcular un resumen sha256.

Respuestas (2)

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.

¿Cómo un valor de da 2^224-1como bnProofOfWorkLimitresultado que cada hash tenga la posibilidad de 1/2^32ser más bajo que el objetivo máximo?
Hay 2 ^ 256 valores de hash posibles diferentes, aproximadamente 2 ^ 224 de ellos son inferiores al objetivo máximo, por lo que uno uniformemente aleatorio tiene una probabilidad de 2 ^ 224 / 2 ^ 256 = 1/2 ^ 32 de probabilidad de ser inferior a el objetivo máximo. PD: no estoy lo suficientemente familiarizado con el código como para saber exactamente qué es bnProofOfWorkLimit, pero supongo que se traduce en el objetivo máximo como se describe anteriormente.
Lo tengo, no estaba seguro de los valores de hash máximos posibles. ¿Cuál es el significado de que un hash sea "más bajo" que el objetivo máximo de todos modos? ¿Cómo juega todo esto en la ecuación de dificultad? Es un desafío increíble comprender cómo funciona todo esto en el nivel más bajo, comenzando desde cero y simplemente leyendo el código.
@bvpx: Bueno, ser más bajo que el objetivo máximo no es muy significativo, aparte de ser útil en los cálculos y ser un requisito para compartir un grupo de minería tradicional. Lo que importa es estar por debajo del objetivo actual. En realidad, no existe la "dificultad", el objetivo se calcula a partir del objetivo anterior y el tiempo para encontrar bloques de 2016, y la dificultad se define como la relación entre el objetivo máximo y el objetivo actual. El primer objetivo era, por supuesto, el objetivo máximo y nunca puede superarlo.
@bvpx: La cuestión es que, una vez que sabemos que la probabilidad de ser menor que el objetivo máximo es 1/2^32 y que la dificultad es D, sabemos que la probabilidad de que un hash sea menor que el objetivo y, por lo tanto, un bloque válido es 1 / (2^32*D). Por supuesto, dado que el objetivo máximo es 2 ^ 224-2 ^ 208 en lugar de 2 ^ 224, esto es una cantidad insignificante.
Ya veo. Por lo tanto, la dificultad no podía reorientarse a menos de 1 porque ya estaba en el límite. Cuando más mineros se unieron a la red a fines de 2009, la dificultad aumentó. Sin embargo, me pregunto cómo se calculó la ventana de 10 minutos. ¿Es la 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.
@bvpx: No, 1/2^32 no es significativo además de ser un número redondo y dar un resultado que coincidía con lo que se deseaba. A partir del hashrate total de la red (que al principio era el hashrate de Satoshi), es fácil calcular cuál es el objetivo necesario para mantener los bloques en uno cada 10 min. Alts cambia el intervalo entre bloques no jugando con el objetivo máximo, sino cambiando el cálculo de retarget.

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