简介
本篇我们将会介绍在安装了EOS后,如何快速的启动一个节点,及启动产块节点的方式。
EOS程序主要由三部分组成,nodeos(node eos)、cleos(cli eos)和keosd(key eos)。
- nodeos为节点,负责产块和提供节点API等。
- cleos是命令行工具,可以和nodeos、keosd进行交互。
- keosd是负责存储钱包私钥的。
Docker启动
目前官方已经不推荐使用docker容器了,但是使用容器可以给我们带来很多方便,已经让windows用户也能使用EOS,所幸我们仍然可以使用到最新的镜像,这得力于eostudio的贡献。我们可以使用eostudio/eos,该镜像下有多个tag对应不同的EOS发行版本,请拉取时指定特定的版本,EOS各版本间不能保证完全兼容,各版本的升级说明还请关注官方github的release中的updating部分。
#拉取镜像
docker pull eostudio/eos:v2.0.2
以下是创建容器的最简推荐方式:
docker run --name eosio -d \
-p 8888:8888 -p 9876:9876 \
-v /var/program/eosio/chain/:/eosio/nodeos \
-v /var/program/eosio/wallet:/root/eosio-wallet \
eostudio/eos:v2.0.2 /bin/bash -c "nodeos --data-dir /eosio/data/ --config-dir /eosio/config/"
启动后,我们挂载的目录下会生成默认配置文件。你可以手动修改配置文件后重新启动已便让配置生效。
docker restart eosio
当然,你也可以将需要复写的配置项带在启动参数中:
docker run --name eosio -d \
-p 8888:8888 -p 9876:9876 \
-v /var/program/eosio/chain/:/eosio/nodeos \
-v /var/program/eosio/wallet:/root/eosio-wallet \
eostudio/eos:v2.0.2 /bin/bash -c "nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::wallet_plugin --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin -d /mnt/dev/data --data-dir /eosio/data/ --config-dir /eosio/config/ --http-server-address=0.0.0.0:8888 --access-control-allow-origin=* --contracts-console"
节点启动后,你可以通过docker的log来查看输出。
docker logs -f eosio
在没有启动产块或者配置p2p同步节点的情况下,节点完成初始化便会停留此界面下
我们也可通过docker的执行程序来进入容器操作节点,或者调用cleos等。
#进入容器内
docker exec -it eosio /bin/bash
#也可直接调用cleos的命令
docker exec eosio cleos get account eosio
nodeos程序
默认启动nodeos时会同时启动keosd。
初始化
直接运行nodeos就可以运行,初始会生成默认配置,不会产块。
nodeos
通过直接运行nodeos可以让程序在默认目录下生成所需文件夹,如config、data、wallet,还有所需的文件,如:config.ini。
然后我们就可以停止节点了,如果是在当前运行窗口中执行的,可以直接通过command+c
或者ctrl+c
来退出,如果需要杀进程的话,这里特别提醒,一定要使用kill -2 pid
软杀进程,如果在产生数据后还进行强杀的话会导致数据校验不通过,然后重新进行数据重放。如果是使用的docker,可以直接停止容器docker stop eosio
。
配置
找到系统自动生成的config.ini文件,然后进行下列的一些修改。
开发环境的配置参考如下:
- 开发
# print contract's output to console (eosio::chain_plugin)
contracts-console = true
- 跨域
这里配置的参数是用于rpc调用时,允许跨域请求。
# Specify the Access-Control-Allow-Origin to be returned on each request. (eosio::http_plugin)
access-control-allow-origin = *
# Specify the Access-Control-Allow-Headers to be returned on each request. (eosio::http_plugin)
access-control-allow-headers = Content-Type
# Specify if Access-Control-Allow-Credentials: true should be returned on each request. (eosio::http_plugin)
access-control-allow-credentials = true
# If set to false, then any incoming "Host" header is considered valid (eosio::http_plugin)
http-validate-host = 0
- 监听
这里你可以修改监听http请求的ip和端口,使用0.0.0.0将会允许所有ip的请求。
# The local IP and port to listen for incoming http connections; set blank to disable. (eosio::http_plugin)
http-server-address = 0.0.0.0:8888
- 产块
这里的配置是打开产块开关,然后指定出块节点的名字,并配置该节点使用的公钥和私钥。
# Enable block production, even if the chain is stale. (eosio::producer_plugin)
enable-stale-production = true
# ID of producer controlled by this node (e.g. inita; may specify multiple times) (eosio::producer_plugin)
producer-name = eosio
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
最后这个是产块节点使用的公钥和私钥。开发环境需要使用该私钥进行初始账号的操作。
- 插件
针对我们使用到的功能,我加载相应的插件。
# Plugin(s) to enable, may be specified multiple times
plugin = eosio::producer_plugin
plugin = eosio::chain_api_plugin
plugin = eosio::http_plugin
启动节点并检查
修改好了config.ini的配置后,我们直接启动节点。如果你使用的不是默认config,那么,你需要在启动时指定–config-dir参数。
我们将eosio的目录放在自定义的/mnt/lv1/eosio下,然后我们使用nohup来托管nodeos,并将日志输出到logs/eos.log中。
nohup nodeos --config-dir /mnt/lv1/eosio/config --data-dir /mnt/lv1/eosio/data --genesis-json /mnt/lv1/eosio/config/genesis.json > /mnt/lv1/eosio/logs/eos.log 2>&1 &
- 通过日志或者命令行确认节点已启动。
如果你是直接启动的nodeos的话,在命令行中应该可以直接看到输出。
如果你使用了我上面nohup的方式启动并输出到了日志文件中的话,可以通过以下方式跟随查看输出。
#查看节点日志记录,如果你使用了参数配置启动的方式的话
tail -f /mnt/lv1/eosio/logs/eos.log
如果使用的是docker启动的,可以直接看docker的logs
#查看节点日志记录,如果你使用了参数配置启动的方式的话
docker logs -f eosio
- 通过http请求调用RPC接口检查。
默认的节点http端口是8888。当然你也可以直接通过浏览器请求。
curl http://localhost:8888/v1/chain/get_info
同步主网
接入主网的节点,目前有几种常用启动方式。
-
同步。直接配置p2p节点,然后开启同步,从创世区块开始同步。
全量数据,同步缓慢,占用硬盘空间很大,速度和p2p节点网络有很大关系。
-
重放。从网上下载最新blocks数据,然后进行重放,重放完后开始同步。
全量数据,重放速度比同步快很多,但是无法中途停止,重放完后的同步速度取决于p2p节点网络。
-
快照。从网上获取最新快照,然后从快照启动,开始同步。
部分数据,快速启动,占用硬盘空间较小,启动后会进行数据还原,还原后开始同步,同步速度取决于p2p节点网络。
EOS的体量很大,远大于BTC和ETH,所以对于不做数据分析的用户来说,最快速的启动方式就是通过快照了,这也是官方是经历了1年多后最终的解决方案。现在单blocks文件应该已经上T了,当你重放完成后,全盘占用应该要翻番了,所以没有一定的硬盘量,还是不要尝试全量数据了。
获取快照
我们可以从eossweden下载最新的快照。
注意:如果你要从其他的网站下载快照,那么你要特别注意快照锁使用的EOS版本,EOS在1.8以后使用的快照数据结构和1.7.x及以前使用的不同,所以快照不兼容。
注意2:下载的快照是压缩后的,解压后大概需要2G多。
修改配置
主网同步时,我们需要根据自身服务器情况和使用情况修改配置,这里提供几个推荐修改的配置。
按照BM的说的,使用wabt的速度要快2倍。
# Override default WASM runtime (eosio::chain_plugin)
wasm-runtime = wabt
修改一下存储数据库的最大大小,默认值早存不下了。
# Maximum size (in MiB) of the chain state database (eosio::chain_plugin)
chain-state-db-size-mb = 102400
# Maximum size (in MiB) of the reversible blocks database (eosio::chain_plugin)
reversible-blocks-db-size-mb = 10240
结合服务器性能,调大链线程池还有网络线程池,以及同步时每次通过p2p节点获取的区块数。
# Number of worker threads in controller thread pool (eosio::chain_plugin)
chain-threads = 30
# Number of worker threads in net_plugin thread pool (eosio::net_plugin)
net-threads = 10
# number of blocks to retrieve in a chunk from any individual peer during synchronization (eosio::net_plugin)
sync-fetch-span = 100
读取模式很重要,如果你只是用于数据查询或者导出的话,建议使用read-only或者irreversible,你拿到的数据会更可靠。但是也意味着你的区块高度会低于现在的头区块。如果你要使用speculative,那么你的速度会很快,并能很快速的处理链上交易,但是数据有很高的几率会被回滚或者抛弃。所以保守的模式是使用head。
# Database read mode ("speculative", "head", "read-only", "irreversible").
# In "speculative" mode database contains changes done up to the head block plus changes made by transactions not yet included to the blockchain.
# In "head" mode database contains changes done up to the current head block.
# In "read-only" mode database contains changes done up to the current head block and transactions cannot be pushed to the chain API.
# In "irreversible" mode database contains changes done up to the last irreversible block and transactions cannot be pushed to the chain API.
# (eosio::chain_plugin)
read-mode = head
最大交易时间其实是要结合你的交易体量来决定的,一般发布合约或者某些费时的操作可能会超过最大交易时间,你可以适量调大。
# Limits the maximum time (in milliseconds) that is allowed a pushed transaction's code to execute before being considered invalid (eosio::producer_plugin)
max-transaction-time = 10000
启动插件除了常规的那几个外,推荐增加这两个api插件,net_api提供了p2p节点的管理的api,而producer_api中有生成快照的api,你需要定期对已启动的节点生成新的快照,以便在节点异常退出时能快速从快照重启,而不是重新下载一个快照或者从很早以前的快照启动后重新同步。
plugin = eosio::net_api_plugin
plugin = eosio::producer_api_plugin
快照启动
快照启动前,你需要确保你的数据目录data里满足如下要求。
- 删除state文件夹(如果之前启动过节点就会有,请备份后删除)
- 删除blocks文件夹。blocks文件夹也可以保留,但要删除blocks里的reversible文件夹,同时必须保证blocks.log中包含的区块和快照起始区块有交集,否则请备份后删除。
从快照启动很简单,你只要把快照放到某个目录里(推荐放在snapshots里),然后启动节点时,指定参数–snapshot,指向具体的快照文件即可。如下:
nohup nodeos --config-dir /mnt/lv1/eosio/config --data-dir /mnt/lv1/eosio/data --disable-replay-opts --snapshot /mnt/lv1/eosio/data/snapshots/snapshot-066a790d51e2e8d80d27eb643a9f31a7308f11421b08bc6581ec837d55692589.bin > /mnt/lv1/eosio/logs/eos.log 2>&1 &
注意:通过快照启动后,关闭节点,再打开时,不需要再指定–snapshot参数。