栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

两万字整理Fabric(超级账本) 配置文件 掌握了它就掌握了Fabric的核心

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

两万字整理Fabric(超级账本) 配置文件 掌握了它就掌握了Fabric的核心

导语:文章没有重复的地方,没有废话,如果能帮助到你,那是我的荣幸,记得一键三连哟

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. 链码交互

一、四个核心配置文件

1、crypto-config.yaml
2、configtx.yaml
3、docker-compose-cli.yaml
4、byfn.sh

二、Fabric 的核心配置文件

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. 生成认证证书;
  2. 生成起始区块;
  3. 创建通道配置文件;
  4. 创建组织锚节点配置文件;
  5. docker 容器启动;
  6. 根据通道配置文件生成通道
  7. 将节点加入通道;
  8. 根据锚节点配置文件更新锚节点;
  9. 安装链码;
  10. 实例化链码;
  11. 链码交互;
  12. 链码查询;
1. 生成认证证书

crytogen 组件,为每一个组织生成MSP 所需要的证书与密钥,它与crypto-config.yaml文件配
套使用,在命令行输入以下命令:
cd $HOME/fabric-samples/first-network cryptogen
generate --config=./crypto-config.yaml
会在当前目录下自动生成crypto-config目录,里边存放了所有的证书与密钥,为MSP 提供服务;

crypto-config.yaml

Name:组织名称
Domain:组织域名
Specs:

  • Hostname:自定义节点名称
    Template:使用模板定义节点名称 peer($Count +1)
  • Count:节点数量
    Users:用户名称 user$Count
  • Count:用户数量
2. 生成起始区块

configtxgen 组件,用于生成通道创世区块或通道交易的配置文件,需要与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

configtx.yaml

该文件总共有六个配置段:
Organizations:定义了各组织机构的名称、MSPID、MSP目录、读写策略等;
Capabilities:能力定义,设定了不同版本的节点所能做的事情;
Application:定义了要写入创世区块或配置交易的应用参数。
Orderer:定义了通道的共识模式与区块的相关信息;
Channel:定义了通道中相关API的调用权限;
Profiles:定义configtxgen工具的相关配置入口;

Organizations:

Name:在网络中的名称
ID:MSP中的唯一ID
MSPDir:msp的相关目录
Policies:读写策略
AnchorPeers:锚节点配置

Capabilities:

Capabilities段用来定义fabric网络的能力。这是版本v1.1.0引入的一个新的配置段,当与版本
v1.0.x的对等节点与排序节点混合组网时不可使用。
Capabilities段定义了fabric程序要加入网络所必须支持的特性。例如,如果添加了一个新的
MSP类型,那么更新的程序可能会根据该类型识别并验证签名,但是老版本的程序就没有办法验
证这些交易。这可能导致不同版本的fabric程序中维护的世界状态不一致。
因此,通过定义通道的能力,就明确了不满足该能力要求的fabric程序,将无法处理交易,除非
升级到新的版本。对于v1.0.x的程序而言,如果在Capabilities段定义了任何能力,即使声明不
需要支持这些能力,都会导致其有意崩溃。

Application:

这一部分后续由应用程序端进行配置;

Orderer:

Channel:

Profiles:

configtxgen 工具 -profile 命令 后接的名称要与profiles 下的字段 匹配;

3. 创建通道配置文件

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. 创建组织锚节点配置文件

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配置段的定义一致;
锚节点每个组织至少有一个,有多少个锚节点就创建多少个锚节点配置文件;

4.1 创建Org1组织锚节点配置文件
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP

4.2 创建Org2组织锚节点配置文件
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP


4.3关闭TLS传输

修改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字段的环境变量注释掉;

5. docker 容器启动

使用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 -d

docker-compose-cli.yaml

此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:端口映射信息;
  • “宿主机端口:容器端口”
cli客户端节点

客户端节点cli的环境变量配置;

orderer排序节点

排序节点orderer的环境变量配置;

peer对等节点

对等节点peer的环境变量配置;

进入docker容器

当执行到第5步,启动docker容器后,在byfn.sh脚本的195行,使用了exec命令,执行了cli容
器里的脚本文件。所以接下来的命令都是在cli容器中执行的;

所以,我们需要进入到cli容器中:
docker exec -it cli bash
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端 bash:可执行shell命令

6. 根据通道配置文件生成通道

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. 将peer0.Org1节点加入通道

peer channel join -b mychannel.block
peer channel join:加入通道;
-b:引用那个起始区块;
mychannel.block 是第6步创建通道时生成的文件,以通道名称命名,.block结尾;

7. 将peer1.Org1节点加入通道

cli客户端节点,通过下图的四个环境变量,使其默认与peer0.Org1节点连接,所以上一条命令, 我们将peer0.Org1这个节点加入了通道;

现在我们也需要修改这几个变量,使其连接其他节点,再将节点加入通道当中。

export CORE_PEER_ADDRESS=peer1.org1.example.com:7051 peer channel join -b mychannel.block

7. 将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.block

7. 将peer1.Org2节点加入通道
export CORE_PEER_ADDRESS=peer1.org2.example.com:7051 
peer channel join -b mychannel.block

8. 根据锚节点配置文件更新锚节点

peer 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. 根据锚节点配置文件更新锚节点-Org2

因为我们现在连接的使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

8. 根据锚节点配置文件更新锚节点-Org1

因为我们现在连接的使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节点,所以我们把链码安装到这个节点上,使其成为背书节点。
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.Org1

peer chaincode install -n mycc -v 1.0 -l golang -p "github.com/chaincode/chaincode_example02/go/"

9. 安装链码-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/users/Admin@org2.example.com/msp
peer chaincode install -n mycc -v 1.0 -l golang -p "github.com/chaincode/chaincode_example02/go/"

10. 实例化链码

实例化链码,每条链码只需要实例化一次,重复实例化会报错。
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. 链码查询

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:传输给链码的参数;

12. 链码交互

链码交互,应实例化时选择了 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:背书节点的证书文件;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/308464.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号