自行搭建区块链节点指南:从零运行以太坊、Solana 节点

自己跑过全节点,才算真正理解区块链。

用 Infura、Alchemy 等第三方 RPC 服务很方便,但你每次查询、每笔交易都在依赖一个中心化入口。运行你自己的节点意味着:不信任第三方、完全掌控数据、免除速率限制、还能为网络去中心化出一份力。

本文教你从零搭建以太坊(执行层+共识层)和 Solana 的全节点,涵盖硬件选型、安装配置、状态剪裁、日常运维等全部环节。


一、为什么要自己跑节点?

在开始操作之前,先明确三个核心价值:

对比项第三方 RPC 服务自建节点
隐私你的 IP 和查询内容对服务商可见完全私密
速率限制免费版有配额(通常 100k 请求/天)无限制
延迟公共同步延迟(多人共享)本地局域网级
数据验证信任服务商返回正确数据本地全验证
月费免费版有限,付费版 $50+/月仅服务器成本
运维负担无需维护需自行维护

适合自建节点的场景:

  • 你跑 DeFi 机器人的套利脚本,需要高频低延迟 RPC
  • 你要验证链上交易的真实性
  • 你想为网络去中心化做贡献
  • 你开发 dApp 需要稳定可靠的测试环境

⚠️ 坦诚告知:跑全节点需要一定的 Linux 基础(SSH、命令行、systemd)。如果你是纯新手,建议先用第三方 RPC 服务过渡,同时用本文在测试网练手。


二、硬件选型

以太坊全节点

以太坊有执行层(Execution Layer, EL)和共识层(Consensus Layer, CL)两个客户端需要同时运行。

配置项最低要求推荐配置(长期)
CPU4 核8 核以上
内存16 GB32 GB
存储2 TB SSD4 TB NVMe SSD
带宽100 Mbps500 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 对硬件要求远高于以太坊:

配置项最低要求(验证节点)推荐配置
CPU12 核 / 24 线程24 核 / 48 线程(AMD Threadripper / Intel Xeon)
内存128 GB256 GB
存储1 TB NVMe(账本)+ 512 GB(账户)2 TB + 1 TB NVMe
GPU可选NVIDIA 4090(加速 PoH 验证)
带宽1 Gbps10 Gbps

Solana 的性能要求意味着普通云服务器不适合跑 Solana 验证节点。如果只是想接入 Solana 网络查询数据,可以考虑运行 RPC 节点(要求略低)或使用 Geyser 插件过滤数据。


三、搭建以太坊节点

3.1 选择客户端组合

以太坊执行层和共识层有多种客户端实现,推荐搭配

执行层共识层特点
GethLighthouse最成熟、文档最全、社区最大
NethermindPrysm性能优秀、资源占用低
ErigonTeku存储效率极高(剪裁后可 <500 GB)
BesuNimbusJava 生态、企业级支持

本文以 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,务必做好安全措施

  1. 不要直接把 RPC 暴露到公网——任何人都可以通过你的 RPC 发交易,会让你损失 Gas 费用
  2. 正确的做法是先做一层反向代理 + 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 GB64-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

最后

自己跑节点是一趟有回报的技术旅程。第一周需要花些时间调试同步速度,之后就基本不用管了。一旦节点追上链头,你就有了一条完全属于你自己的区块链入口——不限速、不收费、不依赖任何人。这份自主权,正是加密货币最初的理念。

🔗 扩展阅读