如何运行一个 Conflux 节点

2,915 阅读9分钟

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-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 INFO  main                 network::thr - throttling.initialize: min = 10M, max = 64M, cap = 256M
2021-04-14T11:54:23.519229+08:00 INFO  main                 conflux      -
:'######:::'#######::'##::: ##:'########:'##:::::::'##::::'##:'##::::'##:
'##... ##:'##.... ##: ###:: ##: ##.....:: ##::::::: ##:::: ##:. ##::'##::
 ##:::..:: ##:::: ##: ####: ##: ##::::::: ##::::::: ##:::: ##::. ##'##:::
 ##::::::: ##:::: ##: ## ## ##: ######::: ##::::::: ##:::: ##:::. ###::::
 ##::::::: ##:::: ##: ##. ####: ##...:::: ##::::::: ##:::: ##::: ## ##:::
 ##::: ##: ##:::: ##: ##:. ###: ##::::::: ##::::::: ##:::: ##:: ##:. ##::
. ######::. #######:: ##::. ##: ##::::::: ########:. #######:: ##:::. ##:
:......::::.......:::..::::..::..::::::::........:::.......:::..:::::..::
Current Version: 1.1.3-testnet

2021-04-14T11:54:23.519271+08:00 INFO  main                 conflux      - Starting full client...

节点启动后会在 run 目录里新建两个文件夹 blockchain_data, log 用于存储节点数据和日志。

启动一个全新的主网或测试网节点后,它会从网络同步历史区块数据,追赶中的节点处于 catch up 模式,可以从日志看到节点的状态和最新的 epoch 数:

2021-04-16T14:49:11.896942+08:00 INFO  IO Worker #1         cfxcore::syn - Catch-up mode: true, latest epoch: 102120 missing_bodies: 0
2021-04-16T14:49:12.909607+08:00 INFO  IO Worker #3         cfxcore::syn - Catch-up mode: true, latest epoch: 102120 missing_bodies: 0
2021-04-16T14:49:13.922918+08:00 INFO  IO Worker #1         cfxcore::syn - Catch-up mode: true, latest epoch: 102120 missing_bodies: 0
2021-04-16T14:49:14.828910+08:00 INFO  IO Worker #1         cfxcore::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 节点