wie kann man ein utxo ausgeben wenn die entsprechende scriptsig länger als 256 bytes ist?

Ich versuche, ein utxo auszugeben, das an eine p2sh-Adresse gesendet wird. Die Skriptsig (einschließlich des Einlöseskripts) ist länger als 256 Bytes. Wenn die Transaktion serialisiert wird, gibt es nur ein Byte, um die Größe des scriptsig anzugeben. Wie soll ich es machen? Danke im Voraus.

Antworten (1)

Die Größe wird als Kompaktgröße kodiert. Diese können bis zu 9 Byte lang sein und eine beliebige Größe zwischen null und 18446744073709551615 Byte codieren.

Die Regeln lauten (laut 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);
}

Was im Grunde bedeutet, für alle Daten der Länge Lin Bytes,

Wenn L < 253, ist die Kodierung nur der Wert selbst. Alles zwischen 0x00und 0xFC.

Bei größeren Größen stellen wir der Codierung ein Byte voran 0xFD, 0xFEoder 0xFFje nachdem, wie viele Bytes für die Codierung erforderlich wären. Die Größen 253, 254und 255sind eine Ausnahme (es ist leicht zu erkennen, warum ihre Bytes für die Codierung selbst verwendet werden) und werden als Zwei-Byte-Größe behandelt. Die Größenbytes selbst sind in Little Endian codiert.

Wenn 253 <= L < 65535, ist die Codierung zuerst das Byte 0xFD, dann die beiden Bytes, die die tatsächliche Größe ausmachen. Ihr spezifischer Wert 256liegt in diesem Bereich und wird wie folgt codiert:

FD0001

FDweil es im zweiten Bereich liegt und 0001das "Umgekehrte" von ist 0100.

Die restlichen Bereiche verhalten sich gleich und ihre Bereiche werden im Code-Snippet angezeigt.

Beachten Sie, dass Sie im speziellen Fall der Ausgabe von P2SH niemals 254 oder 255 benötigen, da das maximal zulässige Einlösungsskript 520 Bytes beträgt.
Die Größenbytes selbst sind in Little Endian codiert.