協議 入門
節點
Node
又稱:全節點、Full Node
節點是運行比特幣軟體並連接到比特幣網路的電腦。全節點儲存完整的區塊鏈副本並獨立驗證所有交易和區塊,是比特幣去中心化和安全性的基礎。運行自己的節點意味著真正的「不信任,去驗證」(Don’t Trust, Verify)。
節點的重要性
為什麼節點重要?
節點在比特幣網路中的角色:
去中心化的基礎:
┌─────────────────────────────────────────────────┐
│ │
│ 節點 ←─→ 節點 ←─→ 節點 │
│ ↑ ↑ ↑ │
│ ↓ ↓ ↓ │
│ 節點 ←─→ 節點 ←─→ 節點 │
│ ↑ ↑ ↑ │
│ ↓ ↓ ↓ │
│ 節點 ←─→ 節點 ←─→ 節點 │
│ │
│ 沒有中心伺服器 │
│ 每個節點都是平等的 │
│ 任何人都可以加入 │
│ │
└─────────────────────────────────────────────────┘
節點的功能:
1. 驗證所有交易和區塊
2. 儲存完整區塊鏈歷史
3. 傳播交易給其他節點
4. 執行共識規則
5. 服務輕客戶端請求
「不信任,去驗證」
運行自己節點的意義:
不運行節點:
┌─────────────────────────────────────────────────┐
│ │
│ 你的錢包 ──→ 第三方伺服器 ──→ 比特幣網路 │
│ │ │
│ 你必須信任 │
│ 第三方伺服器 │
│ │
└─────────────────────────────────────────────────┘
運行自己節點:
┌─────────────────────────────────────────────────┐
│ │
│ 你的錢包 ──→ 你的節點 ──→ 比特幣網路 │
│ │ │
│ 自己驗證 │
│ 所有交易 │
│ │
└─────────────────────────────────────────────────┘
差異:
- 隱私:第三方不知道你的地址
- 安全:自己驗證餘額和交易
- 主權:不依賴他人
節點類型
全節點(Full Node)
全節點特性:
定義:
- 下載並驗證整個區塊鏈
- 獨立執行所有共識規則
- 不信任任何其他節點
功能:
✓ 完全驗證所有交易
✓ 完全驗證所有區塊
✓ 儲存完整 UTXO 集合
✓ 可以服務其他節點
✓ 可以直接廣播交易
硬體需求(2024):
┌─────────────────────────────────────┐
│ 儲存:~600 GB(並持續增長) │
│ RAM:4+ GB(建議 8 GB) │
│ CPU:一般桌面處理器即可 │
│ 網路:10+ Mbps,無限流量最佳 │
│ 月流量:~200-400 GB │
└─────────────────────────────────────┘
常見軟體:
- Bitcoin Core(官方參考實現)
- btcd(Go 語言)
- libbitcoin(C++)
修剪節點(Pruned Node)
修剪節點特性:
定義:
- 完全驗證所有區塊(同全節點)
- 驗證後刪除舊區塊數據
- 只保留最近的區塊
工作方式:
┌─────────────────────────────────────────────────┐
│ │
│ 下載區塊 1-100,000 │
│ ↓ │
│ 驗證每個區塊(同全節點) │
│ ↓ │
│ 保留 UTXO 集合 │
│ ↓ │
│ 刪除舊區塊數據(只保留最新 N 個區塊) │
│ │
└─────────────────────────────────────────────────┘
設置(Bitcoin Core):
prune=550 # 保留至少 550 MB 區塊數據
優點:
- 大幅減少儲存需求(~10-20 GB)
- 仍然完全驗證
- 適合儲存有限的設備
缺點:
- 無法服務歷史區塊給其他節點
- 無法重新掃描舊交易
- 無法支援某些錢包功能
輕節點(SPV / Light Node)
輕節點特性:
定義:
- 只下載區塊頭(每個 80 bytes)
- 使用 SPV(簡化支付驗證)
- 信任礦工的工作量證明
工作方式:
┌─────────────────────────────────────────────────┐
│ │
│ 只下載區塊頭(80 MB 整個歷史) │
│ ↓ │
│ 向全節點查詢特定交易 │
│ ↓ │
│ 使用 Merkle 證明驗證交易存在 │
│ ↓ │
│ 信任最長鏈的工作量證明 │
│ │
└─────────────────────────────────────────────────┘
儲存需求:
- 區塊頭:~80 MB
- 對比全節點:~600 GB
- 減少 99.99%
安全性取捨:
✓ 可以驗證交易已被礦工確認
✗ 無法驗證交易是否違反共識規則
✗ 必須信任礦工誠實
✗ 隱私較差(需要告訴伺服器你的地址)
常見實現:
- Electrum(使用 Electrum Server)
- 多數手機錢包
歸檔節點(Archive Node)
歸檔節點特性:
定義:
- 全節點 + 完整歷史索引
- 可以查詢任何歷史狀態
- 資源需求最高
額外功能:
- 歷史餘額查詢
- 任意時點的 UTXO 快照
- 完整交易索引
儲存需求:
- 基本:~600 GB(區塊數據)
- + txindex:額外 ~30 GB
- + coinstatsindex:額外 ~10 GB
設置:
txindex=1
coinstatsindex=1
用途:
- 區塊瀏覽器
- 分析服務
- 研究用途
礦工節點
礦工節點特性:
定義:
- 全節點 + 挖礦功能
- 建構新區塊
- 參與工作量證明
額外功能:
- 交易選擇和排序
- 區塊模板生成
- 提交工作量證明
現代礦池架構:
┌─────────────────────────────────────────────────┐
│ │
│ 礦池節點(全節點) │
│ │ │
│ ├── Stratum 伺服器 │
│ │ │ │
│ │ ├── ASIC 礦機 1 │
│ │ ├── ASIC 礦機 2 │
│ │ └── ASIC 礦機 N │
│ │ │
│ └── 區塊廣播 │
│ │
└─────────────────────────────────────────────────┘
注意:
- 個人挖礦已不經濟
- 大多數礦工連接礦池
- 礦池運行全節點
運行全節點
硬體需求
最低需求 vs 推薦配置:
┌────────────────┬─────────────┬─────────────────┐
│ 項目 │ 最低需求 │ 推薦配置 │
├────────────────┼─────────────┼─────────────────┤
│ CPU │ 雙核心 │ 四核心+ │
│ RAM │ 4 GB │ 8 GB+ │
│ 儲存 │ 600 GB HDD │ 1 TB SSD │
│ 網路 │ 10 Mbps │ 100+ Mbps │
│ 月流量 │ 200 GB │ 無限 │
└────────────────┴─────────────┴─────────────────┘
專用硬體選項:
Raspberry Pi 4:
- 低功耗(~5W)
- 8 GB RAM 版本
- 外接 SSD
- 成本:~$100-150
舊筆電/桌機:
- 可能已有足夠配置
- 低成本入門
專用節點設備:
- Umbrel
- Start9
- RaspiBlitz
- 預設置,即插即用
安裝 Bitcoin Core
# 在 Ubuntu/Debian 上安裝
# 1. 下載 Bitcoin Core
wget https://bitcoincore.org/bin/bitcoin-core-26.0/bitcoin-26.0-x86_64-linux-gnu.tar.gz
# 2. 驗證簽名(重要!)
wget https://bitcoincore.org/bin/bitcoin-core-26.0/SHA256SUMS
wget https://bitcoincore.org/bin/bitcoin-core-26.0/SHA256SUMS.asc
# 驗證雜湊
sha256sum --ignore-missing --check SHA256SUMS
# 驗證 GPG 簽名
gpg --keyserver hkps://keys.openpgp.org --recv-keys 01EA5486DE18A882D4C2684590C8019E36C2E964
gpg --verify SHA256SUMS.asc
# 3. 解壓並安裝
tar xvf bitcoin-26.0-x86_64-linux-gnu.tar.gz
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-26.0/bin/*
# 4. 創建數據目錄
mkdir ~/.bitcoin
# 5. 創建配置檔
cat > ~/.bitcoin/bitcoin.conf << EOF
# 基本設置
server=1
daemon=1
txindex=0
# 網路
listen=1
maxconnections=125
# RPC(供本地錢包使用)
rpcuser=yourusername
rpcpassword=yourpassword
# 可選:修剪模式(節省空間)
# prune=550
EOF
# 6. 啟動節點
bitcoind
# 7. 檢查狀態
bitcoin-cli getblockchaininfo
初始區塊下載(IBD)
初始同步過程:
第一次運行時:
┌─────────────────────────────────────────────────┐
│ │
│ 1. 連接到種子節點 │
│ ↓ │
│ 2. 發現更多節點 │
│ ↓ │
│ 3. 下載區塊頭 │
│ ↓ │
│ 4. 下載完整區塊 │
│ ↓ │
│ 5. 驗證每個交易和區塊 │
│ ↓ │
│ 6. 建構 UTXO 集合 │
│ │
└─────────────────────────────────────────────────┘
預期時間:
- SSD + 快速網路:4-8 小時
- HDD + 快速網路:1-2 天
- 慢速硬體:數天到數週
加速技巧:
1. 使用 SSD(最重要)
2. 分配更多記憶體
dbcache=4096 # 使用 4GB 用於緩存
3. 暫時關閉交易索引
4. 優良的網路連接
監控進度:
bitcoin-cli getblockchaininfo
# 查看 "verificationprogress"(0.0 到 1.0)
節點配置
重要配置選項
# bitcoin.conf 完整配置範例
# ====== 基本設置 ======
# 以背景程序運行
daemon=1
# 資料目錄(可選)
# datadir=/path/to/data
# ====== 網路設置 ======
# 接受外部連接
listen=1
# 最大連接數
maxconnections=125
# 只使用 Tor(增強隱私)
# onlynet=onion
# ====== 儲存設置 ======
# 修剪模式(MB,最小 550)
# prune=550
# 交易索引(需要更多空間)
# txindex=1
# ====== 效能設置 ======
# 資料庫快取大小(MB)
dbcache=450
# 每秒最大上傳(KB)
# maxuploadtarget=1000
# ====== RPC 設置 ======
server=1
rpcuser=myusername
rpcpassword=mysecurepassword
# 允許的 RPC 來源
rpcallowip=127.0.0.1
# ====== 錢包設置 ======
# 停用錢包功能
# disablewallet=1
# ====== 除錯 ======
# 記錄所有 RPC 呼叫
# debug=rpc
# 記錄所有網路訊息
# debug=net
透過 Tor 運行
# 安裝 Tor
sudo apt install tor
# 配置 Tor
sudo cat >> /etc/tor/torrc << EOF
ControlPort 9051
CookieAuthentication 1
CookieAuthFileGroupReadable 1
EOF
# 將使用者加入 tor 群組
sudo usermod -a -G debian-tor $USER
# 重啟 Tor
sudo systemctl restart tor
# Bitcoin 配置
cat >> ~/.bitcoin/bitcoin.conf << EOF
# Tor 設置
proxy=127.0.0.1:9050
listen=1
bind=127.0.0.1
# 自動設置隱藏服務
listenonion=1
EOF
# 重啟 Bitcoin
bitcoin-cli stop
bitcoind
# 檢查 .onion 地址
bitcoin-cli getnetworkinfo
# 查看 "localaddresses" 中的 .onion 地址
節點維護
監控節點狀態
# 基本狀態
bitcoin-cli getblockchaininfo
# {
# "chain": "main",
# "blocks": 820000,
# "verificationprogress": 0.9999999,
# "size_on_disk": 550000000000,
# ...
# }
# 網路連接狀態
bitcoin-cli getnetworkinfo
# {
# "connections": 10,
# "connections_in": 2,
# "connections_out": 8,
# ...
# }
# 連接的節點列表
bitcoin-cli getpeerinfo
# 記憶體池狀態
bitcoin-cli getmempoolinfo
# {
# "size": 5000,
# "bytes": 3000000,
# ...
# }
# 錢包資訊(如果啟用)
bitcoin-cli getwalletinfo
常見問題排解
問題:同步卡住
可能原因:
1. 網路問題
2. 磁碟空間不足
3. 節點被封禁
解決方案:
# 檢查連接
bitcoin-cli getpeerinfo | grep "synced_blocks"
# 手動添加節點
bitcoin-cli addnode "node.example.com:8333" "onetry"
# 檢查磁碟空間
df -h ~/.bitcoin
# 重啟節點
bitcoin-cli stop
bitcoind
問題:記憶體使用過高
解決方案:
# 減少資料庫快取
dbcache=300 # 預設 450
# 減少連接數
maxconnections=20
# 減少記憶體池大小
maxmempool=100
問題:頻寬使用過高
解決方案:
# 限制上傳
maxuploadtarget=1000 # MB/天
# 減少連接
maxconnections=20
# 只連出不接受連入
listen=0
節點安全
基本安全措施
安全清單:
□ 使用強 RPC 密碼
□ 限制 RPC 訪問(rpcallowip)
□ 使用防火牆
□ 定期更新軟體
□ 使用專用使用者帳戶
□ 加密資料目錄(如果有錢包)
□ 監控異常活動
防火牆設置(UFW):
# 允許比特幣 P2P
sudo ufw allow 8333/tcp
# 允許本地 RPC
sudo ufw allow from 127.0.0.1 to any port 8332
# 啟用防火牆
sudo ufw enable
備份
需要備份的資料:
錢包(如果使用):
~/.bitcoin/wallets/
配置:
~/.bitcoin/bitcoin.conf
不需要備份(可重新下載):
~/.bitcoin/blocks/
~/.bitcoin/chainstate/
備份腳本範例:
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/bitcoin"
# 停止節點
bitcoin-cli stop
sleep 10
# 備份錢包
tar -czf $BACKUP_DIR/wallets-$DATE.tar.gz ~/.bitcoin/wallets/
# 重啟節點
bitcoind
開發者使用
RPC 介面
# 常用 RPC 命令
# 區塊鏈查詢
bitcoin-cli getbestblockhash
bitcoin-cli getblock "blockhash"
bitcoin-cli getblockheader "blockhash"
bitcoin-cli getblockcount
# 交易查詢
bitcoin-cli getrawtransaction "txid" true
bitcoin-cli decoderawtransaction "hex"
# 記憶體池
bitcoin-cli getrawmempool
bitcoin-cli getmempoolentry "txid"
# 網路
bitcoin-cli getnetworkinfo
bitcoin-cli getpeerinfo
bitcoin-cli getconnectioncount
# 錢包(如果啟用)
bitcoin-cli listwallets
bitcoin-cli getbalance
bitcoin-cli listtransactions
程式化存取
# Python 使用 RPC
from bitcoinrpc.authproxy import AuthServiceProxy
# 連接到節點
rpc = AuthServiceProxy("http://user:[email protected]:8332")
# 獲取區塊資訊
block_count = rpc.getblockcount()
print(f"區塊高度: {block_count}")
# 獲取最新區塊
best_hash = rpc.getbestblockhash()
block = rpc.getblock(best_hash)
print(f"最新區塊: {block['height']}")
print(f"交易數: {len(block['tx'])}")
# 解碼交易
tx = rpc.getrawtransaction(block['tx'][0], True)
print(f"Coinbase 交易: {tx['txid']}")
// Node.js 使用 RPC
const Client = require('bitcoin-core');
const client = new Client({
host: '127.0.0.1',
port: 8332,
username: 'user',
password: 'password',
});
async function main() {
// 獲取區塊鏈資訊
const info = await client.getBlockchainInfo();
console.log(`區塊高度: ${info.blocks}`);
console.log(`同步進度: ${(info.verificationprogress * 100).toFixed(2)}%`);
// 獲取記憶體池
const mempool = await client.getMempoolInfo();
console.log(`記憶體池大小: ${mempool.size} 交易`);
}
main();
節點統計
全球節點分布
比特幣節點分布(2024):
可達節點(接受連入):
~15,000-20,000 個
總節點(包括不可達):
估計 40,000-100,000 個
地理分布:
┌─────────────┬──────────┐
│ 國家 │ 佔比 │
├─────────────┼──────────┤
│ 美國 │ ~25% │
│ 德國 │ ~15% │
│ 法國 │ ~7% │
│ 荷蘭 │ ~5% │
│ 加拿大 │ ~4% │
│ 英國 │ ~4% │
│ 其他 │ ~40% │
└─────────────┴──────────┘
版本分布:
- Bitcoin Core 26.x:~30%
- Bitcoin Core 25.x:~25%
- Bitcoin Core 24.x:~15%
- 其他版本:~30%
查看即時統計:
- bitnodes.io
- coin.dance/nodes
運行成本
年度運行成本估算:
電費(24/7 運行):
- Raspberry Pi 4:5W × 24h × 365d = 44 kWh
成本:~$5-15/年
- 舊筆電:30W × 24h × 365d = 263 kWh
成本:~$30-80/年
- 專用伺服器:100W × 24h × 365d = 876 kWh
成本:~$100-250/年
網路:
- 家用網路:通常包含在現有費用
- VPS:$5-20/月
儲存:
- 1TB SSD:~$80-100(一次性)
總計(Raspberry Pi 方案):
- 初始:~$150-200
- 年度:~$10-30
常見問題
需要運行自己的節點嗎?
視情況而定:
應該運行的情況:
✓ 持有大量比特幣
✓ 重視隱私
✓ 想要完全主權
✓ 開發比特幣應用
✓ 想要支持網路
可以不運行的情況:
- 持有量少
- 信任錢包提供商
- 沒有技術能力/興趣
折衷方案:
- 使用可信的輕錢包
- 連接朋友的節點
- 使用 Umbrel 等簡易方案
運行節點能賺錢嗎?
直接收入:
- 全節點本身不產生收入
- 不像礦工有區塊獎勵
間接價值:
- 保護自己的比特幣
- 隱私保護(無價)
- 學習比特幣技術
- 支持網路去中心化
可能的收入來源:
- 運行 Lightning 路由節點
- 提供 API 服務
- 運行 Electrum 伺服器
- 但都需要額外設置
修剪節點 vs 全節點?
選擇建議:
選擇全節點如果:
- 有足夠儲存空間(600+ GB)
- 想要支援網路
- 可能需要歷史區塊
- 計劃運行服務
選擇修剪節點如果:
- 儲存有限(只需 ~10 GB)
- 主要為個人使用
- 不需要服務其他人
- 使用 Raspberry Pi 等小型設備
安全性相同:
- 兩者都完全驗證所有交易
- 修剪節點不是輕節點
- 同樣獨立、同樣安全