为什么使用快照1. 快速同步节点EOS 的日志文件已经达到了 160G,同步一个 EOS 全节点大约需要耗时 10-15 天的时间,时间成本非常高。作为一个普通 Dapp 开发者,我们并不需要之前的区块数据,所以完全不需要浪费大把时间去同步一个 EOS 全节点。通过快照同步的方式能够很好的满足我们的需求,使用最新快照启动的节点,能够在 34 分钟内完成节点同步达到主网高度,时间成本大大降低。2. 节省服务器资源 快照启动的节点,区块日志 block.log 内只会保存节点启动之后的区块数据,占用的磁盘空间更小。对比全节点和快照方式启动的节点两种方式同步 EOS 主网的结果来看,可以得出的结论是使用快照启动的节点在 CPU 和 RAM 的使用上都要远远小于全节点。这就意味着在一定程度上使用快照同步的节点能够很大程度上的降低我们的服务器成本。3. 不停机数据备份传统的区块数据备份步骤:停止同步中的节点使用压缩工具将区块数据压缩重新启动节点快照备份步骤:访问对应的接口: /v1/producer/create_snapshot,节点开始数据备份,备份结束后继续同步,无需停掉正在运行的节点。通过上面的对比可以看出,使用快照方式启动的节点,在数据备份上将更加简单便捷。快照实现的原理1. 使用快照启动相应的源码地址: https://github.com/EOSIO/eos/…,截取部分代码:auto infile = std::ifstream(my->snapshot_path->generic_string(), (std::ios::in | std::ios::binary));auto reader = std::make_shared<istream_snapshot_reader>(infile);reader->validate();reader->read_section<genesis_state>([this]( auto §ion ){ section.read_row(my->chain_config->genesis); });infile.close();从源码中可以看出当启动添加参数:snapshot时,会以快照中的数据启动。2. 实现快照备份进行快照备份时,服务器资源使用情况稳定。但正在备份中的节点服务将暂时不可用,待数据备份结束后将恢复。所以推荐备份节点和业务节点独立开。相应的源码如下: https://github.com/EOSIO/eos/...producer_plugin::snapshot_information producer_plugin::create_snapshot() const { chain::controller& chain = my->chain_plug->chain(); auto reschedule = fc::make_scoped_exit(this{ my->schedule_production_loop(); }); if (chain.pending_block_state()) { // abort the pending block chain.abort_block(); } else { reschedule.cancel(); } auto head_id = chain.head_block_id(); std::string snapshot_path = (my->_snapshots_dir / fc::format_string(“snapshot-${id}.bin”, fc::mutable_variant_object()(“id”, head_id))).generic_string(); EOS_ASSERT( !fc::is_regular_file(snapshot_path), snapshot_exists_exception, “snapshot named ${name} already exists”, (“name”, snapshot_path)); auto snap_out = std::ofstream(snapshot_path, (std::ios::out | std::ios::binary)); auto writer = std::make_shared<ostream_snapshot_writer>(snap_out); chain.write_snapshot(writer); writer->finalize(); snap_out.flush(); snap_out.close(); return {head_id, snapshot_path};}从源码中可以看出,当进行快照备份时,会将备份数据写到我们设置的路径下,快照的文件名为当前区块的hash。下面我们将详细介绍在 FIBOS、EOS 上如何通过快照启动启动 FIBOS 节点注意: FIBOS 版本: v1.4.0+创建快照配置快照目录快照生成位置 config.data_dir 为根目录,可以配置为:config.data_dir = “./blockData/data"fibos.load(“producer”, {“snapshots-dir”: “snapshots”});根据配置,快照生成的位置为:./blockData/data/snapshots载入插件fibos.load(“producer_api”);注意: 开启该插件后,请确保你的节点放置在内网安全。完整配置文件可参考:const fibos = require(‘fibos’);fibos.config_dir = “./blockData/data"fibos.data_dir = “./blockData/data”;fibos.load(“http”, { “http-server-address”: “0.0.0.0:8870”, “access-control-allow-origin”: “*”, “http-validate-host”: false, “verbose-http-errors”: true});fibos.load(“net”, { “p2p-peer-address”: [], “max-clients”: 100, “p2p-listen-endpoint”: “0.0.0.0:9876”});fibos.load(“producer”, { “snapshots-dir”: “snapshots”});fibos.load(“producer_api”);fibos.load(“chain”, { “contracts-console”: true, “genesis-json”: “genesis.json”});fibos.load(“chain_api”);fibos.start();相关 p2p 节点地址信息可以去 http://p2pcheck.fibospubg.top… 获取。生成快照启动节点后,通过调用接口:/v1/producer/create_snapshot 生成快照,命令如下:curl http://127.0.0.1:8870/v1/producer/create_snapshot节点生成完快照后,返回结果如下:{“head_block_id”:“00003070049e51276829f6d1020fa638e5428fc9f8b0532fc60f680d72359dbe”,“snapshot_name”:”./blockData/data/snapshots/snapshot-00003070049e51276829f6d1020fa638e5428fc9f8b0532fc60f680d72359dbe.bin”}通过快照启动配置快照文件路径fibos.load(“chain”, {“snapshot”: “./blockData/data/snapshots/snapshot-00003070049e51276829f6d1020fa638e5428fc9f8b0532fc60f680d72359dbe.bin”});启动服务fibos.start();启动 EOS 节点注意: nodeos 版本: v1.4.0+通过快照启动下载快照文件:最新的快照文件地址:https://eosnode.tools/snapshotswget $(wget –quiet “https://eosnode.tools/api/snapshots?limit=1" -O- | jq -r ‘.data[0].s3’) -O snapshot.tar.gz解压快照文件tar -xvzf snapshot.tar.gz目录结构:├── node-data│ ├── snapshots└── config.ini注意:使用快照备份的方式启动时,需要保证 node-data 文件夹下无日志和状态数据文件。配置文件:vim config.iniagent-name = EOSNODEOSchain-state-db-size-mb = 10240reversible-blocks-db-size-mb = 1024http-server-address = 0.0.0.0:8870http-validate-host = falseverbose-http-errors = trueabi-serializer-max-time-ms = 2000access-control-allow-origin = *allowed-connection = anymax-clients = 2sync-fetch-span = 3000connection-cleanup-period = 30enable-stale-production = falseplugin = eosio::chain_api_pluginplugin = eosio::chain_pluginp2p-peer-address = ip:prot相关 p2p 节点地址信息可以去 https://github.com/CryptoLion… 获取快照方式启动脚本:nodeos –config-dir ./ –data-dir ./node-data –snapshot ./node-data/snapshots/snapshot-023e5e8813f687c6c5ffcf6eae853eb24f78d90b475dac4fb94face8c8308e4f.bin节点启动后目录结构:├── node-data│ ├── snapshots│ ├── blocks│ ├── state└── config.ini验证:curl http://127.0.0.1:8870/v1/chain/get_block -X POST -d ‘{“block_num_or_id”:38006282}‘返回结果为高度38006282的区块数据,返回的结果大致如下:{ “timestamp”: “2019-01-18T02:43:16.500”, “producer”: “atticlabeosb”, “confirmed”: 0, “previous”: “0243ee09128b14b56f90b3a0288b4b6f34526f53d71f8dc4e56bb89a42b4a93d”, “transaction_mroot”: “179c0382cf457b63356f733dc93bd3c582419f2b3a64e0d270e9d9238149bae4”, “action_mroot”: “e83174a2fae3c44777616993e7ba65393805a382bf423b744010873f76beaae8”, “schedule_version”: 667, “new_producers”: null, “header_extensions”: [ ], “producer_signature”: “SIG_K1_KhkTgB5PHXGmYtiZMGgHVcQKxKFh8uUFVA8Mwic8bpjA6bCFSYnNkbGqYZW23A5zBXWKvb3PnMJGEiS3MHwvPGpZzf95wd”, “transactions”: […..]}生成快照添加插件在 config.ini 中添加:plugin = eosio::producer_api_plugin注意: 开启该插件后,请确保你的节点放置在内网安全。设置备份目录启动时完整参数:nodeos –config-dir ./ –data-dir ./node-data –snapshots-dir ../snapshots-backups创建快照curl http://curl http://127.0.0.1:8870/v1/producer/create_snapshot按照目前 EOS 的大小,这一步大约需要耗时1015分钟。快照创建结束后,在 snapshots-backups 目录下,生成相应的快照文件。请求返回结果如下:{ “head_block_id”:“000006a4529a21b72b58c70c262fd3a754930d68b30b0b166f72fc1dbbc376e8”, “snapshot_name”:”./snapshots-backups/snapshot-000006a4529a21b72b58c70c262fd3a754930d68b30b0b166f72fc1dbbc376e8.bin"}适用场景搭建自己的 EOS、FIBOS API 节点只关心当前最新的区块数据、交易,无需溯源