Transaction-Input
P2WPKH 輸入的大小和重量是多少?
我正在研究兩個比特幣項目和一些部落格文章的不同 P2WPKH 輸入大小計算。我正在尋找 P2WPKH 輸入的確切權重、vsize 和序列化長度的詳細解釋,與P2PKH 交易的輸入有多大?.
TL;DR:
P2WPKH 輸入應保守估計為68.0 vbytes。標準 P2WPKH 輸入的重量通常為 67.75 或 68.0 vbytes,具體取決於簽名中的 r 值是低還是高。使用簽名研磨(強烈推薦)的錢包將始終產生 67.75 vbyte 輸入。68.0 vbytes 是允許高 r 簽名的保守估計。
P2WPKH 輸入的組成
每個輸入通過提供其事務輸出點來承諾花費特定的 UTXO :
PREVOUT: hash (32 bytes) index (4 bytes)
P2WPKH輸入的腳本為空,但是,腳本長度必須提供為
0
:SCRIPTSIG: length (1 byte) <no content>
每個交易輸入都有自己的序列號:
sequence (4 bytes)
P2WPKH 輸入需要交易見證塊中的見證棧:
WITNESS STACK: item count (1 byte) signature length (1 byte) signature (71 or 72 bytes)¹ pubkey length (1 byte) pubkey (33 bytes)
保守的重量、vsize 和尺寸估計
P2WPKH 交易輸入添加到交易……
重量:
4 × (32 + 4 + 1 + 4) + 1 + 1 + 72 + 1 + 33 = 272 WU
尺寸:
32 + 4 + 1 + 4 + (1 + 1 + 72 + 1 + 33) / 4 = 68 vbytes
序列化字節長度:
32 + 4 + 1 + 4 + 1 + 1 + 72 + 1 + 33 = 149 bytes
如果簽名錢包使用簽名研磨,r 值始終為 32 字節,將簽名減少到 71 字節,上述最大值分別減少到 271 WU、67.75 vbytes 和 148 字節。
請注意,使用至少一個 segwit 輸入會向交易標頭、見證標記和見證標誌添加2 個見證字節。此外,當至少有一個 segwit 輸入時,見證塊必須為每個 input提供一個見證堆棧,該堆棧必須至少包含一個見證項計數器,指示堆棧為空,作為非 segwit 輸入的字節提供。因此,隔離見證交易的整體交易元素是:
0x00
version (4 bytes) witness marker (1 WU) witness flag (1 WU) input count (1 byte) inputs (variable size) output count (1 byte) outputs (variable size) witness stacks (as many as input count) witness item count (1 WU) witness items (0–n of variable weight) locktime (4 bytes)
出於完整性考慮,具有非標準簽名的 P2WPKH 輸入具有 high-s 和 high-r 的重量分別為 273 WU、68.25 vbytes 和 150 bytes。
¹ 另請參閱DER 編碼的 ECDSA 簽名的最大大小是多少?.