peer channel create 是用于创建通道的命令,该命令首先构造一个common.Evelope的消息包,然后发送给orderer,由orderer完成通道的创建。而create构造消息的过程依赖于通道配置文件channel.tx,channel.tx的生成依赖于configtx.yaml。我们用一张图来展示整个流程的大致步骤:
那么创建通过命令执行后做了哪些事情?
查看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 目录下 |
该命令执行过程:
$CHANNEL_NAME
$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如如何生成的。
在fabric/peer/channel/create.go
当中,我们顺着 createCmd函数进行分析createCmd -> create -> executeCreate -> sendCreateChainTransaction -> createChannelFromConfigTx/sanityCheckAndSignConfigTx
;
再分析sanityCheckAndSignConfigTx函数sanityCheckAndSignConfigTx -> CreateSignedEnvelope
,CreateSignedEnvelope即为整个功能的核心,包含了构造消息的过程,再结合代码上下文,得出以下数据构造流程图:
我们以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大致包含以下信息:
channel.tx实际上是经过序列化的protobuf数据,为了方便查看,可以转换成json格式;configtxgen也提供查看的命令。
可以通过工具configtxgen查看json格式数据
configtxgen -inspectChannelCreateTx channel.tx
我们注意到,在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可以转换成json数据进行查看,json格式含义以及字段含义,实际和configtx.yaml存在什么样的关系?单独一篇进行分分析