這篇文章主要為大家展示了“如何搭建一個(gè)多通道Fabric網(wǎng)絡(luò)”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何搭建一個(gè)多通道Fabric網(wǎng)絡(luò)”這篇文章吧。
成都創(chuàng)新互聯(lián)公司是專業(yè)的金平網(wǎng)站建設(shè)公司,金平接單;提供網(wǎng)站制作、做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行金平網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
我們將構(gòu)造一個(gè)包含3個(gè)機(jī)構(gòu)的Hyperledger Fabric網(wǎng)絡(luò):Org1、Org2和Org3,每個(gè)機(jī)構(gòu)中包含一個(gè)節(jié)點(diǎn)Peer0。網(wǎng)絡(luò)包含兩個(gè)通道:由Org1、Org2和Org3組成的ChannelAll,以及由Org1和Org2組成的Channel12,因此這個(gè)Fabric網(wǎng)絡(luò)是多通道的配置。在這兩個(gè)Fabric通道上我們將部署同樣的鏈碼,即Fabrc-Samples中提供的Simple Asset鏈碼:

Step 1:在Hyperledger官方提供的fabric-samples目錄下克隆本教程提供的示例代碼:
cd fabric-samples git clone https://github.com/kctam/3org2ch_143.git cd 3org2ch_143
Step 2:為參與Fabric通道的機(jī)構(gòu)生成所需的密碼學(xué)資料
../bin/cryptogen generate --config=./crypto-config.yaml
Step 3:生成Fabric通道素材
mkdir channel-artifacts && export FABRIC_CFG_PATH=$PWD
../bin/configtxgen -profile OrdererGenesis \
-outputBlock ./channel-artifacts/genesis.block
export CHANNEL_ONE_NAME=channelall
export CHANNEL_ONE_PROFILE=ChannelAll
export CHANNEL_TWO_NAME=channel12
export CHANNEL_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 -asOrg Org1MSP
../bin/configtxgen -profile ${CHANNEL_ONE_PROFILE} \
-outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors_${CHANNEL_ONE_NAME}.tx \
-channelID $CHANNEL_ONE_NAME -asOrg Org2MSP
../bin/configtxgen -profile ${CHANNEL_ONE_PROFILE} \
-outputAnchorPeersUpdate ./channel-artifacts/Org3MSPanchors_${CHANNEL_ONE_NAME}.tx \
-channelID $CHANNEL_ONE_NAME -asOrg Org3MSP
../bin/configtxgen -profile ${CHANNEL_TWO_PROFILE} \
-outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors_${CHANNEL_TWO_NAME}.tx \
-channelID $CHANNEL_TWO_NAME -asOrg Org1MSP
../bin/configtxgen -profile ${CHANNEL_TWO_PROFILE} \
-outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors_${CHANNEL_TWO_NAME}.tx \
-channelID $CHANNEL_TWO_NAME -asOrg Org2MSPStep 4:啟動(dòng)所有的容器,最后應(yīng)當(dāng)看到有5個(gè)容器
docker-compose up -d docker ps
Step 5:為了便于演示,開啟3個(gè)終端,并設(shè)置排序節(jié)點(diǎn)的CA
Org1
docker exec -it cli bash 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
Org2
docker exec -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" \ -it cli bash 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
Org3
docker exec -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" \ -it cli bash 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
Step 5:在Fabric網(wǎng)絡(luò)中創(chuàng)建多通道,并將各peer節(jié)點(diǎn)分別加入多個(gè)通道
首先創(chuàng)建channelall通道,并將3個(gè)機(jī)構(gòu)的節(jié)點(diǎn)都加入該通道:
Org1
peer channel create -o orderer.example.com:7050 -c channelall \ -f /opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/channelall.tx \ --tls --cafile $ORDERER_CA peer channel join -b channelall.block --tls --cafile $ORDERER_CA peer channel update -o orderer.example.com:7050 -c channelall \ -f /opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/Org1MSPanchors_channelall.tx \ --tls --cafile $ORDERER_CA
Org2
peer channel join -b channelall.block --tls --cafile $ORDERER_CA peer channel update -o orderer.example.com:7050 -c channelall \ -f /opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/Org2MSPanchors_channelall.tx \ --tls --cafile $ORDERER_CA
Org3
peer channel join -b channelall.block --tls --cafile $ORDERER_CA peer channel update -o orderer.example.com:7050 -c channelall \ -f /opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/Org3MSPanchors_channelall.tx \ --tls --cafile $ORDERER_CA
然后創(chuàng)建channel12,并將Org1和Org2都加入該通道:
Org1
peer channel create -o orderer.example.com:7050 -c channel12 \ -f /opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/channel12.tx \ --tls --cafile $ORDERER_CA peer channel join -b channel12.block --tls --cafile $ORDERER_CA peer channel update -o orderer.example.com:7050 -c channel12 \ -f /opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/Org1MSPanchors_channel12.tx \ --tls --cafile $ORDERER_CA
Org2
peer channel join -b channel12.block --tls --cafile $ORDERER_CA peer channel update -o orderer.example.com:7050 -c channel12 \ -f /opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts/Org2MSPanchors_channel12.tx \ --tls --cafile $ORDERER_CA
Step 6:檢查各節(jié)點(diǎn)已經(jīng)加入的Fabric通道
在各節(jié)點(diǎn)對(duì)應(yīng)的終端中使用如下命令查看當(dāng)前節(jié)點(diǎn)加入的通道:
peer channel list
你應(yīng)當(dāng)可以看到org1和org2分別加入了兩個(gè)通道,而org3則只加入了一個(gè)通道。
如果一切順利,現(xiàn)在你就有了一個(gè)包含3個(gè)機(jī)構(gòu)的多通道Fabric網(wǎng)絡(luò),可以用于測試 任何鏈碼了。
Step 7:在測試完畢后記得清理實(shí)驗(yàn)環(huán)境,命令如下:
docker-compose down -v docker rm $(docker ps -aq) docker rmi $(docker images dev-* -q)
現(xiàn)在我們的Fabric多通道實(shí)驗(yàn)網(wǎng)絡(luò)已經(jīng)起來了,可以開始部署鏈碼了。
我們使用fabric-samples內(nèi)置的SACC鏈碼,其內(nèi)容如下:
/*
* Copyright IBM Corp All Rights Reserved
*
* SPDX-License-Identifier: Apache-2.0
*/
package main
import (
"fmt"
"github.com/hyperledger/fabric/core/chaincode/shim"
"github.com/hyperledger/fabric/protos/peer"
)
// SimpleAsset implements a simple chaincode to manage an asset
type SimpleAsset struct {
}
// Init is called during chaincode instantiation to initialize any
// data. Note that chaincode upgrade also calls this function to reset
// or to migrate data.
func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response {
// Get the args from the transaction proposal
args := stub.GetStringArgs()
if len(args) != 2 {
return shim.Error("Incorrect arguments. Expecting a key and a value")
}
// Set up any variables or assets here by calling stub.PutState()
// We store the key and the value on the ledger
err := stub.PutState(args[0], []byte(args[1]))
if err != nil {
return shim.Error(fmt.Sprintf("Failed to create asset: %s", args[0]))
}
return shim.Success(nil)
}
// Invoke is called per transaction on the chaincode. Each transaction is
// either a 'get' or a 'set' on the asset created by Init function. The Set
// method may create a new asset by specifying a new key-value pair.
func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
// Extract the function and args from the transaction proposal
fn, args := stub.GetFunctionAndParameters()
var result string
var err error
if fn == "set" {
result, err = set(stub, args)
} else { // assume 'get' even if fn is nil
result, err = get(stub, args)
}
if err != nil {
return shim.Error(err.Error())
}
// Return the result as success payload
return shim.Success([]byte(result))
}
// Set stores the asset (both key and value) on the ledger. If the key exists,
// it will override the value with the new one
func set(stub shim.ChaincodeStubInterface, args []string) (string, error) {
if len(args) != 2 {
return "", fmt.Errorf("Incorrect arguments. Expecting a key and a value")
}
err := stub.PutState(args[0], []byte(args[1]))
if err != nil {
return "", fmt.Errorf("Failed to set asset: %s", args[0])
}
return args[1], nil
}
// Get returns the value of the specified asset key
func get(stub shim.ChaincodeStubInterface, args []string) (string, error) {
if len(args) != 1 {
return "", fmt.Errorf("Incorrect arguments. Expecting a key")
}
value, err := stub.GetState(args[0])
if err != nil {
return "", fmt.Errorf("Failed to get asset: %s with error: %s", args[0], err)
}
if value == nil {
return "", fmt.Errorf("Asset not found: %s", args[0])
}
return string(value), nil
}
// main function starts up the chaincode in the container during instantiate
func main() {
if err := shim.Start(new(SimpleAsset)); err != nil {
fmt.Printf("Error starting SimpleAsset chaincode: %s", err)
}
}Fabric Samples提供的SACC鏈碼的邏輯很簡單:
當(dāng)鏈碼實(shí)例化時(shí)就會(huì)執(zhí)行Init()函數(shù),該函數(shù)需要兩個(gè)參數(shù),分別對(duì)應(yīng)鍵和值
將傳入Init()函數(shù)的鍵/值對(duì)使用PutState方法保存到賬本中
在鏈碼實(shí)例化之后,對(duì)交易的處理是由Invoke()函數(shù)來負(fù)責(zé)的。 該函數(shù)的參數(shù) 包括一個(gè)方法名以及若干參數(shù)。
如果調(diào)用Invoke()函數(shù)時(shí)方法名為set,那么就需要傳入兩個(gè)參數(shù),分別表示要 設(shè)置的鍵和值
如果調(diào)用Invoke()函數(shù)時(shí)方法名為get,那么就需要一個(gè)參數(shù),表示要讀取的鍵
通過鏈碼安裝操作,就可以在各節(jié)點(diǎn)上啟動(dòng)鏈碼。注意在鏈碼實(shí)例化之前還不可用。
在各節(jié)點(diǎn)對(duì)應(yīng)的終端中使用如下命令安裝鏈碼:
peer chaincode install -n sacc -p github.com/chaincode/sacc -v 1.0
我們應(yīng)當(dāng)可以看到如下的輸出結(jié)果:

現(xiàn)在所有的節(jié)點(diǎn)上都安裝了SACC鏈碼,我們可以實(shí)例化這個(gè)鏈碼了。
首先我們看包含所有三個(gè)機(jī)構(gòu)的ChannelAll通道。
在Org1對(duì)應(yīng)的終端中,在ChannelAll通道上實(shí)例化鏈碼:
peer chaincode instantiate -o orderer.example.com:7050 --tls \
--cafile $ORDERER_CA -C channelall -c '{"Args":["a", "100"]}' \
-n sacc -v 1.0 -P "OR('Org1MSP.peer', 'Org2MSP.peer', 'Org3MSP.peer')"我們?cè)O(shè)置了初始的鍵/值對(duì)為a/100。此外我們?cè)O(shè)置了背書策略:OR表示只需要3個(gè)機(jī)構(gòu)中的任何一個(gè)背書即可。
現(xiàn)在讓我們?cè)谕ǖ繡hannelAll上查詢鍵a的值。
進(jìn)入Org1對(duì)應(yīng)的終端,運(yùn)行如下命令:
peer chaincode query -C channelall -n sacc -c '{"Args":["get","a"]}'結(jié)果如下:

現(xiàn)在在Org2對(duì)應(yīng)的終端中運(yùn)行如下命令:
peer chaincode query -C channelall -n sacc -c '{"Args":["get","a"]}'結(jié)果如下:

現(xiàn)在在Org3對(duì)應(yīng)的終端中運(yùn)行如下命令:
peer chaincode query -C channelall -n sacc -c '{"Args":["get","a"]}'結(jié)果如下:

現(xiàn)在我們可以看到在三個(gè)節(jié)點(diǎn)上得到了相同的值,它們共享同一個(gè)賬本。
現(xiàn)在讓我們?cè)谕ǖ繡hannel12上實(shí)例化這個(gè)SACC鏈碼。
在Org1對(duì)應(yīng)的終端中,運(yùn)行如下命令:
peer chaincode instantiate -o orderer.example.com:7050 \
--tls --cafile $ORDERER_CA -C channel12 \
-c '{"Args":["b", "200"]}' -n sacc -v 1.0 \
-P "OR('Org1MSP.peer', 'Org2MSP.peer')"這次我們將初始的鍵/值對(duì)設(shè)置為b/200,背書策略為任一機(jī)構(gòu)完成背書即可。
還是從Org1開始:
peer chaincode query -C channel12 -n sacc -c '{"Args":["get","b"]}'結(jié)果如下:
然后進(jìn)入Org2對(duì)應(yīng)的終端:
peer chaincode query -C channel12 -n sacc -c '{"Args":["get","b"]}'結(jié)果如下:

如果我們?cè)贠rg3對(duì)應(yīng)的終端運(yùn)行同樣的命令,就會(huì)看到提示禁止訪問。這是 因?yàn)镺rg3沒有加入通道Channel12:
peer chaincode query -C channel12 -n sacc -c '{"Args":["get","b"]}'結(jié)果如下:
如果我們嘗試在通道Channel12上讀取鍵a的值,會(huì)發(fā)現(xiàn)提示沒有定義a。 在Hyperledger Fabric中,每個(gè)通道都有自己的賬本,不同通道的狀態(tài)是不共享的。
在Org1和Org2的終端中運(yùn)行如下命令:
peer chaincode query -C channel12 -n sacc -c '{"Args":["get","a"]}'結(jié)果如下:

以上是“如何搭建一個(gè)多通道Fabric網(wǎng)絡(luò)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)頁標(biāo)題:如何搭建一個(gè)多通道Fabric網(wǎng)絡(luò)
標(biāo)題路徑:http://chinadenli.net/article4/ihhdoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、商城網(wǎng)站、搜索引擎優(yōu)化、面包屑導(dǎo)航、響應(yīng)式網(wǎng)站、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)