跳至主要內容
Standards Track Final

BIP-152: 緊湊區塊傳輸

透過壓縮區塊傳輸減少頻寬使用和傳播延遲,提升比特幣網路效能。

Matt Corallo 2016年4月27日
BIP 編號

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
  • 驗證失敗回退:如果重建的區塊驗證失敗,節點會請求完整區塊

版本歷史

版本 1
初始版本

2016 年隨 Bitcoin Core 0.13.0 發布

版本 2
SegWit 支援

支援 witness 資料的傳輸,使用 wtxid 計算短 ID

效能影響

頻寬節省

典型情況下減少 90%+ 的區塊傳輸頻寬,讓頻寬受限的節點也能參與網路。

傳播加速

區塊傳播時間大幅縮短,降低孤塊率,增加網路安全性。

相關技術

  • FIBRE:Matt Corallo 開發的專用區塊傳播網路,使用 UDP 和前向糾錯
  • Erlay(BIP-330):進一步優化交易傳播,減少 mempool 同步頻寬
  • Graphene:使用 IBLT(可逆布隆查找表)的實驗性方案

總結

BIP-152 Compact Block Relay 是比特幣網路效能的重要改進。 透過利用節點間已有的交易資訊,大幅減少區塊傳輸的頻寬需求和延遲。 這項改進對於維護比特幣網路的去中心化特性至關重要。

已複製連結
已複製到剪貼簿