¿Qué es prueba de límite de trabajo?

Mire el siguiente código de la billetera bitcoin de Android:

proofOfWorkLimit = Utils.decodeCompactBits(0x1d00ffffL);

Y mira el código de la billetera bitcoin qt:

static CBigNum bnProofOfWorkLimit(~uint256(0) >> 32);

Supongo que en el segundo caso ProofOfWorkLimit es 32 "0" y 224 "1" (000000...000111111111....11111111)?

Entonces, ¿no tengo idea de cómo obtener el primer caso "0x1d00ffffL" del segundo caso? En binario "0x1d00ffffL" es 11101000000001111111111111111.

PD He buscado en uint256.h. No fue útil.

Respuestas (1)

El primer byte, 1D, es la longitud. Los siguientes tres bytes son los bytes altos del hash. Entonces tenemos 00ffff, luego agregamos ffbytes al final para llegar a 29 bytes. Entonces hemos terminado.

Terminamos con 3 bytes de ceros a la izquierda porque 32-29 es 3. Y obtenemos un byte de ceros del segundo byte de los bits compactos. Así que el resultado final es 00,00,00,00,ff,ff,ff...

Gracias por responder. Todavía estoy confundido. ¿Puede su respuesta cómo obtener el "primer caso" de "static CBigNum bnProofOfWorkLimit (~ uint256 (0) >> 27);" ?
~0 significa que todos los bits están establecidos. >> 32significa desplazar los bits dejados por 32 bits, desplazando en ceros en su lugar.
Gracias de nuevo. Disculpe la insistencia, pero ¿puede responder qué es exactamente lo que debo poner aquí "Utils.decodeCompactBits(0x1d00ffffL);" en caso de que "~uint256(0) >> 27" ?
Quieres 27 bits cero. Eso es 3 bytes de todos los bits cero, seguidos de 3 bits cero más. 00011111es 1F_ Dado que todo tiene 32 bytes y necesitamos 3 bytes cero, la longitud del segmento distinto de cero es 29 bytes, que en hexadecimal es 1D. Entonces, a menos que cometí un error, obtengo 0x1D1FFFFF.