peer channel create解析
peer channel create解析
目的
簡介
peer channel create 是用于創(chuàng)建通道的命令,該命令首先構(gòu)造一個common.Evelope的消息包,然后發(fā)送給orderer,由orderer完成通道的創(chuàng)建。而create構(gòu)造消息的過程依賴于通道配置文件channel.tx,channel.tx的生成依賴于configtx.yaml。我們用一張圖來展示整個流程的大致步驟:
那么創(chuàng)建通過命令執(zhí)行后做了哪些事情?
命令分析
命令選項
查看fabric文檔Commands Reference部分,peer channel create的命令行選項如下:
| -o | 連接的orderer的地址,hostname:port |
| -c | channel的名稱,默認(rèn)為mychannel |
| -f | 配置的交易信息(暫時還沒搞清楚) |
| –tls | 和orderer通信時是否啟用tls |
| –cafile | 使用tls時,所使用的orderer的證書 |
操作樣例
我們以fabric/example/e2e_cli為例,在e2e_cli目錄下中script/script.sh文件,createChannel函數(shù)中,創(chuàng)建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 | 采用的是默認(rèn),為mychannel |
| $CORE_PEER_TLS_ENABLED | /e2e_cli/base/peer-base.yaml中定義的環(huán)境變量,為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目錄下 |
該命令執(zhí)行過程:
我們查fabric/protos/orderer/ab.ptoro當(dāng)中rpc接口的定義描述。
service AtomicBroadcast {// broadcast receives a reply of Acknowledgement for each common.Envelope in order, indicating success or type of failurerpc 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操作調(diào)用的是Broadcast接口,我們看到發(fā)送的數(shù)據(jù)類型是common.Envelope。那common.Envelope包含哪些內(nèi)容呢?
我們從代碼中分析,構(gòu)造的消息類型是common.Envelope,而構(gòu)造該消息的信息來自channel.tx,那我們繼續(xù)追蹤common.Evelope的構(gòu)造過程,以及channel.tx如如何生成的。
源碼分析
common.Envelope消息構(gòu)造
在fabric/peer/channel/create.go當(dāng)中,我們順著 createCmd函數(shù)進(jìn)行分析createCmd -> create -> executeCreate -> sendCreateChainTransaction -> createChannelFromConfigTx/sanityCheckAndSignConfigTx;
再分析sanityCheckAndSignConfigTx函數(shù)sanityCheckAndSignConfigTx -> CreateSignedEnvelope,CreateSignedEnvelope即為整個功能的核心,包含了構(gòu)造消息的過程,再結(jié)合代碼上下文,得出以下數(shù)據(jù)構(gòu)造流程圖:
channel.tx文件的生成和查看
channel.tx文件生成
我們以example/e2e_cli為例,其生成文件的腳本為generateChannelArtifacts.sh
我們找到generateChannelArtifacts函數(shù),該函數(shù)當(dāng)中包含以下生成channel.tx文件的命令:
$CONFIGTXGEN -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME該命令是創(chuàng)建一個通道創(chuàng)建交易數(shù)據(jù),執(zhí)行該命令之后,channel.tx生成。
其中的變量的含義如下:
| $CONFIGTXGEN | 即configtxgen |
| $CHANNEL_NAME | 通道名稱 |
configtxgen依賴于configtx.yaml,而上面命令在生成channel.tx時是讀取configtx.yaml的TwoOrgsChannel配置項。我們來看下TwoOrgsChannel相關(guān)的配置包含了一致性算法類型,所包含的組織
TwoOrgsChannel:Consortium: SampleConsortiumApplication:<<: *ApplicationDefaultsOrganizations:- *Org1- *Org2Org1和Org2的配置包含組織名稱、ID、MSP目錄、錨節(jié)點信息,詳細(xì)如下:
- &Org1# DefaultOrg defines the organization which is used in the sampleconfig# of the fabric.git development environmentName: Org1MSP# ID to load the MSP definition asID: Org1MSPMSPDir: crypto-config/peerOrganizations/org1.example.com/mspAnchorPeers:# 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.comPort: 7051- &Org2# DefaultOrg defines the organization which is used in the sampleconfig# of the fabric.git development environmentName: Org2MSP# ID to load the MSP definition asID: Org2MSPMSPDir: crypto-config/peerOrganizations/org2.example.com/mspAnchorPeers:# 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.comPort: 7051ApplicationDefaults的配置:
Application: &ApplicationDefaults# Organizations is the list of orgs which are defined as participants on# the application side of the networkOrganizations:關(guān)于yaml的語法,可以參考阮一峰的科普教程YAML 語言教程。
總結(jié)一下:
channel.t是configtxgen通過根據(jù)配置文件configtx.yaml生成的,channel.tx大致包含以下信息:
channel.tx文件查看
channel.tx實際上是經(jīng)過序列化的protobuf數(shù)據(jù),為了方便查看,可以轉(zhuǎn)換成json格式;configtxgen也提供查看的命令。
可以通過工具configtxgen查看json格式數(shù)據(jù)
configtxgen -inspectChannelCreateTx channel.tx問題
orderer.example.com域名是如何解析的?
我們注意到,在channel.tx文件生成小結(jié)中,peer channel create命令連接了orderer服務(wù)地址(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服務(wù)地址是通過域名來表示的,在fabric整個網(wǎng)絡(luò)中是通過什么實現(xiàn)的呢?
查看資料我們了解到,docker-compose本身就支持通過servicename進(jìn)行訪問,因此可以通過這種方式訪問。
參考:Networking in Compose
channel.tx文件分析?
在channel.tx文件查看小節(jié)中,channel.tx可以轉(zhuǎn)換成json數(shù)據(jù)進(jìn)行查看,json格式含義以及字段含義,實際和configtx.yaml存在什么樣的關(guān)系?單獨一篇進(jìn)行分分析
參考
總結(jié)
以上是生活随笔為你收集整理的peer channel create解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【DP】跳格子
- 下一篇: element ui实现抽屉效果_抽屉效