Bitcoin-Core

CompactSize 和 VarInt 編碼有什麼區別?

  • July 23, 2022

Pieter Wuille 對 CompactSize 編碼的定義似乎與Greg Walker 對 VarInt 編碼的定義相匹配,但BitcoinWiki 聲稱 CompactSize 不應與 VarInt 混淆

如果有的話,這兩種編碼之間有什麼區別?還是它們只是同一件事?

Bitcoin Core 的序列化框架中實現了兩種不同的可變長度整數編碼:

  1. P2P 協議中用於向量長度的編碼(塊中的事務數、事務中的輸入/輸出數、inv/addr 消息中的條目數……)在比特幣核心程式碼庫中被稱為“ CompactSize”編碼,儘管它在歷史上在外部協議文件中被稱為“VarInt”。
  2. 另一種編碼僅在比特幣核心內部使用,例如在磁碟上的 UTXO 數據庫中,但在 P2P 協議的任何地方都沒有使用。這在比特幣核心程式碼庫中被稱為“VarInt”。

作為參考,這兩種編碼是:

  1. “CompactSize”編碼(在比特幣核心之外也稱為“VarInt”):
  • 0.. 0xfc: 1 字節(值本身)
  • 0xfd.. 0xffff: 3 字節(0xfd + 2 字節小端編碼)
  • 0x10000.. 0xffffffff: 5 字節(0xfe + 4 字節小端編碼)
  • 0x100000000.. 0xffffffffffffffff: 9 字節(0xff + 8 字節小端編碼)
  1. “VarInt”編碼(不在比特幣核心之外使用)在程式碼庫中描述如下:

可變長度整數:字節是數字的 MSB base-128 編碼。每個字節中的高位表示後面是否有另一個數字。為了確保編碼是一對一的,除最後一位外,所有數字都減去一個。因此,字節序列 a

$$ $$長度為 len,除了最後一個字節之外的所有字節都設置了第 128 位,對數字進行編碼: (一個

$$ len-1 $$& 0x7F) + sum(i=1..len-1, 128^i*((a$$ len-i-1 $$& 0x7F)+1))

它產生以下尺寸:

  • 0.. 0x7f: 1 字節
  • 0x80.. 0x407f: 2 個字節
  • 0x4080.. 0x20407f: 3 個字節
  • 0x204080.. 0x1020407f: 4 個字節
  • 0x10204080.. 0x81020407f: 5 個字節

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