EOS基础全家桶(四)启动节点

允我心安 提交于 2020-04-03 12:35:05

简介

本篇我们将会介绍在安装了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参数。

原文链接

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!