Entero compacto en Scripts

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?

Respuestas (3)

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

Esta es la dirección correcta. Encontré el código fuente relevante en Bitcoind, pero esperaba una explicación concisa del formato si estaba documentado en algún lugar fuera del código.

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

Los enteros de longitud variable se utilizan en los formatos de protocolo y serialización. El entero compacto se usa en el lenguaje Script para representar valores enteros durante las operaciones. Por ejemplo, decodifique "4f01e40164" { "asm": "-1 -100 100", "type": "no estándar", "p2sh": "2N8BQEfUK2Q1e6Svt9ro9LkjVeB5tXQJnBh" }
@Matt, no mezcle Variable_length_integer_encoding (la cantidad de entradas/salidas en la transacción) y la codificación de operaciones push en scripts. Estas son cosas diferentes.
No lo estoy mezclando, mi pregunta es sobre la codificación de enteros para operaciones de inserción.
Esta respuesta es incorrecta. Los enteros de longitud variable en el protocolo P2P no son lo mismo que la codificación de enteros para números dentro de Script.