Skip to main content

如何运行 Conflux 主网节点

Conflux 是一个基于 PoW(工作量证明) + PoS(权益证明) 的完全去中心化网络,如果想要参与此去中心化网络挖矿,或者拥有自己的 RPC 服务需要自己运行一个 node (也称 client)。本文将介绍如何运行一个 Conflux 节点。

ArchiveNode VS FullNode

Conflux 的节点分为三种类型:归档节点(ArchiveNode),全节点(FullNode),轻节点(LightNode)。不同类型节点的区别在于保留存储的数据量不同,归档节点最全,轻节点最少。当然存储数据越多消耗的系统硬件资源越多。关于不同类型节点的详细介绍参看这里

通常情况下如果想参与挖矿,运行一个全节点即可,如果想作为 RPC 服务来使用则需要运行一个 ArchiveNode. 轻节点则主要用于作为钱包来使用。

机器配置

运行一个 ArchiveNode 的机器资源大致如下:

  • CPU:4Core
  • 内存:16G
  • 硬盘:1T

Fullnode 对机器配置的要求会低一些,如果想参与挖矿出块的话,需要有单独的显卡

另外: 建议将系统的最大文件打开数调高到 10000。一般 Linux 系统默认为 1024, 不太够用。

阿里云建议使用通用型 G7 或性能更强配置;AWS推荐 m5.xlarge 或性能更强配置。

作为 RPC 节点时,最好使用高性能磁盘:阿里云推荐磁盘使用 ESSD 盘;AWS 至少使用 GP3 类型,不低于6000IOPS,或者使用 Provisioned IOPS SSD按需求自定义。

如何获取节点程序和配置

Conflux 网络节点程序的获取方式,首推到官方 Github Conflux-rust 仓库的 Release 页面 进行下载, 一般直接下载最新 Release 的版本即可。每个 Release 的版本不仅包含源代码,还提供 Windows, Mac, Linux 三大平台预编译好的节点程序。

需要注意的是目前主网和测试网节点程序的版本发布是两条线: 主网一般是 conflux-vx.x.x, 测试网则为 conflux-vx.x.x-testnet. 下载程序时需要根据个人的需求选择正确的版本线。

下载的 zip 包,解压后是一个 run 文件夹,里面包含如下内容:

➜  tree
.
├── conflux  # 节点程序
├── log.yaml # 日志配置文件
├── pos_config # pos 相关配置
│   ├── genesis_file
│   ├── initial_nodes.json
│   └── pos_config.yaml
├── start.bat # windows 启动脚本
├── start.sh # unix 启动脚本
├── hydra.toml # 主网配置文件
└── throttling.toml # 限流配置文件

0 directories, 6 files

其中主要文件为 confluxhydra.toml(或 tethys.toml), 如果下载的是 windows 包的话, 节点程序为 conflux.exe

另外一种方式是从源码编译节点程序,如果有兴趣的话,可以参考此文档自行编译。

主要配置项

在运行节点前需要先准备好节点配置文件,在下载的程序包里可以找到配置文件,一般主网是 hydra.toml (或 tethys.toml), 测试网则为 testnet.toml. 两个配置文件主要区别在于 bootnodeschainId 的配置值不同。开发者也可以到 conflux-rust Github 仓库的 run 目录下面查找配置文件。文件名同样为 hydra.tomltestnet.toml

通常情况用户不需要修改任何配置,直接运行启动脚本即可(不想了解配置细节?直接跳到下一章节运行节点)。但如果想打开某些功能或自定义节点某些行为,就需要自行设置一些配置参数,以下为最常用的一些配置:

节点类型

  • node_type: 用于设置启动节点的类型,可选值为 full (默认值), archive, light

chainId

  • chainId 用于配置节点要连接的链的ID,主网为 1029, 测试网为 1 (一般不需要修改)
  • evm_chain_id eSpace chainId, 主网为 1030, 测试网为 71 (一般不需要修改)
  • 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 连接凭证
  • 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, txpool, pos, cfx, debug, pubsub, test, trace (safe=cfx+pubsub)。一般建议设置为 safe
  • persist_tx_index: true or false 如果需要处理 transaction 相关 RPCs 的话,需要同时打开此配置,不然将只能访问到最近的交易信息, Archive 模式下,此配置默认打开
  • 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 数量的最大值
  • jsonrpc_http_eth_port = 8545 eSpace http 端口号
  • jsonrpc_ws_eth_port = 8546 eSpace websocket 端口号
  • public_evm_rpc_apis = "evm" eSpace RPC 打开的 namespace

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_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)

Conflux-rust v2.0 开始,dev 模式不会自动打开 http RPC port,需要用户手动打开

配置 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)

关于完整的配置项,可以直接查看配置文件,其中有所有的可配置项,以及详细的注释介绍.

运行节点

配置文件配好了,就可以通过节点程序,运行节点了。第一次启动节点的时候需要设置 pos_key 的加密密码(一次设置,一次确认);之后每次启动节点需要输入此密码。该密码也可以在配置文件中配置(dev_pos_private_key_encryption_password

# 运行启动脚本
$ ./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: 开发模式镜像,此模式下会自动初始化十个账号,可用于本地快速开发

Conflux v2.0 Updates

Conflux v2.0 (Hydra) 是一个重大版本升级,通过 8 个不同的 CIP 引入了一系列新功能。其中最重要的是 PoS 机制和 eSpace 空间。该版本升级也给节点的运营带来一些变化

配置

配置文件命名从 tethys.toml 改为了 hydra.toml

新增配置项

  • evm_chain_id = 1030 eSpace 的 chainId,主网为 1030,测试网为 71
  • jsonrpc_http_eth_port = 8545 eSpace http 端口号
  • jsonrpc_ws_eth_port = 8546 eSpace websocket 端口号
  • public_evm_rpc_apis = "evm" eSpace RPC 打开的 namespace
  • dev_pos_private_key_encryption_password = "your-password" (可选) 引入 PoS 机制后,节点启动时需要配置一个用于保护 pos_key 的密码,该密码可通过命令行交互方式设置,也可以在配置文件中通过 dev_pos_private_key_encryption_password 配置项配置。注意:该配置项在配置文件中是明文配置的,可能会有泄漏风险,请妥善保护。

另外配置文件中的 bootnodes 配置也进行了更新。

pos_config 目录

V2.0 hardfork 后,下载的程序包中会包含一个新的目录 pos_config 该目录中存放 PoS 链的 genesis 信息包含三个文件

  • genesis_file
  • initial_nodes.json
  • pos_config.yaml

节点运营者无需对这些文件做任何处理,只要确保运行节点的目录中包含 pos_config 文件夹即可.

节点首次启动会在该目录下创建一个 pos_key, 该文件存储了节点参与 PoS 的私钥,请妥善保管,不要错误删掉或意外泄漏

节点启动

节点的启动方式没有发生变化,还是通过 conflux binary 程序加配置文件启动。若配置文件中未配置 dev_pos_private_key_encryption_password 配置项,则节点第一次启动时,会要求设置 pos_key 密码, 以后节点每次重启也需要通过命令行输入密码。若配置文件中加了此配置项,则启动体验跟之前保持一致。

节点硬盘要求

由于 Conflux 网络已运行超过 1 年时间,节点数据增多不少,因此节点机器的建议硬盘大小从 200G 调整为 1T(ArchiveNode)

PoS 节点运行注意事项

如果参与到 PoS 机制当中(获取 PoS 收益),需要运行一个 PoS 节点,运行 PoS 节点需要注意一下事项

  • 节点的 pos_key 文件中包含节点参与 PoS 的私钥,需要妥善保管,不能丢失和泄漏
  • pos_key 文件千万不能多节点复用,此操作会导致 CFX 被锁进 PoS 中永远无法取出
  • 若节点被强制退出 (foreRetired) 则该节点在 PoS 中的所有票都会被 unlock,unlock 期最长可达 14天,此期间没有 PoS 收益

PoS 节点更新或重启如何避免被 forceRetired

PoS 投票节点重启防止被强制退出的操作流程:

  1. 在PoS节点上运行./conflux rpc local pos stop_election,会返回null或者返回一个未来的PoS区块编号。此时节点不再申请加入PoS委员会。
  2. 如果返回了区块编号,则保持节点运行。在返回的PoS区块已经生成之后(几个小时后),再次运行相同命令,此时应该返回null。在这个区块之后节点不再获得PoS奖励。
  3. 如果命令返回值为null,则节点可以安全关闭。在节点重启之后会自动再次加入PoS投票过程(需要2-3个小时才会获得新的PoS挖矿奖励)。

PoS 节点如何更换 pos_key 文件

PoS 节点的账户由 pos_key 生成并控制,该文件在节点初次启动时会自动创建,并由密码保护。一个 pos_key 只能绑定一个 PoW 账户。 如果想更换一个现有节点的 pos_key 文件,或者重新生成 pos_key 文件,除了替换或删除原有文件以外,还需要同时对另外一个文件 pos_db/secure_storage.json 进行相同的操作

常见问题

为什么重启后,同步需要很久?

节点重启后会从上个 checkpoint 开始同步,并重新 replay 区块数据,根据当前距离上一 checkpoint 的远近,需要等待不同的时长,才能开始从最新区块开始同步. 这是正常现象,一般会等几分钟到十几分钟不等。从 conflux-rust v2.0.3 版本开始节点重启过程做了优化,可在十分钟内完成重启。

为什么节点同步的区块高度卡住,不再增长?

如果发现区块同步卡住,不再增长。可查看日志或终端是否有错误,如果没有错误大概率是因为网络原因,可尝试重启节点。

修改配置后,重启节点需要清除数据么?

分情况,有的需要,有的不需要。如果修改的配置涉及到数据存储或数据索引,需要清数据重启节点,比如:

  • persist_tx_index
  • executive_trace

修改其他配置不需要清数据,直接重启即可.

目前的 archive node 数据有多大?

截止到 2022.8.1 区块数据的压缩包大小为不到 300 G

如何参与挖矿?

挖矿需要使用 GPU 参与,具体可参看这里

如何快速同步数据,从而运行一个 archive node

可使用 fullnode-node 下载归档节点的数据快照,使用快照的节点数据,可以快速同步到最新数据。

节点运行 error 日志怎么看?

如果是通过 start.sh 运行的节点,可以在相同目录中的 stderr.txt 查看错误原因。

运行节点是否需要公网 IP?

如果不对外提供 RPC 服务,运行一个 Conflux 节点不需要公网IP。

节点升级 v2 错误

No such device or address

若节点从 v1.x 版本升级到 v2 遇到如下错误,则可能节点是通过 Supervisor 等方式启动. 节点启动时无法正确读取 pos_key 加密密码。 此种情况可在配置文件中添加配置项 dev_pos_private_key_encryption_password

Error: "failed to start full client: \"Os { code: 6, kind: Uncategorized, message: \\\"No such device or address\\\" }\""

参考