比特幣交易的大小是如何計算的
據我了解,比特幣交易的費用是基於每字節交易大小的推薦費用(主要來自第三方服務)。我很好奇的是錢包是如何達到交易規模的?
自 Segwit 啟動以來,交易規模以重量單位 (WU) 表示。重量單位可以通過除以 4 並向上取整轉換為“虛擬大小”或虛擬字節 (vB)。虛擬大小決定了您在支付費用時的交易量。
未關注的交易
現在,讓我們關注非隔離見證交易。在確定大小時,每個 Non-Segwit 數據字節計數為 4 WU。每筆交易都包含以下欄位:
- 版本(4 字節)
of Inputs (VarInt, 1 byte for numbers up to 252)
- 輸入(變化)
輸出數(VarInt,1 字節,最多 252 個數字)
- 輸出(變化)
- 鎖定時間(4 個字節)
讓我們通過查看非隔離見證原始交易來分解每個欄位:
0200000001d2eed35b0d55763981c635cab7788c28e3683af3d329947a17d7f6005390e6ef010000006a47304402200ffaac8f12e56f4af66109220812b76c7d6bb0e5906cf2de235b79496b3e080b0220037304894b648fa0b50e0d82ef9f58b537233ee282ab31fc04fb3d169d2c97cc0121030120a287eb98922752a89b39df64f7f3314036f6f096341c9189b0cb3c692aaeffffffff02404ff200000000001976a9140b818b11f9624e6a2d5b757a3e8fe45db3f6647788ace0b4b401000000001976a914a1e5e47fce1c5c0868107dba3851eb696c2ead5388ac00000000
版本
這個事務的版本是
02000000
(2 in little-endian)。版本始終為 4 字節 (16 WU)。# 輸入
輸入的數量是
01
(VarInt 表示法中的 1)。這表明該交易有 1 個輸入被使用。這增加了 1 個字節 (4 WU)。輸入
所有輸入都包含以下欄位:
- 引用的事務雜湊(32 字節)
- 輸出索引(4 字節)
- 腳本長度(VarInt,1 個字節,最多 252 個數字)
- ScriptSig(可變)
- 序列(4 個字節)
對於我們的範例交易,值為:
- 參考TX:
d2eed35b0d55763981c635cab7788c28e3683af3d329947a17d7f6005390e6ef
- 輸出索引:
01000000
(1 in little-endian)- 腳本長度:
6a
(VarInt 表示法中為 106)- 腳本簽名:
47304402200ffaac8f12e56f4af66109220812b76c7d6bb0e5906cf2de235b79496b3e080b0220037304894b648fa0b50e0d82ef9f58b537233ee282ab31fc04fb3d169d2c97cc0121030120a287eb98922752a89b39df64f7f3314036f6f096341c9189b0cb3c692aae
- 順序:
ffffffff
這個輸入總共增加了 147 個字節(588 WU)。
# 輸出
輸出的數量是
02
(VarInt 表示法中的 2)。這表明在此事務中創建了 2 個輸出。這增加了 1 個字節 (4 WU)。輸出
所有輸出都包含以下欄位:
- 值(8 字節)
- 腳本長度(VarInt,1 個字節,最多 252 個數字)
- ScriptPubKey(可變)
對於我們的範例交易,我們有 2 個輸出。第一個輸出是:
- 價值:
404ff20000000000
(15,880,000 聰,小端)- 腳本長度:
19
(VarInt 表示法中為 25)- 腳本公鑰:
76a9140b818b11f9624e6a2d5b757a3e8fe45db3f6647788ac
該輸出總共增加了 34 個字節 (136 WU)。
第二個輸出是:
- 價值:
e0b4b40100000000
(28,620,000 satoshi,小端序)- 腳本長度:
19
(VarInt 表示法中為 25)- 腳本公鑰:
76a914a1e5e47fce1c5c0868107dba3851eb696c2ead5388ac
該輸出總共增加了 34 個字節 (136 WU)。
鎖定時間
對於我們的範例事務,鎖定時間為
00000000
(0 in little-endian)。鎖定時間始終為 4 個字節 (16 WU)。這筆交易一共是900 WU。轉換為 vB 為我們提供 225 vB。輸入值為0.4491 BTC,輸出值為 0.445 BTC,總礦工費為 0.0041 或 410,000 satoshi。將其轉換為 sat/vB 為我們提供了 1,822 sat/vB 的費率。(難以置信的高!)
跟踪交易
隔離見證交易是任何花費隔離見證輸入(也就是以“3”或“bc1”開頭的地址)的交易。隔離見證交易包括一些額外的資訊,例如見證數據。隔離見證數據計為 1 WU/字節,因此包含在交易中的成本更低。這就是 Segwit 節省費用的原因。Segwit Transaction 由以下欄位組成,計為 Segwit Data 的欄位以粗體顯示:
- 版本(4 字節)
- 標記(1 字節)
- 標誌(1 字節)
of Inputs (VarInt, 1 byte for numbers up to 252)
- 輸入(變化)
輸出數(VarInt,1 字節,最多 252 個數字)
- 輸出(變化)
- 見證數據(可變)
- 鎖定時間(4 個字節)
同樣,讓我們在範例Segwit Transaction中分解每個部分:
02000000000101caba4ccb61cca412fe29ec553d286134a02335c04355a9cc1e056fe2403692cf1400000000fdffffff026406010000000000160014093c864a10516154d18d2accd61c6b2920a2040f60361e000000000017a9140195e8dd3d1527038a0a77e0b0e4515d6c8ab195870247304402200760efedbcee3bbd913661fb40c364caed622b331ee3b5bc70ac25df2d3763d5022020efdb41ef325089d146eb48948b6aaec85c086fa38a3df4d2a51ee729645ebc012102be338e0362fb01101a873a7502012cb82f7d9d303b4943fa0702829a763e49762b550900
版本
版本和以前一樣,
02000000
(2 in little-endian)並且總是 4 字節(16 WU)。標記
標記是
00
(VarInt 表示法中的 0)。標記表明該交易是隔離見證交易。執行 Segwit 的節點將看到此標記並知道正確解析事務,而未執行 Segwit 的節點會將標記視為“# of Inputs”欄位,將其視為無效輸入而丟棄為 0。這增加了 1 個字節 (1 WU)。旗幟
標誌是
01
(VarInt 表示法中的 1)。該標誌表示見證數據將出現在交易中,並添加 1 個字節 (1 WU)。# 輸入
輸入的數量是
01
(VarInt 表示法中的 1)表示該交易有 1 個輸入。這增加了 1 個字節 (4 WU)。輸入
第一個(也是唯一一個)輸入如下:
- 參考TX:
caba4ccb61cca412fe29ec553d286134a02335c04355a9cc1e056fe2403692cf
- 輸出索引:
14000000
(14 in little-endian)- 腳本長度:(
00
在 VarInt 表示法中為 0)- 腳本簽名:[空]
- 順序:
fdffffff
該輸入增加了 41 個字節 (164 WU)。
# 輸出
輸出的數量為
02
(VarInt 表示法中的 2)表示在此事務中創建了 2 個輸出。這增加了 1 個字節 (4 WU)。輸出
第一個輸出如下:
- 價值:
6406010000000000
(67,172 聰,小端)- 腳本長度:
16
(VarInt 表示法中為 22)- 腳本公鑰:
0014093c864a10516154d18d2accd61c6b2920a2040f
此輸出增加了 31 個字節 (124 WU)。第二個輸出如下:
- 價值:
60361e0000000000
(1,980,000 satoshi,小端)- 腳本長度:
17
(VarInt 表示法中為 23)- 腳本公鑰:
a9140195e8dd3d1527038a0a77e0b0e4515d6c8ab19587
此輸出增加了 32 個字節 (128 WU)。
見證數據
見證數據由數據推送組成。我不會在此答案中詳細介紹見證計劃。本次交易的見證程序為:
02 47 304402200760efedbcee3bbd913661fb40c364caed622b331ee3b5bc70ac25df2d3763d5022020efdb41ef325089d146eb48948b6aaec85c086fa38a3df4d2a51ee729645ebc01 21 02be338e0362fb01101a873a7502012cb82f7d9d303b4943fa0702829a763e4976
見證數據增加了 107 個字節 (107 WU)。
鎖定時間
此交易的鎖定時間為
2b550900
(611,627 in little-endian),並用作可以花費此交易輸出的塊高度。這增加了 4 個字節 (16 WU)。這筆交易總共是 565 WU。轉換為 vB,即 142 vB。輸入值為0.02118172 BTC,組合輸出值為 0.02047172 BTC,交易費用為 0.00071 BTC(71,000 聰)。該交易的費用為 500 sat/vB。(也極高!)
估算費用
有了這些知識,錢包如何知道在給定費率的情況下使用多少作為費用? 這很簡單。有關在給定不同地址類型的情況下錢包如何處理此資訊的資訊,請參閱此答案。在簽署交易之前,你的錢包會根據輸入、輸出、地址類型和所需的費率來估算要預留多少 satoshi 作為費用。
至於錢包如何以盡可能低的費用創建交易,以及查看目前記憶體池的費用估算算法如何工作,它們取決於錢包。