Función GetBlockWork() de Bitcoin

La implementación de GetBlockWork()en la fuente bitcoin v0.9.3 ( https://github.com/bitcoin/bitcoin/blob/v0.9.3/src/main.h#L815-L822 ) me parece extraña. El código se proporciona a continuación para mayor comodidad.

CBigNum GetBlockWork() const
{
    CBigNum bnTarget;
    bnTarget.SetCompact(nBits);
    if (bnTarget <= 0)
        return 0;
    return (CBigNum(1)<<256) / (bnTarget+1);
}
  1. ¿Por qué el +1 en el denominador?
  2. ¿Y el numerador no debería ser el entero máximo posible de 256 bits, en lugar de 2^256?

Espero que la implementación sea:

CBigNum GetBlockWork() const
{
    CBigNum bnTarget;
    bnTarget.SetCompact(nBits);
    if (bnTarget <= 0)
        return 0;
    CBigNum bnMax;
    bnMax.SetHex("0xFFFFFFFFFFFFFFFF"); // Max 256 bit int
    return (bnMax / bnTarget);
}

Respuestas (1)

Esta parece ser una función para calcular la cantidad promedio de hashes necesarios para generar un bloque en particular. (Esto es diferente de la dificultad.)

Creo que esta función es correcta. Para explicar por qué, imagina que Bitcoin usa hashes de 4 bits en lugar de hashes de 256 bits. Esto haría que el rango de valores posibles fuera de 0 a 15.

Si el objetivo fuera 15, eso significaría que cualquier hash sería válido. Por lo tanto, debería tomar 1 hash en promedio para encontrar una prueba de trabajo válida:

= (maximum possible hash + 1) / (target + 1)
= (15 + 1) / (15 + 1)
= 1

Si el objetivo fuera 7, eso significaría que la mitad de los hashes serían válidos. Por lo tanto, debería tomar 2 hashes en promedio para encontrar una prueba de trabajo válida:

= (maximum possible hash + 1) / (target + 1)
= (15 + 1) / (7 + 1)
= 2

Recuerde, una prueba de trabajo es válida si es menor o igual que el objetivo. Véase también ComprobarPruebaDeTrabajo().

No puedo decir si esto se usa en alguna parte. Esta función parece haber sido eliminada en la última versión.

Básicamente, el +1 en el denominador se debe a que hay target+1valores que son menores o iguales que el objetivo, lo cual tiene sentido. Y el numerador es `1+maxtarget', porque hay 1+maxtarget valores que son menores o iguales que el objetivo máximo. Esto lo aclara, gracias!
Hola, eventualmente, según la fuente reciente de litecoin, ¿cómo codificar para extraer realmente el bloque de génesis? Por ejemplo, esto se basa en la versión 0.8 de la fuente litecoin. pastebin.com/du2XdxCC A partir de esto, ¿cómo se debe cambiar? Gracias.