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.
El primer byte, 1D, es la longitud. Los siguientes tres bytes son los bytes altos del hash. Entonces tenemos 00ffff
, luego agregamos ff
bytes 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...
Vitali Grabovski
david schwartz
>> 32
significa desplazar los bits dejados por 32 bits, desplazando en ceros en su lugar.Vitali Grabovski
david schwartz
00011111
es1F
_ 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, obtengo0x1D1FFFFF
.