温故可以知新:EOS的快照(snapshot)功能

Words
1015
Reading
5 min
Listen
Play
5y

虽然EOS的快照功能使用了好久好久,但是从没系统地整理并分享过,这里整理一下分享给大家。另外貌似这两天EOS涨的还不错,话说不知道还能不能有春天了?

image.png
(图源 :pixabay)

创建快照

在创建快照之前,首先要启用如下两个插件(可以通过编辑配置文件并重启nodeos来启用):

plugin = eosio::producer_plugin
plugin = eosio::producer_api_plugin

如果没启用上述插件,创建快照时则会出现类似如下错误:

{"code":404,"message":"Not Found","error":{"code":0,"name":"exception","what":"unspecified","details":[{"message":"Unknown Endpoint","file":"http_plugin.cpp","line_number":570,"method":"handle_http_request"}]}}

准备好之后,我们就可以使用类似如下指令创建快照啦:

curl -XPOST http://127.0.0.1:8888/v1/producer/create_snapshot

创建快照时,节点同步会暂停,所以如果你是超级节点,不能在生产系统上直接操作哦,否则会大把丢块的。

另外需要说明的是,不能在配置比较低的机器上创建快照,否则可能要等好久好久好久哦。在我的机器上,当前创建快照大概需要五六分钟,这个时间还是可以接受的。

快照创建好以后会打印快照信息,同时区块继续开始同步。快照信息大致如下:

{"head_block_id":"0b8dc54541ad782ba2858b891e518a676e26532454e271b26d2b4df830842e9c","snapshot_name":"/home/test1234/.local/share/eosio/nodeos/data/snapshots/snapshot-0b8dc54541ad782ba2858b891e518a676e26532454e271b26d2b4df830842e9c.bin"}

默认会生成到区块数据对应的snapshots目录下,我们可以通过ls或者du指令看一下这个文件的大小,当前这个文件大小约为4.5G。

使用快照

在使用快照之前,我们需要先停掉nodeos并清空blocks以及state目录,否则会出现如下错误提示:

Snapshot can only be used to initialize an empty database.

根据自己数据目录的对应情况,我们可以使用类似如下命令清空:

rm -rf ~/.local/share/eosio/nodeos/data/blocks/*
rm -rf ~/.local/share/eosio/nodeos/data/state/*

停掉nodeos并清空blocks以及state目录后,我们可以使用如下指令从快照运行nodeos:

nodeos -x --snapshot ~/.local/share/eosio/nodeos/data/snapshots/snapshot-0b8dc54541ad782ba2858b891e518a676e26532454e271b26d2b4df830842e9c.bin

其中--snapshot后边接的就是你snapshot文件路径和文件名啦。

当上述指令被执行后,除了和正常启动nodeos一样打印一些初始化信息外,还会打印出如下信息:

Starting initialization from snapshot, this may take a significant amount of time

翻译过来就是:

从快照开始初始化,这可能会花费大量的时间。

然后耐心等待就可以了,这个时间应该也和机器配置有关,配置越高(高主频、大内存、高速SSD/NVME等)这个耗时越短啦,我当前机器上,大致耗时2、3分钟,算是比较快的啦。

从快照运行并正常同步后,我建议使用正常启动命令重启一下(其实也没啥必要,强迫症使然),对了,如果不是跑BP节点,建议关掉上边启用的两个插件。

外部资源

除了自己生成并使用快照外,我们也可以使用第三方提供的快照资源来运行nodeos节点。

以前这样的资源比较多,现在我发现好多站点都停掉了。https://snapshots.eosnation.io/ 这个貌似还能用,里边除了提供主网快照外,还提供Jungle以及Kylin等测试网的快照。

不过我没运行验证过,想必问题不大。

与HIVE快照的区别

EOS上的快照与HIVE上快照最大的区别就是,EOS可以直接从快照上启动,而HIVE除了需要快照还需要block_log文件。

这个差异导致我第一次尝试使用HIVE快照时第一步就把block_log删除掉,然后傻眼了。😳

这两者快照我觉得各有优缺点吧,EOS的快照可以使我们使用极低的磁盘占用来运行节点,但是没法获取快照之前的区块内容了,而HIVE则占用大量空间但是可以获取快照以前的区块内容。

相关链接

温故可以知新:EOS的快照(snapshot)功能 | Ecency