天天看点

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

这篇文章上接:ubuntu18.04 快速搭建 Hyperledger Fabric超级账本框架,为了更好的了解Fabric1.4运行时的工作原理,下面自己动手部署first-network。

文章目录

    • 在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network
      • 1. 准备工作
      • 2. 手动部署
        • 1. 生成MSP证书
        • 2. 自己动手修改生成MSP证书的代码
        • 3. 生成配置交易
        • 4. 启动测试网络
        • 5. 参考文献
        • 6. 后记

1. 准备工作

首先在

fabric-samples/first-network

文件夹下运行

./byfn.sh up

命令,若成功运行才可进行手动部署的操作,运行成功后输入

./byfn.sh down

命令关闭网络。每次修改源代码且运行后,下次运行之前都要 运行

./byfn.sh down

关闭之前的网络

2. 手动部署

1. 生成MSP证书

终端进入

fabric-samples/first-network

文件下,运行以下命令:

../bin/cryptogen generate --config=./crypto-config.yaml
           

执行成功出现以下结果:

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

这个步骤的是使用

cryptogen工具

,根据

crypto-config.yaml

配置生成MSP证书,同时当前目录中会生成

crypto-config

文件夹,文件夹中包括

ordererOrganizations

peerOrganizations

两个文件夹,其中包含了排序服务组织机构的证书和Peer节点的证书。

cryptogen

的作用是为各种网络实体材料生成加密材料(x509证书和签名秘钥),网络实体进行通信和交易时,使用加密材料进行签名和认证。和其他区块链网络一样,fabric中的交易和通信也是通过实体的私钥(keystore)进行签名,通过公钥(signcerts)进行验证。

cryptogen

使用

crypto-config.yaml

作为参数配置,这个文件里面包含网络拓扑,并为组织和属于这个组织的实体(orderer和peer)生成证书库。每个组织被分配一个唯一根证书(ca-cert),该证书讲指定的实体与组织绑定。

​ 下面我们看一下

crypto-config.yaml

中的代码片段:

​ 这部分为orderer节点的代码

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 网络实体的命名约定为{{.Hostname}}.{{.Domain}}。此order节点使用Space方式

​ 这部分为peer节点的代码

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 对文件不做任何修改,使用

tree crypto-config -L 4

查看

crypto-config

文件下的目录结构如图所示:

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

2. 自己动手修改生成MSP证书的代码

​ 下面我们对

org2.example.com

下的代码进行修改

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 运行:

../bin/cryptogen generate --config=./crypto-config.yaml
           

​ 再次使用tree命令查看

crypto-config

下的文件结构。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQs21z1Y-1590929339687)(/home/jsm/.config/Typora/typora-user-images/image-20200526085704234.png)]

​ 现在修改 orderer节点的代码,修改之前的目录结构为:

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 修改代码:

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 修改后orderer节点的目录结构:

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 可见

Space``Template

参数可以混合用,也可随便单独用一个,修改orderer节点的

Users

参数貌似没用 现在不知道是因为我操作的问题,还是本来就是这样。

3. 生成配置交易

使用

configtxgen

生成配置交易,它会生成4个配置网络工件:genesis.block(创世纪区块)、channel.tx(通道配置交易)、Org1MSPanchors.tx(锚节点交易)、Org2MSPanchors.tx(锚节点交易)。

configtxgen

的配置参数放在

configtx.yaml

文件中。

​ 首先我们告诉

configtxgen

工作的目录,方便它查找

configtx.yaml

export FABRIC_CFG_PATH=$PWD
           

​ 然后生成orderer创世纪区块

../bin/configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
           
在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 创建通道配置交易

export CHANNEL_NAME=mychannel
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
           
在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 定义通道中Org1的锚节点

../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
           

​ 定义通道中Org2锚节点

../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
           

​ 终端输出:

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 上述4个工件保存在

channel-artifacts

目录下 若都运行成功会看到

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 锚节点是一个peer节点,在一个网络中,有多个组织,每个组织有多个peer节点组织和组织之间需要通信,那么每个组织中选取一个peer节点作为代表进行通信,我们就称这个peer节点为锚节点,锚节点的职责就是代表当前这个组织和其他的组织进行通信,我们可以在配置文件中指定锚节点,任意的peer节点都有资格成为锚节点,但是一个组织最多有一个锚节点。 创世纪区块是排序服务的创世区块;通道配置交易在通道创建时广播给orderer;锚节点交易指定通道上每个组织的锚节点。

​ 下面我们看一下

configtx.yaml

配置文件中的内容

​ 定义peer节点的参数

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 定义orderer节点共识机制相关参数

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 满足

BatchTimeout

MaxMessageCount

AbsoluteMaxBytes

PerferredMaxBytes

中的任何一个条件orderer都会打块。并且这4个参数还影响fabric网络的性能,如何最优都需要根据环境的不同进行调参。

4. 启动测试网络

  • 进入网络

    fabric网络需要进入Docker中启动,引用

    docker-compose-cli.yaml

    文件启动docker
    # 不看网络启动日志
    docker-compose -f docker-compose-cli.yaml up -d
    # 看网络启动日志、
    docker-compose -f docker-compose-cli.yaml up
               
    docker exec -it cli bash
               
    若成功显示:
    在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network
  • 创建通道
    export CHANNEL_NAME=mychannel
    export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile $ORDERER_CA
               
    出现下图表示成功
    在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

    peer channel create

    会返回一个创世纪区块,区块名为

    通道名.block

    ,因为我们的通道名称为

    mychannel

    , 所以返回的区块名为

    mychannel.block

    -c

    表示通道名称为

    $CHANNEL_NAME

    通道名称必须全为小写;

    -f

    表示通道配置交易

    channel.tx

    ,其包含了指定的配置信息,

    channel.tx

    文件被挂载到

    CLI

    容器中的

    channel-artifacts

    目录中;

    --tls --cafile

    指定

    ORDERER_CA

    的根证书路径,要求节点验证TLS握手。
  • peer0.org1

    加入通道
    peer channel join -b mychannel.block
               
    在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network
    更新通道,将

    peer0.org1

    设为锚节点
    peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile $ORDERER_CA 
               
    在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

    peer0.org1

    安装链码
    peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
               
    在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network
  • 实例化链码
    peer chaincode instantiate -o orderer.example.com:7050 --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 -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR('Org1MSP.peer','Org2MSP.peer')"
               
    出现:
    在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

    -P

    是我们指定的策略为

    "OR('Org1MSP.peer','Org2MSP.peer')"

    ,表示我们只需要一个属于Org1或Org2的”背书“,若将

    OR

    改为

    AND

    则意味着我们需要两个”背书“。

    ​ 我们在实例化链码时也进行了初始化,即将

    a

    赋值为

    100

    b

    赋值为

    200

    ,可以通过下列命令对

    a

    的值进行查询:
    peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
               
    ​ 结果为

    100

    ,将命令后面的参数由

    a

    改为

    b

    ,可以对

    b

    的值进行查询。

    ​ 另外由于我们是在

    peer0.org1

    的环境中将链码实例化的,所以在另外的终端输入

    docker ps

    命令,会看到

    NAME

    dev-peer0.org1.example.com-mycc-1.0

    的容器,链码会在这个容器中运行,任何安装(

    peer chaincode install

    )链码的peer,在被调用时都会检查是否生成了链码容器,若没有就会首先生成。且不不管链码在那个

    peer

    中被实例化,都只能实例化一次。且实例化节点必须为

    Admin

  • peer0.org2

    加入通道

    ​ 将通道中的环境改为

    peer0.org2

    (之前是

    peer0.org1

    ),具体操作就是设置

    peer0.org2

    环境变量,
    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
    CORE_PEER_ADDRESS=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
               
    然后输入以下命令:
    # 加入通道
    peer channel join -b mychannel.block
    # 更新通道,定义锚节点
     peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile $ORDERER_CA
     # 安装链码
     peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
               
    然后查询

    a

    的值,测试是否加入成功,命令同上。成功后开始进行转账交易:将a移动10个到b。
    # 配置环境变量,声明peer0.org1的MSP地址
    PEER0_ORG1_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
    # 转账将a移动10个到b
    peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -nmycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA -c '{"Args":["invoke", "a", "b", "10"]}'
               
    因为在实例化链码时我们声明指定的策略是

    "OR('Org1MSP.peer','Org2MSP.peer')"

    只需要一个节点MSP(背书),所以此次转账交易我们只用到了

    peer0.org1

    这一个节点的背书。若声明为

    "AND('Org1MSP.peer','Org2MSP.peer')"

    则需要两个节点MSP(背书),则首先指定

    peer0.org2

    的MSP地址,然后使用

    --peerAddresses

    命令指定多个背书,转账命令改为:
    # 配置环境变量,声明peer0.org1的MSP地址
    PEER0_ORG2_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
    peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -nmycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"Args":["invoke", "a", "b", "10"]}'
               
    再次查询a、b的值:
    # 查询a
    peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
    # 结果应为90
    # 查询b
    peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","b"]}'
    # 结果应为210
               

5. 参考文献

  • https://blog.csdn.net/zxc87545586/article/details/89400941
  • Hyperledger Fabric核心技术 第三章
  • Fabric 的官方概念 https://www.jianshu.com/p/8d775a1c76e0
  • peer和orderer的作用:https://blog.csdn.net/qq_36336522/article/details/85216240

6. 后记

​ 恭喜你,一路看到这里,如果以上步骤都顺利完成的话,一个简单的fabric网络就算搭建成功了。但是细心的网友可能会发现,在生成MSP证书时,共定义了两个组织,每个组织有定义了两个peer节点时如图:

在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network

​ 现在我们只是将

peer0.org1

peer0.org2

加入了通道,还有

peer1.org1

peer1.org2

没有加入,这个两个peer节点就请读者自己完成。需要注意的是每一次将一个新的peer节点加入通道时都需要将环境变量更改为这个新的peer节点。

​ 这篇文章断断续续写了一周快两周的时间,在此过程中付出了很多的时间,往往一个小的章节结就需要查很多的资料,唯恐自己描述的有误,贻笑大方,但是付出总是有回报的,自己也学到了很多知识。

奋斗吧,少年!!!

​ 最后如果你觉得我写的还可以的话,请鼓励一下下吧!!!

支付宝 微信
在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network
在Ubuntu 18.04的Hyperledger Fabric1.4中手动部署first-network