Fabric 配置文件详解导语:文章没有重复的地方,没有废话,如果能帮助到你,那是我的荣幸,记得一键三连哟
- 一、四个核心配置文件
- 二、Fabric 的核心配置文件
- 三、网络启动步骤
- 1. 生成认证证书
- crypto-config.yaml
- 2. 生成起始区块
- configtx.yaml
- Organizations:
- Capabilities:
- Application:
- Orderer:
- Channel:
- Profiles:
- 3. 创建通道配置文件
- 4. 创建组织锚节点配置文件
- 4.1 创建Org1组织锚节点配置文件
- 4.2 创建Org2组织锚节点配置文件
- 4.3关闭TLS传输
- 5. docker 容器启动
- docker-compose-cli.yaml
- cli客户端节点
- orderer排序节点
- peer对等节点
- 进入docker容器
- 6. 根据通道配置文件生成通道
- 7. 将peer0.Org1节点加入通道
- 7. 将peer1.Org1节点加入通道
- 7. 将peer0.Org2节点加入通道
- 7. 将peer1.Org2节点加入通道
- 8. 根据锚节点配置文件更新锚节点
- 8. 根据锚节点配置文件更新锚节点-Org2
- 8. 根据锚节点配置文件更新锚节点-Org1
- 9. 安装链码
- 9. 安装链码-peer0.Org1
- 9. 安装链码-peer0.Org2
- 10. 实例化链码
- 11. 链码查询
- 12. 链码交互
二、Fabric 的核心配置文件1、crypto-config.yaml
2、configtx.yaml
3、docker-compose-cli.yaml
4、byfn.sh
三、网络启动步骤Fabric 将节点运行在docker容器中,其证书认证、通道创建、链码安装、链码交互等,都可以通过配置文件与命令行工具执行。
在Fabric 网络搭建的过程中,有三个配置文件起到很重要的作用,我们可以通过对这个几个配置
文件的修改,来构建符合业务逻辑和企业需求的区块链网络。 这几个配置文件我们可以在fabric-samples
目录下的first-network 项目里找到:
1、crypto-config.yaml:认证证书、组织信息、网络节点数量等;
2、configtx.yaml:起始区块、通道配置文件、共识算法设置等;
3、docker-compose-cli.yaml:docker容器设置、批量管理docker容器等;
4、还有一个shell脚本byfn.sh,详细说明了启动Fabric 区块链网络所需的大部分命令;
1. 生成认证证书
- 生成认证证书;
- 生成起始区块;
- 创建通道配置文件;
- 创建组织锚节点配置文件;
- docker 容器启动;
- 根据通道配置文件生成通道
- 将节点加入通道;
- 根据锚节点配置文件更新锚节点;
- 安装链码;
- 实例化链码;
- 链码交互;
- 链码查询;
crypto-config.yamlcrytogen 组件,为每一个组织生成MSP 所需要的证书与密钥,它与crypto-config.yaml文件配
套使用,在命令行输入以下命令:
cd $HOME/fabric-samples/first-network cryptogen
generate --config=./crypto-config.yaml
会在当前目录下自动生成crypto-config目录,里边存放了所有的证书与密钥,为MSP 提供服务;
2. 生成起始区块Name:组织名称
Domain:组织域名
Specs:
- Hostname:自定义节点名称
Template:使用模板定义节点名称 peer($Count +1)- Count:节点数量
Users:用户名称 user$Count- Count:用户数量
configtx.yamlconfigtxgen 组件,用于生成通道创世区块或通道交易的配置文件,需要与configtx.yaml文件配套使用。
configtxgen -profile TwoOrgsOrdererGenesis -channelID syschannel -outputBlock ./channel-artifacts/genesis.block
-profile:后边接通道配置名称,从configtx.yaml文件的profiles配置段中寻找相关通道配置名称载入。 -channelID:后边接通道名称,这里定义的是系统通道的名称,建议全小写并且没有特殊字符; -outputBlock:后边接创世区块输出的文件路径,路径中目录如果不存在,需提前创建;
cd $HOME/fabric-samples/first-network
mkdir -p channel-artifacts
configtxgen -profile TwoOrgsOrdererGenesis -channelID syschannel -outputBlock ./channel-artifacts/genesis.block
Organizations:该文件总共有六个配置段:
Organizations:定义了各组织机构的名称、MSPID、MSP目录、读写策略等;
Capabilities:能力定义,设定了不同版本的节点所能做的事情;
Application:定义了要写入创世区块或配置交易的应用参数。
Orderer:定义了通道的共识模式与区块的相关信息;
Channel:定义了通道中相关API的调用权限;
Profiles:定义configtxgen工具的相关配置入口;
Capabilities:Name:在网络中的名称
ID:MSP中的唯一ID
MSPDir:msp的相关目录
Policies:读写策略
AnchorPeers:锚节点配置
Application:Capabilities段用来定义fabric网络的能力。这是版本v1.1.0引入的一个新的配置段,当与版本
v1.0.x的对等节点与排序节点混合组网时不可使用。
Capabilities段定义了fabric程序要加入网络所必须支持的特性。例如,如果添加了一个新的
MSP类型,那么更新的程序可能会根据该类型识别并验证签名,但是老版本的程序就没有办法验
证这些交易。这可能导致不同版本的fabric程序中维护的世界状态不一致。
因此,通过定义通道的能力,就明确了不满足该能力要求的fabric程序,将无法处理交易,除非
升级到新的版本。对于v1.0.x的程序而言,如果在Capabilities段定义了任何能力,即使声明不
需要支持这些能力,都会导致其有意崩溃。
Orderer: Channel: Profiles:这一部分后续由应用程序端进行配置;
3. 创建通道配置文件configtxgen 工具 -profile 命令 后接的名称要与profiles 下的字段 匹配;
4. 创建组织锚节点配置文件configtxgen 组件,用于生成通道创世区块或通道交易的配置文件,需要与configtx.yaml文件配套使用。
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
-profile:后边接通道配置名称,从configtx.yaml文件的profiles配置段中寻找相关通道配置名称载入。 -outputCreateChannelTx:后边接通道配置文件输出的文件路径;
-channelID:后边接通道名称,这里定义的是业务通道的名称,建议全小写并且没有特殊字符
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
4.1 创建Org1组织锚节点配置文件configtxgen 组件,用于生成通道创世区块或通道交易的配置文件,需要与configtx.yaml文件配套使用。
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
-profile:后边接通道配置名称,从configtx.yaml文件的profiles配置段中寻找相关通道配置名称载入。
-outputAnchorPeersUpdate:后边接组织锚节点配置文件输出的文件路径;
-channelID:后边接通道名称,这里定义的是业务通道的名称,建议全小写并且没有特殊字符;
-asOrg:后边接所属组织的MSPID,要与configtx.yaml文件中Organizations配置段的定义一致;
锚节点每个组织至少有一个,有多少个锚节点就创建多少个锚节点配置文件;
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP4.2 创建Org2组织锚节点配置文件
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
5. docker 容器启动修改docker-compose的yaml 文件,将TLS相关配置关闭:
一:修改docker-compose-cli.ymal中service下的cli容器的environment:
将TLS字段的环境变量注释掉;
修改docker-compose的yaml 文件,将TLS相关配置关闭:
二:修改base/peer-bash.ymal中service下的peer-base容器和orderer容器的environment: 将TLS字段的环境变量注释掉;
使用docker-compose 组件,根据docker-compose-cli.yaml 文件批量启动docker容器;
docker-compose -f docker-compose-cli.yaml up -d
-f:使用指定配置文件
up:启动
-d:后台运行,不占用命令行窗口
docker-compose -f docker-compose-cli.yaml up -ddocker-compose-cli.yaml
cli客户端节点此yaml文件定义了docker的相关信息,供docker-compose启动时使用;
以下是顶级的配置项:
version:定义了版本信息;
volumes:定义了卷信息,提供给 services 中的 具体容器使用;
networks:定义了网络信息,提供给 services 中的 具体容器使用;
services:定义了服务的配置信息以及该服务启动的每个容器的配置;
以下是services配置项下的服务信息以及相关的容器配置:
container_name:指定容器的名称;
image:指定服务所使用的镜像,如果本地不存在,将拉取镜像;
tty:是否默认给容器一个虚拟终端;
environment:环境变量配置,可以用数组或字典两种方式;
working_dir:工作目录,登录该容器终端时默认访问的目录;
command:覆盖容器启动后默认执行的命令;
depends_on:容器启动的先后问题;
extends:拓展使用另一yaml文件中的内容;
networks:使用顶级配置项networks所定义的网络,容器只能在同一网络中进行交互;
- volumes:卷挂载路径;
- 本地的目录名称:容器中的目录名称
- ports:端口映射信息;
- “宿主机端口:容器端口”
orderer排序节点客户端节点cli的环境变量配置;
peer对等节点排序节点orderer的环境变量配置;
进入docker容器对等节点peer的环境变量配置;
6. 根据通道配置文件生成通道当执行到第5步,启动docker容器后,在byfn.sh脚本的195行,使用了exec命令,执行了cli容
器里的脚本文件。所以接下来的命令都是在cli容器中执行的;
所以,我们需要进入到cli容器中:
docker exec -it cli bash
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端 bash:可执行shell命令
7. 将peer0.Org1节点加入通道peer 组件,可用于创建通道、节点加入、链码安装、链码实例化、链码交互等操作; peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx
peer channel create:创建通道;
-o:与某个排序节点连接;
-c:通道名称;
-f:使用通道配置文件;
–tls:是否开启TLS加密传输协议;
–cafile:服务端的证书文件;
7. 将peer1.Org1节点加入通道peer channel join -b mychannel.block
peer channel join:加入通道;
-b:引用那个起始区块;
mychannel.block 是第6步创建通道时生成的文件,以通道名称命名,.block结尾;
cli客户端节点,通过下图的四个环境变量,使其默认与peer0.Org1节点连接,所以上一条命令, 我们将peer0.Org1这个节点加入了通道;
现在我们也需要修改这几个变量,使其连接其他节点,再将节点加入通道当中。
export CORE_PEER_ADDRESS=peer1.org1.example.com:7051 peer channel join -b mychannel.block7. 将peer0.Org2节点加入通道
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051 export CORE_PEER_LOCALMSPID=Org2MSP export CORE_PEER_MSPConFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/user/Admin@org2.example.com/msp peer channel join -b mychannel.block7. 将peer1.Org2节点加入通道
export CORE_PEER_ADDRESS=peer1.org2.example.com:7051 peer channel join -b mychannel.block8. 根据锚节点配置文件更新锚节点
8. 根据锚节点配置文件更新锚节点-Org2peer channel update -o orderer.example.com:7050 -c mychannel -f
./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx
peer channel update:更新通道;
-o:与某个排序节点连接;
-c:通道名称;
-f:使用通道配置文件,是第4步时生成的文件;
–tls:是否开启TLS加密传输协议;
–cafile:服务端的证书文件;
8. 根据锚节点配置文件更新锚节点-Org1因为我们现在连接的使peer1.Org2,所以我们先更新Org2组织的锚节点,因为我们在
configtx.yaml文件中的Organizations里设置了peer0.org2为锚节点,所以要修改环境变量, 连接到peer0.Org2节点;
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export CORE_PEER_LOCALMSPID=Org2MSP
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx
9. 安装链码因为我们现在连接的使peer0.Org2,并且我们在configtx.yaml文件中的Organizations里设置了peer0.org1为锚节点,所以要修改环境变量,连接到peer0.Org1节点;
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_MSPConFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx
9. 安装链码-peer0.Org1因为我们现在连接的是peer0.Org1节点,所以我们把链码安装到这个节点上,使其成为背书节点。
peer chaincode install -n mycc -v ${VERSION} -l ${LANGUAGE} -p ${CC_SRC_PATH}
在fabric-samples/first-network/scripts/script.sh文件里:
peer chaincode install:安装链码;
-n:链码名称,首次在这里定义;
-v:链码版本号,默认1.0;
-l:链码编程语言,使用golang;
-p:链码目录的路径,为容器中的路径,在docker-compose-cli.yaml里的cli容器,通过文件映 射连接宿主机的链码;
9. 安装链码-peer0.Org2peer chaincode install -n mycc -v 1.0 -l golang -p "github.com/chaincode/chaincode_example02/go/"
10. 实例化链码export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export CORE_PEER_LOCALMSPID=Org2MSP
export CORE_PEER_MSPConFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
peer chaincode install -n mycc -v 1.0 -l golang -p "github.com/chaincode/chaincode_example02/go/"
实例化链码,每条链码只需要实例化一次,重复实例化会报错。
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
peer chaincode instantiate:实例化链码;
-o:与某个排序节点连接;
-l:链码编程语言,使用golang;
–tls:是否开启TLS加密传输协议;
-v:链码版本号,默认1.0;
–cafile:服务端的证书文件;
-c:传输给链码的参数;
-C:通道名称;
-P:背书策略;
-n:链码名称;
因为现在连接的是peer0.Org2节点,所以这里是将peer0.Org2节点的链码实例化成容器,单独运行;
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -l
golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
11. 链码查询
12. 链码交互peer0.Org2的链码实例化操作后,其他的链码可以通过查询链码使其生成容器单独运行。
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_MSPConFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/user/Admin@org1.example.com/msp peer chaincode query -C mychannel -n mycc -c ‘{“Args”:[“query”,“a”]}’
peer chaincode query:链码查询;
-n:链码名称;
-C:通道名称;
-c:传输给链码的参数;
链码交互,应实例化时选择了 AND背书策略,所以在发起请求时,需要用–peerAddresses 指令 发送多条请求。
peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mycc --peerAddresses peer0.Org1.example.com:7051 --peerAddresses peer0.Org2.example.com:7051 -c '{"Args":["invoke","a","b","10"]}'
peer chaincode invoke:链码交互;
-C:通道名称;
-o:与某个排序节点连接;
-n:链码名称;
–tls:是否开启TLS加密传输协议;
-c:传输给链码的参数;
–cafile:服务端的证书文件;
–peerAddresses:背书节点地址;
–tlsRootCertFiles:背书节点的证书文件;



