進階
Blocks Only Mode
深入了解 Bitcoin Core 的 blocksonly 模式,透過只同步區塊來節省頻寬。
8 分鐘
什麼是 Blocks Only 模式?
Blocks Only 模式讓 Bitcoin Core 只接收和驗證區塊,不參與未確認交易的中繼。 這大幅減少頻寬使用,適合網路連線受限或只需要驗證區塊鏈的場景。
頻寬節省
正常模式
- • 接收所有交易廣播
- • 中繼交易給其他節點
- • 每天約 10-50 GB
Blocks Only
- • 只接收區塊
- • 不參與交易中繼
- • 每天約 150-200 MB
配置方式
啟用 Blocks Only
# 命令行啟用
bitcoind -blocksonly
# 配置文件
echo "blocksonly=1" >> ~/.bitcoin/bitcoin.conf
# 運行時切換(需要重啟)
# 沒有 RPC 命令可以動態切換 相關選項
# bitcoin.conf
# 啟用 blocks only 模式
blocksonly=1
# 額外的頻寬節省選項
# 限制上傳流量(MB/天,0 = 無限制)
maxuploadtarget=500
# 減少出站連接(預設 10,blocks only 時可減少)
maxconnections=20
# 不監聽入站連接(進一步減少頻寬)
listen=0 注意: Blocks only 模式仍然會驗證區塊中的所有交易,確保完整的安全性。 只是不參與未確認交易的傳播。
行為變化
啟用後的變化
| 功能 | 正常模式 | Blocks Only |
|---|---|---|
| 接收區塊 | ✓ | ✓ |
| 驗證區塊 | ✓ | ✓ |
| 接收交易廣播 | ✓ | ✗ |
| 中繼交易 | ✓ | ✗ |
| Mempool | 維護 | 基本空 |
| 發送交易(RPC) | ✓ | ✓ |
| 手續費估算 | 準確 | 不可用 |
Mempool 行為
// Blocks only 模式下的 mempool 行為
class MempoolBlocksOnly {
// 不接收來自 P2P 的交易
onTxMessage(peer: Peer, tx: Transaction): void {
// 忽略,不處理
return;
}
// 但仍然接受本地提交的交易
submitTransaction(tx: Transaction): Result {
// 驗證交易
if (!this.validateTransaction(tx)) {
return { error: 'Invalid transaction' };
}
// 添加到 mempool
this.mempool.add(tx);
// 不廣播(沒有連接支持 tx relay)
// 但白名單連接可以接收
for (const peer of this.whitelistedPeers) {
peer.send('tx', tx);
}
return { success: true };
}
// 區塊到達時,從 mempool 移除確認的交易
onNewBlock(block: Block): void {
for (const tx of block.transactions) {
this.mempool.remove(tx.txid);
}
}
} 使用場景
✓ 適合使用
- • 頻寬有限的環境
- • 衛星網路連接
- • 只需要區塊鏈驗證
- • 備份節點
- • 歷史數據分析
✗ 不適合使用
- • 需要手續費估算
- • 即時交易監控
- • 交易廣播服務
- • 礦池/礦工節點
- • 閃電網路節點
衛星節點
Blockstream Satellite 用戶特別適合使用 blocks only 模式, 因為衛星連接是單向的且頻寬受限。
# 衛星節點配置示例
blocksonly=1
listen=0
maxconnections=4
maxuploadtarget=100
# 如果有雙向網路連接用於發送交易
# 可以添加白名單節點
whitelist=192.168.1.100 限制與影響
手續費估算
手續費估算不可用
由於沒有 mempool 數據,estimatesmartfee 命令將返回錯誤或不準確的結果。
# 在 blocks only 模式下
bitcoin-cli estimatesmartfee 6
{
"errors": ["Insufficient data or no feerate found"]
} 錢包影響
- ✓ 餘額查詢
正常工作,基於已確認交易
- ⚠ 發送交易
可以創建交易,但廣播受限
- ✗ 接收未確認交易通知
不會收到,只在區塊確認後才能看到
- ✗ 自動手續費
需要手動指定手續費
實現細節
P2P 協議變化
class P2PNodeBlocksOnly {
private blocksOnly: boolean;
// 發送 version 消息時設定
sendVersion(peer: Peer): void {
const version = {
version: 70016,
services: this.getServices(),
// blocks only 節點不設定 NODE_BLOOM 標誌
// 並且在 fRelay 字段設為 false
relay: !this.blocksOnly,
};
peer.send('version', version);
}
// 處理 inv 消息
onInv(peer: Peer, inv: Inventory[]): void {
for (const item of inv) {
switch (item.type) {
case INV_TYPE.BLOCK:
case INV_TYPE.COMPACT_BLOCK:
// 區塊相關的 inv 正常處理
this.requestBlock(peer, item.hash);
break;
case INV_TYPE.TX:
case INV_TYPE.WITNESS_TX:
if (this.blocksOnly) {
// 忽略交易 inv
continue;
}
this.requestTx(peer, item.hash);
break;
}
}
}
// Blocks only 模式不發送 mempool 請求
// 不響應 mempool 消息
// 不廣播本地交易(除非是白名單連接)
} 頻寬計算
正常模式的日均流量:
- 交易廣播:~20-40 GB(雙向)
- 區塊傳輸:~150 MB
- 其他協議開銷:~500 MB
總計:~20-40 GB/天
Blocks Only 模式的日均流量:
- 區塊傳輸:~150 MB
- 區塊頭和其他:~50 MB
總計:~200 MB/天
節省比例:約 99% 替代方案
maxuploadtarget
如果只想限制上傳流量而不完全禁用交易中繼,可以使用 maxuploadtarget。
# 限制每天上傳 1 GB
bitcoind -maxuploadtarget=1024
# 達到限制後:
# - 停止服務歷史區塊
# - 繼續服務新區塊
# - 繼續正常交易中繼 與 Pruning 結合
# 最小資源配置
blocksonly=1
prune=550 # 最小 550 MB
maxconnections=10
listen=0
# 這個配置:
# - 磁碟使用約 550 MB
# - 每天流量約 200 MB
# - 仍然完全驗證所有區塊 總結
- ✓ 頻寬節省:減少約 99% 的網路流量
- ✓ 安全性:仍然完整驗證所有區塊
- ✓ 適用場景:頻寬受限、備份節點、區塊鏈分析
- ⚠ 限制:無手續費估算、無未確認交易通知
已複製連結