¿Cómo gastar un utxo cuando el scriptsig correspondiente tiene más de 256 bytes?

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.

Respuestas (1)

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 Len bytes,

Si L < 253, la codificación es solo el valor en sí. Cualquier cosa entre 0x00y 0xFC.

Para tamaños más grandes, anteponemos la codificación con un byte 0xFD, 0xFEo 0xFFdependiendo de cuántos bytes se necesiten para codificarla. Los tamaños 253y son una excepción 254( 255es 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 256está en este rango y se codificará como:

FD0001

FDporque está en el segundo rango, y 0001es el "reverso" de 0100.

El resto de los rangos se comportan igual y sus rangos se muestran en el fragmento de código.

Tenga en cuenta que en el caso específico de gastar P2SH, nunca necesita 254 o 255, ya que el máximo de script permitido es de 520 bytes.
Los bytes de tamaño en sí están codificados en little endian.