He estado mirando la representación compacta de números enteros para operaciones con números enteros en el lenguaje Script. Parece que la mayoría de las operaciones producen o insertan matrices de bytes, pero cuando se realizan operaciones con números enteros, esas matrices se interpretan utilizando un formato compacto firmado. ¿Este formato está realmente definido en alguna parte, o es estrictamente específico de bitcoin?
Según tengo entendido, puede procesar hasta 4 bytes como un número entero, el negativo de un número entero es binario o con 0x80
. Tengo problemas para decodificar enteros negativos de 1 a 4 bytes en la codificación de cadena de bits correcta.
¿Alguien tiene algún ejemplo o puede indicarme la dirección correcta?
formato big endian genérico MPI formato little endian específico de bitcoin, con tamaño implícito
implementación de Python
https://github.com/petertodd/python-bitcoinlib/blob/master/bitcoin/core/_bignum.py
Los enteros sin signo CompactSize no se usan en Script, se usan en el protocolo Bitcoin para indicar la cantidad de bytes que contiene la siguiente estructura de datos.
Los está confundiendo con ScriptNumbers, que se interpretan para operaciones aritméticas dentro del Script Interpreter .
Cabe señalar que en realidad pueden ser de 5 bytes, sin embargo, si realiza otra operación en ese entero de 5 bytes, recibirá un error en el Intérprete.
Si desea ver cómo se manejan los números negativos, puede consultar la implementación de CScriptNum, cuyo tipo numérico subyacente es un int64_t
No estoy seguro de dónde encontraste números enteros negativos. Pero en la mayoría de los lugares en el protocolo bitcoin se usa una longitud variable compacta para los números enteros. Ver referencia aquí https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer
codificador morse