Bitcoin-Core
CompactSize 和 VarInt 編碼有什麼區別?
Pieter Wuille 對 CompactSize 編碼的定義似乎與Greg Walker 對 VarInt 編碼的定義相匹配,但BitcoinWiki 聲稱 CompactSize 不應與 VarInt 混淆。
如果有的話,這兩種編碼之間有什麼區別?還是它們只是同一件事?
Bitcoin Core 的序列化框架中實現了兩種不同的可變長度整數編碼:
- P2P 協議中用於向量長度的編碼(塊中的事務數、事務中的輸入/輸出數、inv/addr 消息中的條目數……)在比特幣核心程式碼庫中被稱為“ CompactSize”編碼,儘管它在歷史上在外部協議文件中被稱為“VarInt”。
- 另一種編碼僅在比特幣核心內部使用,例如在磁碟上的 UTXO 數據庫中,但在 P2P 協議的任何地方都沒有使用。這在比特幣核心程式碼庫中被稱為“VarInt”。
作為參考,這兩種編碼是:
- “CompactSize”編碼(在比特幣核心之外也稱為“VarInt”):
0
..0xfc
: 1 字節(值本身)0xfd
..0xffff
: 3 字節(0xfd + 2 字節小端編碼)0x10000
..0xffffffff
: 5 字節(0xfe + 4 字節小端編碼)0x100000000
..0xffffffffffffffff
: 9 字節(0xff + 8 字節小端編碼)
- “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 個字節- …