自己跑过全节点,才算真正理解区块链。
用 Infura、Alchemy 等第三方 RPC 服务很方便,但你每次查询、每笔交易都在依赖一个中心化入口。运行你自己的节点意味着:不信任第三方、完全掌控数据、免除速率限制、还能为网络去中心化出一份力。
本文教你从零搭建以太坊(执行层+共识层)和 Solana 的全节点,涵盖硬件选型、安装配置、状态剪裁、日常运维等全部环节。
一、为什么要自己跑节点?
在开始操作之前,先明确三个核心价值:
| 对比项 | 第三方 RPC 服务 | 自建节点 |
|---|
| 隐私 | 你的 IP 和查询内容对服务商可见 | 完全私密 |
| 速率限制 | 免费版有配额(通常 100k 请求/天) | 无限制 |
| 延迟 | 公共同步延迟(多人共享) | 本地局域网级 |
| 数据验证 | 信任服务商返回正确数据 | 本地全验证 |
| 月费 | 免费版有限,付费版 $50+/月 | 仅服务器成本 |
| 运维负担 | 无需维护 | 需自行维护 |
适合自建节点的场景:
- 你跑 DeFi 机器人的套利脚本,需要高频低延迟 RPC
- 你要验证链上交易的真实性
- 你想为网络去中心化做贡献
- 你开发 dApp 需要稳定可靠的测试环境
⚠️ 坦诚告知:跑全节点需要一定的 Linux 基础(SSH、命令行、systemd)。如果你是纯新手,建议先用第三方 RPC 服务过渡,同时用本文在测试网练手。
二、硬件选型
以太坊全节点
以太坊有执行层(Execution Layer, EL)和共识层(Consensus Layer, CL)两个客户端需要同时运行。
| 配置项 | 最低要求 | 推荐配置(长期) |
|---|
| CPU | 4 核 | 8 核以上 |
| 内存 | 16 GB | 32 GB |
| 存储 | 2 TB SSD | 4 TB NVMe SSD |
| 带宽 | 100 Mbps | 500 Mbps+ |
| 系统 | Ubuntu 22.04+ | Ubuntu 24.04 LTS |
存储是最关键的瓶颈。以太坊全节点目前(2026 年中)的数据量约 1.5 TB,且每月增长 ~20 GB。必须使用 NVMe SSD,SATA SSD 的 IOPS 跟不上同步速度,可能导致节点永远无法追赶上最新区块。
💡 省钱技巧:使用"快照同步"(Snap Sync)+ 状态剪裁(Pruning),可以将存储需求降低到 500-800 GB。下文会详细介绍。
Solana 全节点
Solana 对硬件要求远高于以太坊:
| 配置项 | 最低要求(验证节点) | 推荐配置 |
|---|
| CPU | 12 核 / 24 线程 | 24 核 / 48 线程(AMD Threadripper / Intel Xeon) |
| 内存 | 128 GB | 256 GB |
| 存储 | 1 TB NVMe(账本)+ 512 GB(账户) | 2 TB + 1 TB NVMe |
| GPU | 可选 | NVIDIA 4090(加速 PoH 验证) |
| 带宽 | 1 Gbps | 10 Gbps |
Solana 的性能要求意味着普通云服务器不适合跑 Solana 验证节点。如果只是想接入 Solana 网络查询数据,可以考虑运行 RPC 节点(要求略低)或使用 Geyser 插件过滤数据。
三、搭建以太坊节点
3.1 选择客户端组合
以太坊执行层和共识层有多种客户端实现,推荐搭配:
| 执行层 | 共识层 | 特点 |
|---|
| Geth | Lighthouse | 最成熟、文档最全、社区最大 |
| Nethermind | Prysm | 性能优秀、资源占用低 |
| Erigon | Teku | 存储效率极高(剪裁后可 <500 GB) |
| Besu | Nimbus | Java 生态、企业级支持 |
本文以 Geth + Lighthouse 为例——这是最主流的组合,遇到问题最容易搜到答案。
3.2 安装 Geth
1
2
3
4
5
6
7
| # 添加 Geth PPA 源
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt update
# 安装 Geth
sudo apt install -y geth
# 验证安装
geth version
|
3.3 安装 Lighthouse
1
2
3
4
5
6
7
8
9
| # 下载最新预编译二进制
cd /tmp
wget https://github.com/sigp/lighthouse/releases/latest/download/lighthouse-$(uname -m)-unknown-linux-gnu.tar.gz
tar -xzf lighthouse-*.tar.gz
sudo mv lighthouse /usr/local/bin/
# 安装依赖
sudo apt install -y libclang-dev libssl-dev
# 验证安装
lighthouse --version
|
3.4 初始化数据目录
1
2
3
4
5
6
7
8
9
| # 创建数据目录
sudo mkdir -p /data/ethereum
sudo chown -R $USER:$USER /data/ethereum
# Geth 数据目录
mkdir -p /data/ethereum/execution
# Lighthouse 数据目录
mkdir -p /data/ethereum/consensus
|
3.5 生成 JWT 密钥
共识层和执行层之间通过 JWT(JSON Web Token)认证通信:
1
2
3
| # 生成 JWT 密钥
openssl rand -hex 32 | tr -d '\n' > /data/ethereum/jwt.hex
echo "JWT 密钥已生成: /data/ethereum/jwt.hex"
|
3.6 启动 Geth(执行层)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| geth \
--datadir /data/ethereum/execution \
--http \
--http.addr 127.0.0.1 \
--http.port 8545 \
--http.api eth,net,web3,txpool \
--ws \
--ws.addr 127.0.0.1 \
--ws.port 8546 \
--ws.api eth,net,web3 \
--authrpc.addr 127.0.0.1 \
--authrpc.port 8551 \
--authrpc.jwtsecret /data/ethereum/jwt.hex \
--syncmode snap \
--cache 4096 \
--txlookuplimit 0 \
>> /data/ethereum/execution/geth.log 2>&1 &
|
参数说明:
--syncmode snap:使用快照同步,速度最快--cache 4096:分配 4 GB 内存作为数据库缓存(根据你的内存调整)--txlookuplimit 0:不保留历史交易索引(省空间,不影响实时查询)
⏱ 初次同步约需 6-12 小时,取决于网络和磁盘速度。可以通过查看日志进度:tail -f /data/ethereum/execution/geth.log | grep "Imported"
3.7 启动 Lighthouse(共识层)
1
2
3
4
5
6
7
8
9
10
| lighthouse bn \
--datadir /data/ethereum/consensus \
--network mainnet \
--execution-endpoint http://127.0.0.1:8551 \
--execution-jwt /data/ethereum/jwt.hex \
--checkpoint-sync-url https://sync-mainnet.beaconcha.in \
--http \
--http-address 127.0.0.1 \
--http-port 5052 \
>> /data/ethereum/consensus/lighthouse.log 2>&1 &
|
参数说明:
--checkpoint-sync-url:从可信检查点同步,大幅缩短共识层同步时间(从数天缩短到数分钟)- 共识层无需
--http-api 暴露给公网(除非你需要远程信标链 API)
3.8 验证节点状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 检查 Geth 同步进度
geth attach --datadir /data/ethereum/execution --exec 'eth.syncing'
# 如果返回 false,表示已同步完成
# 如果返回对象,可以看到当前区块和最高区块的差值
# 检查 Lighthouse 状态
curl -s http://127.0.0.1:5052/eth/v1/node/syncing | jq .
# 检查对等节点数量
geth attach --datadir /data/ethereum/execution --exec 'net.peerCount'
# 查看日志
tail -f /data/ethereum/execution/geth.log
tail -f /data/ethereum/consensus/lighthouse.log
|
同步完成后的表现:
- Geth 日志稳定输出 “Imported new chain segment” 每 12 秒
eth.syncing 返回 false- Lighthouse 日志输出 “Slot tick” 跟随当前 slot
3.9 配置 systemd 服务(推荐)
手动启动的进程会在 SSH 断开后终止。用 systemd 让节点开机自启:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
| # Geth 服务
sudo tee /etc/systemd/system/geth.service << 'EOF'
[Unit]
Description=Geth Execution Layer
After=network.target
Wants=network.target
[Service]
User=$USER
Type=simple
Restart=always
RestartSec=30
ExecStart=/usr/bin/geth \
--datadir /data/ethereum/execution \
--http \
--http.addr 127.0.0.1 \
--http.port 8545 \
--http.api eth,net,web3,txpool \
--ws \
--ws.addr 127.0.0.1 \
--ws.port 8546 \
--ws.api eth,net,web3 \
--authrpc.addr 127.0.0.1 \
--authrpc.port 8551 \
--authrpc.jwtsecret /data/ethereum/jwt.hex \
--syncmode snap \
--cache 4096 \
--txlookuplimit 0
[Install]
WantedBy=multi-user.target
EOF
# Lighthouse 服务
sudo tee /etc/systemd/system/lighthouse.service << 'EOF'
[Unit]
Description=Lighthouse Consensus Layer
After=network.target geth.service
Wants=network.target geth.service
[Service]
User=$USER
Type=simple
Restart=always
RestartSec=30
ExecStart=/usr/local/bin/lighthouse bn \
--datadir /data/ethereum/consensus \
--network mainnet \
--execution-endpoint http://127.0.0.1:8551 \
--execution-jwt /data/ethereum/jwt.hex \
--checkpoint-sync-url https://sync-mainnet.beaconcha.in \
--http \
--http-address 127.0.0.1 \
--http-port 5052
[Install]
WantedBy=multi-user.target
EOF
# 启用并启动
sudo systemctl daemon-reload
sudo systemctl enable geth lighthouse
sudo systemctl start geth
sudo systemctl start lighthouse
# 检查状态
sudo systemctl status geth
sudo systemctl status lighthouse
|
四、使用你的节点
4.1 本地调用 RPC
节点同步完成后,你就可以用它来发送交易和查询链上数据了:
1
2
3
4
5
6
7
| # 获取最新区块号
curl -s -X POST http://127.0.0.1:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
# 返回示例:{"jsonrpc":"2.0","id":1,"result":"0x132a3f8"}
# 十六进制转十进制:20033528
|
4.2 安全暴露 RPC(可选)
如果需要从其他机器访问你的节点 RPC,务必做好安全措施:
- 不要直接把 RPC 暴露到公网——任何人都可以通过你的 RPC 发交易,会让你损失 Gas 费用
- 正确的做法是先做一层反向代理 + IP 白名单
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 使用 Nginx 反向代理 + IP 白名单
sudo tee /etc/nginx/sites-available/eth-rpc << 'EOF'
server {
listen 8545 ssl;
server_name your-domain.com;
ssl_certificate /etc/ssl/certs/your-cert.pem;
ssl_certificate_key /etc/ssl/private/your-key.pem;
# IP 白名单(只允许你的其他服务器访问)
allow 你的内网或跳板机 IP;
deny all;
location / {
proxy_pass http://127.0.0.1:8545;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
EOF
|
更安全的方法是使用 SSH 隧道:
1
2
3
| # 在本地机器上建立 SSH 隧道
ssh -L 8545:127.0.0.1:8545 your-server
# 然后本地浏览器/脚本访问 http://127.0.0.1:8545 即可
|
4.3 查询链上数据
同步完成后,你的节点可以回答任何链上问题:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # 查询 USDT 合约余额(USDT 在以太坊上的合约地址)
curl -s -X POST http://127.0.0.1:8545 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0",
"method":"eth_call",
"params":[{
"to":"0xdAC17F958D2ee523a2206206994597C13D831ec7",
"data":"0x70a08231000000000000000000000000你的钱包地址(去掉0x前缀填40位)"
},"latest"],
"id":1
}'
# 查询交易收据
curl -s -X POST http://127.0.0.1:8545 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0",
"method":"eth_getTransactionReceipt",
"params":["0x交易哈希"],
"id":1
}'
|
4.4 用 WebSocket 订阅实时事件
1
2
3
4
5
6
7
8
| # 使用 wscat 测试 WebSocket
sudo apt install -y wscat
wscat -c ws://127.0.0.1:8546
# 连接后发送订阅请求
> {"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}
# 之后每次产生新区块,你会收到实时推送
|
五、存储优化与剪裁
5.1 理解剪裁(Pruning)
以太坊全节点默认保存所有历史状态数据(每个账户的余额、合约存储等)。Geth 的 snap 同步模式会自动剪裁不需要的旧状态,但你可能还需要进一步优化:
1
2
3
4
5
6
| # 检查当前数据使用量
du -sh /data/ethereum/execution/geth/chaindata
du -sh /data/ethereum/execution/geth/state # 这个目录最大
# Geth 在线剪裁(2024年后版本支持)
geth --datadir /data/ethereum/execution snapshot prune-state
|
5.2 使用 Erigon 获得最小存储
如果你的存储空间紧张,考虑改用 Erigon(执行层):
1
2
3
4
5
6
7
8
9
10
11
| # Erigon 的存储效率极高,剪裁后仅需 400-600 GB
# 安装 Erigon
wget https://github.com/erigontech/erigon/releases/latest/download/erigon-$(uname -m)-linux.tar.gz
tar -xzf erigon-*.tar.gz
sudo mv erigon /usr/local/bin/
# 启动 Erigon(自带 sentinel/共识层集成)
erigon \
--datadir /data/ethereum/erigon \
--chain mainnet \
--prune htc # 剪裁历史交易、收据、调用数据
|
5.3 数据目录总览
1
2
3
4
5
6
7
8
9
10
| # 优化后的以太坊节点数据布局
/data/ethereum/
├── execution/ # Geth 数据
│ └── geth/
│ ├── chaindata/ # ~300 GB(区块数据)
│ ├── trie/ # ~200 GB(状态树)
│ └── lightchaindata/ # 极小(light client 缓存)
├── consensus/ # Lighthouse 数据
│ └── beacon/ # ~100 GB(信标链数据)
└── jwt.hex # JWT 密钥(仅 64 字节)
|
六、日常运维与监控
6.1 检查健康状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| # 快速健康检查脚本
cat > /usr/local/bin/check-eth-node.sh << 'SCRIPT'
#!/bin/bash
echo "=== 以太坊节点健康检查 ==="
echo "时间: $(date)"
# 检查 process
if pgrep -x geth > /dev/null; then
echo "[OK] Geth 运行中"
else
echo "[ERR] Geth 未运行"
fi
if pgrep -x lighthouse > /dev/null; then
echo "[OK] Lighthouse 运行中"
else
echo "[ERR] Lighthouse 未运行"
fi
# 检查同步状态
SYNC=$(geth attach --datadir /data/ethereum/execution --exec 'eth.syncing' 2>/dev/null)
if [ "$SYNC" = "false" ]; then
echo "[OK] 节点已同步"
else
echo "[WARN] 节点同步中…"
fi
# 检查对等节点
PEERS=$(geth attach --datadir /data/ethereum/execution --exec 'net.peerCount' 2>/dev/null)
echo "对等节点: $PEERS"
# 检查磁盘使用
DISK=$(df -h /data/ethereum | tail -1 | awk '{print $5}')
echo "磁盘使用: $DISK"
SCRIPT
chmod +x /usr/local/bin/check-eth-node.sh
# 运行检查
/usr/local/bin/check-eth-node.sh
|
6.2 设置警报
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # 如果对等节点少于 3 个,发送 Telegram 通知
cat > /usr/local/bin/watch-eth-node.sh << 'SCRIPT'
#!/bin/bash
PEERS=$(geth attach --datadir /data/ethereum/execution --exec 'net.peerCount' 2>/dev/null)
if [ "$PEERS" -lt 3 ]; then
curl -s -X POST https://api.telegram.org/bot<你的BOT_TOKEN>/sendMessage \
-d chat_id=<你的CHAT_ID> \
-d text="❌ 以太坊节点对等节点不足:$PEERS"
fi
# 检查磁盘剩余空间(不足 50 GB 时报警)
DISK_AVAIL=$(df /data/ethereum --output=avail | tail -1)
if [ "$DISK_AVAIL" -lt 50000000 ]; then
curl -s -X POST https://api.telegram.org/bot<你的BOT_TOKEN>/sendMessage \
-d chat_id=<你的CHAT_ID> \
-d text="⚠️ 以太坊节点磁盘空间不足:$(($DISK_AVAIL/1000000)) GB"
fi
SCRIPT
# 每 15 分钟运行一次
(crontab -l 2>/dev/null; echo "*/15 * * * * /usr/local/bin/watch-eth-node.sh") | crontab -
|
6.3 节点升级
以太坊客户端经常更新,建议每月检查一次版本:
1
2
3
4
5
6
7
8
9
10
| # Geth 升级
sudo apt update && sudo apt upgrade -y geth
sudo systemctl restart geth
# Lighthouse 升级(重新下载二进制)
wget -O /tmp/lighthouse.tar.gz https://github.com/sigp/lighthouse/releases/latest/download/lighthouse-$(uname -m)-unknown-linux-gnu.tar.gz
sudo systemctl stop lighthouse
tar -xzf /tmp/lighthouse.tar.gz -C /tmp
sudo mv /tmp/lighthouse /usr/local/bin/
sudo systemctl start lighthouse
|
七、搭建 Solana RPC 节点
如果你需要访问 Solana 生态,运行一个 Solana RPC 节点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| # 安装 Solana CLI
sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)"
export PATH="$HOME/.local/share/solana/install/active_release/bin:$PATH"
solana --version
# 创建数据目录
mkdir -p /data/solana
cd /data/solana
# 生成 validator 密钥(RPC 节点也需要一个身份密钥)
solana-keygen new --outfile ~/validator-keypair.json
# 启动 RPC 节点
solana-validator \
--identity ~/validator-keypair.json \
--ledger /data/solana/ledger \
--accounts /data/solana/accounts \
--rpc-port 8899 \
--entrypoint entrypoint.mainnet-beta.solana.com:8001 \
--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \
--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \
--entrypoint entrypoint4.mainnet-beta.solana.com:8001 \
--entrypoint entrypoint5.mainnet-beta.solana.com:8001 \
--limit-ledger-size 50000000 \
--enable-rpc-transaction-history \
--rpc-pubsub-enable \
--no-snapshot-fetch-in-parallel \
>> /data/solana/solana.log 2>&1 &
|
⚠️ Solana 节点运维负担较重,日均日志量可达 10+ GB。建议启用日志轮转:
bash
sudo tee /etc/logrotate.d/solana « ‘EOF’
/data/solana/solana.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
EOF
```
八、常见问题排查
8.1 同步速度太慢
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 1. 检查磁盘 IO
iostat -x 1
# 确保 %util 不超过 90%,await 不超过 10ms
# 2. 检查带宽
sudo apt install -y nethogs
sudo nethogs
# 3. 检查对等节点
geth attach --exec 'net.peerCount'
# 4. 如果 peerCount 太少,在 Geth 启动参数中增加:
--maxpeers 50
|
8.2 节点同步中断后重启
1
2
3
4
5
6
7
8
9
10
11
12
| # 查看上次中断的日志
tail -50 /data/ethereum/execution/geth.log
# 安全重启
sudo systemctl stop lighthouse
sudo systemctl stop geth
# 等待 30 秒让数据库安全关闭
sleep 30
sudo systemctl start geth
# 等 Geth 完全启动后再启动 Lighthouse
sleep 60
sudo systemctl start lighthouse
|
8.3 数据库损坏
1
2
3
4
5
6
| # Geth 提供了修复工具
geth --datadir /data/ethereum/execution removedb
# ⚠️ 这会删除所有数据,需要重新同步!
# 更好的选择:保留链数据,仅重新同步状态
geth --datadir /data/ethereum/execution --syncmode snap
|
九、资源消耗参考
以下是经过 3 个月稳定运行的实测数据:
| 指标 | 以太坊(Geth+Lighthouse) | Solana RPC 节点 |
|---|
| CPU 平均占用 | 15-30% | 40-70% |
| 内存占用 | 8-16 GB | 64-120 GB |
| 磁盘增长 | ~20 GB/月 | ~100 GB/月 |
| 月流量 | 约 2-5 TB | 约 10-30 TB |
| 月电费(估算) | $20-40 | $80-200 |
| 月服务器租金 | $30-80(独服) | $200-500(独服) |
十、值得尝试的其他节点
除了以太坊和 Solana,还有一些有趣的全节点可以自己跑:
- Bitcoin Core:存储约 600 GB,配置最简易,跑过即对比特币有更深理解
- Polygon Edge:兼容以太坊,数据量较小(~200 GB),适合低配机器
- Arbitrum Nitro:Layer 2 全节点,需要 L1 节点配合运行
- BNB Chain:基于 Geth 分叉,存储约 300 GB,配置与 Geth 基本一致
1
2
3
4
5
| # 安装 Bitcoin Core 全节点
wget https://bitcoincore.org/bin/bitcoin-core-27.0/bitcoin-27.0-x86_64-linux-gnu.tar.gz
tar -xzf bitcoin-*.tar.gz
sudo install -m 0755 -o root -t /usr/local/bin bitcoin-27.0/bin/*
bitcoind -daemon -datadir=/data/bitcoin
|
最后
自己跑节点是一趟有回报的技术旅程。第一周需要花些时间调试同步速度,之后就基本不用管了。一旦节点追上链头,你就有了一条完全属于你自己的区块链入口——不限速、不收费、不依赖任何人。这份自主权,正是加密货币最初的理念。
🔗 扩展阅读: