fabric网络在创建时就已经确定了初始的节点数量,而在实际应用场景中可能会需要在某个组织中动态增加节点。这里以balance-transfer v1.0为例(2 Org,4 Peer),介绍如何在org1中加入第3个peer节点。
一、追加新节点的身份信息
首先需要在组织org1的MSP目录中追加新节点的证书和私钥信息,主要是用到cryptogen工具(v1.1.0以上版本)
1.修改cryptogen.yaml文件(或者直接新建一个文件)中Template
字段里的count
参数,设置为需要该组织中存在的节点总数,可一次增加多个节点。
这里只在org1加入一个节点,所以cryptogen.yaml文件修改部分如下:
PeerOrgs:
- Name: Org1
Domain: org1.example.com
CA:
Hostname: ca
Template:
Count: 3
SANS:
- "localhost"
Users:
Count: 1
2.执行extend命令完成追加操作
在artifacts/channel目录下执行:
./cryptogen extend --config=./cryptogen.yaml
注:--config参数应以实际情况下配置文件的名称及路径为准
二、编写新节点的docker配置文件
接下来需要编写docker配置文件用于启动新节点,内容较为简单,只需要在已有节点的配置上稍作修改即可,注意避免容器端口的冲突。
这里我将新节点的配置文件命名为new-peer.yaml
,放置于artifacts目录下,以下是文件内容:
version: '2'
services:
peer2.org1.example.com:
container_name: peer2.org1.example.com
extends:
file: base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer2.org1.example.com
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_ADDRESS=peer2.org1.example.com:7051
ports:
- 7151:7051
- 7153:7053
volumes:
- ./channel/crypto-config/peerOrganizations/org1.example.com/peers/peer2.org1.example.com/:/etc/hyperledger/crypto/peer
启动新节点容器,在配置文件所在目录下执行:
docker-compose -f new-peer.yaml up -d
三、修改网络配置文件
网络配置文件network-config.json
用于帮助应用程序获取网络节点的地址等信息,是app与节点通信的关键,所以需要在该配置文件中增加新节点的信息。
注:balance-transfer 1.1版本后已改为network-config.js文件。
在json文件的org1部分的peers字段后添加"peer3"的信息,注意ip和端口等信息需要与上述docker配置文件中保持一致,内容如下:
"peer3": {
"requests": "grpcs://localhost:7151",
"events": "grpcs://localhost:7153",
"server-hostname": "peer2.org1.example.com",
"tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer2.org1.example.com/tls/ca.crt"
}
四、将新节点加入通道
此时新增节点已经加入了区块链网络,但并没有加入某一个channel,所以是没有账本数据的。需要发送请求将其加入channel:
curl -s -X POST
http://localhost:4000/channels/mychannel/peers
-H "authorization: Bearer $ORG1_TOKEN"
-H "content-type: application/json"
-d '{
"peers": ["peer3"]
}'
请求中,$ORG1_TOKEN
是通过注册获取的org1的token值,"peer3"是在网络配置文件中设置的新节点的别名。
加入通道成功后,查看节点日志可以发现新节点开始从其他节点同步区块:
docker logs peer2.org1.example.com
五、安装链码
加入channel后,peer3已经可以参与记账,但是不能指定该节点进行查询或交易,这时候需要发起请求安装chaincode:
curl -s -X POST
http://localhost:$PORT/chaincodes
-H "authorization: Bearer $ORG1_TOKEN"
-H "content-type: application/json"
-d '{
"peers": ["peer3"],
"chaincodeName":"mycc",
"chaincodePath":"github.com/example_cc",
"chaincodeVersion":"v0"
}'
安装成功后指定新节点进行查询或交易操作,会自动生成该节点的chaincode镜像,并启动容器运行chaincode。在已有组织中新加节点的操作到这里就全部完成了!