Compact Size (VarInt)
CompactSize (también llamado VarInt en algunos contextos) es el formato de codificación de enteros variables que Bitcoin usa en la serialización de transacciones y bloques para indicar longitudes y conteos: número de inputs, número de outputs, longitud de scripts, etc. No usa un número fijo de bytes; usa 1, 3, 5 o 9 bytes según el valor a representar, lo que ahorra espacio para los valores más comunes (menores de 253). Esta herramienta codifica cualquier número entero en formato CompactSize y decodifica cualquier CompactSize a su valor numérico. Imprescindible para quienes trabajan con transacciones Bitcoin a nivel de bytes.
Reglas de codificación
| Rango | Prefijo | Tamaño total | Formato |
|---|---|---|---|
| 0 – 252 | — | 1 byte | Valor directo |
| 253 – 65.535 | fd |
3 bytes | fd + 2 bytes LE |
| 65.536 – 4.294.967.295 | fe |
5 bytes | fe + 4 bytes LE |
| > 4.294.967.295 | ff |
9 bytes | ff + 8 bytes LE |
LE = Little-Endian: el byte menos significativo va primero. Por ejemplo, 253 (0x00FD) se codifica como fd fd00.
Ejemplos
¿Dónde se usa
Compact Size se usa en muchos lugares dentro de las transacciones Bitcoin:
- Input count — número de inputs en la transacción
- Output count — número de outputs
- Script length — longitud del scriptSig o scriptPubKey
- Witness item count — número de elementos en el witness
- Witness item length — longitud de cada elemento witness