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。在已有组织中新加节点的操作到这里就全部完成了!

标签: fabric

已有 12 条评论

  1. 您好,运行第四步新节点加入通道出现
    UnauthorizedError: No authorization token was found和UnauthorizedError: Format is Authorization: Bearer [token]这样的错误,请问应该怎么改呢

    1. zyj zyj

      Hello,$ORG1_TOKEN 是表示一个变量,需要预先先通过一个注册接口来获取,像这样:

      TOKEN=$(curl -s -X POST \
      http://$URL/users \
      -H "content-type: application/x-www-form-urlencoded" \
      -d "username=admin&orgName=$CUR_ORG&password=123")
      TOKEN=$(echo $TOKEN | jq ".token" | sed "s/\"//g")

      可以参考: https://github.com/zhayujie/fabric-tools/blob/master/multi-machine-deploy/new-org/add_org.sh 中的addOrg()方法

  2. Hunter 景文 Hunter 景文

    请问您这个network-config.json文件,似乎是仅在balance-transfer项目内存在,那对于常规启动fabric网络的来说,没有这样的文件,又该如何去进行网络的配置呢?(本人fabric 1.4.4)

    1. zyj zyj

      这里的增加节点流程是在fabric-app层完成的(基于node-sdk),一般完整的应用都会有类似的网络配置文件,可能形式会有不同,根据具体情况做相应变化即可。
      对于常规启动的fabric网络(没有sdk和app层),是没有网络配置文件的,也无法通过http接口方式新增节点。建议使用cli容器命令行的方式进行操作(参考first-network示例)。

      1. yf yf

        博主您好,相比cli容器命令行的方式,您的这种方法感觉步骤少了多少,最终效果是一样的么?

        1. zyj zyj

          效果是一样的,cli容器中的命令本质也是执行这些操作

          1. yf yf

            在现有的组织上增加新节点需要更新锚节点么?

            1. zyj zyj

              锚节点用于不同组织间的区块同步,类似于组织的"外交官"

              1.在现有组织上增加新节点需要更新锚节点吗? 不用,因为新增节点不影响该组织原有锚节点的工作。
              2.增加新的组织需要特别设置锚节点吗? 也不用,因为每个组织的orderer节点会默认充当组织内的锚节点角色。

              1. yf yf

                博主您好,我最近也在做一个fabric开发的项目,方便加个联系方式么请教您么
                微信:18362088378

  3. Anapodoton Anapodoton

    请问这个值$ORG1_TOKEN怎么获取啊

    1. zyj zyj

      这个token变量可以发送注册请求来获取: ORG1_TOKEN=$(curl ...)

  4. 催更

添加新评论