如何运行一个 Conflux 节点

Conflux 是一个基于 PoW(工作量证明) 的完全去中心化网络,如果想要参与此去中心化网络挖矿,或者拥有自己的 RPC 服务需要自己运行一个 node (也称 client)。本文将介绍如何运行一个 Conflux 节点。
Archivenode VS fullnode Conflux 的节点分为三种类型:归档节点(archivenode),全节点(fullnode),轻节点(lightnode)。不同类型节点的区别在于保留存储的数据量不同,归档节点最全,轻节点最少。当然存储数据越多消耗的系统硬件资源越多。关于不同类型节点的详细介绍参看这里
通常情况下如果想参与挖矿,运行一个全节点即可,如果想作为 RPC 服务来使用则需要运行一个 Archivenode. 轻节点则主要用于作为钱包来使用。
机器配置 运行一个 archivenode 的机器资源大致如下:

  • CPU:4Core
  • 内存:16G
  • 硬盘:200G
fullnode 对机器配置的要求会低一些,如果想参与挖矿出块的话,需要有单独的显卡
另外: 建议将系统的最大文件打开数调高到 10000。一般 Linux 系统默认为 1024, 不太够用。
如何获取节点程序和配置 Conflux 网络节点程序的获取方式,首推到官方 Github Conflux-rust 仓库的 Release 页面进行下载, 一般直接下载最新 Release 的版本即可。每个 Release 的版本不仅包含源代码,还提供 Windows, Mac, Linux 三大平台预编译好的节点程序。
如何运行一个 Conflux 节点
文章图片

需要注意的是目前主网和测试网节点程序的版本发布是两条线: 主网一般是 Conflux-vx.x.x, 测试网则为 Conflux-vx.x.x-testnet. 下载程序时需要根据个人的需求选择正确的版本线。
下载的 zip 包,解压后是一个 run 文件夹,里面包含如下内容:
?run tree . ├── conflux# 节点程序 ├── log.yaml # 日志配置文件 ├── start.bat # windows 启动脚本 ├── start.sh # unix 启动脚本 ├── tethys.toml # 主网配置文件 └── throttling.toml # 限流配置文件0 directories, 6 files

其中主要文件为 confluxtethys.toml, 如果下载的是 windows 包的话, 节点程序为 conflux.exe
另外一种方式是从源码编译节点程序,如果有兴趣的话,可以参考此文档自行编译。
主要配置项 在运行节点前需要先准备好节点配置文件,在下载的程序包里可以找到配置文件,一般主网是 tethys.toml, 测试网则为 testnet.toml. 两个配置文件主要区别在于 bootnodeschainId 的配置值不同。开发者也可以到 conflux-rust Github 仓库的 run 目录下面查找配置文件。文件名同样为 tethys.tomltestnet.toml
通常情况用户不需要修改任何配置,直接运行启动脚本即可(不想了解配置细节?直接跳到下一章节运行节点)。但如果想打开某些功能或自定义节点某些行为,就需要自行设置一些配置参数,以下为最常用的一些配置:
节点类型
  • node_type: 用于设置启动节点的类型,可选值为 full (默认值), archive, light
chainId
  • chainId 用于配置节点要连接的链的ID,主网为 1029, 测试网为 1 (一般不需要修改)
Miner related
  • mining_address: 节点挖矿奖励接收地址,可以配置 hex40 地址或 CIP-37 地址(注意:地址的 network prefix 需要与当前配置的 chainId 一致),如果配置了该项 minint_type 默认为 stratum
  • mining_type: 可选值为 stratum, cpu, disable
  • stratum_listen_address: stratum 地址
  • stratum_port: stratum 端口号
  • stratum_secret: stratum 连接凭证
RPC related
  • jsonrpc_cors: 用于控制 rpc 域名验证策略,可选值为 none, all, 或者逗号(无空格)分隔的域名
  • jsonrpc_http_keep_alive: false or true 用于控制是否为 rpc HTTP connections 设置 KeepAlive
  • jsonrpc_ws_port: websocket rpc 端口号
  • jsonrpc_http_port: http rpc 端口号
  • public_rpc_apis: 对外开放访问的 rpc api,可选值为 all, safe, cfx, debug, pubsub, test, trace (safe=cfx+pubsub)。一般建议设置为 safe
  • persist_tx_index: true or false 如果需要处理 transaction 相关 RPCs 的话,需要同时打开此配置,不然将只能访问到最近的交易信息
  • persist_block_number_index: true or false 如果想要通过 blockNumber 查询 block 信息,需要打开此配置
  • executive_trace: true or false 是否打开 trace EVM execution 功能,如果打开 trace 会被记录到 database 中
  • get_logs_filter_max_epoch_range: Event log 获取方法 cfx_getLogs 调用,对节点性能影响很大,可以通过此选项配置 该方法一次能查询的 epoch 范围最大值
  • get_logs_filter_max_limit: cfx_getLogs 方法一次查询能够返回 log 数量的最大值
Snapshot
  • additional_maintained_snapshot_count: 用于设置 stable checkpoint 之前 snapshot 需要保留的个数,默认为 0, stable genesis 之前的 snapshot 都会被删掉。如果用户想查询比较久远的历史状态,需要设置此选项。此选项开始后,磁盘用量同样会增加许多。
directries
  • conflux_data_dir: 数据(block data, state data, node database)的存放目录
  • block_db_dir: block 数据存放目录,默认情况会存放到 conflux_data_dir 指定目录下的 blockchain_db 目录中
  • netconf_dir: 用于控制 network 相关的持久化目录,包括 net_key
Log related
  • log_conf: 用于指定 log 详细配置文件如 log.yaml,配置文件中的设置会覆盖 log_level 设置
  • log_file: 指定 log 的路径,不设置的话会输出到 stdout
  • log_level: 日志打印的级别,可选值为 error, warn, info, debug, trace, off
日志的 log 级别越高,打印的日志越多,响应的会占用贡多的存储空间,也会影响节点的性能.
开发者(dev)模式
Conflux-rust 还提供一个开发者(dev)模式,该模式下会启动一个单节点链,并默认打开所有的 RPC 方法。此模式节点非常适合智能合约开发者快速部署和调试合约。
其配置方式如下:
  • bootnodes: 注释掉此配置
  • mode: 将模式选项配置为 dev
  • dev_block_interval_ms: 出块间隔时间, 单位为毫秒(ms)
配置 genesis 账户
在 dev 模式下可以通过一个单独的 genesis_secrets.txt 文件,配置 genesis 账户,该文件中需要一行放置一个私钥(不带0x前缀), 并在配置文件中添加 genesis_secrets 配置项,将值配置为 该文件的路径:
genesis_secrets = './genesis_secrets.txt'

这样节点启动之后,每个账户初始会有 10000,000,000,000,000,000,000 Drip 也就是 1w CFX。
其他
  • net_key: 是一个 256 bit 的私钥,用于生成唯一 node id,该选项如果不调会随机生成,如果设置可以填一个长度为 64 的 hex 字符串
  • tx_pool_size: 交易允许存放的最大交易数(默认 50W)
  • tx_pool_min_tx_gas_price: 交易池对交易 gasPrice 的最小限制(默认为 1)
关于完整的配置项,可以直接查看配置文件,其中有所有的可配置项,以及详细的注释介绍.
运行节点 配置文件配好了,就可以通过节点程序,运行节点了。
# 运行启动脚本 $ ./start.sh

如果你在 stdout 或日志文件看到如下内容,表示节点已经成功启动了:
2021-04-14T11:54:23.518634+08:00 INFOmainnetwork::thr - throttling.initialize: min = 10M, max = 64M, cap = 256M 2021-04-14T11:54:23.519229+08:00 INFOmainconflux- :'######:::'#######::'##::: ##:'########:'##:::::::'##::::'##:'##::::'##: '##... ##:'##.... ##: ###:: ##: ##.....:: ##::::::: ##:::: ##:. ##::'##:: ##:::..:: ##:::: ##: ####: ##: ##::::::: ##::::::: ##:::: ##::. ##'##::: ##::::::: ##:::: ##: ## ## ##: ######::: ##::::::: ##:::: ##:::. ###:::: ##::::::: ##:::: ##: ##. ####: ##...:::: ##::::::: ##:::: ##::: ## ##::: ##::: ##: ##:::: ##: ##:. ###: ##::::::: ##::::::: ##:::: ##:: ##:. ##:: . ######::. #######:: ##::. ##: ##::::::: ########:. #######:: ##:::. ##: :......::::.......:::..::::..::..::::::::........:::.......:::..:::::..:: Current Version: 1.1.3-testnet2021-04-14T11:54:23.519271+08:00 INFOmainconflux- Starting full client...

节点启动后会在 run 目录里新建两个文件夹 blockchain_data, log 用于存储节点数据和日志。
启动一个全新的主网或测试网节点后,它会从网络同步历史区块数据,追赶中的节点处于 catch up 模式,可以从日志看到节点的状态和最新的 epoch 数:
2021-04-16T14:49:11.896942+08:00 INFOIO Worker #1cfxcore::syn - Catch-up mode: true, latest epoch: 102120 missing_bodies: 0 2021-04-16T14:49:12.909607+08:00 INFOIO Worker #3cfxcore::syn - Catch-up mode: true, latest epoch: 102120 missing_bodies: 0 2021-04-16T14:49:13.922918+08:00 INFOIO Worker #1cfxcore::syn - Catch-up mode: true, latest epoch: 102120 missing_bodies: 0 2021-04-16T14:49:14.828910+08:00 INFOIO Worker #1cfxcore::syn - Catch-up mode: true, latest epoch: 102180 missing_bodies: 0

你也可以通过 cfx_getStatus 方法获取当前节点的最新 epochNumber,并跟 scan 的最新 epoch 比较从而判断数据是否已经同步到了最新。
RPC 服务
节点启动之后,并且打开了 RPC 相关的端口号和配置的话,则钱包,Dapp 可以通过 RPC url 访问节点. 例如
http://node-ip:12537
Portal 钱包中添加网络,或者 SDK 实例的时候可以使用此地址.
使用 Docker 运行节点 对 Docker 比较熟悉的小伙伴也可以使用 Docker 来运行一个节点。官方提供了各个版本的 Docker image 可以自行 pull image 并运行。
因为节点数据比较大,所以建议在运行 image 时,挂载一个数据目录用于存放节点数据。
目前发布的镜像 tag 有三条 pipeline:
  • x.x.x-mainnet: 主网镜像
  • x.x.x-testnet: 测试网镜像
  • x.x.x: 开发模式镜像,此模式下会自动初始化十个账号,可用于本地快速开发
常见问题 为什么重启后,同步需要很久?
节点重启后会从上个 checkpoint 开始同步,并重新 replay 区块数据,根据当前距离上一 checkpoint 的远近,需要等待不同的时长,才能开始从最新区块开始同步.
这是正常现象,一般会等几分钟到十几分钟不等。
为什么节点同步的区块高度卡住,不再增长?
如果发现区块同步卡住,不再增长。可查看日志或终端是否有错误,如果没有错误大概率是因为网络原因,可尝试重启节点。
修改配置后,重启节点需要清除数据么?
分情况,有的需要,有的不需要。如果修改的配置涉及到数据存储或数据索引,需要清数据重启节点,比如:
  • persist_tx_index
  • executive_trace
  • persist_block_number_index
修改其他配置不需要清数据,直接重启即可.
目前的 archive node 数据有多大?
截止到 2021.11.04 区块数据的压缩包大小为不到 90 G
如何参与挖矿?
挖矿需要使用 GPU 参与,具体可参看这里
如何快速同步数据,从而运行一个 archive node
可使用 fullnode-node 下载归档节点的数据快照,使用快照的节点数据,可以快速同步到最新数据。
节点运行 error 日志怎么看?
如果是通过 start.sh 运行的节点,可以在相同目录中的 stderr.txt 查看错误原因。
如何运行一个 PoS 节点?
TO BE UPDATE
参考
  • 官方运行节点文档
  • 节点程序源码
原文链接:如何运行一个 Conflux 节点
【如何运行一个 Conflux 节点】相关资料库:
  • Conflux开发资料包
  • conflux-chain github
  • conflux-fans github

    推荐阅读