目录
1、网络服务配置
2、关联的docker-compose-base.yaml
各Peer节点容器设置如下信息。
3、被关联的Peer-base.yaml
4、启动网络
2、完成通道的创建
2.1将节点加入应用通道
更新锚节点
2.为什么要创建节点并将其加入应用通道中?
1、网络服务配置
由于要启动多个网络节点,Hyperledger Fabric采用了容器技术,所以需要一个简化的
方式来集中化管理这些节点容器。我们使用docker-compose这个工具来实现一步到位的节
点容器管理,而且只需要编写相应的配置文件即可。
Hyperledger Fabric同样提供了docker--compose工具的示例配置文件,该配置文件在
fabric-samples/first-network目录下,文件名称为docker-compose-.cli.yaml,打开这个配置文
件可以看到如下完整内容:
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
volumes:
orderer.example.com:
peer0.org1.example.com:
peer1.org1.example.com:
peer0.org2.example.com:
peer1.org2.example.com:
networks:
byfn:
services:
orderer.example.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.example.com
container_name: orderer.example.com
networks:
- byfn
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org1.example.com
networks:
- byfn
peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
file: base/docker-compose-base.yaml
service: peer1.org1.example.com
networks:
- byfn
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org2.example.com
networks:
- byfn
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends:
file: base/docker-compose-base.yaml
service: peer1.org2.example.com
networks:
- byfn
cli:
container_name: cli
image: hyperledger/fabric-tools:$IMAGE_TAG
tty: true
stdin_open: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
#- CORE_LOGGING_LEVEL=DEBUG
- CORE_LOGGING_LEVEL=INFO
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
volumes:
- /var/run/:/host/var/run/
- ./../chaincode/:/opt/gopath/src/github.com/chaincode
- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
depends_on:
- orderer.example.com
- peer0.org1.example.com
- peer1.org1.example.com
- peer0.org2.example.com
- peer1.org2.example.com
networks:
- byfn
由以上配置信息可以看出,该配置文件指定了网络中各个节点容器(共计6个容器,即1个Orderer、属于2个Orgs组织的4个Peer、1个CLI)的信息。仔细观察会发现,Orderer与各Peer容器都设置了container_name与networks信息;其他信息都由extends指向了base/docker--compose-base.yaml文件。
CLI容器指定了所代表的Peer节点(CORE_PEER_ADDRESS=peero.orgl.example.
com:7051),通过volumes指定了将系统中的链码、组织结构及证书、生成的配置文件映射
到容器中指定的目录下,且通过depends_on属性指定了所依赖的相关容器。
2、关联的docker-compose-base.yaml
在docker-compose-.cli.yaml配置文件中,由extends.file指向了一个base/docker-compose-
base.yaml的配置文件,该配置文件指定了Orderer节点与Peer节点的主要配置信息。
Orderer节点容器设置如下信息。
1)environment:该部分主要关注如下核心配置信息。
- ORDERER GENERAL GENESISFILE:指定在Orderer容器中初始区块的所在路径,由volumes中的/channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block指定主机到Docker的映射。
- ORDERER GENERAL LOCALMSPID:指定当前Orderer容器的唯一MSPID.
- ORDERER GENERAL LOCALMSPDIR:指定当前Orderer容器的MSP所在路径。
- ORDERER GENERAL_TLS_ENABLED:是否开启TLS验证。
- ORDERER GENERAL TLS PRIVATEKEY:指定私钥所在路径。
- ORDERER GENERAL TLS CERTIFICAT:指定证书所在路径。
- ORDERER GENERAL TLS ROOTCAS:指定受信任的CA根证书所在路径。
2)working_dir:进入容器后的默认工作目录。
3)volumes:指定系统中的初始区块配置文件、MSP、TLS目录映射到Docker容器中的指定路径下。
4)pots:指定当前节点的监听端口。
各Peer节点容器设置如下信息。
1)extends:基本信息来源于哪个文件。
2)environment:指定容器的D、监听地址及端口号、本地MSPID,大体与Orderer中的environment部分相同。
3)volumes:将系统的msp及tls目录映射到容器中的指定路径下。
4)ports:指定当前节点的监听端口。
配置文件信息如下:
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
orderer.example.com:
container_name: orderer.example.com
image: hyperledger/fabric-orderer:$IMAGE_TAG
environment:
- ORDERER_GENERAL_LOGLEVEL=INFO
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
# enabled TLS
- ORDERER_GENERAL_TLS_ENABLED=true
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: orderer
volumes:
- ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
- orderer.example.com:/var/hyperledger/production/orderer
ports:
- 7050:7050
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer0.org1.example.com
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
- peer0.org1.example.com:/var/hyperledger/production
ports:
- 7051:7051
- 7053:7053
peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer1.org1.example.com
- CORE_PEER_ADDRESS=peer1.org1.example.com:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls
- peer1.org1.example.com:/var/hyperledger/production
ports:
- 8051:7051
- 8053:7053
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer0.org2.example.com
- CORE_PEER_ADDRESS=peer0.org2.example.com:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
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
- peer0.org2.example.com:/var/hyperledger/production
ports:
- 9051:7051
- 9053:7053
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer1.org2.example.com
- CORE_PEER_ADDRESS=peer1.org2.example.com:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/fabric/tls
- peer1.org2.example.com:/var/hyperledger/production
ports:
- 10051:7051
- 10053:7053
3、被关联的Peer-base.yaml
在base/docker--compose-base.yaml配置文件中,由extends.file指向了一个peer-base.
yaml的配置文件,该配置文件设置了所有Peer容器的基本的共同信息,其核心配置信息
如下。
- CORE PEER_TLS_ENABLED:指定是否开启TLS验证。
- CORE PEER GOSSIP_USELEADERELECTION:指定使用选举方式。
- CORE PEER GOSSIP ORGLEADER:指定是否将当前节点设定为Leader.
- CORE PEER TLS CERT FILE:指定TLS证书所在路径。
- CORE_PEER TLS_KEY FILE:指定密钥所在路径。
- CORE PEER TLS ROOTCERT FILE:指定受信任的CA根证书所在路径。
配置文件完整内容如下:
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
peer-base:
image: hyperledger/fabric-peer:$IMAGE_TAG
environment:
- 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=${COMPOSE_PROJECT_NAME}_byfn
- CORE_LOGGING_LEVEL=INFO
#- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_PROFILE_ENABLED=true
- 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
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start
4、启动网络
所有有关Hyperledger Fabric网络环境所需文件创建且配置完成之后(组织结构及身份证书、初始区块文件、通道交易配置文件及锚节点更新配置文件),就可以启动网络。
下面使用已安装的docker-.compose工具,通过其命令来方便地启动Hyperledger Fabric网络的所有节点:
sudo docker-compose -f docker-compose-cli.yaml up -d
sudo docker-compose -f docker-compose-cil.yaml up -d
是一个命令行指令,用于在使用Docker Compose管理容器化应用程序时启动服务。这个命令的不同部分解释如下:
sudo
: 这是一个Linux或Unix系统上的特权命令,用于以超级用户(root)的身份执行后续的命令。它可能需要管理员权限才能运行。docker-compose
: 这是一个命令行工具,用于通过一个配置文件(通常是docker-compose.yaml或类似的文件)定义和管理多个Docker容器组成的应用程序。它简化了容器编排和部署过程。-f docker-compose-cil.yaml
: 这是一个选项,用于指定要使用的 Docker Compose 配置文件的路径。在这个例子中,配置文件名为docker-compose-cil.yaml
。up
: 这是一个docker-compose命令,用于启动应用程序中定义的服务。它会根据配置文件创建和启动相应的容器。-d
: 这是一个选项,表示在后台运行容器。即使您关闭了终端窗口,容器也会继续运行。所以,
sudo docker-compose -f docker-compose-cil.yaml up -d
命令会读取docker-compose-cil.yaml
配置文件,并根据其中定义的服务启动相应的容器。这些容器将在后台运行,以便可以继续进行其他操作而不影响它们的运行。
使用docker ps 命令,查看到6个节点都启动了。
2、完成通道的创建
概念:通道,是将一个大的网络划分成不同的私有“子网”,划分之后的多个子网可以称为多通道。
作用:通道提供一种通信机制,能够将Peer和Orderer连接在一起,形成一个具有保密性的通信链路(虚拟),从而实现对分布式账本数据的隔离。
要加入通道,每个节点都要有自己的通过MSP获得的身份标识。
具体步骤:
1、进入通过docker-compose-cli.yaml配置文件指定的CLI容器
执行如下Docker命令进入指定的CLI容器中(后续操作都在该CLI容器中执行):
sudo docker exec -it cli bash
sudo
: 它是一个 Linux/Unix 系统中的命令,用于以超级用户权限运行后续的命令。如果当前用户没有足够的权限执行 Docker 相关操作,可以使用sudo
命令来获取临时的超级用户权限。
docker
: 这是 Docker 引擎的命令行客户端工具。它用于与 Docker 守护进程通信,并执行与容器和镜像相关的操作。
exec
: 这是 Docker 命令行客户端的一个子命令,用于在运行中的容器中执行命令。
-it
: 这是docker exec
命令的选项之一,用于指定交互式终端和标准输入流(stdin)连接到容器的 TTY(终端)。
cli
: 这是容器的名称或 ID。cli
在这里代表要执行命令的目标容器。
bash
: 这是要在容器中执行的命令。bash
是一个常见的 Unix/Linux 命令行解释器,通过执行bash
命令,我们可以在容器内启动一个交互式的命令行 shell。
如果命令执行成功,则命令提示符会变为如下类似内容(代表成功进人CLI容器):
其中,@符号后面的内容根据不同的设备会显示不同的内容。
2、创建应用通道
- 检查环境变量是否正确设置:
echo $CHANNEL_NAME
2.设置环境变量
export CHANNEL_NAME=mychannel
注意:设置的通道名称必须与创建通道交易配置文件时指定的通道名称相同。
3.创建通道
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
下面是对该命令中各部分的解释:
peer
: 这是 Hyperledger Fabric 的命令行客户端工具,用于与 Fabric 网络进行交互并执行相应操作。
channel create
: 这是peer
命令的子命令,用于在 Fabric 网络中创建一个新的通道。
-o orderer.example.com:7050
: 这是指定要连接的排序服务节点(orderer)的地址和端口号。在这个例子中,使用的是orderer.example.com
地址和7050
端口。
-c $CHANNEL_NAME
: 这是指定要创建的通道的名称。$CHANNEL_NAME
是一个变量,表示通道名称可以根据实际情况进行替换。
-f ./channel-artifacts/channel.tx
: 这是指定通道配置文件的路径和文件名。channel.tx
文件包含了有关通道的配置信息,例如组织、锚节点等。
--tls
: 这是启用 TLS(传输层安全)连接的选项。通过使用 TLS,可以保证通信的安全性。
--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
: 这是指定用于验证通信的 TLS CA(证书颁发机构)文件的路径和文件名。在这里,使用/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
文件进行验证。
2.1将节点加入应用通道
应用通道所包含组织的成员节点可以加入通道中:
peer channel join -b mychannel.block
参数说明:
- join —— 将当前Peer节点加入应用通道中。
- -b —— 指定当前节点要加入/连接至哪个应用通道。
成功后界面如下:
更新锚节点
使用Org1的管理员身份更新锚节点配置:
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
使用Org2的管理员身份更新锚节点配置:
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
root@ac15c364fb7f:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
2.为什么要创建节点并将其加入应用通道中?
创建应用通道交易配置文件,可以指定创建的应用通道中可以有哪些组织加入及指定相应的权限;网络上的每个交易都需要在一个指定的通道中执行;在通道中,交易必须通过通道的认证和授权。要加入一个通道的每个节点都必须有自己的通过MSP获得的身份标识,用于鉴定每个节点在通道中的是什么节点和服务。