节点管理¶
中继链中继模式提供对中继链自身节点的增删管理功能。
1 概述¶
中继链自身节点有共识节点和审计节点两种,中继链初始启动的节点都是共识节点。
- 共识节点:参与共识;
- 审计节点:不参与共识,只能同步数据。
⚠️注意: 1. 关于共识节点,目前中继链只支持rbft共识算法的节点增删管理; 2. rbft共识只在BitXHub商业版本中支持,启动商业版本的BitXHub需要获取相应的LICENSE,并将LICENSE放在每个BitXHub节点的根目录下; 3. 关于审计节点,目前中继链支持注册注销的简单操作,但实际的审计节点有待后续实现。
注意: 下文中的使用方法主要介绍rbft共识算法下的共识节点增删)
2 增加节点¶
2.1 功能介绍¶
目前中继链支持在使用rbft共识算法的情况下增加共识节点,新增过程中节点的一般状态转换如下:
新增节点有以下几点需要注意:
(1)节点只能逐个的增加,即上一个节点的新增提案完成才可以继续增加下一个节点;
(2)共识节点增加时需要提供一个vpNodeId参数,该参数按可用共识节点的序号逐个递增,比如:当前有4个可用共识节点,那么这4个共识节点的vpNodeId一定分别是1、2、3、4,新增共识节点的id必须为5。
2.2 使用方法¶
第一步:启动rbft共识的BitXHub¶
bitxhub的默认共识类型是raft,如果要启动rbft共识的bitxhub,需要修改每个节点的bitxhub.toml配置文件,将共识类型参数改为rbft:
此外,rbft是在bitxhub商业版本中支持的,启动商业版本的bitxhub的命令如下:第二步:启动新节点¶
新节点的启动需要先准备相关配置文件然后再启动,具体流程如下:
(1)为方便使用bitxhub本身命令行功能,需要先编译商业版本的bitxhub二进制文件,命令如下:
(2)线下向CA证书的代理机构请求准入证书。bitxhub命令行提供了生成证书功能,命令如下:
// 生成自己的私钥
// --name:指定私钥名称,默认使用node
// --target:指定生成私钥位置
$ bitxhub cert priv gen --name node --target .
// 获取私钥的csr文件
// --key:指定新节点私钥的路径
// --org:指定新节点的组织名称
// --target:指定生成文件路径
$ bitxhub cert csr --key ./node.priv --org Node --target .
// 代理结构颁发证书
// --csr:指定新节点csr文件的路径
// --is_ca:指定当前是否是生成ca根证书(不是)
// --key:指定代理机构私钥的路径,可以使用bitxhub项目scripts/certs目录下的agency.priv
// --cert:指定代理机构证书的路径,可以使用bitxhub项目scripts/certs目录下的agency.cert
// --target:指定生成文件路径
$ bitxhub cert issue --csr node.csr --is_ca false --key $PROJECT_PATH/bitxhub/scripts/certs/agency.priv --cert $PROJECT_PATH/bitxhub/scripts/certs/agency.cert --target .
(3)线下准备新节点的私钥(这个私钥与上文中用户获取证书的私钥不同,此私钥与节点network.toml中的account对应)。bitxhub命令行提供相关功能,命令如下:
(4)准备节点配置文件模板,命令如下:
(5)将相关私钥证书拷贝到相应路径,包括新节点证书私钥、新节点证书、agency证书、ca证书、节点私钥、LICENSE,命令如下:
$ cp ./node.cert ./node5/certs/
$ cp ./node.priv ./node5/certs/
$ cp $PROJECT_PATH/bitxhub/scripts/certs/node1/certs/agency.cert ./node5/certs/
$ cp $PROJECT_PATH/bitxhub/scripts/certs/node1/certs/ca.cert ./node5/certs/
$ cp ./key.json ./node5
$ cp $LICENSE_PATH/LICENSE ./node5
(6)修改bitxhub.toml中端口信息和共识类型,需要修改的部分修改后如下:
[port]
jsonrpc = 8885
grpc = 60015
gateway = 9095
pprof = 53125
monitor = 40015
[order]
type = "rbft"
(7)在network.toml中添加新节点的网络信息,bitxhub命令行提供了根据相关私钥查看节点pid和account信息的功能
// 查看节点pid信息
$ bitxhub cert priv pid --path ./node5/certs/node.priv
Qmb6ZaaCw6dYPL7ifLAG2gugXf61jo9q4eEfQ3USNBaubm
// 查看节点account信息
$ bitxhub key show --path ./node5/key.json
private key: 18fcb8f87c5ed7bc67bd0fc40248ecea7e65d7d624cc588ed5903e6b2caca339
public key: 04ffa0e8a1353aa36ef7c4e986ec87d01e4692a7fc1b511d2f7e56a8573ebc54f76f7efa3e5eca17655a2c91d57fa060b30e395500c1bff7b3933477678d78d93c
address: 0x9E887Aa2e8009C6c4b4aF7792e0afe71f0Dc1d64
// 修改network.toml,将新节点网络信息添加到network.toml末尾,并修改id和new参数,修改后netwokr.toml如下:
id = 5 # self id
n = 4 # the number of primary vp nodes
new = true # track whether the node is a new node
[[nodes]]
account = "0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013"
hosts = ["/ip4/127.0.0.1/tcp/4001/p2p/"]
id = 1
pid = "QmXi58fp9ZczF3Z5iz1yXAez3Hy5NYo1R8STHWKEM9XnTL"
[[nodes]]
account = "0x79a1215469FaB6f9c63c1816b45183AD3624bE34"
hosts = ["/ip4/127.0.0.1/tcp/4002/p2p/"]
id = 2
pid = "QmbmD1kzdsxRiawxu7bRrteDgW1ituXupR8GH6E2EUAHY4"
[[nodes]]
account = "0x97c8B516D19edBf575D72a172Af7F418BE498C37"
hosts = ["/ip4/127.0.0.1/tcp/4003/p2p/"]
id = 3
pid = "QmQUcDYCtqbpn5Nhaw4FAGxQaSSNvdWfAFcpQT9SPiezbS"
[[nodes]]
account = "0xc0Ff2e0b3189132D815b8eb325bE17285AC898f8"
hosts = ["/ip4/127.0.0.1/tcp/4004/p2p/"]
id = 4
pid = "QmQW3bFn8XX1t4W14Pmn37bPJUpUVBrBjnPuBZwPog3Qdy"
[[nodes]]
account = "0x9E887Aa2e8009C6c4b4aF7792e0afe71f0Dc1d64"
hosts = ["/ip4/127.0.0.1/tcp/4005/p2p/"]
id = 5
pid = "Qmb6ZaaCw6dYPL7ifLAG2gugXf61jo9q4eEfQ3USNBaubm"
(8)启动新节点,命令如下:
新节点后启动后会一直尝试连接bitxhub节点,但由于节点没有注册会一直连接失败,原节点也会一直拒绝新节点的连接。
- 新节点会打印出如下日志:
ERRO[2021-07-23T14:36:13.300] Connect failed error="dial backoff" module=p2p node=1
ERRO[2021-07-23T14:36:13.326] Connect failed error="dial backoff" module=p2p node=4
ERRO[2021-07-23T14:36:13.339] Connect failed error="dial backoff" module=p2p node=2
ERRO[2021-07-23T14:36:14.005] Connect failed error="dial backoff" module=p2p node=3
- 原节点会打印出如下日志:
INFO[2021-07-23T14:35:12.804] Intercept a connection with an unavailable node, peer.Pid: Qmb6ZaaCw6dYPL7ifLAG2gugXf61jo9q4eEfQ3USNBaubm, peer.Id: 5, peer.status: registering module=p2
第三步:注册新节点¶
中继链管理员注册新节点的命令如下:
// --repo:指定中继链管理员私钥的路径
// --pid:指定新节点pid信息
// --account:指定新节点account信息
// --type:指定新节点类型
// --id:指定共识节点的id
$ bitxhub --repo $PROJECT_PATH/bitxhub/scripts/build/node1 client governance node register --pid Qmb6ZaaCw6dYPL7ifLAG2gugXf61jo9q4eEfQ3USNBaubm --account 0x9E887Aa2e8009C6c4b4aF7792e0afe71f0Dc1d64 --type vpNode --id 5
proposal id is 0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013-0
第四步:中继链管理员投票¶
中继链管理员进行投票治理,默认四个管理员的情况下需要三个管理员投赞成票提案可通过,命令如下:
// --repo:指定中继链管理员key的路径
// --id:指定治理提案的id,0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013-0
// --info:指定投票内容是approve或是reject
// --reason:指定投票理由,可自定义
$ bitxhub --repo $PROJECT_PATH/bitxhub/scripts/build/node4 client governance vote --id 0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013-0 --info approve --reason reason
$ bitxhub --repo $PROJECT_PATH/bitxhub/scripts/build/node2 client governance vote --id 0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013-0 --info approve --reason reason
$ bitxhub --repo $PROJECT_PATH/bitxhub/scripts/build/node1 client governance vote --id 0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013-0 --info approve --reason reason
投票通过注册成功后,新节点将会自动与原节点连接成功,等待片刻(新节点需要同步区块)后新节点将会成功打印出bitxhub的logo:
=======================================================
____ _ __ _ __ __ __ __
/ __ ) (_) / /_ | |/ / / / / / __ __ / /_
/ __ | / / / __/ | / / /_/ / / / / / / __ \
/ /_/ / / / / /_ / | / __ / / /_/ / / /_/ /
/_____/ /_/ \__/ /_/|_| /_/ /_/ \__,_/ /_.___/
=======================================================
第五步:查看中继链节点信息¶
中继链提供查看节点信息的命令如下:
// --repo:指定中继链管理员key的路径
// --type:指定中继链节点类型
$ bitxhub --repo $PROJECT_PATH/bitxhub/scripts/build/node1 client governance node all --type vpNode
NodePid type VpNodeId Account Status
------- ---- -------- ------- ------
QmQW3bFn8XX1t4W14Pmn37bPJUpUVBrBjnPuBZwPog3Qdy vpNode 4 0xc0Ff2e0b3189132D815b8eb325bE17285AC898f8 available
QmbmD1kzdsxRiawxu7bRrteDgW1ituXupR8GH6E2EUAHY4 vpNode 2 0x79a1215469FaB6f9c63c1816b45183AD3624bE34 available
QmXi58fp9ZczF3Z5iz1yXAez3Hy5NYo1R8STHWKEM9XnTL vpNode 1 0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013 available
QmQUcDYCtqbpn5Nhaw4FAGxQaSSNvdWfAFcpQT9SPiezbS vpNode 3 0x97c8B516D19edBf575D72a172Af7F418BE498C37 available
Qmb6ZaaCw6dYPL7ifLAG2gugXf61jo9q4eEfQ3USNBaubm vpNode 5 0x9E887Aa2e8009C6c4b4aF7792e0afe71f0Dc1d64 available
3 删除节点¶
3.1 功能介绍¶
节点删除时的一般状态转换如下:
available
→ logouting
→ unavailable
删除节点有以下几点注意:
(1)节点删除后可以重新注册,不做类似应用链注销后不可重复注册的限制;
(2)初始节点不可以删除;
(3)删除共识节点时目前只支持删除按vpNodeId排序的最后一个节点,比如当前有5个可用共识节点,这5个共识节点的id一定分别是1、2、3、4、5,那么只能删除id为5的共识节点(这一点后续可能会改进)
(4)cluster模式删除节点时需要保证共识节点个数不少于4个
3.2 使用方法¶
第一步:中继链管理员删除节点¶
中继链管理员除节点的命令如下:
// --repo:指定中继链管理员key的路径
// --pid:待删除节点的pid
$ bitxhub --repo $PROJECT_PATH/bitxhub/scripts/build/node1 client governance node logout --pid Qmb6ZaaCw6dYPL7ifLAG2gugXf61jo9q4eEfQ3USNBaubm
proposal id is 0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013-1
0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013-1
。
第二步:中继链管理员投票¶
中继链管理员进行投票治理,默认四个管理员的情况下需要三个管理员投赞成票提案可通过,命令如下:
// --repo:指定中继链管理员key的路径
// --id:指定治理提案的id,0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013-1
// --info:指定投票内容是approve或是reject
// --reason:指定投票理由,可自定义
$ bitxhub --repo $PROJECT_PATH/bitxhub/scripts/build/node4 client governance vote --id 0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013-1 --info approve --reason reason
$ bitxhub --repo $PROJECT_PATH/bitxhub/scripts/build/node2 client governance vote --id 0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013-1 --info approve --reason reason
$ bitxhub --repo $PROJECT_PATH/bitxhub/scripts/build/node1 client governance vote --id 0xc7F999b83Af6DF9e67d0a37Ee7e900bF38b3D013-1 --info approve --reason reason
投票通过后,被删除的节点会自动被停掉,打印出的日志如下:
INFO[2021-07-23T15:10:48.190] Delete node [ID: 5, peerInfo: id:5 pid:"Qmb6ZaaCw6dYPL7ifLAG2gugXf61jo9q4eEfQ3USNBaubm" account:"0x9E887Aa2e8009C6c4b4aF7792e0afe71f0Dc1d64" hosts:"/ip4/127.0.0.1/tcp/4005/p2p/" ] module=p2p
INFO[2021-07-23T15:10:48.451] Replica 5 need to process seqNo 1 as a null request module=order
INFO[2021-07-23T15:10:48.451] ======== THIS NODE WILL STOP IN 3 SECONDS module=order
INFO[2021-07-23T15:10:48.468] Replica 5 persist view=9/N=4 after updateN module=order
INFO[2021-07-23T15:10:48.468] ======== Replica 5 finished updateN, primary=2, n=4/f=1/view=9/h=0 module=order
INFO[2021-07-23T15:10:51.460] Transaction cache stopped! module=order
INFO[2021-07-23T15:10:51.460] RBFT stopping... module=order
INFO[2021-07-23T15:10:51.461] ======== RBFT stopped! module=order
INFO[2021-07-23T15:10:51.466] Disconnect peer [ID: 1, Pid: QmXi58fp9ZczF3Z5iz1yXAez3Hy5NYo1R8STHWKEM9XnTL] module=p2p
INFO[2021-07-23T15:10:51.466] Disconnect peer [ID: 2, Pid: QmbmD1kzdsxRiawxu7bRrteDgW1ituXupR8GH6E2EUAHY4] module=p2p
INFO[2021-07-23T15:10:51.466] Disconnect peer [ID: 3, Pid: QmQUcDYCtqbpn5Nhaw4FAGxQaSSNvdWfAFcpQT9SPiezbS] module=p2p
INFO[2021-07-23T15:10:51.466] Disconnect peer [ID: 4, Pid: QmQW3bFn8XX1t4W14Pmn37bPJUpUVBrBjnPuBZwPog3Qdy] module=p2p
INFO[2021-07-23T15:10:51.466] ======== THIS NODE HAS BEEN DELETED!!! module=order
4 其他功能¶
中继链还提供了其他查询节点信息的功能。
- 查询中继链所有指定类型节点,默认查询共识节点,命令如下:
- 查询中继链某个节点状态,命令如下: