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);
}
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);
}
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.
codificador morse
target+1
valores 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!creador