高級
Cluster Mempool
了解 Bitcoin Core 正在開發的新 mempool 架構,提供更好的費率計算和 RBF 處理。
15 分鐘
Cluster Mempool 是 Bitcoin Core 正在開發的重大 mempool 重構。它將交易組織為 「clusters」(集群),提供更準確的費率計算、更好的 RBF 規則和更高效的區塊構建。
現有架構的問題
當前的 mempool 實現存在多個問題:
問題 1: 祖先/後代費率計算不準確
TX_A (1 sat/vB, 100 vB) → TX_B (10 sat/vB, 100 vB)
→ TX_C (10 sat/vB, 100 vB)
當前計算:
TX_B 的祖先費率 = (100 + 1000) / 200 = 5.5 sat/vB
TX_C 的祖先費率 = (100 + 1000) / 200 = 5.5 sat/vB
問題: TX_A 的費用被重複計算!
問題 2: RBF 規則過於簡單
- 只看絕對費用,不考慮 mempool 激勵兼容性
- 容易被 pinning 攻擊利用
問題 3: 區塊模板構建效率低
- 需要持續重新計算優先級
- 難以處理複雜的依賴關係 Cluster 概念
Cluster 是一組相互連接的交易,形成一個連通的依賴圖:
Cluster 示例:
Cluster 1: Cluster 2:
A D
/ \ |
B C E
\
F
規則:
- 每個交易恰好屬於一個 cluster
- Cluster 內的交易有依賴關係
- 不同 cluster 之間沒有依賴
- 新交易可能合併多個 cluster 線性化(Linearization)
每個 cluster 都有一個「線性化」順序,定義了最優的挖礦順序:
Cluster: A → B → C (A 是父交易)
可能的線性化:
1. [A, B, C] - 按依賴順序
2. [A, C, B] - 也有效
最優線性化: 最大化 "前綴費率"
示例:
A: 1 sat/vB, 100 vB
B: 5 sat/vB, 100 vB
C: 2 sat/vB, 100 vB
線性化 [A, B, C]:
- 前綴 [A]: 1 sat/vB
- 前綴 [A,B]: (100+500)/200 = 3 sat/vB
- 前綴 [A,B,C]: (100+500+200)/300 = 2.67 sat/vB
線性化 [A, C, B]:
- 前綴 [A]: 1 sat/vB
- 前綴 [A,C]: (100+200)/200 = 1.5 sat/vB
- 前綴 [A,C,B]: 2.67 sat/vB
[A, B, C] 更好(更早達到高費率) Chunk 和費率圖
線性化產生的「chunks」定義了交易的實際挖礦優先級:
費率圖示例:
費率 ↑
│ ┌───┐
5 │ │ B │
│ └───┘
3 │ ┌─────────┐
│ │ A+B │ ← Chunk (一起挖)
│ └─────────┘
1 │┌───┐
││ A │
│└───┘
└─────────────→ 累積大小
Chunk: 線性化中費率遞減的連續段
- 同一 chunk 中的交易應一起被挖
- Chunk 費率 = chunk 總費用 / chunk 總大小 新的 RBF 規則
Cluster mempool 啟用了更合理的 RBF 規則:
// 舊規則 (BIP-125)
replacement.fee > sum(replaced_txs.fees)
replacement.feerate > replaced_tx.feerate
// 新規則 (基於激勵兼容性)
比較替換前後的 mempool 費率圖
替換有效,當且僅當:
1. 新費率圖在所有點都 >= 舊費率圖
(對礦工永遠不更差)
2. 存在某個區塊大小,新圖嚴格更好
(對礦工至少有時更好)
這自動處理:
- Package 費率考慮
- 無需固定的 "額外費用" 規則
- 防止 pinning 攻擊 Cluster 大小限制
// 提議的限制
MAX_CLUSTER_COUNT = 100 // 最大交易數
MAX_CLUSTER_SIZE = 101 KB // 最大虛擬大小
// 為什麼需要限制?
- 線性化算法複雜度
- 驗證替換的計算成本
- 防止 DoS 攻擊
// 與舊限制的關係
舊: MAX_ANCESTORS = 25, MAX_DESCENDANTS = 25
→ 最壞情況 cluster 可達 625 交易
新: 直接限制 cluster 大小,更可預測 實現進度
開發階段
- 階段 1:Cluster 數據結構和線性化算法 ✓
- 階段 2:Cluster 限制替換祖先/後代限制
- 階段 3:基於費率圖的 RBF
- 階段 4:基於 chunk 的區塊模板構建
- 階段 5:完全移除舊的祖先/後代追蹤
對開發者的影響
// 行為變化
1. Package 限制變化
舊: 25 祖先 + 25 後代
新: 單個 cluster 限制
2. RBF 更容易成功
- 只要對礦工更好就會被接受
- 不再需要滿足任意的費用增量
3. 更準確的費率估算
- getmempoolentry 將返回 chunk 費率
- 更好地反映實際挖礦優先級
4. V3 交易
- 仍然有效,提供額外保證
- 與 cluster mempool 協同工作 API 變化
# 提議的新 RPC 字段
bitcoin-cli getmempoolentry <txid>
{
...
"cluster_id": "abc123...",
"cluster_size": 5,
"chunk_feerate": 15.5, // sat/vB
"linearization_index": 2, // 在 cluster 中的位置
...
}
bitcoin-cli getmempoolinfo
{
...
"cluster_count": 1234,
"max_cluster_size": 100,
...
} 與其他改進的關係
- Package Relay:Cluster mempool 使 package 評估更準確
- V3 Transactions:提供額外的拓撲保證
- Ephemeral Anchors:依賴 cluster mempool 的 package 處理
- TRUC:受益於更好的 RBF 規則
參考資源
- GitHub: Cluster Mempool Tracking Issue
- Delving Bitcoin: Cluster Mempool Working Group
- Bitcoin Core PR #28676, #29242 等
未來展望
Cluster mempool 是 Bitcoin Core mempool 的根本性改進。完成後,它將:
- 使 RBF 更加公平和可預測
- 減少 pinning 攻擊的可能性
- 提高區塊構建效率
- 為未來的 mempool 功能鋪平道路
已複製連結