• -------------------------------------------------------------
  • ====================================

20-Fabric实战进阶-阿里云部署单机多节点网络(二)

区块链 dewbay 4年前 (2020-01-06) 2298次浏览 已收录 0个评论 扫描二维码

在上一篇文章《19-Fabric 实战进阶-阿里云部署单机多节点网络(一)》中,介绍了搭建一个 Fabric 所需要的环境以及相关的配置文件。本文将在上一篇的基础上,搭建一个简单的 Fabric 网络。其中包括以下内容:

20-Fabric实战进阶-阿里云部署单机多节点网络(二)
全文结构

1、启动 Fabric 网络

我们知道,在 Fabric 网络中,节点的角色分成两大类,Orderer 排序节点以及 Peer 节点。在最简单的 Fabric 网络中,至少有一个 Orderer 节点和一个 Peer 节点。在启动上述节点的过程中,我们可以用 docker-compose 工具来启动对应的节点。

  • 启动排序节点的命令
docker-compose -f docker-orderer.yaml up -d

运行成功后,结果如下:

20-Fabric实战进阶-阿里云部署单机多节点网络(二)
orderer 节点启动成功
  • 启动 Peer 节点的命令
docker-compose -f docker-peer.yaml up -d

运行成功后,结果如下:

20-Fabric实战进阶-阿里云部署单机多节点网络(二)
peer 节点启动成功

启动完成后,可以看到主机中可以用 docker ps 查看容器运行的情况:

20-Fabric实战进阶-阿里云部署单机多节点网络(二)
容器运行情况

在使用 docker-compose 启动网络的过程中,可能会出现以下错误:
错误类型:signal SIGSEGV: segmentation violation

解决方法:
在 docker compose yaml 里对 peer、orderer、cli 的环境变量加入 GODEBUG=netdns=go
详情见:阿里云环境部署 Hyperledger Fabric 之 SIGSEGV 问题分析和解决经验分享


2、启动 CLI 客户端

当所有的容器启动之后,接下来要做的就是对 Channel 和 ChainCode 执行操作了。在本次实践中,是通过对客户端来完成对 peer 节点的操作。在实际的应用场景中,可以使用第三方的 SDK 来对 peer 节点进行操作。但是在环境搭建的过程中,我们使用 cli 客户端完成对 peer 节点的操作。可通过以下命令进入 cli 客户端

docker exec -it cli bash

3.通道操作

通道是 fabric 中的一项重要特性。位于同一通道中的节点,可以共享数据。

在 Fabric 区块网络的搭建过程中,我们首先需要利用上一节生成的通道配置文件 mychannel.tx,来创建通道。然后再将对应的 peer 节点加入到通道中来。

  • 创建一个 channel
peer channel create -o orderer.example.com:7050 -c mychannel -t 50 -f ./channel-artifacts/mychannel.tx 

创建成功后,如下图所示:

20-Fabric实战进阶-阿里云部署单机多节点网络(二)
channel 运行成功后的打印输出

随后执行 ls 可以查看 mychannel.block 文件。

  • Peer 加入通道中

在《Fabric 实战进阶-阿里云部署单机多节点网络》一文中,peer 节点的配置文件 docker-peer.yaml 文件,关于 cli 的配置中,将 cli 关联的 peer 节点配置成 peer0.org1.接下来要通过 mychannel.block 文件,将该节点加入到 channel 中。

运行一下命令:

peer channel join -b mychannel.block

结果如下所示:

20-Fabric实战进阶-阿里云部署单机多节点网络(二)

至此,关于通道的操作已经完成。

Fabric 网络三要素:Orderer 节点、Peer 节点以及 Channel 的操作都已经完成。我们首先是启动了 Orderer 节点以及 Peer 节点,最后把 Peer 节点加入到通道中。这样,一个最小单位的 Fabric 网络已经成功搭建起来了。


4.智能合约操作

本节直接使用 fabric 官网提供的智能合约 example02,来进行智能合约的安装和实例化。

# 进入如下目录
cd ~/go/src/github.com/hyperledger/fabric/examples
# 将目录下的 chaincode 目录拷贝至 network001 中
cp -r chaincode ~/go/src/github.com/hyperledger/fabric/network001
  • 安装智能合约

执行如下命令,完成对智能合约的安装

 peer chaincode install -n mycc -p github.com/hyperledger/fabric/network001/chaincode/go/chaincode_example02 -v 1.0

运行成功后界面如下:

20-Fabric实战进阶-阿里云部署单机多节点网络(二)

  • 实例化智能合约

安装好智能合约之后,就要实例化智能合约了。

执行如下命令进行实例化 chaincode:

peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR('Org1MSP.member')"

实例化成功后,界面如下:

20-Fabric实战进阶-阿里云部署单机多节点网络(二)

ChainCode 要在区块链网络中运行,需要经过链码安装链码实例化两个步骤。其中,整个部署过程中,针对每个想要调用智能合约的节点,都需要安装一次 chaincode.但是只需要实例化一次就可以了。因为安装 chaincode 的对象是 Peer 节点,而实例化 ChainCode 的对象是 ChainCode。关于智能合约的详细使用,参见:

苏小乐:5-HyperLedger-Fabric1.0 原理-ChainCode 基础知识详解zhuanlan.zhihu.com20-Fabric实战进阶-阿里云部署单机多节点网络(二)苏小乐:14-Fabric-搭建一个 Fabric 网络&CLI 命令详解zhuanlan.zhihu.com20-Fabric实战进阶-阿里云部署单机多节点网络(二)

  • 智能合约测试

在实例化的过程中,实际上是启动了一个运行 ChainCode 的容器。其中参数

-c '{"Args":["init","a","100","b","200"]}' 

表示初始化了两个账户,并给 a 和 b 分别赋值 100 和 200.接下来,就通过 cli 客户端来对智能合约进行调用。

    • 查询 a 的资产
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

20-Fabric实战进阶-阿里云部署单机多节点网络(二)

    • b 转账给 a 账户 50 元
 peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mycc -c '{"Args":["invoke","b","a","50"]}'

20-Fabric实战进阶-阿里云部署单机多节点网络(二)

    • 查询 a 的余额为 150

20-Fabric实战进阶-阿里云部署单机多节点网络(二)


5.部署 Peer0.org2 节点

在上述的四个步骤中,我们成功的部署了一个 Orderer 节点以及 ORG1 组织中的 Peer0 节点。如果现在需要新增加一个节点,我们该怎么做呢?

其实基本步骤和部署 Peer0.org1 节点类似。包括:

  • 配置 peer0.org2 的启动文件,docker-peer1.yaml.
  • 启动 peer0.org2 节点。
  • 将 peer0.org2 节点加入到通道中。
  • 将 ChainCode 安装在 peer0.org2 节点上。

做完上述步骤,就完成了在一个组织中新增 peer 节点。

  • 准备 docker-peer1.yaml 文件,上传至 network001 文件目录。具体内容如下:
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

services:

  peer0.org2.example.com:
    container_name: peer0.org2.example.com
    image: hyperledger/fabric-peer
    environment:
      - CORE_PEER_ID=peer0.org2.example.com
      - CORE_PEER_NETWORKID=network001
      - CORE_PEER_ADDRESS=peer0.org2.example.com:7051
      - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org2.example.com:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051
      - CORE_PEER_LOCALMSPID=Org2MSP

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      # the following setting starts chaincode containers on the same
      # bridge network as the peers
      # https://docs.docker.com/compose/networking/
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=network001
      # - CORE_LOGGING_LEVEL=ERROR
      - CORE_LOGGING_LEVEL=DEBUG
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=network001_default
      - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_PROFILE_ENABLED=false
      - CORE_PEER_TLS_ENABLED=false
      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
    volumes:
        - /var/run/:/host/var/run/
        - ./crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp
        - ./crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    ports:
      - 8051:7051
      - 8052:7052
      - 8053:7053
    networks:
      default:
        aliases:
          - network001

特别提醒:
上述文件加粗部分,如果你搭建环境的文件夹名称不是 network001 而是别的,则需要将 network001 换成你自己的文件夹名称。否则,peer 节点无法与 Orderer 节点等建立联系。
文件下载地址:

使用如下命令启动 peer1.org0

 docker-compose -f docker-peer1.yaml up -d

启动 CLI 容器:

docker exec -it cli bash

由于 cli 容器之前主要是绑定的 Peer0.org1.如果想要使用 CLI 命令窗口来操作 peer0.org2,则需要将 CLI 容器中的环境变量设置成 Peer0.org2 的环境变量。直接将如下变量输入命令窗如下:

CORE_PEER_ID=peer0.org2.example.com
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
CORE_PEER_CHAINCODELISTENADDRESS=peer0.org2.example.com:7052
CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051
CORE_PEER_LOCALMSPID=Org2MSP 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp 

随后,将 peer0.org2 节点加入通道中:

peer channel join -b mychannel.block

然后,对该节点安装 ChainCode

 peer chaincode install -n mycc -p github.com/hyperledger/fabric/network001/chaincode/go/chaincode_example02 -v 1.0

操作结果如下:

20-Fabric实战进阶-阿里云部署单机多节点网络(二)

  • 调用智能合约

在该节点安装好 ChainCode 之后,就可以从该节点调用 ChainCode 了。下面来调用 ChainCode 查询一下用户 a 的余额。

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

20-Fabric实战进阶-阿里云部署单机多节点网络(二)


总结

到这里,在阿里云上搭建 Fabric 单机多节点网络就结束了。

与之前在本地搭建有几个要注意的点:

  • BUG 错误类型:signal SIGSEGV: segmentation violation

该错误是在阿里云上部署 Fabric 网络,启动 peer 节点的时候,会出现的错误。

解决办法:

在 docker compose yaml 里
对 peer、orderer、cli 的环境变量加入 GODEBUG=netdns=go

具体原因见:阿里云环境部署 Hyperledger Fabric 之 SIGSEGV 问题分析和解决经验分享

  • 在文件目录 network001 下搭建 fabric 网络时,需要将 peer 节点对应的配置文件 docker_peer.yaml 中的环境变量,改成自定义目录的名字:
 - CORE_PEER_NETWORKID=network001
 - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=network001
 - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=network001_default

 networks:
      default:
        aliases:
          - network001

这一部分,和 docker 的网络配置相关知识有关。详情可参见:

Networking in Compose

docs.docker.com20-Fabric实战进阶-阿里云部署单机多节点网络(二)

露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:20-Fabric实战进阶-阿里云部署单机多节点网络(二)
喜欢 (0)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址