BIP-152: 緊湊區塊傳輸
透過壓縮區塊傳輸減少頻寬使用和傳播延遲,提升比特幣網路效能。
152
Standards Track
Final
2016-04-27
摘要
BIP-152 定義了 Compact Block Relay 協議,一種優化區塊傳播的方式。 由於接收節點通常已經擁有區塊中的大部分交易(在 mempool 中), 這個協議只傳輸交易的短 ID,讓接收方可以從本地重建完整區塊。
動機
傳統區塊傳播的問題
在沒有 Compact Block 之前,當礦工挖出新區塊時,需要將完整區塊(通常 1-2 MB) 傳送給所有連接的節點。這造成了幾個問題:
- • 頻寬浪費:大多數交易節點已經有了,重複傳輸沒有意義
- • 傳播延遲:大區塊需要更長時間傳輸,增加孤塊風險
- • 中心化壓力:高頻寬需求可能導致網路中心化
實際效果
使用 Compact Block,區塊傳輸大小通常可以減少 90% 以上。 例如,一個 1 MB 的區塊可能只需傳輸約 10-20 KB 的資料。
運作原理
Compact Block 結構
一個 Compact Block 包含以下資訊:
CompactBlock: ├── header // 80 bytes - 完整區塊頭 ├── nonce // 8 bytes - 用於計算短 ID ├── shortids_length // 可變 - 短 ID 數量 ├── shortids[] // 每個 6 bytes - 交易短 ID ├── prefilled_txn_length └── prefilled_txn[] // 預填充的交易(通常是 coinbase)
短 ID 計算
每個交易的短 ID(6 bytes)是這樣計算的:
1. 計算金鑰: key = SHA256(SHA256(block_header || nonce))[0:16] 2. 計算 SipHash: short_id = SipHash-2-4(key, txid)[0:6]
使用 SipHash 而非截斷的 SHA256,是為了防止碰撞攻擊, 同時保持計算效率。
區塊重建流程
接收 Compact Block 後: 1. 解析區塊頭和 nonce ↓ 2. 使用相同算法計算 mempool 中所有交易的短 ID ↓ 3. 嘗試匹配 shortids[] 與本地交易 ↓ 4. 如果所有交易都找到 → 重建完整區塊並驗證 ↓ 5. 如果有缺失交易 → 發送 getblocktxn 請求缺失部分
兩種傳播模式
Low Bandwidth Mode(低頻寬模式)
預設模式。節點先發送 inv 訊息,對方請求後才發送 Compact Block:
傳送方 接收方 │ │ │─── inv ──────────→│ │ │ │←── getdata ────────│ │ │ │─── cmpctblock ───→│ │ │ │←── getblocktxn ────│ (如果有缺失交易) │ │ │─── blocktxn ─────→│
High Bandwidth Mode(高頻寬模式)
更激進的模式。節點主動發送 Compact Block,不等待請求:
傳送方 接收方 │ │ │─── cmpctblock ───→│ (主動發送) │ │ │←── getblocktxn ────│ (如果有缺失交易) │ │ │─── blocktxn ─────→│
節點通常會向 3 個對等節點請求高頻寬模式,以最小化延遲。
訊息類型
| 訊息 | 方向 | 用途 |
|---|---|---|
| sendcmpct | 雙向 | 宣告支援 Compact Block,設定高/低頻寬模式 |
| cmpctblock | 發送方 → 接收方 | 傳送 Compact Block |
| getblocktxn | 接收方 → 發送方 | 請求缺失的交易 |
| blocktxn | 發送方 → 接收方 | 回應缺失交易請求 |
碰撞處理
由於短 ID 只有 6 bytes(48 bits),理論上可能發生碰撞。協議有幾種處理方式:
- • 統計機率極低:對於 4000 筆交易的區塊,碰撞機率約為 2^-17
- • nonce 隨機化:每次傳輸使用不同 nonce,攻擊者難以預測短 ID
- • 驗證失敗回退:如果重建的區塊驗證失敗,節點會請求完整區塊
版本歷史
2016 年隨 Bitcoin Core 0.13.0 發布
支援 witness 資料的傳輸,使用 wtxid 計算短 ID
效能影響
頻寬節省
典型情況下減少 90%+ 的區塊傳輸頻寬,讓頻寬受限的節點也能參與網路。
傳播加速
區塊傳播時間大幅縮短,降低孤塊率,增加網路安全性。
相關技術
- FIBRE:Matt Corallo 開發的專用區塊傳播網路,使用 UDP 和前向糾錯
- Erlay(BIP-330):進一步優化交易傳播,減少 mempool 同步頻寬
- Graphene:使用 IBLT(可逆布隆查找表)的實驗性方案
總結
BIP-152 Compact Block Relay 是比特幣網路效能的重要改進。 透過利用節點間已有的交易資訊,大幅減少區塊傳輸的頻寬需求和延遲。 這項改進對於維護比特幣網路的去中心化特性至關重要。
延伸閱讀: 查看 GitHub 上的完整 BIP-152 文件