修剪 GETH 以太坊数据库对于以太坊加密货币的POS挖矿,通常使用名为验证器的特殊软件。验证器又分为两个组成部分:执行层和共识层。共识层是POS挖矿本身,而执行层是以太坊的POW区块链网络,该网络从2015年一直运行到2022年合并为止。此期间积累的所有数据已完全转移到新的POS网络。

由于存在多个验证器软件选项,以下考虑因素将适用于最流行的Geth客户端。

每个层都使用自己的数据库,对于执行层,该数据库每周增加14GB。数据库的总大小已经接近2TB。对于归档验证器(用于诸如Etherscan和beacoincha.in等服务),使用Geth客户端时,SSD空间需求更高,超过14TB。

为了减小全节点(标准验证器)的SSD大小需求,开发人员设计了一个数据库修剪过程,对每个交易仅保留最后的128个区块。

全节点以太坊验证器

理论上,此过程允许使用1TB SSD,但修剪需要每月进行。因此,建议购买一个2TB SSD用于验证器,并每年执行一次数据库缩减。此过程需要约6-7小时,在此期间您的验证器将离线并可能产生惩罚。

共识层也有自己的数据库,但其大小增长不如执行层的数据库那么迅速。因此,主要关注于减小执行层的数据库大小。

重要提示:从版本 1.13.0 开始,如果您已经在使用 --state.scheme=path 或者只是要安装 ETH 验证器,则 GETH 客户端支持新标志 --state.scheme=path 以及新的 Pebble 数据库类型使用新的数据库类型,则无需再修剪数据库。 对于已更新到版本 1.13.0 或更高版本的所有其他客户端,旧版本的数据库将继续工作。 要切换到新数据库,需要完全删除Geth客户端数据库(gethremovedb命令),在GETH设置中指定标志--state.scheme=path和--db.engine pebble,并等待完全同步节点 1 天,前提是您有快速的 SSD、强大的现代 CPU 和快速的互联网。

现在让我们继续执行Geth客户端的数据库修剪的操作说明。 

GETH数据库修剪

重要提示:只有在SSD上至少有40GB的可用空间时,才能修剪数据库。如果SSD上的空间不足,您可以通过减少SWAP文件或扩展逻辑磁盘大小来增加空间。或者,暂时将共识层的数据库移动到另一个磁盘上,或者作为最后的手段,使用Pebble数据库从头开始执行新的同步。

要在Linux上检查磁盘上的可用空间,请使用以下命令:

df -h

另一点:您的GETH客户端必须完全同步,并在启动后至少运行35分钟,以收集必要的数据。

第一步是停止GETH进程:

sudo systemctl stop geth

您还可以停止共识层。PRYSM客户端的停止命令如下:

sudo systemctl stop prysmvalidator
sudo systemctl stop prysmbeacon

在进行下一步之前等待3分钟。

在进一步操作之前,建议启动一个终端多路复用器,如TMUX,以确保如果您失去对远程服务器终端的访问,修剪过程不会中断。

tmux

这是在您失去对远程终端的访问时需要的。在这种情况下,数据库修剪过程将不会随着您的会话中断而中断。

现在,您可以开始减小数据库大小。

修剪数据库的命令:

 geth snapshot prune-state

如果按照Somer Esat在Medium上的说明安装验证器,也就是说使用systemd启动GETH,那么命令将会有所不同:

sudo -u <user> geth --datadir <path> snapshot prune-state

例如:: sudo -u geth geth --datadir /var/lib/geth snapshot prune-state

或者 sudo -u goeth geth --datadir /var/lib/goethereum snapshot prune-state

命令的选择取决于您的GETH数据库在服务器上的存储位置。您可以在geth.service文件中找到数据库路径:

sudo nano /etc/systemd/system/geth.service

数据库路径在--datadir标志下指定。

如果操作正确,数据库缩减过程将开始,分为3个阶段:

第一阶段是构建布隆过滤器,这在我的计算机上花费了超过2个小时

减少以太验证器数据库

elapsed:已经过去的时间

eta:预计到达过程结束的时间

实际的数据库修剪将开始,大约需要额外4个小时。

修剪状态数据 eth geth

修剪后,数据库将被压缩,在控制台上标记为“Compacting database”。这个过程可能需要额外的一个小时左右。

成功完成以太坊验证器数据库缩减任务后,将会显示一条消息:“State pruning successful”。

关闭TMUX:

tmux kill-server

接下来,启动GETH客户端和验证器(如果它也被关闭了):

sudo systemctl start geth

sudo systemctl start prysmbeacon

sudo systemctl start prysmvalidator

错误:“Snapshot not old enough yet: need 128 more blocks”

如果在决定缩小数据库之前您的验证器运行时间不足,将出现此错误。建议GETH至少运行35分钟,然后再进行修剪。

此错误也会在选择错误的命令来修剪GETH客户端的数据库时发生。请指定正确的路径或使用不同的命令格式。

另一种启动GETH以太坊数据库修剪的方法

编辑现有的geth.service文件:

sudo nano /etc/systemd/system/geth.service

在ExecStart的末尾添加以下行:

snapshot prune-state

所有其他参数应保持不变。

重新加载systemd:

sudo systemctl daemon-reload

启动GETH服务:

sudo systemctl start geth

您可以使用以下命令监视数据库修剪的进度:

journalctl -fu geth

完成GETH数据库修剪后,从geth.service文件中删除snapshot prune-state这一行:

sudo nano /etc/systemd/system/geth.service

重新加载systemd:

sudo systemctl daemon-reload

启动GETH服务:

sudo systemctl start geth

在一台配备了Ryzen 1700X处理器、32GB RAM和2TB SSD ADATA XPG GAMMIX S11 Pro的服务器上,减小GETH客户端数据库的整个过程大约需要7个小时。

如果您的服务器配置明显较弱,减小数据库所需的总时间将更长。相反,在一台性能更强大的计算机上,修剪可能需要更少的时间。

结论:在GETH客户端上运行的ETH验证器数据库的修剪是一个非常有用的功能,因为它允许使用比实际需要的要小得多的SSD。这还可以解决如果您的2TB SSD已经不足以支持以太坊验证器的问题。在几个小时内,您可以减小数据库,并避免需要进行2周的完整GETH同步以过渡到Pebble,其中数据库的缩减是自动进行的。

如果您决定不切换到Pebble,请记住在SSD上仍有40GB可用空间时定期执行snapshot prune-state命令。