[轉]Fabric2.3中使用test-network搭建測試網絡


這個測試網絡一方面可以用來學習Fabric,另一方面也可以讓一些更有經驗的開發者來測試他們的智能合約和應用,但是不建議用於生產環境,在2.0版本后,這個測試網絡也取代了原來的"first-network"。
1.啟動測試網絡
首先進入clone好項目的目錄,執行如下命令進入測試網絡所在文件夾
cd fabric-samples/test-network
在這里可以看到一個network.sh文件,執行./network.sh -h可以看到它的使用說明
下面這條命令會移除先前所有運行中的容器
sudo ./network.sh down
然后執行如下的命令,會創建一個Fabric網絡。
sudo ./network.sh up
有些人可能會在這一步過程中遇到問題,小編也遇到了,不要慌,點這看解決辦法

Peer binary and configuration files not found..
Follow the instructions in the Fabric docs to install the Fabric Binaries:
https://hyperledger-fabric.readthedocs.io/en/latest/install.html

這個網絡由兩個peer節點,一個order節點組成,當使用這個命令的時候,不會有channel被建立,如果成功的話可以看到如下的輸出。

可以通過如下命令查看當前運行的三個Docker容器,這三個容器就是由剛才的up命令創建的
sudo docker ps -a
每個與Fabric網絡交互的節點需要屬於一個作為網絡成員的組織,這些組織所組成的組被稱為consortium(聯盟),這個測試網絡有兩個聯盟成員Org1和Org2,還有一個為網絡提供排序服務的排序組織。

Peers是Fabric網絡的基礎組件,它存儲區塊鏈的賬本,並在交易提交到賬本之前驗證交易,Peers也運行包含着業務邏輯的智能合約,由此來管理賬本上的資產。

網絡中的每個Peer都屬於聯盟的一個成員,在測試網絡中peer0.org1.example.com和peer0.org2.example.com各有一個peer。

每個Fabric網絡也包含一個排序服務,用於將交易進行排序,這樣可以讓peer節點專注於驗證交易和提交到賬本。在order節點收到來自客戶端的交易之后,會按照順序添加到一個塊中,然后分發到各個peer中,加入區塊鏈賬本。此外order節點還可以操作系統的channel,定義哪些組織是聯盟成員。

測試網絡中用了一個Raft排序節點來提供排序服務,這個節點所屬組織為orderer.example.com,在測試網絡中只有一個order節點,但是在真實的網絡中,可能會有被多個組織操作的多個排序節點,不同的排序節點會利用Raft共識算法在網絡中來達成交易的一致。

2.創建一個Channel
Channel是一個用於特定網絡成員之間通信的私有層,只有被邀請加入Channel的成員才能夠使用它,對網絡中其他成員不可見,每個Channel都有一個單獨的區塊鏈賬本,被邀請加入Channel的peer可以存儲Channel的賬本然后驗證Channel的交易。

運行如下命令可以創建一個名為mychannel的Channel連接Org1和Org2。
./network.sh createChannel
只要最后打印出========= Channel successfully joined ===========就說明創建成功了,也可以利用-c來自定義Channel的名稱,通過指定不同的名稱可以創建多個Channel。

如果想要在啟動測試網絡的同時創建Channel,可以同時使用up和createChannel兩個參數。

3.在管道中使用chaincode(智能合約)
06在創建channel之后,可以使用智能合約來和channel的賬本交互,運行在網絡成員上的應用可以調用智能合約來改變賬本上的資產,也可以查詢智能合約來讀取賬本上的數據。

多重簽名用於保證利用智能合約創建的交易的有效性,在提交到賬本之前,智能合約會被多個組織簽名,這樣可以防止一個組織篡改賬本,只有交易是連續的,而且被足夠多的組織簽名之后,才會提交到賬本中。指明channel中組織的策略也是chaincode定義的部分。

在Fabric中,只能合約以chaincode的形式部署在網絡中,一個智能合約會安裝在一個組織的peers中,之后才能部署在Channel中,這樣才可以用於和區塊鏈賬本交互和交易背書,Channel中的成員需要同意chaincode中的定義,這些定義建立了chaincode的治理,只有足夠多的成員同意了定義,才能將這個定義提交到channel中,來進行使用。

這里運行如下命令可以啟動一個用於剛剛創建好的channel的chaincode
./network.sh deployCC
這個命令會創建一個名為fabcar的chaincode到兩個peer上,然后用在兩個peer所屬的channel上。
在fabcar chaincode的定義提交到channel之后,這個腳本會調用init函數來初始化這個chaincode,然后調用這個chaincode來防止初始化的車輛列表到賬本中,然后會使用查詢chaincode的方式來確認數據已經被添加了,這些數據將會用於之后的測試。

4.與網絡交互
當測試網絡成功啟動之后,可以利用命令行的peer命令與網絡交互,它允許用戶調用部署好的智能合約,更新channel或者安裝和部署新的智能合約。

首先確保自己位於test-network目錄下,並且已經根據1.3節的內容配置好了peer的環境變量。或者用如下的方式來臨時配置。
export PATH=${PWD}/../bin:$PATH
此外還需要配置一下config所在的目錄。
export FABRIC_CFG_PATH=$PWD/../config/
這樣准備工作就做好了。

設置如下的環境變量,可以使得你作為Org1來操作peer命令。

# Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051

CORE_PEER_TLS_ROOTCERT_FILECORE_PEER_MSPCONFIGPATH兩行指明了Org1的加密所用的信息。

可以使用如下的命令來查看channel的賬本中的汽車列表,這個列表是剛才使用deployCC參數時添加的。
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'

當然chaincode也可以在網絡中的某個成員想要轉移或者更新資產的時候調用,利用如下的命令可以調用fabcar chaincode來修改賬本中的某一輛車的擁有者。

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabcar --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"changeCarOwner","Args":["CAR9","Dave"]}'

如果出現"Chaincode invoke successful. result: status:200 "的字樣,說明更新成功。

由於背書策略要求交易被Org1和Org2都簽名,所以chaincode在調用時需要用–peerAddresses參數來指明兩個Org,因為TLS在這個網絡中被使用到,所以需要使用到tlsRootCertFiles來指明TLS證書。

為了查看調用是否成功,可以使用另一個chaincode的查詢,這里我們可以利用Org2來執行peer命令進行查詢,首先需要設置如下環境變量。

# Environment variables for Org2

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051

然后可以使用如下命令來查看CAR9在賬本中的情況。
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryCar","CAR9"]}'

5.關閉網絡
當使用完測試網絡的時候,可以用如下命令來關閉測試網絡。

./network.sh down

這條命令會停止並移走節點和chaincode的容器,刪除加密所用的信息,並且移走channel和docker卷等之前運行產生的東西,不過如果需要的話,之后可以利用up參數再次讓網絡運行。

6.啟動過程詳解

  • ./network.sh為兩個peer節點和一個order節點創建了證書和密鑰,默認情況下,腳本會利用在organizations/cryptogen文件夾下的加密工具。
  • 腳本利用configtxgen工具創建了系統的創世塊,它使用configtx/configtx.yaml文件來創建創世塊,並存儲在system-genesis-block文件夾中。
  • 當上述兩步完成之后,./network.sh會啟動網絡,腳本利用在docker文件夾下的docker-compose-test-net.yaml文件創建peer和orderer節點。
  • 如果使用了createChannel子命令,腳本還會運行script文件夾下的createChannel.sh腳本來創建所需要的channel,腳本會用peer命令來創建channel,加入兩個組織。
  • 如果運行了deployCC命令,腳本會在所有peers上運行script下的deployCC.sh腳本來安裝fabcar chaincode,在chaincode的定義被提交到channel之后,peer命令會調用init函數來初始化chaincode,並將所需的數據放入chaincode中。

轉自:https://blog.csdn.net/zekdot/article/details/106977734


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM