參考隔離見證原始交易格式
誰能給我一個連結到隔離見證原始交易的規範,例如<https://developer.bitcoin.org/reference/transactions.html#raw-transaction-format>中提供的?(這個網址完美地解釋了它,但僅適用於遺留交易)我只能找到沒有解釋如何建構一個的文件(例如 BIP)。
BIP144詳細說明了確切的格式。
這個想法是每個交易輸入都有一個見證堆棧(由 0 個或多個字節數組組成,每個字節數組都是可變長度的)。對於 pre-segwit 交易,所有見證堆棧都是空的。
交易有兩種不同的序列化格式,基本的和擴展的。每當一個事務中的所有見證堆棧都是空的,就必須使用基本的序列化格式(等於 pre-segwit 事務格式)。每當至少一個見證堆棧非空時,必須使用擴展格式。
常用格式
我將首先介紹一些常見的序列化名稱,以便進一步使用:
LE16 :將*[0,0xFFFF]*範圍內的無符號整數序列化為2 個字節,最低有效字節在前。
LE32 :將*[0,0xFFFFFFFF]*範圍內的無符號整數序列化為4 個字節,最低有效字節在前。
LE64 :將*[0,0xFFFFFFFFFFFFFFFF]*範圍內的無符號整數序列化為8 個字節,最低有效字節在前。
CompactSize:以可變字節數序列化無符號整數:
- 0 ≤ n ≤ 0xFC:直接序列化為 [n](一個字節)。
- 0xFD ≤ n ≤ 0xFFFF:序列化為 [0xFD] + LE16(n)(3 個字節)。
- 0x10000 ≤ n ≤ 0xFFFFFFFF:序列化為 [0xFE] + LE32(n)(5 個字節)。
- 0x100000000 ≤ n ≤ 0xFFFFFFFFFFFFFFFF:序列化為 [0xFF] + LE64(n)(9 字節)。這實際上並沒有被使用,因為沒有這麼大的結構可以放在一個塊中。
T 的向量:T類型項目的可變長度列表的序列化。序列化由第一個 CompactSize(n) 組成,其中 n 是列表元素的數量,然後是每個元素本身的序列化。
基本序列化
對於沒有證人的交易。
序列化如下:
LE32:版本號:交易版本號(目前一般為1或2,版本2的含義見BIP68)。
用於指定交易輸入的 TxIns 向量。每個TxIn是:
- 32 字節:prevout hash:前一個交易的 txid,其輸出正被此輸入消耗。
- LE32: prevout index : 此輸入所花費的輸出在上一個事務的 TxOut 向量中的位置。
- 字節向量:scriptSig或解鎖腳本。該腳本應該將滿足已用輸出的 scriptPubKey 中的程序所需的參數推送到堆棧上。
- LE32:nSequence:交易輸入的序列號或相對鎖定時間。有關詳細資訊,請參閱 BIP125 和 BIP68。
用於指定交易輸出的 TxOuts 向量。每個TxOut是:
- LE64:金額:交易輸出的價值,以 sats 為單位(BTC 的 1/100000000)。
- 字節向量:scriptPubKey或鎖定腳本。此腳本指定可以使用輸出的條件。
LE32:nLockTime :事務的絕對鎖定時間(高度,如果 < 500000000,或 UNIX 時間戳,如果最後)。在這個時間/高度過去之前,交易不能被包含在一個塊中。
擴展序列化
對於與見證人的交易。
LE32: nVersion **:**同上
固定字節0x00:表示擴展格式
固定字節 0x01:表示存在見證擴展
TxIn 向量:同上
TxOut 的向量:同上
對於每個輸入,一個見證堆棧。見證棧的數量沒有長度指標;它們的數量隱含地等於 TxIn 的數量。每個見證棧是:
StackItems 的向量。每個StackItem是:
- 字節向量。
LE32: nLockTime : 同上
因此,每個交易輸入都有一個相應的見證堆棧,每個由零個或多個字節向量組成。對於預見證支出,見證堆棧是空的。對於 segwit 輸入,堆棧項相當於 scriptSig,解鎖支出。例如:
- 對於 P2WPKH 支出 ( BIP141 ],見證堆棧包含兩項;首先是公鑰,然後是簽名。
- 對於 P2WSH 支出 (BIP141),見證堆棧包含一項或多項。最後一項是見證腳本,之前的所有項都是它的輸入。
- 對於 P2TR 密鑰路徑支出 ( BIP341 ),見證堆棧僅包含一項:簽名。
- 對於 P2TR 腳本路徑花費(BIP341 和BIP342),見證堆棧包含 2 個或更多項:最後一項是控制塊(證明此腳本是允許的),倒數第二項是腳本本身,以及之前的所有項是腳本的輸入。
對於本地見證人支出,scriptSigs 本身將(並且必須)為空。P2WPKH 和 P2WSH 也可以嵌入到 P2SH ( BIP16 ) 中。在這種情況下,scriptSig 將包含一個虛擬的兌換腳本,它將執行“重定向”到見證人。