Segregated-Witness

傳統地址格式和原生 segwit 之間的虛擬大小、剝離大小和原始大小如何比較?

  • December 23, 2021

這個答案表明隔離見證不會減少交易規模。如果這是真的,為什麼發送 SegWit 交易更便宜?

讓我們比較單簽名輸出類型的 2 輸入和 2 輸出交易。我將交易的字節長度稱為“原始大小”,將沒有見證數據的交易稱為“剝離大小”,將見證折扣時的大小等效稱為“虛擬大小”。

顯示詳細數據的表格

  • P2PKHPay to Public Key Hash沒有見證數據,因此原始大小等於剝離大小等於虛擬大小。具有兩個輸入和兩個輸出的 P2PKH 事務具有 374 字節(= 374 vbytes)。
  • P2SH-P2WPKHPay to Script Hash-wrapped Pay to Witness Public Key Hash(又名“包裝隔離見證”)將資金鎖定到 P2SH 輸出,但輸入的兌換腳本包含一個見證程序,該程序將評估重定向到見證堆棧。見證堆棧的內容與 P2PKH 相同scriptSig。具有兩個輸入和兩個輸出的 P2SH-P2WPKH 事務的原始大小為 420 字節,剝離大小(刪除見證數據)為 202 字節,虛擬大小為 256.5 vbytes。
  • P2WPKHPay to Witness Public Key Hash(又名 single-sig v0 native segwit)不需要 P2SH 間接,而是直接解析見證程序。它與 P2SH-P2WPKH 輸入具有相同的見證堆棧。具有兩個輸入和兩個輸出的 P2WPKH 事務的原始大小為 372 字節,剝離大小為 154 字節,虛擬大小為 208.5 vbytes。
  • P2TR支付給 Taproot(v1 原生 segwit (keypath-spend))也直接解決了見證程序。由於見證程序已經包含公鑰而不是公鑰雜湊,因此見證堆棧比公鑰小,但輸出腳本更大。具有兩個輸入和兩個輸出的 P2TR 事務的原始大小為 312 字節,剝離大小為 178 字節,虛擬大小為 211.5 vbytes。

原始大小對應於磁碟上事務的**數據足跡或傳輸它的頻寬成本。**我們看到 P2SH-P2WPKH 實際上是最大的原始大小。P2WPKH 和 P2PKH 在原始大小上非常接近,傳統格式 P2PKH 的輸入大小略小,但輸出大小略大。P2TR 具有最小的數據佔用空間。

虛擬大小對應於決定費用的塊權重以及一個塊中可以容納多少交易。在應用見證人所承受的稱重後,P2WPKH 的權重最小,緊隨其後的是 P2TR,其次是 P2SH-P2WPKH,傳統格式 P2PKH 算作最重。


尺寸計算

交易標頭列出了交易版本(4 B)、輸入計數(VarInt,通常為 1 B,但最多 9 B)、輸出計數(varInt,通常為 1 B,但最多 9 B)和鎖定時間(4乙)。對於隔離見證交易,我們添加與整個交易相關的見證標記 (1 WU) 和見證標誌 (1 WU)。

每個輸入都必須表明它在每個輸出點上花費的 UXTO (txid+vout = 32+4 B),具有序列值 (4 B),並具有輸入腳本 ( scriptSig)。對於非隔離見證輸出類型,scriptSig包含腳本參數和/或贖回腳本以滿足輸出腳本( scriptPubKey)。對於打包的 segwit 輸入,scriptSig由一個兌換腳本組成,其中包含一個見證程序,該程序作為最終腳本重定向到見證堆棧。對於原生 segwit 輸出,為空,由scriptSig``scriptSig長度為 0。根據 segwit 規則,這被解釋為驗證重定向到見證堆棧。請注意,如果交易至少有一個隔離見證輸入,則每個輸入都必須有一個見證棧,非隔離見證輸入的見證棧長度為零(即只有一個字節表示長度為 0)。

輸出包括一定數量的 satoshis (8 B) 和一個輸出腳本 ( scriptPubKey)。輸出沒有見證數據。

P2PKH

TxHeader:10 B = 40 WU

輸入¹:148 B = 592 WU

輸出:34 B = 136 WU

對於傳統格式,原始大小、剝離大小和虛擬大小都是相等的,因為它們沒有見證數據。

帶有 2 個輸入和 2 個輸出的 Tx:

raw = stripped = vsize = 10 B + 2×148 B + 2×34 B = 374 B = 374 vB

weight = 4×374 vB = 1496 WU

P2SH-P2WPKH

TxHeader:10 B + 2 WU = 10.5 vB = 42 WU

輸入²:64 B + 108 WU = 91 vB = 364 WU

輸出:32 vB = 128 WU

帶有 2 個輸入和 2 個輸出的 Tx:

raw = 12 B + 2×(64 B + 108 B) + 2×32 B = 420 B

stripped = 10 B + 2×64 B + 2+32 B = 202 B

weight = 42 WU + 2×(4×64 vB + 108 WU) + 2×128 WU = 1026 WU = 256.5 vB

P2WPKH

TxHeader:10 B + 2 WU = 10.5 vB = 42 WU

輸入³:41 vB + 108 WU = 68 vB = 272 WU

輸出:31 vB = 124 WU

帶有 2 個輸入和 2 個輸出的 Tx:

raw = 12 B + 2×(41 B + 108 B) + 2×31 B = 372 B

stripped = 10 B + 2×41 B + 2×31 B = 154 B

weight = 42 WU + 2×(4×41 vB + 108 WU) + 2×124 WU = 834 WU = 208.5 vB

P2TR

TxHeader:10 B + 2 WU = 10.5 vB = 42 WU

輸入⁴:41 vB + 66 WU = 57.5 vB = 230 WU

輸出:43 vB = 172 WU

帶有 2 個輸入和 2 個輸出的 Tx:

raw = 12 B + 2×(41 B + 66 B) + 2×43 B = 312 B

stripped = 10 B + 2×41 B + 2×43 B = 178 B

weight = 42 WU + 2×(4×41 vB + 66 WU) + 2×178 WU = 846 WU = 211.5 vB


輸入腳本權重的詳細資訊見:

¹ P2PKH 交易的輸入有多大?

²封裝的 segwit 單簽名輸入的大小和重量是多少?

³ P2WPKH 輸入的大小和重量是多少?

P2TR 輸入的權重是多少?

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