Raw-Transaction

當相應的scriptsig長於256字節時如何花費一個utxo?

  • December 2, 2017

我正在嘗試將 utxo 發送到 p2sh 地址。scriptsig(包括兌換腳本)超過 256 個字節。當交易被序列化時,只有一個字節來指示腳本的大小。我應該怎麼做?提前謝謝。

尺寸編碼為緊湊尺寸。這些最長可達 9 個字節,編碼的大小為 0 到 18446744073709551615 字節之間的任何值。

規則是(根據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);
}

這基本上意味著,對於任何長度L以字節為單位的數據,

如果L < 253,編碼就是值本身。0x00和之間的任何東西0xFC

對於更大的尺寸,我們在編碼前加上一個字節0xFD0xFE或者0xFF取決於編碼它需要多少字節。大小253,254255是一個例外(很容易理解為什麼。它們的字節用於編碼本身)並被視為兩字節大小。大小字節本身以小端編碼。

如果253 <= L < 65535,編碼首先是 byte 0xFD,然後是構成實際大小的兩個字節。您的特定值256在此範圍內,並將被編碼為:

FD0001

FD因為它在第二個範圍內,並且00010100.

其餘範圍的行為相同,它們的範圍顯示在程式碼片段中。

引用自:https://bitcoin.stackexchange.com/questions/64021