¿Cómo se traduce un límite de prueba de trabajo de `~uint256(0) >> 20` en una dificultad de `1 / 2^12`?

En la fuente de Litecoin está escrito:

static CBigNum bnProofOfWorkLimit(~uint256(0) >> 20); // Litecoin: starting difficulty is 1 / 2^12

¿Cómo se calcula eso? ~uint256(0) >> 20es 0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_ Los hashes tienen la misma probabilidad de ser cualquier número dado, por lo que la posibilidad de obtener un hash de Litecoin válido (es decir, uno que sea más pequeño que este número) es 0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff / 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff= 1 / 2^20, no 1 / 2^12 . ¿Es esto un error tipográfico en el código fuente de Litecoin o estoy malinterpretando algo?

2^32Una buena forma de recordarlo es que una dificultad de 1 significa que se necesita un promedio de hash para minar un bloque, y se escala linealmente a partir de ahí. Esta convención proviene de Bitcoin, donde la dificultad mínima es, de hecho, 1.
Hola. En la fuente reciente, no hay CBigNum, ¿qué se ha cambiado?

Respuestas (1)

Para usar la terminología en la wiki de Litecoin , ~uint256(0) >> 20es el objetivo y 1 / 2^12es (aproximadamente) la dificultad. Puede ver eso ejecutando lo siguiente en Python (o cualquier cosa que pueda manejar cálculos en números grandes).

target = 0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff # or 2**236-1
diff = 0xFFFF * 2**208 / target
print(diff) # 0.00024413689970970154
print(1/2**12) # 0.000244140625

Creo que la 1 / 2^20cifra que calculaste es la probabilidad de que cada hash tenga éxito, que no es lo mismo que (aunque está relacionado con) la dificultad.

Oh, interesante, no me di cuenta de que tenían una convención sobre cuál es la dificultad. Eso aclara las cosas.
Hola. En la fuente reciente, no hay CBigNum, ¿qué se ha cambiado?