peer channel create解析

peer channel create解析

目的

  1. peer channel create命令如何进行操作,以及操作选项
  2. peer channel create命令的内部逻辑流程分析(不涉及到远程orderer执行)

简介

peer channel create 是用于创建通道的命令,该命令首先构造一个common.Evelope的消息包,然后发送给orderer,由orderer完成通道的创建。而create构造消息的过程依赖于通道配置文件channel.tx,channel.tx的生成依赖于configtx.yaml。我们用一张图来展示整个流程的大致步骤:
peer channel create解析_第1张图片

那么创建通过命令执行后做了哪些事情?

  1. 创建了基于通道名称对应的通道
  2. 配置了通道上的锚节点?(虽然配置文件当中包含,但是待进一步确认

命令分析

命令选项

查看fabric文档Commands Reference部分,peer channel create的命令行选项如下:

参数名 含义
-o 连接的orderer的地址,hostname:port
-c channel的名称,默认为mychannel
-f 配置的交易信息(暂时还没搞清楚)
–tls 和orderer通信时是否启用tls
–cafile 使用tls时,所使用的orderer的证书

操作样例

我们以fabric/example/e2e_cli为例,在e2e_cli目录下中script/script.sh文件,createChannel函数中,创建channel语句为:

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >&log.txt

其中的变量含义如下:

变量名 含义
$CHANNEL_NAME 采用的是默认,为mychannel
$CORE_PEER_TLS_ENABLED /e2e_cli/base/peer-base.yaml中定义的环境变量,为true
- CORE_PEER_TLS_ENABLED=true
$ORDERER_CA orderer的证书
ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
目录在e2e_cli/crypto-config目录下

该命令执行过程:

  1. 发送消息,创建了channel,名字为$CHANNEL_NAME
  2. 获取创世区块,并且用protobuf进行序列化,本地生成了一个文件$CHANNEL_NAME.block

我们查fabric/protos/orderer/ab.ptoro当中rpc接口的定义描述。

service AtomicBroadcast {
    // broadcast receives a reply of Acknowledgement for each common.Envelope in order, indicating success or type of failure
    rpc Broadcast(stream common.Envelope) returns (stream BroadcastResponse) {}

    // deliver first requires an Envelope of type DELIVER_SEEK_INFO with Payload data as a mashaled SeekInfo message, then a stream of block replies is received.
    rpc Deliver(stream common.Envelope) returns (stream DeliverResponse) {}
}

update操作调用的是Broadcast接口,我们看到发送的数据类型是common.Envelope。那common.Envelope包含哪些内容呢?

我们从代码中分析,构造的消息类型是common.Envelope,而构造该消息的信息来自channel.tx,那我们继续追踪common.Evelope的构造过程,以及channel.tx如如何生成的。

源码分析

common.Envelope消息构造

fabric/peer/channel/create.go当中,我们顺着 createCmd函数进行分析createCmd -> create -> executeCreate -> sendCreateChainTransaction -> createChannelFromConfigTx/sanityCheckAndSignConfigTx;

再分析sanityCheckAndSignConfigTx函数sanityCheckAndSignConfigTx -> CreateSignedEnvelope,CreateSignedEnvelope即为整个功能的核心,包含了构造消息的过程,再结合代码上下文,得出以下数据构造流程图:
peer channel create解析_第2张图片

channel.tx文件的生成和查看

channel.tx文件生成

我们以example/e2e_cli为例,其生成文件的脚本为generateChannelArtifacts.sh

我们找到generateChannelArtifacts函数,该函数当中包含以下生成channel.tx文件的命令:

$CONFIGTXGEN -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

该命令是创建一个通道创建交易数据,执行该命令之后,channel.tx生成。

其中的变量的含义如下:

变量 含义
$CONFIGTXGEN 即configtxgen
$CHANNEL_NAME 通道名称

configtxgen依赖于configtx.yaml,而上面命令在生成channel.tx时是读取configtx.yaml的TwoOrgsChannel配置项。我们来看下TwoOrgsChannel相关的配置包含了一致性算法类型,所包含的组织

    TwoOrgsChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2

Org1和Org2的配置包含组织名称、ID、MSP目录、锚节点信息,详细如下:

- &Org1
        # DefaultOrg defines the organization which is used in the sampleconfig
        # of the fabric.git development environment
        Name: Org1MSP

        # ID to load the MSP definition as
        ID: Org1MSP

        MSPDir: crypto-config/peerOrganizations/org1.example.com/msp

        AnchorPeers:
            # AnchorPeers defines the location of peers which can be used
            # for cross org gossip communication.  Note, this value is only
            # encoded in the genesis block in the Application section context
            - Host: peer0.org1.example.com
              Port: 7051

    - &Org2
        # DefaultOrg defines the organization which is used in the sampleconfig
        # of the fabric.git development environment
        Name: Org2MSP

        # ID to load the MSP definition as
        ID: Org2MSP

        MSPDir: crypto-config/peerOrganizations/org2.example.com/msp

        AnchorPeers:
            # AnchorPeers defines the location of peers which can be used
            # for cross org gossip communication.  Note, this value is only
            # encoded in the genesis block in the Application section context
            - Host: peer0.org2.example.com
              Port: 7051

ApplicationDefaults的配置:

Application: &ApplicationDefaults

    # Organizations is the list of orgs which are defined as participants on
    # the application side of the network
    Organizations:

关于yaml的语法,可以参考阮一峰的科普教程YAML 语言教程。

总结一下:

channel.t是configtxgen通过根据配置文件configtx.yaml生成的,channel.tx大致包含以下信息:

  1. 通道名称
  2. 通道当中的组织
  3. 组织的锚节点

channel.tx文件查看

channel.tx实际上是经过序列化的protobuf数据,为了方便查看,可以转换成json格式;configtxgen也提供查看的命令。

可以通过工具configtxgen查看json格式数据

configtxgen -inspectChannelCreateTx channel.tx

问题

orderer.example.com域名是如何解析的?

我们注意到,在channel.tx文件生成小结中,peer channel create命令连接了orderer服务地址(orderer.example.com:7050):

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >&log.txt

该orderer服务地址是通过域名来表示的,在fabric整个网络中是通过什么实现的呢?

查看资料我们了解到,docker-compose本身就支持通过servicename进行访问,因此可以通过这种方式访问。

参考:Networking in Compose

channel.tx文件分析?

在channel.tx文件查看小节中,channel.tx可以转换成json数据进行查看,json格式含义以及字段含义,实际和configtx.yaml存在什么样的关系?单独一篇进行分分析

参考

  1. Channel Configuration (configtxgen)
  2. Networking in Compose

你可能感兴趣的:(hyperledger,fabric)