Ethereum geth不会在非正常系统重启时将trie节点数据从内存持久化到磁盘

Ethereum geth不会在非正常系统重启时将trie节点数据从内存持久化到磁盘,ethereum,web3,go-ethereum,geth,Ethereum,Web3,Go Ethereum,Geth,问题:geth 1.8.22在系统重新启动时从第一个块开始挖掘,而不是从最后一个块开始挖掘 我们拥有的 我们有3个使用PoA(clique)的同步私有geth节点 发生了什么事 一天(一周前),我们与主机提供商发生了问题,因此我们不得不重新启动3个节点中的2个(每个节点位于单独的VP上)。目前的街区是400000。当节点1和节点2重新启动时,它们开始从块372而不是最后一个块4 000 000进行挖掘 为什么会发生(我猜) Geth 1.8.22将一些带有trie节点数据的数据保存在RAM中,而

问题:geth 1.8.22在系统重新启动时从第一个块开始挖掘,而不是从最后一个块开始挖掘

我们拥有的

我们有3个使用PoA(clique)的同步私有geth节点

发生了什么事

一天(一周前),我们与主机提供商发生了问题,因此我们不得不重新启动3个节点中的2个(每个节点位于单独的VP上)。目前的街区是400000。当节点1和节点2重新启动时,它们开始从块372而不是最后一个块4 000 000进行挖掘

为什么会发生(我猜)

Geth 1.8.22将一些带有trie节点数据的数据保存在RAM中,而不是磁盘中。在节点关闭时(例如从控制台),此trie节点数据将从RAM保存到硬盘驱动器。在强制关闭系统时(例如从主机管理面板),trie节点数据没有时间保存在硬盘上。我们的节点在没有任何重启的情况下运行了6个月,所以我认为这个trie节点数据一直保存在RAM中,并且在系统重启时消失了(尽管我们仍然有节点3正在运行)

日志

以下是我尝试运行其中一个节点的备份版本时的日志:

vladimir@comp:~/Public/projects/ethereum/repu geth bug/geth-linux-amd64-1.8.22-7fa3509e$。/geth--datadir../opt/ethereum/data/--networkid 1515--unlock 0xd6ee38421e1713dd50e888c6d689b82953946bc3--password../opt/ethereum/unlock--port 30306--mine
信息[11-21 | 17:06:25.374]最大对等计数ETH=25 LES=0总计=25
信息[11-21 | 17:06:25.374]启动对等节点实例=Geth/v1.8.22-stable-7fa3509e/linux-amd64/go1.11.5
信息[11-21 | 17:06:25.374]分配的缓存和文件句柄数据库=/home/vladimir/Public/projects/ethereum/repro-geth-bug/opt/ethereum/data/geth/chaindata-cache=512句柄=2048
信息[11-21 | 17:06:26.550]初始化链配置配置=“{链ID:1515家园:1道:道支持:假EIP150:2 EIP155:3 EIP158:3拜占庭:4君士坦丁堡:5君士坦丁堡:引擎:集团}”
信息[11-21 | 17:06:26.550]初始化以太坊协议版本=“[63 62]”网络=1515
警告[11-21 | 17:06:26.579]头部状态缺失,正在修复链号=4073749哈希=9bfb53…56d503
信息[11-21 | 17:07:45.179]将区块链重绕到过去的状态编号=371哈希=102018…d91947
信息[11-21 | 17:07:45.180]加载的最新本地标头编号=4073749哈希=9bfb53…56d503 td=8147499年龄=2d5h43m
信息[11-21 | 17:07:45.180]加载的最新本地完整块编号=371哈希=102018…d91947 td=743年龄=7mo3w6d
信息[11-21 | 17:07:45.180]加载的最新本地快速块编号=4073749哈希=9bfb53…56d503 td=8147499年龄=2d5h43m
信息[11-21 | 17:07:45.180]加载的本地事务日志事务=3已删除=3
信息[11-21 | 17:07:45.180]重新生成的本地交易日记帐交易=0账户=0
警告[11-21 | 17:07:45.180]区块链不为空,快速同步已禁用
信息[11-21 | 17:07:45.623]新本地节点记录序列=6 id=e8c5a9e8848d4e30 ip=127.0.0.1 udp=30306 tcp=30306
信息[11-21 | 17:07:45.623]自启动P2P网络=enode://9647000ba2579dd529574b49f472f029839a09257c1bc3ade5135cbbb5f3ceaf1237aff5b6b947d2fa4f218fa24858dc2767bd4b78e082b04c9d013c1482cfa6@127.0.0.1:30306
信息[11-21 | 17:07:45.624]IPC端点打开url=/home/vladimir/Public/projects/ethereum/repo geth bug/opt/ethereum/data/geth.IPC
信息[11-21 | 17:07:46.192]未锁定的帐户地址=0xd6ee38421e1713dD50E888c6D689B82953946bC3
信息[11-21 | 17:07:46.192]交易池价格阈值更新价格=100000000
信息[11-21 | 17:07:46.192]交易池价格阈值更新价格=100000000
信息[11-21 | 17:07:46.192]以太基自动配置地址=0xd6ee38421e1713dD50E888c6D689B82953946bC3
信息[11-21 | 17:07:46.192]提交新采矿工作编号=372 sealhash=685e15…2c52df uncles=0 txs=0 gas=0 fees=0运行时间=75.951µs
信息[11-21 | 17:07:46.192]已成功密封新区块编号=372 sealhash=685e15…2c52df hash=0c60ef…f29e6b经过时间=385.27µs

信息[11-21 | 17:07:46.192]请检查完整答案:

简言之:

  • geth在经过1小时的块处理后保存数据
  • 如果您的网络超轻(即大部分为空块),则需要很长时间才能将块从内存刷新到硬盘
  • 目前无法在geth中配置持久性轮次的周期
解决方案:定期重新启动geth,以便将数据从RAM保存到硬盘驱动器

此处有问题