在上一篇文章《19-Fabric 实战进阶-阿里云部署单机多节点网络(一)》中,介绍了搭建一个 Fabric 所需要的环境以及相关的配置文件。本文将在上一篇的基础上,搭建一个简单的 Fabric 网络。其中包括以下内容:
1、启动 Fabric 网络
我们知道,在 Fabric 网络中,节点的角色分成两大类,Orderer 排序节点以及 Peer 节点。在最简单的 Fabric 网络中,至少有一个 Orderer 节点和一个 Peer 节点。在启动上述节点的过程中,我们可以用 docker-compose 工具来启动对应的节点。
- 启动排序节点的命令
docker-compose -f docker-orderer.yaml up -d
运行成功后,结果如下:
- 启动 Peer 节点的命令
docker-compose -f docker-peer.yaml up -d
运行成功后,结果如下:
启动完成后,可以看到主机中可以用 docker ps 查看容器运行的情况:
在使用 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
创建成功后,如下图所示:
随后执行 ls 可以查看 mychannel.block 文件。
- Peer 加入通道中
在《Fabric 实战进阶-阿里云部署单机多节点网络》一文中,peer 节点的配置文件 docker-peer.yaml 文件,关于 cli 的配置中,将 cli 关联的 peer 节点配置成 peer0.org1.接下来要通过 mychannel.block 文件,将该节点加入到 channel 中。
运行一下命令:
peer channel join -b mychannel.block
结果如下所示:
至此,关于通道的操作已经完成。
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
运行成功后界面如下:
- 实例化智能合约
安装好智能合约之后,就要实例化智能合约了。
执行如下命令进行实例化 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')"
实例化成功后,界面如下:
ChainCode 要在区块链网络中运行,需要经过链码安装和链码实例化两个步骤。其中,整个部署过程中,针对每个想要调用智能合约的节点,都需要安装一次 chaincode.但是只需要实例化一次就可以了。因为安装 chaincode 的对象是 Peer 节点,而实例化 ChainCode 的对象是 ChainCode。关于智能合约的详细使用,参见:
苏小乐:5-HyperLedger-Fabric1.0 原理-ChainCode 基础知识详解苏小乐:14-Fabric-搭建一个 Fabric 网络&CLI 命令详解
- 智能合约测试
在实例化的过程中,实际上是启动了一个运行 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"]}'
-
- b 转账给 a 账户 50 元
peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mycc -c '{"Args":["invoke","b","a","50"]}'
-
- 查询 a 的余额为 150
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
操作结果如下:
- 调用智能合约
在该节点安装好 ChainCode 之后,就可以从该节点调用 ChainCode 了。下面来调用 ChainCode 查询一下用户 a 的余额。
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
总结
到这里,在阿里云上搭建 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 的网络配置相关知识有关。详情可参见: