我們將構造一個包含3個機構的Hyperledger Fabric網絡:Org1、Org2和Org3,每個機構中包含一個節點Peer0。網絡包含兩個通道:由Org1、Org2和Org3組成的ChannelAll,以及由Org1和Org2組成的Channel12,因此這個Fabric網絡是多通道的配置。在這兩個Fabric通道上我們將部署同樣的鏈碼,即Fabrc-Samples中提供的Simple Asset鏈碼:
Step 1:在Hyperledger官方提供的fabric-samples目錄下克隆本教程提供的示例代碼:
cdfabric-samplesgitclonehttps://github.com/kctam/3org2ch_143.gitcd3org2ch_143
Step 2:為參與Fabric通道的機構生成所需的密碼學資料
../bin/cryptogengenerate--config=./crypto-config.yaml
Step 3:生成Fabric通道素材
mkdirchannel-artifacts&&exportFABRIC_CFG_PATH=$PWD../bin/configtxgen-profileOrdererGenesis\-outputBlock./channel-artifacts/genesis.blockexportCHANNEL_ONE_NAME=channelallexportCHANNEL_ONE_PROFILE=ChannelAllexportCHANNEL_TWO_NAME=channel12exportCHANNEL_TWO_PROFILE=Channel12../bin/configtxgen-profile${CHANNEL_ONE_PROFILE}\-outputCreateChannelTx./channel-artifacts/${CHANNEL_ONE_NAME}.tx\-channelID$CHANNEL_ONE_NAME../bin/configtxgen-profile${CHANNEL_TWO_PROFILE}\-outputCreateChannelTx./channel-artifacts/${CHANNEL_TWO_NAME}.tx\-channelID$CHANNEL_TWO_NAME../bin/configtxgen-profile${CHANNEL_ONE_PROFILE}\-outputAnchorPeersUpdate./channel-artifacts/Org1MSPanchors_${CHANNEL_ONE_NAME}.tx\-channelID$CHANNEL_ONE_NAME-asOrgOrg1MSP../bin/configtxgen-profile${CHANNEL_ONE_PROFILE}\-outputAnchorPeersUpdate./channel-artifacts/Org2MSPanchors_${CHANNEL_ONE_NAME}.tx\-channelID$CHANNEL_ONE_NAME-asOrgOrg2MSP../bin/configtxgen-profile${CHANNEL_ONE_PROFILE}\-outputAnchorPeersUpdate./channel-artifacts/Org3MSPanchors_${CHANNEL_ONE_NAME}.tx\-channelID$CHANNEL_ONE_NAME-asOrgOrg3MSP../bin/configtxgen-profile${CHANNEL_TWO_PROFILE}\-outputAnchorPeersUpdate./channel-artifacts/Org1MSPanchors_${CHANNEL_TWO_NAME}.tx\-channelID$CHANNEL_TWO_NAME-asOrgOrg1MSP../bin/configtxgen-profile${CHANNEL_TWO_PROFILE}\-outputAnchorPeersUpdate./channel-artifacts/Org2MSPanchors_${CHANNEL_TWO_NAME}.tx\-channelID$CHANNEL_TWO_NAME-asOrgOrg2MSP
Step 4:啟動所有的容器,最后應當看到有5個容器
docker-composeup-ddockerps
Step 5:為了便于演示,開啟3個終端,并設置排序節點的CA
Org1
dockerexec-itclibashexportORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
Org2
dockerexec-e"CORE_PEER_LOCALMSPID=Org2MSP"\-e"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"\-e"CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp"\-e"CORE_PEER_ADDRESS=peer0.org2.example.com:7051"\-itclibashexportORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
Org3
dockerexec-e"CORE_PEER_LOCALMSPID=Org3MSP"\-e"CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt"\-e"CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp"\-e"CORE_PEER_ADDRESS=peer0.org3.example.com:7051"\-itclibashexportORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
Step 5:在Fabric網絡中創建多通道,并將各peer節點分別加入多個通道
首先創建channelall通道,并將3個機構的節點都加入該通道:
Org1
peerchannelcreate-oorderer.example.com:7050-cchannelall\-f/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/channelall.tx\--tls--cafile$ORDERER_CApeerchanneljoin-bchannelall.block--tls--cafile$ORDERER_CApeerchannelupdate-oorderer.example.com:7050-cchannelall\-f/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/Org1MSPanchors_channelall.tx\--tls--cafile$ORDERER_CA
Org2
peerchanneljoin-bchannelall.block--tls--cafile$ORDERER_CApeerchannelupdate-oorderer.example.com:7050-cchannelall\-f/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/Org2MSPanchors_channelall.tx\--tls--cafile$ORDERER_CA
Org3
peerchanneljoin-bchannelall.block--tls--cafile$ORDERER_CApeerchannelupdate-oorderer.example.com:7050-cchannelall\-f/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/Org3MSPanchors_channelall.tx\--tls--cafile$ORDERER_CA
然后創建channel12,并將Org1和Org2都加入該通道:
Org1
peerchannelcreate-oorderer.example.com:7050-cchannel12\-f/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/channel12.tx\--tls--cafile$ORDERER_CApeerchanneljoin-bchannel12.block--tls--cafile$ORDERER_CApeerchannelupdate-oorderer.example.com:7050-cchannel12\-f/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/Org1MSPanchors_channel12.tx\--tls--cafile$ORDERER_CA
Org2
peerchanneljoin-bchannel12.block--tls--cafile$ORDERER_CApeerchannelupdate-oorderer.example.com:7050-cchannel12\-f/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/Org2MSPanchors_channel12.tx\--tls--cafile$ORDERER_CA
Step 6:檢查各節點已經加入的Fabric通道
在各節點對應的終端中使用如下命令查看當前節點加入的通道:
peerchannellist
你應當可以看到org1和org2分別加入了兩個通道,而org3則只加入了一個通道。
如果一切順利,現在你就有了一個包含3個機構的多通道Fabric網絡,可以用于測試 任何鏈碼了。
Step 7:在測試完畢后記得清理實驗環境,命令如下:
docker-composedown-vdockerrm$(dockerps-aq)dockerrmi$(dockerimagesdev-*-q)
現在我們的Fabric多通道實驗網絡已經起來了,可以開始部署鏈碼了。
我們使用fabric-samples內置的SACC鏈碼,其內容如下:
/**CopyrightIBMCorpAllRightsReserved**SPDX-License-Identifier:Apache-2.0*/packagemainimport("fmt""github.com/hyperledger/fabric/core/chaincode/shim""github.com/hyperledger/fabric/protos/peer")//SimpleAssetimplementsasimplechaincodetomanageanassettypeSimpleAssetstruct{}//Initiscalledduringchaincodeinstantiationtoinitializeany//data.Notethatchaincodeupgradealsocallsthisfunctiontoreset//ortomigratedata.func(t*SimpleAsset)Init(stubshim.ChaincodeStubInterface)peer.Response{//Gettheargsfromthetransactionproposalargs:=stub.GetStringArgs()iflen(args)!=2{returnshim.Error("Incorrectarguments.Expectingakeyandavalue")}//Setupanyvariablesorassetsherebycallingstub.PutState()//Westorethekeyandthevalueontheledgererr:=stub.PutState(args[0],[]byte(args[1]))iferr!=nil{returnshim.Error(fmt.Sprintf("Failedtocreateasset:%s",args[0]))}returnshim.Success(nil)}//Invokeiscalledpertransactiononthechaincode.Eachtransactionis//eithera'get'ora'set'ontheassetcreatedbyInitfunction.TheSet//methodmaycreateanewassetbyspecifyinganewkey-valuepair.func(t*SimpleAsset)Invoke(stubshim.ChaincodeStubInterface)peer.Response{//Extractthefunctionandargsfromthetransactionproposalfn,args:=stub.GetFunctionAndParameters()varresultstringvarerrerroriffn=="set"{result,err=set(stub,args)}else{//assume'get'eveniffnisnilresult,err=get(stub,args)}iferr!=nil{returnshim.Error(err.Error())}//Returntheresultassuccesspayloadreturnshim.Success([]byte(result))}//Setstorestheasset(bothkeyandvalue)ontheledger.Ifthekeyexists,//itwilloverridethevaluewiththenewonefuncset(stubshim.ChaincodeStubInterface,args[]string)(string,error){iflen(args)!=2{return"",fmt.Errorf("Incorrectarguments.Expectingakeyandavalue")}err:=stub.PutState(args[0],[]byte(args[1]))iferr!=nil{return"",fmt.Errorf("Failedtosetasset:%s",args[0])}returnargs[1],nil}//Getreturnsthevalueofthespecifiedassetkeyfuncget(stubshim.ChaincodeStubInterface,args[]string)(string,error){iflen(args)!=1{return"",fmt.Errorf("Incorrectarguments.Expectingakey")}value,err:=stub.GetState(args[0])iferr!=nil{return"",fmt.Errorf("Failedtogetasset:%switherror:%s",args[0],err)}ifvalue==nil{return"",fmt.Errorf("Assetnotfound:%s",args[0])}returnstring(value),nil}//mainfunctionstartsupthechaincodeinthecontainerduringinstantiatefuncmain(){iferr:=shim.Start(new(SimpleAsset));err!=nil{fmt.Printf("ErrorstartingSimpleAssetchaincode:%s",err)}}
Fabric Samples提供的SACC鏈碼的邏輯很簡單:
當鏈碼實例化時就會執行Init()
函數,該函數需要兩個參數,分別對應鍵和值
將傳入Init()函數的鍵/值對使用PutState方法保存到賬本中
在鏈碼實例化之后,對交易的處理是由Invoke()
函數來負責的。 該函數的參數 包括一個方法名以及若干參數。
如果調用Invoke()函數時方法名為set,那么就需要傳入兩個參數,分別表示要 設置的鍵和值
如果調用Invoke()函數時方法名為get,那么就需要一個參數,表示要讀取的鍵
通過鏈碼安裝操作,就可以在各節點上啟動鏈碼。注意在鏈碼實例化之前還不可用。
在各節點對應的終端中使用如下命令安裝鏈碼:
peerchaincodeinstall-nsacc-pgithub.com/chaincode/sacc-v1.0
我們應當可以看到如下的輸出結果:
現在所有的節點上都安裝了SACC鏈碼,我們可以實例化這個鏈碼了。
首先我們看包含所有三個機構的ChannelAll通道。
在Org1對應的終端中,在ChannelAll通道上實例化鏈碼:
peerchaincodeinstantiate-oorderer.example.com:7050--tls\--cafile$ORDERER_CA-Cchannelall-c'{"Args":["a","100"]}'\-nsacc-v1.0-P"OR('Org1MSP.peer','Org2MSP.peer','Org3MSP.peer')"
我們設置了初始的鍵/值對為a/100。此外我們設置了背書策略:OR
表示只需要3個機構中的任何一個背書即可。
現在讓我們在通道ChannelAll上查詢鍵a
的值。
進入Org1對應的終端,運行如下命令:
peerchaincodequery-Cchannelall-nsacc-c'{"Args":["get","a"]}'
結果如下:
現在在Org2對應的終端中運行如下命令:
peerchaincodequery-Cchannelall-nsacc-c'{"Args":["get","a"]}'
結果如下:
現在在Org3對應的終端中運行如下命令:
peerchaincodequery-Cchannelall-nsacc-c'{"Args":["get","a"]}'
結果如下:
現在我們可以看到在三個節點上得到了相同的值,它們共享同一個賬本。
現在讓我們在通道Channel12上實例化這個SACC鏈碼。
在Org1對應的終端中,運行如下命令:
peerchaincodeinstantiate-oorderer.example.com:7050\--tls--cafile$ORDERER_CA-Cchannel12\-c'{"Args":["b","200"]}'-nsacc-v1.0\-P"OR('Org1MSP.peer','Org2MSP.peer')"
這次我們將初始的鍵/值對設置為b/200
,背書策略為任一機構完成背書即可。
還是從Org1開始:
peerchaincodequery-Cchannel12-nsacc-c'{"Args":["get","b"]}'
結果如下:
然后進入Org2對應的終端:
peerchaincodequery-Cchannel12-nsacc-c'{"Args":["get","b"]}'
結果如下:
如果我們在Org3對應的終端運行同樣的命令,就會看到提示禁止訪問。這是 因為Org3沒有加入通道Channel12:
peerchaincodequery-Cchannel12-nsacc-c'{"Args":["get","b"]}'
結果如下:
如果我們嘗試在通道Channel12上讀取鍵a
的值,會發現提示沒有定義a
。 在Hyperledger Fabric中,每個通道都有自己的賬本,不同通道的狀態是不共享的。
在Org1和Org2的終端中運行如下命令:
peerchaincodequery-Cchannel12-nsacc-c'{"Args":["get","a"]}'
結果如下:
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
在我們國家有一種退休政策叫內退政策,內退的工齡是怎么規定的2022年國企取消職工內退政策了,距法定退休5年以內或工齡滿30年以上的員工,經與企業洽談一致,可實行內部退養。內退期間由企業逐月為其發放生活費,交納各項社會保險費。生活費規范依據企業付出才能由企業與內退人員洽談斷定,但最低不得低于當地下崗員工第一年的 生活費規范,即當地失業保險金規范的120%?!秳趧臃ā窙]有規定內退,以下是勞社部發布的關...
浙江農村信用社合作銀行是什么金融機構?是浙江省內第一家獲準成立的城鄉一體化金融機構,也是浙江省農村信用社體系改革的重要成果之一。農信銀行將農村信用社改革和新型農村金融機構建設相結合,堅持“金融服務鄉村,為農民增收致富”的原則,全面開展普惠金融業務,為浙江省的城鄉居民提供優質、高效、全面的金融服務。合作銀行是什么銀行?合作銀行是指由私人和團體組織的互助性集體金融機構。主要目的...
人民幣升值對房價影響有什么問題?人民幣升值將提高人民幣的購買力,并將直接影響經濟發展。理論上,房地產價格是由供需因素決定的,但作為一種消費品,房地產也受到經濟因素的很大影響。注意以下兩點:人民幣升值對房地產的影響:1.貨幣升值將增加投資收益,大量投資將進入中國市場,導致投資過熱,可能影響房地產供應。2.貨幣升值會提高購買力,但購買力是相對的,這與國際購買力是否增強有關。如果房地產價格上漲,可能會上...