Standards Track Draft
BIP-158: 緊湊區塊過濾器
定義緊湊區塊過濾器的格式,使用 Golomb-Rice 編碼壓縮資料,搭配 BIP-157 使用。
Olaoluwa Osuntokun, Alex Akselrod 2017年5月24日
BIP 編號
158
類型
Standards Track
狀態
Draft
創建日期
2017-05-24
摘要
BIP-158 定義了一種緊湊的區塊過濾器格式,使用 Golomb-Rice 編碼來壓縮區塊中的 腳本和輸出資料。輕客戶端可以下載這些過濾器,在本地檢查是否有與自己相關的交易。
過濾器概念
過濾器是一種概率資料結構,可以快速判斷「某元素可能在集合中」或「某元素肯定不在集合中」:
查詢結果:False
元素肯定不在集合中。可以跳過這個區塊。
查詢結果:True
元素可能在集合中(有假陽性機率)。需要下載完整區塊確認。
過濾器類型
BIP-158 目前定義了一種過濾器類型:
Basic Filter(類型 0x00)
包含:
- • 區塊中所有交易輸出的 scriptPubKey
- • 區塊中所有交易輸入花費的 scriptPubKey(不含 coinbase)
這足以讓錢包發現與自己地址相關的交易。
Golomb-Rice 編碼
基本原理
Golomb-Rice 編碼是一種變長編碼,對於某些數值分布可以達到接近最優的壓縮率:
給定參數 P(2 的冪次),對數值 x 編碼: 1. 計算商 q = x / P 2. 計算餘數 r = x % P 3. 編碼 q:使用一元碼(q 個 1 後跟一個 0) 4. 編碼 r:使用 log2(P) 個位元 範例(P = 4, x = 11): • q = 11 / 4 = 2 • r = 11 % 4 = 3 • 編碼 = 110(一元碼)+ 11(2 位元)= 11011
過濾器構建
構建過濾器的步驟: 1. 收集元素 elements = [scriptPubKey1, scriptPubKey2, ...] 2. 計算哈希值(使用 SipHash) hashes = [SipHash(key, e) for e in elements] key = 前一個區塊哈希的前 16 bytes 3. 縮放到目標範圍 F = N * M // N = 元素數量,M = 假陽性參數 scaled = [(h * F) >> 64 for h in hashes] 4. 排序並計算差值 sorted = sort(scaled) deltas = [sorted[i] - sorted[i-1] for i in range(1, N)] 5. Golomb-Rice 編碼差值 encoded = GolombRice_encode(deltas, P)
參數選擇
| 參數 | 值 | 說明 |
|---|---|---|
| M | 784931 | 假陽性率 ≈ 1/784931 |
| P | 19 | Golomb-Rice 編碼參數 |
| 每元素位元 | ≈ 20 | 平均每個腳本約 20 位元 |
查詢過濾器
查詢過濾器的步驟: 1. 計算查詢元素的哈希和縮放值 query_hash = SipHash(key, query_script) query_scaled = (query_hash * N * M) >> 64 2. 解碼過濾器,重建排序後的值集合 values = decode_filter(filter_data) 3. 二分搜索 return binary_search(values, query_scaled) 假陽性場景: • 查詢返回 True,但區塊實際不包含該腳本 • 發生機率 ≈ 1/M ≈ 1/784931 • 每約 1200 個區塊會有一次假陽性
過濾器大小
過濾器比完整區塊小得多:
~15 KB
典型區塊過濾器大小
~1.5 MB
典型區塊大小
~1%
過濾器/區塊比例
與 Bloom Filter 比較
| 特性 | BIP-37 Bloom | BIP-158 GCS |
|---|---|---|
| 構建方 | 客戶端 | 伺服器 |
| 隱私 | 差 | 好 |
| 可驗證 | 否 | 是 |
| 每元素位元 | ~10 | ~20 |
| 頻寬效率 | 更低(按需) | 較高(下載所有) |
安全性
惡意伺服器
- 假陰性攻擊:伺服器提供少了某些元素的過濾器, 客戶端會漏掉相關交易。解決方案:從多個獨立節點獲取並比較。
- 過濾器頭鏈:使用過濾器頭鏈可以檢測篡改, 但不能防止所有節點串通。
總結
BIP-158 定義了一種高效的區塊過濾器格式,使用 Golomb-Rice 編碼達到接近最優的壓縮率。 結合 BIP-157 的 P2P 協議,為輕客戶端提供了隱私優先的同步方案。 雖然需要下載更多資料,但換來的是更好的隱私保護。
延伸閱讀
延伸閱讀: 查看 GitHub 上的完整 BIP-158 文件
已複製連結