Transaction-Fees

比特幣交易的大小是如何計算的

  • January 25, 2020

據我了解,比特幣交易的費用是基於每字節交易大小的推薦費用(主要來自第三方服務)。我很好奇的是錢包是如何達到交易規模的?

自 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 作為費用。

至於錢包如何以盡可能低的費用創建交易,以及查看目前記憶體池的費用估算算法如何工作,它們取決於錢包。

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