Run Conflux Node
- 如何运行 Conflux 主网节点
- 如何运行 Conflux 开发(local)节点
- 如何参与 PoW 挖矿
- 如何运行 PoS 节点
- 如何运行 eSpace 节点
- 如何使用快照文件快速运行节点
- 使用Docker运行节点
- Misc
- 如何部署一个 PoS Pool 服务
- FAQs
如何运行 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
其中主要文件为 conflux
和 hydra.toml(或 tethys.toml)
, 如果下载的是 windows 包的话, 节点程序为 conflux.exe
另外一种方式是从源码编译节点程序,如果有兴趣的话,可以参考此文档自行编译。
主要配置项
在运行节点前需要先准备好节点配置文件,在下载的程序包里可以找到配置文件,一般主网是 hydra.toml (或 tethys.toml)
, 测试网则为 testnet.toml
. 两个配置文件主要区别在于 bootnodes
和 chainId
的配置值不同。开发者也可以到 conflux-rust
Github 仓库的 run 目录
下面查找配置文件。文件名同样为 hydra.toml
或 testnet.toml
。
通常情况用户不需要修改任何配置,直接运行启动脚本即可(不想了解配置细节?直接跳到下一章节运行节点)。但如果想打开某些功能或自定义节点某些行为,就需要自行设置一些配置参数,以下为最常用的一些配置:
节点类型
-
node_type
: 用于设置启动节点的类型,可选值为full
(默认值),archive
,light
chainId
-
chainId
用于配置节点要连接的链的ID,主网为1029
, 测试网为1
(一般不需要修改) -
evm_chain_id
eSpace chainId, 主网为1030
, 测试网为71
(一般不需要修改)
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
ortrue
用于控制是否为 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
orfalse
如果需要处理 transaction 相关 RPCs 的话,需要同时打开此配置,不然将只能访问到最近的交易信息, Archive 模式下,此配置默认打开 -
executive_trace
:true
orfalse
是否打开 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 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)
从 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 投票节点重启防止被强制退出的操作流程:
- 在PoS节点上运行
./conflux rpc local pos stop_election
,会返回null或者返回一个未来的PoS区块编号。此时节点不再申请加入PoS委员会。 - 如果返回了区块编号,则保持节点运行。在返回的PoS区块已经生成之后(几个小时后),再次运行相同命令,此时应该返回null。在这个区块之后节点不再获得PoS奖励。
- 如果命令返回值为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\\\" }\""
参考
如何运行 Conflux 开发(local)节点
安装环境
下载依赖
基于开发者文档安装环境https://developer.confluxnetwork.org/conflux-doc/docs/installation/ (推荐使用linux与osx, windows需要安装vs2015及其余包, 过于繁琐)
编译源码
下载conflux源码
$ git clone https://github.com/Conflux-Chain/conflux-rust
$ cd conflux-rust
$ git checkout v2.0.0
构建
$ cargo build --release
运行单节点
进入conflux的run目录
$ cd conflux-rust/run
将主网toml文件复制为dev下的toml文件
$ cp hydra.toml develpoment.toml
修改development.toml
# 删去boostnode字段
# mode = "dev"取消注释
# dev_block_interval_ms = 250 取消注释
根据以下脚本进行本地单节点运行
export RUST_BACKTRACE=1
export RUST_BACKTRACE=full
../target/release/conflux --config development.toml
当看到如下样式, 并稳定出块, 则启动成功
2022-06-13T14:14:37.433135500+08:00 INFO main network::thr - throttling.initialize: min = 10M, max = 64M, cap = 256M
2022-06-13T14:14:37.435180+08:00 INFO main conflux -
:'######:::'#######::'##::: ##:'########:'##:::::::'##::::'##:'##::::'##:
'##... ##:'##.... ##: ###:: ##: ##.....:: ##::::::: ##:::: ##:. ##::'##::
##:::..:: ##:::: ##: ####: ##: ##::::::: ##::::::: ##:::: ##::. ##'##:::
##::::::: ##:::: ##: ## ## ##: ######::: ##::::::: ##:::: ##:::. ###::::
##::::::: ##:::: ##: ##. ####: ##...:::: ##::::::: ##:::: ##::: ## ##:::
##::: ##: ##:::: ##: ##:. ###: ##::::::: ##::::::: ##:::: ##:: ##:. ##::
. ######::. #######:: ##::. ##: ##::::::: ########:. #######:: ##:::. ##:
:......::::.......:::..::::..::..::::::::........:::.......:::..:::::..::
Current Version: 2.0.0
获取初始代币
由于sdk中发送交易与部署合约账户中需要有cfx, 上述的环境并未给账户中分发代币, 因此需要给账户增加代币
首先获得keystore文件
# 从github的项目中直接复制内容
https://github.com/conflux-fans/conflux-abigen-example/tree/main/keystore
以go-sdk为例, 调用sdk来创建账户并产生私钥
func main(){
createAcc()
exportPriKeys()
}
func createAcc(){
client, err := conflux.NewClient(local_url, conflux.ClientOption{
KeystorePath: ".keystore"}) //local_url = "http://127.0.0.1:12537"
if err != nil {
panic(err)
}
defer client.Close()
acc1,err := client.AccountManager.Create("test")
if err != nil {
log.Fatalln(err)
}
fmt.Println(acc1.String())
acc2,err := client.AccountManager.Create("test")
if err != nil {
log.Fatalln(err)
}
fmt.Println(acc2.String())
}
func exportPriKeys(){
client, err := conflux.NewClient(local_url, conflux.ClientOption{
KeystorePath: ".keystore"}) //local_url = "http://127.0.0.1:12537"
if err != nil {
panic(err)
}
defer client.Close()
list := client.GetAccountManager().List()
priv1, err := client.GetAccountManager().Export(list[0], "test")
if err != nil {
panic(err)
}
priv2, err := client.GetAccountManager().Export(list[1], "test")
if err != nil {
panic(err)
}
fmt.Println(priv2)
fmt.Println(priv1)
}
记录输出的私钥
在conflux-rust/run目录下创建密钥文件
vim key.txt
# 将输出的私钥去掉前缀0x, 并复制到该文件中, 示例为:
# 931fffc586b7596b3f40bf67f4a38150c54d4cf98a96d25e8e679ba0825545cf
# 628819aeb8c48d044de86706ae17f7a8675af563582aea27502f40bf1ccdd35c
在development.toml文件中加入
genesis_secrets = "key.txt"
清除链上数据, 并重启
sh clear_state.sh
sh test.sh
再次调用sdk查询可以发现账户中有了代币
func queryBalance(){
client, err := conflux.NewClient(local_url, conflux.ClientOption{
KeystorePath: ".keystore"}) //local_url = "http://127.0.0.1:12537"
if err != nil {
panic(err)
}
defer client.Close()
t, err := client.GetAccountManager().GetDefault()
if err != nil {
panic(err)
}
fmt.Println(t.String())
m, err := client.GetBalance(*t)
if err != nil {
panic(err)
}
fmt.Println(m.String())
}
如何参与 PoW 挖矿
显卡挖矿教程
- Conflux 测试网 GPU 挖矿教程文档(v2.0.0-testnet)
- Conflux GPU 挖矿教程文档(v2.0.0-fix)
- F2pool how to mine conflux
- Youtube video - how to mine conflux (windows)
如何运行 PoS 节点
Conflux-rust v2.0 引入了 PoS 机制,用于提高网络的 finality,从而提高网络的安全性,并且 CFX 持有者可以通过参与 PoS 获取一定(至少年化10%以上)的收益。 参与 PoS 机制需要运行一个 Fullnode/Archivenode, 并将 Conflux 账户地址与该节点进行绑定。绑定之后 CFX 持有者可以通过与 PoSRegister 内置合约交互增加或减少投票。 获取的收益将直接发送至绑定的 Conflux PoW 账户地址。
运行 PoS 节点
PoS 节点的运行方式与 Conflux 普通节点运行方式 基本一致,
需要说明的是节点在首次启动时会自动生成 pos_key 文件(pos_config 目录中),并要求用户为该文件设置密码(一次设置,一次确认)。pos_key 文件保存了节点参与 pos 机制账号的私钥,因此需要妥善保管。
之后每次节点重启都会要求输入 pos_key 密码,如果输入错误节点启动将会失败。另外也可将该密码配置到配置文件中,配置项为 dev_pos_private_key_encryption_password
也可以通过环境变量 CFX_POS_KEY_ENCRYPTION_PASSWORD
进行设置
运行 PoS 节点的风险
PoS 节点运营者,需要保证 PoS 节点的稳定性,节点越稳定收益越高。
forceRetired
如果 PoS 节点当选
成为了委员会委员,但又没有正常履行
委员的职责(参与 PoS 投票),且持续超过一定时间
(三小时),则节点将会被强制退休(forceRetired)。
通常以下三种情况会导致节点被强制退休:
- 节点宕机
- 区块数据同步落后
- 节点重启时间过长
如果节点被强制退休,该节点的所有 PoS 投票会被自动进行解锁操作,解锁的票需要经过 1-14
天的时间才会变成解锁状态
,解锁的票无法获取 PoS 收益。
节点的强制退休状态会持续 1 天
,七天之后才会变为正常状态。
节点发生强制退休,其质押的 CFX 本金不会丢失,只是会被锁定 1-14 天,期间无法获取收益。
CFX 被罚没
参与 PoS 共识,只有一种情况 CFX 会被罚没:同一个节点参与投票时,对同一个投票选项(比如 PoS 区块)投出了不同的票,此种情况节点会被认为恶意攻击 PoS 共识。
该节点所质押的所有 CFX 将会被永久锁死,无法取出
.
导致此种情况发生只有一种 case:两个 PoS node 使用同一个 pos_key 同时参与 PoS 共识。
运营 PoS 节点注意事项
运行 PoS 节点除了正确的配置 pos_config 并运行节点外,需要注意一下事项:
- 保证节点机器有足够的硬盘空间,建议提供 500GB 以上空间
- 妥善保管节点的 pos_key 以及 pos_key 的密码
- 增大系统的
最大文件打开数
到 65536
除此之外建议增加以下监控:
- 节点同步区块是否落后:可是用本地节点最新 epochNumber 与官方节点的 epochNumber 比较
- 节点是否正常参与 PoS 投票:可通过 PoS RPC 获取 PoS 的投票交易来判断
另外如果想重新生成 pos_config/pos_key
文件,需要将 pos_db/secure_storage.json
文件一并删除,然后重启即可。
如何升级节点保证不被强制退休
PoS 节点非不必要,不建议进行升级操作,如果的确需要进行升级操作,建议在升级前,先通知节点停止参与选举,待节点状态变为不参与状态后再关停节点并进行升级操作。 节点重启后会自动重新开始参与 PoS 选举。具体操作步骤如下:
- 运行命令
./conflux rpc local pos stop_election
通知节点停止参与选举,但节点不会立刻结束参与选举,整个停止参选过程可能需要几个小时。该命令会返回节点停止参与投票的区块号
- 每隔一段时间重复执行此命令以查看节点的状态,如果命令返回为 null 则节点已完成停止参与投票,此时可进行节点关闭操作。
- 升级完成后重启节点,节点会自动重新参与投票。(节点重启时会自动重新执行从最近 checkpoint 到最新的区块,此过程可能持续较长(几个小时),也可能很快)
如何实现 PoS 节点不停机更新
Conflux-rust 最新版本 v2.0.1
允许节点启动时不参与 PoS 投票,并通过命令控制节点停止/开始参与投票,通过此特性可以实现节点的宕机切换和无缝升级,从而保证 PoS 节点的持续运行。
注意:此模式下主备两台机器会使用同一个 pos_key, 因此操作时千万不能让两台机子同时参与 PoS 投票,否则会有 CFX 被锁死的风险。
该模式是通过 PR2438 添加进来的,在 PR 中有主备升级操作的英文介绍。大致步骤如下:
假设已经获取了 pos_config/pos_key
文件
- 准备两个机器 A, B 均配置
pos_started_as_voter=false
选项,并使用相同的pos_config/pos_key
,然后让两个节点运行起来,此时这两个节点均不会参与 PoS 共识 - 可以通过命令
./conflux rpc local pos voting_status
获取节点的投票状态,如果返回 true 表示节点在参与投票, false 表示未参与投票 - 通过第二步的命令确认两个节点均未参与 PoS 的状态后,可以通过命令
./conflux rpc local pos start_voting
让其中一个节点开始参与 PoS 共识
此时我们搭建了两个节点,一主一备,并且只有一个节点参与 PoS 共识,如果需要进行节点升级可进行主备切换操作:
- 运行命令
./conflux rpc local pos stop_voting
停止主节点参与 PoS 共识,可通过状态获取命令检查是否停止成功。投票停止后该节点会把文件pos_db/secure_storage.json
重命名为pos_db/secure_storage.json.save
- 将此文件移动到备节点的
pos_db
目录,此时该目录同时包含pos_db/secure_storage.json
和pos_db/secure_storage.json.save
两个文件 - 运行命令
./conflux rpc local pos start_voting
让备节点开始参与 PoS 共识,此时节点会自动使用pos_db/secure_storage.json.save
替换pos_db/secure_storage.json
文件。(注意执行此步时,一定要确保主节点处于停止参与 PoS 共识的状态)
至此我们就完成了主备切换操作,此时可对为参与共识的节点进行升级操作。
再次提醒: 进行主备切换一定要再三检查确保主节点已停止参与 PoS 共识
如果主节点直接宕掉了,可以手动把节点的 pos_db/secure_storage.json
重命名为 pos_db/secure_storage.json.save
,并复制到备节点的 pos_db 目录中,然后让备节点开始参与投票。
资源链接
如何运行 eSpace 节点
eSpace 与 Core space 共用一个节点程序,启动方式相同。因此可参照 Core 节点搭建启动的方式启动一个 eSpace 的节点。
另外 eSpace 有几个单独配置需要设置:
-
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
如何使用快照文件快速运行节点
Archive-tool 是社区维护的一份 Conflux 网络节点数据快照,可用来快速同步数据,启动节点。详细用法参看工具使用说明。
使用Docker运行节点
用户能够借助Docker便捷地搭建Conflux节点的运行环境。 以下我们假定docker的环境配置已经完成。
获取镜像
可以从docker hub中获取Conflux的镜像。但需要注意tag的选取。我们以2.0.2版本为例进行说明。不同tag可大致分为三个系列,如:
-
conflux-rust:2.0.2-mainnet
。mainnet 后缀代表为 Conflux 主网镜像。以默认配置运行该镜像会运行起一个主网节点。 -
conflux-rust:2.0.2-fix-testnet
。testnet 后缀代表为 Conflux 测试网镜像。以默认配置运行该镜像会运行起一个测试网节点。 -
conflux-rust:2.0.2
。无后缀的代表为用于本地开发的镜像。以默认配置运行该镜像会运行起一个本地的节点。使用latest
tag 会默认拉取此系列的最新版本镜像。
// 我们推荐先使用无后缀的版本用于测试,之后有需要也可以使用其他版本
docker pull confluxchain/conflux-rust:2.0.2
运行镜像
使用默认配置启动
使用以下命令可以快速启动用于本地开发的镜像。
docker run -p 12537:12537 --rm --name cfx-node confluxchain/conflux-rust:2.0.2
启动后可以尝试是否能使用钱包连接到本地网络。如使用Fluent钱包,在设置页的“网络管理”页面中进行配置。在RPC URL填写完成后如果能自动获取区块链ID,则说明上述步骤运行成功。
此外也可以直接借助命令行查看是否有正常响应。
curl --data '{ "jsonrpc": "2.0", "method": "cfx_getStatus", "params": [], "id": 0 }' localhost:12537 -H 'content-type: application/json'
使用自定义配置启动
除了使用默认配置启动外,还能够使用指定的配置文件启动。我们以启动测试网为例进行说明。
首先我们需要获得启动测试网节点的示例配置文件。
git clone https://github.com/Conflux-Chain/conflux-docker.git
cd conflux-docker/fullnode-configs/hydra/testnet
cp testnet.toml conflux.toml
docker需要的配置文件名为conflux.toml
(与直接在宿主机中运行Conflux的需求不同)。我们使用上述项目的fullnode-configs/hydra/testnet/testnet.toml
文件作为配置文件的模版,获得conflux.toml
文件。接下来还需要对conflux.toml
进行若干修改。
- 取消
jsonrpc_http_port=12537
行的注释。 - 在配置文件最后增加一行
dev_pos_private_key_encryption_password = "your-pos-pwd"
。(设置保护pos_key
的口令)
接下来运行下述的命令
// 注意当前目录为conflux-docker/fullnode-configs/hydra/testnet
docker run -p 12537:12537 -v $PWD:/root/run --rm --name cfx-node confluxchain/conflux-rust:2.0.2-fix-testnet
curl --data '{ "jsonrpc": "2.0", "method": "cfx_getStatus", "params": [], "id": 0 }' localhost:12537 -H 'content-type: application/json'
如果有正常响应且chainId为1则说明测试网节点运行正常。
Misc
如何运行Fullstate node
- 从Hydra Hardfork前的数据跑archive节点
- 配置参数
enable_single_mpt_storage=true
single_mpt_space="evm" # 如果只需要打开 eSpace fullstate 则添加此配置
注意:如果需要打开 core space 的 fullstate 则需要自行编译 binary 程序,编译时打开 --features u64-mpt-db-key
配置项,否则内存使用会超过系统最大值
节点同步停止的常见原因
如何判断节点数据同步到最新
根据节点运行日志中的 Catch-up mode
信息可以知道节点是否同步到最新,如果 Catch-up mode 为 true,则表示节点还在追赶同步数据,为 false 则表示节点已同步到最新数据。
如何判断节点是否在正常同步数据
可根据节点运行日志 Catch-up mode
后边的 latest epoch
数值判断节点是否在进行同步,正常情况该数字会不断增长。
如果该数值不增长,也可根据 Statistics: StatisticsInner
的数值判断节点是否在正常工作,如果 inserted_block_count
, inserted_header_count
, inserted_block_count
, activated_block_count
, processed_block_count
几个数值中任一数值在增长,都表示节点在正常工作。
2022-10-11T22:00:32.918557596+08:00 INFO IO Worker #1 cfxcore::sta - Statistics: StatisticsInner { sync_graph: SyncGraphStatistics { inserted_block_count: 198117, inserted_header_count: 371367 }, consensus_graph: ConsensusGraphStatistics { inserted_block_count: 136125, activated_block_count: 371361, processed_block_count: 371366 } }
另外节点在重启时,会需要花费大量时间重建状态,此操作过程中,上述数值不会变化,但此为正常现象。此过程最长可能持续数小时。可耐心等待。
停止数据同步的常见原因
硬盘空间不够
首先可查看机器是否还有空间可用,正常情况下 Conflux 节点空间使用情况为:
- 主网:fullnode 500G, archivenode 1T
- 测试网:fullnode 300G, archivenode 700G
网络问题
如果节点网络状况不好,导致无法连接到 peer 节点,则同步也会停止。如果是网络偶发,可尝试重启节点
系统最大文件打开数过低
系统该默认值为 1024, 节点运行需要调整为 65536
配置文件错误
如果启动节点时使用的配置文件错误(主网节点程序使用测试网配置文件;测试网节点程序使用主网配置文件)或未指定配置文件,此种情况会导致节点无法找到 bootnode,也就无法连接到其他网络节点。
节点数据文件损坏
如果节点数据文件损坏也会导致节点数据同步停止。此种情况在节点升级时出现可能性比较大:正确的升级方式是用最新的节点程序,替换原节点目录中的 conflux binary。一种错误的升级方式是,将原节点目录中的 blockchain 等数据目录拷贝到新下载的程序目录中,此种操作容易发生目录遗漏,拷贝不全的问题,大概率会导致节点无法继续同步
同步测试网 archivenode
如果是从头开始同步 archivenode,建议打开 additional_maintained_snapshot_count
并设置为 100
其他
使用官方下载的程序目录中的 start.sh 或 start.bat 启动节点,会在该目录下生成一个 stderr.txt 如果节点运行发生异常错误,会出现在该文件中,这些错误日志有助于排查节点同步失败原因。
如何部署一个 PoS Pool 服务
搭建 PoS 矿池服务
conflux-fans 社区开源了 PoS Pool 矿池代码 任何人都可以拿来部署一个 PoS 矿池服务,该项目包含两部分:合约代码和 Dapp UI前端。
PoS 矿池部署大致分为以下四步:
- 运行一个 Conflux 节点
- 部署矿池合约
- 注册 PoS
- 部署 Pool 前端页面
Conflux PoS 节点创建
具体参看 PoS 节点运行文档
合约部署和注册
参看 pos-pool 合约部署文档
Pool 前端UI 搭建
参看 pos-pool UI 部署文档
矿池维护
PoS 节点升级
PoS Pool 节点需要保持持续稳定运行,因为他们被选进委员会的概率很大,委员会中的节点在任期内,需要负责 PoS 出块投票工作,如果节点出现异常将会影响 PoS 共识工作。目前的 PoS 机制,如果节点当选为委员会成员,但不正常参与投票,持续超过 3 小时,节点将会被强制退休 (ForceRetire)。
ForceRetire 节点的所有 PoS 票会自动被 unlock,unlock 需要经过 7-14天时间才能 withdraw 出来。意味着你将会损失 7- 14 天的 PoS 奖励。
因此要保持 PoS 节点的稳定,做好监控。如果需要做节点升级有以下两种方式:
合约升级
pos-pool 合约采用 Proxy1967 模式,可实现合约升级。如果需要增加功能,优化代码,或修复问题,可进行合约升级操作
注意:合约升级是一个复杂操作,请确保你了解合约升级的原理和注意事项再操作,否则可能导致合约数据的损坏。
ForceRetire 处理
目前该 pos-pool 实现在遇到节点被 forceRetire 的情况,需要管理员手动处理,才能恢复正常,具体参看
eSpace 矿池部署
eSpace 矿池部署参考 pos-pool 相关文档
FAQs
节点运行常见问题
使用 ./conflux account new 创建的账号从哪可以找到
该命令创建的账号以 keystore 的形式存储在系统的固定目录中:
- Mac:/Users/USER_NAME/Library/Application Support/conflux
- Linux: /root/.local/share/Conflux
- Windows: C:\Users\USER_NAME\AppData\Roaming\Foo Corp\Bar App\config
Keystore 的命名规则为 UTC--日期--哈希, 因此 Linux 系统也可使用如下命令查找:
find / -name UTC--*
备注:该目录实际存放位置使用 app_dirs v1.2.1 获取
节点启动后一直连不上 peer
有可能使用了错误的配置文件,比如主网的 binary + 测试网配置,测试网 binary + 主网配置,或者启动节点时没有指定配置文件。
连接不到 peer 本质原因一种是没有正确的指定 bootnodes
GLIBC_2.27 not found
./conflux: /lib64/libc.so.6: version GLIBC_2.27 not found (required by ./conflux)
此种错误是 GLIBC 未安装或版本错误