Estoy intentando gastar un utxo enviado a una dirección de p2sh. El scriptsig (incluido el script de canje) tiene más de 256 bytes. Cuando la transacción se serializa, solo hay un byte para indicar el tamaño del scriptsig. ¿Cómo debería hacer? Gracias por adelantado.
El tamaño se codifica como Tamaño compacto. Estos pueden tener hasta 9 bytes de longitud y codificar un tamaño entre cero y 18446744073709551615 bytes.
Las reglas son (según serialize.h
):
/**
* Compact Size
* size < 253 -- 1 byte
* size <= USHRT_MAX -- 3 bytes (253 + 2 bytes)
* size <= UINT_MAX -- 5 bytes (254 + 4 bytes)
* size > UINT_MAX -- 9 bytes (255 + 8 bytes)
*/
inline unsigned int GetSizeOfCompactSize(uint64_t nSize)
{
if (nSize < 253) return sizeof(unsigned char);
else if (nSize <= std::numeric_limits<unsigned short>::max()) return sizeof(unsigned char) + sizeof(unsigned short);
else if (nSize <= std::numeric_limits<unsigned int>::max()) return sizeof(unsigned char) + sizeof(unsigned int);
else return sizeof(unsigned char) + sizeof(uint64_t);
}
Lo que básicamente significa, para cualquier dato de longitud L
en bytes,
Si L < 253
, la codificación es solo el valor en sí. Cualquier cosa entre 0x00
y 0xFC
.
Para tamaños más grandes, anteponemos la codificación con un byte 0xFD
, 0xFE
o 0xFF
dependiendo de cuántos bytes se necesiten para codificarla. Los tamaños 253
y son una excepción 254
( 255
es fácil ver por qué. Sus bytes se usan para la codificación en sí) y se tratan como un tamaño de dos bytes. Los bytes de tamaño en sí están codificados en little endian.
Si 253 <= L < 65535
, la codificación es primero el byte 0xFD
, luego los dos bytes que conforman el tamaño real. Su valor específico de 256
está en este rango y se codificará como:
FD0001
FD
porque está en el segundo rango, y 0001
es el "reverso" de 0100
.
El resto de los rangos se comportan igual y sus rangos se muestran en el fragmento de código.
pieter wuille
amaclin