geth 同步区块一直落后的解决方案

本文分享了在遇到以太坊区块同步问题时的一种解决办法:通过从已同步的服务器A复制区块数据到同步出现问题的服务器B,快速实现区块同步。文章详细介绍了关闭服务器、数据复制、启动geth及同步节点的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心思路 : 从原有的(或者从别人那里) 拷贝数据到自己的电脑上;

geth 版本: Geth/v1.8.18-stable/linux-amd64/go1.11.2

最近 新开了一台 服务器来同步 以太坊的 区块, 但是在 geth 的控制台调用 eth.syncing 发现 currentBlock 一直低于highestBlock,

苦于百度上, Google 上 和 github 上都没有确实际的解决方案…

网上有人说是磁盘的问题, 但是我的是 Google Cloud 的 SSD 云盘啊!

所以我想到了一个非常苦逼的办法: 从别人的机器上服务制区块链数据到我的服务器上,
嗯… 我之前已经有一台服务器在 日本, 区块已经同步好了, 所以我准备将数据从日本拷贝到Google Cloud 上来.

服务器 A: 已经同步好区块的服务器
服务器 B: 同步有问题的服务器
当前区块数据大小: 180G 左右
备注: 我下面写的命令中的路径你要注意修改一下

  1. 关闭 A服务器 上 的 geth
    我启动geth 的方式是 用 nohup 启动在后台的, 我 查找到 geth pid 之后 直接 kill 掉(不要加 -9 选项),
    然后查看 nohup 文件的内容, 等待 geth 完全退出. 下面是我执行的命令过程
ps -axu | grep geth # 查看geth 的 pid
kill ${pid} # 给 geth 发出 停止信号
#.... 等待关闭完成(大约 20 秒)
tail -n 10 nohup.out # 查看是否输出 已经关闭了数据库(这个文件是我的nohup 输出文件)
ps -axu | grep geth # 确保没有geth 正在运行
  1. 拷贝数据到新的服务器
    无非就是用 scp 将数据拷贝到另一台电脑嘛~
export target=username@0.0.0.0:~/ethdata/data/
nohup scp ~/eth/data ${target} & 
#... 睡一觉吧, 拷贝很久呢
  1. 在 B 服务器上 同步 A 服务器 的数据
    等了好久, 终于拷贝完成了, 不要忘了把 A 服务的geth 重新启动起来(我花费的传输时间, 区块落后了1000 块).
    接下来在服务器 B 上启动 geth,
    启动数据文件夹指向复制过来的文件夹, 同步节点 指向 服务器 A.
    不过记得修改 nodekey, 否则无法同步
./geth --data-dir =/tmp/eth/ # 生成 新的 nodekey
#将原有的nodkey 改名
mv ~/ethdata/data/geth/nodekey ~/ethdata/data/geth/nodekey2
# 复制新生成的nodekey 到数据目录
cp /tmp/eth/geth/nodekey ~/ethdata/data/geth/nodekey
rm -rf /tmp/eth/ # ...
# 启动
./geth --data-dir=/home/xxx/ethdata/data/ .... #

启动会花费一些时间…
然后进入geth 控制台, 将A 服务器的节点添加进去

./geth attach http://xxx.xxx.xxx.xxx # 连接到
admin.addPeer("xxxx"); # 添加服务器A geht 的节点

我的 A 服务器同步特别快, 我B 服务器还没启动起来就追上了最新块,
B 服务器上的geth 启动 执行 eth.blockNumber 的结果是和 服务器 A 传输之前是一致的,
接下来就等 服务器 B 同步 A 服务器的数据了.

嗯… 20 分钟就同步完了.
好了, 现在我两台服务器的 blockNumber 都和 etherscan.io 一致了!



关于如何查看服务器A 的节点.
进入服务器 A , 查看 日志文件(我的是nohup.out 文件)

head -n 20 nohup.out
  1. 找到 Started P2P networking 相关日志, 大致类似于下面这样
INFO [11-29|07:56:16.208] Started P2P networking  self="enode://xxxxx@0.0.0.0:30303?discport=0"

# enode://xxxxx@0.0.0.0:30303?discport=0 就是了
# admin.addPeer("enode://xxxxx@0.0.0.0:30303?discport=0");
<think>好的,用户想了解如何设置和实现Geth多节点之间的连接与同步,特别是私有链和公网的情况。我需要根据提供的引用内容整理出一个清晰的步骤指南。首先,用户提供的引用提到了网络ID的重要性,不同ID的节点无法连接,所以第一步需要确保所有节点使用相同的networkid。接下来,创世区块的初始化是关键,每个节点都必须使用相同的genesis.json文件。然后,每个节点需要独立的数据目录,并在启动时指定正确的参数,如datadir、networkid、rpc等。 接下来是节点之间的连接,引用3提到需要获取节点的enode信息,并通过admin.addPeer()方法添加对等节点。这一步可能需要用户手动操作,或者编写脚本自动处理。另外,如果节点分布在公网,需要处理防火墙和端口转发的问题,确保30303端口开放,并且节点能够互相访问。 同步机制方面,私有链通常使用全同步,而公网可能需要不同的配置。还要考虑静态节点的配置,确保节点重启后能自动连接。最后,测试转账功能可以验证节点是否同步成功,引用2中的转账示例可以用来作为验证步骤。 在整理步骤时,需要分点说明,每个步骤详细但不过于复杂,确保用户能逐步操作。同时,要注意引用内容中的关键点,比如networkid一致、创世区块相同、enode信息交换等。可能还需要提醒用户常见的错误,比如端口未开放或防火墙设置问题,以及如何查看日志进行调试。 最后,生成相关问题,帮助用户深入理解可能遇到的后续问题,比如网络ID冲突、节点无法发现、同步失败的原因等。这样用户可以根据问题进一步排查和优化配置。</think>### Geth多节点连接与同步配置指南 --- #### 一、基础环境准备 1. **统一网络ID** 所有节点必须在`genesis.json`中定义相同的`chainId`,并在启动时使用相同的`--networkid`参数。例如: ```json // genesis.json片段 "config": { "chainId": 12345, // 自定义链ID "homesteadBlock": 0, "eip150Block": 0 } ``` 启动命令需包含`--networkid 12345`(与`chainId`一致)[^1]。 2. **创世区块初始化** 每个节点需执行初始化命令: ```bash geth --datadir ./node1/data init genesis.json # 节点1 geth --datadir ./node2/data init genesis.json # 节点2 ``` --- #### 二、多节点配置步骤 1. **节点1(主节点)启动参数** ```bash geth --datadir ./node1/data \ --networkid 12345 \ --port 30303 \ --http --http.addr 0.0.0.0 --http.port 8545 \ --http.api "eth,net,web3,personal" \ --nodiscover \ console ``` - `--nodiscover`:防止被公网扫描 - `--http.addr 0.0.0.0`:允许远程RPC访问[^2] 2. **节点2(子节点)启动参数** ```bash geth --datadir ./node2/data \ --networkid 12345 \ --port 30304 \ --http --http.port 8546 \ console ``` --- #### 三、节点连接与同步 1. **获取主节点enode信息** 在节点1控制台执行: ```javascript admin.nodeInfo.enode // 输出示例:enode://a803485513b...@192.168.1.100:30303 ``` 2. **手动添加对等节点** 在节点2控制台执行: ```javascript admin.addPeer("enode://a803485513b...@192.168.1.100:30303") ``` 验证连接状态:`net.peerCount`(返回>0表示成功)[^3] 3. **公网部署注意事项** - 开放防火墙端口:TCP/UDP 30303 - 配置NAT端口转发(如使用家庭网络) - 若使用云服务器,需设置安全组规则 --- #### 四、同步验证与测试 1. **区块同步检查** 在任意节点执行: ```javascript eth.blockNumber // 对比各节点数值是否一致 ``` 2. **跨节点转账测试** ```javascript // 在节点1发起转账 personal.unlockAccount(eth.accounts[0]) eth.sendTransaction({from: eth.accounts[0], to: "0x节点2地址", value: web3.toWei(1,"ether")}) ``` 通过`eth.getBalance("目标地址")`验证余额变化[^2] --- #### 五、高级配置建议 1. **静态节点配置** 在`datadir`下创建`static-nodes.json`,预先写入已知节点enode信息: ```json ["enode://a803485513b...@ip:port", "enode://b2f4...@ip:port"] ``` 2. **启动模式选择** - 全同步:`--syncmode full`(默认,需完整区块链数据) - 快照同步:`--syncmode snap`(更快,适合新节点) ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值