書接前文
Fabric鏈碼部署-go語言
通過上面這篇文章,你可以部署好自己的鏈碼
(后面很多命令是否需要修改,都是根據上面這篇文章來的,如果零基礎的話建議先看上面這篇)
就進行下一步
在測試網絡上運行自己的鏈碼
目錄
1、導航到test-network目錄
1.1 打開日志Logspout(可選)
2、啟動測試網絡
3、測試網絡的組成
4、創建一個通道
5、在通道上啟動鏈碼
6、與網絡交互
6.1 配置對等CLI
6.2 運行Org1
6.2.1 設置環境變量
6.2.2?初始化賬本
6.2.3?查詢賬本
6.2.4 修改賬本
6.3 運行Org2
1、導航到test-network目錄
打開終端窗口 ,直接cd
下面是我的路徑的位置
cd ./go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network
你的可能不一樣,這里或許要微調
不過只要到這個目錄就可以
1.1 打開日志Logspout(可選)
此步驟不是必需的,但對于鏈碼故障排除非常有用。
要監控智能合約的日志,管理員可以使用logspout
工具查看一組Docker
容器的聚合輸出。
該工具將來自不同?Docker
?容器的輸出流收集到一個位置,從而可以輕松地從單個窗口查看發生的情況。
這可以幫助管理員在安裝智能合約時或開發者調用智能合約時調試問題。
由于某些容器純粹是為了啟動智能合約而創建的,并且只存在很短的時間,因此從網絡收集所有日志會很有幫助。
Logspout
?工具將不斷地將日志傳輸到的終端,因此將需要使用新的終端窗口。
可以通過運行以下命令來啟動?Logspout
:(直接復制,不需要改)
./monitordocker.sh fabric_test
如果你啟動失敗,可能是這個位置沒有對應文件,我上一篇博客里有提到怎么復制,從哪復制,建議參考
2、啟動測試網絡
可以在test-network 目錄中找到用于啟動網絡的腳本。
?如果你先前啟動了網絡,建議先進行一下關閉先前網絡的操作,以免后面出一些預料之外的錯誤
方式為(直接復制,不需要改)
./network.sh down
之后直接輸入:(直接復制,不需要改)
./network.sh up
就開始啟動網絡了
你會看到類似這些內容的輸出,就說明成功了
從這里可以看到節點對應的端口信息,后面會用到,不過每次都是一樣的,知道在這里找就可以
3、測試網絡的組成
部署測試網絡后,可以花一些時間檢查其組件。
運行以下命令以列出計算機上運行的所有 Docker 容器。(直接復制,不需要改)
docker ps -a
應該能看到由 network.sh 腳本創建的三個節點
測試網絡包括兩個對等組織:Org1 和 Org2。
它還包括一個維護網絡排序服務的單一排序節點組織。
網絡中的每個對等點都需要屬于一個組織。
在測試網絡中,每個組織各運行一個對等點:peer0.org1.example.com
?和peer0.org2.example.com
示例網絡使用由排序節點組織運營的單節點 Raft 排序服務。
您可以看到在您的計算機上運行的排序節點為?orderer.example.com
。
4、創建一個通道
現在我們的機器上運行了對等節點和排序節點,我們可以使用腳本為 Org1 和 Org2 之間的事務創建 Fabric 通道。
運行以下命令創建一個默認名稱為 mychannel 的通道:(直接復制,不需要改)
./network.sh createChannel
如果命令成功,您可以在日志中看到以下消息:
還可以使用通道標志來創建具有自定義名稱的頻道。
例如,以下命令將創建一個名為channel1的通道:
./network.sh createChannel -c channel1
通道標志還允許您通過指定不同的通道名稱來創建多個通道。
創建mychannel或channel1后,您可以使用以下命令創建第二個名為channel2的頻道:
./network.sh createChannel -c channel2
如果您想一步啟動網絡并直接創建通道,您可以同時使用 up 和 createChannel 模式:
./network.sh up createChannel
5、在通道上啟動鏈碼
通道啟動之后
下一步就是啟動自己的鏈碼了
通過下面命令進行啟動(這里需要改)
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/test-protocol-go -ccl go
deployCC
是這個腳本中定義的一個命令或子命令,它是用來在peer0.org1.example.com
?和peer0.org2.example.com
?上安部署鏈碼的功能,然后將鏈代碼部署在使用通道標志指定的通道上,如果未指定通道,則部署在mychannel
?上-ccn basic
指定了鏈碼的名稱,這里設置為basic
,這意味著你將要部署一個名為basic
的鏈碼。(這個名稱是官方示例里給的,自己可以修改,但是后面對應位置也要改)-ccp ../asset-transfer-basic/test-protocol-go
用于指定鏈碼的路徑,../asset-transfer-basic/test-protocol-go
是鏈碼所在的目錄路徑。-ccl go
指定鏈碼的語言類型,這里是go
,意味著使用的是 Go 編程語言編寫的鏈碼。
注意,你需要修改的地方是鏈碼的路徑,也就是-ccp之后的部分,需要將路徑修改成你的鏈碼的存儲位置
如果你不清楚應該如何提前部署己的鏈碼,看我上一篇文章(開頭有鏈接)
成功后是這個樣子?
6、與網絡交互
6.1 配置對等CLI
使用對等 CLI (peer CLI
)與您的網絡進行交互
對等?CLI
?允許您從?CLI
調用已部署的智能合約、更新通道或安裝和部署新的智能合約。
使用以下命令將二進制文件添加到您的 CLI 路徑:(直接復制,不需要改)
export PATH=${PWD}/../bin:$PATH
export
:這個命令用于設置環境變量,使得后續的命令可以在當前Shell會話中使用。PATH
是一個環境變量,它用于指定系統在哪些目錄中查找可執行文件。當你在命令行中輸入一個命令時,系統會根據PATH
的值在指定的目錄中查找這個命令的可執行文件。${PWD}
:是一個變量,表示當前工作目錄的路徑。../bin
:表示當前工作目錄的上一級目錄中的bin
目錄。..
表示上一級目錄,bin
則是一個通常用于存放可執行文件的目錄。:$PATH
:表示將新設置的目錄${PWD}/../bin
添加到原始PATH
變量中的值的末尾,使用冒號分隔。
還需要將?FABRIC_CFG_PATH
設置為指向?Fabric-samples 存儲庫中的 core.yaml
?文件:(直接復制,不需要改)
export FABRIC_CFG_PATH=$PWD/../config/
export
:這個命令用于設置環境變量,使得后續的命令可以在當前Shell會話中使用。FABRIC_CFG_PATH
是一個環境變量,它用于指定Hyperledger Fabric配置文件的路徑。$PWD
:是一個環境變量,代表當前工作目錄的路徑。../config/
:表示當前工作目錄的上一級目錄中的config
目錄。..
表示上一級目錄,config
則是存放Fabric配置文件的目錄。
core.yaml
是Hyperledger Fabric
節點的配置文件,用于配置節點的各種參數和設置。這個文件包含了節點的基本配置信息,影響著節點的行為、功能和性能。
在Fabric
中,每個節點(如對等節點、排序節點等)都有自己的core.yaml
配置文件,用于定義節點的特定設置。
6.2 運行Org1
6.2.1 設置環境變量
現在可以設置環境變量,以允許您將對等?CLI
?作為?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_ENABLED=true
:啟用對等節點的TLS安全傳輸。這表示對等節點將使用安全的TLS協議進行通信。CORE_PEER_LOCALMSPID="Org1MSP"
:指定了對等節點所屬的本地組織的MSP(成員服務提供者)ID。這里設置為"Org1MSP",表示該對等節點隸屬于組織"Org1"。CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
:設置了對等節點TLS連接時使用的根證書文件路徑。這個證書文件用于驗證與對等節點通信的遠程端的TLS證書的合法性。CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
:指定了對等節點的MSP配置路徑,其中包含了與該對等節點關聯的身份驗證相關信息,比如管理員身份的證書、私鑰等。CORE_PEER_ADDRESS=localhost:7051
:設置了對等節點的地址和端口號,指明其他節點在本地主機(localhost
)上的通信地址為7051
端口。這是對等節點的gRPC
通信地址,其他節點可以使用這個地址與該節點進行通信。
6.2.2?初始化賬本
運行以下命令初始化賬本:(直接復制,不需要改)
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 basic --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":"InitLedger","Args":[]}'
更直觀的表示為:(這里是方便你看的,復制的話復制上面這個就可以)
peer chaincode invoke \ # 調用鏈碼命令-o localhost:7050 \ # 排序服務節點的地址和端口號--ordererTLSHostnameOverride orderer.example.com \ # 排序服務節點的TLS主機名--tls \ # 使用TLS連接--cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" \ # 用于驗證排序服務節點TLS證書的根證書文件路徑-C mychannel \ # 指定鏈碼所在的通道名稱-n basic \ # 指定要調用的鏈碼的名稱--peerAddresses localhost:7051 \ # 要調用的對等節點的地址和端口號--tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" \ # 用于驗證對等節點TLS證書的根證書文件路徑--peerAddresses localhost:9051 \ # 另一個要調用的對等節點的地址和端口號--tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" \ # 用于驗證另一個對等節點TLS證書的根證書文件路徑-c '{"function":"InitLedger","Args":[]}' # 指定要調用的鏈碼函數及其參數
最后一行調用了InitLedger函數,這個在我們的鏈碼里是有的
如果成功,應該看到類似以下的輸出:
-> INFO 001 Chaincode invoke successful. result: status:200
這條信息表示鏈碼調用成功。status:200
表示調用返回了一個 HTTP 200 狀態碼,通常代表著成功的響應。這表明了鏈碼函數的執行在區塊鏈網絡中被成功地觸發,并且成功完成了所需的操作。
6.2.3?查詢賬本
現在可以從 CLI 查詢分類帳。
(我的理解是查詢不需要背書,所以就一行很簡單的代碼,但是修改需要背書,就需要標出網絡中的其余節點用以聯系)
運行以下命令以獲取已添加到通道分類帳的資產列表:(直接復制,不需要改,前提是你的鏈碼和我的一樣(上一篇博客))
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllIdentities"]}'
peer chaincode query
: 這部分指明了使用peer命令行工具,并調用其中的chaincode query子命令,用于執行鏈碼的查詢操作。-C mychannel
: 指定了要執行查詢的通道名稱,這里是mychannel
。-n basic
: 指定了要查詢的鏈碼的名稱為basic
。-c '{"Args":["GetAllIdentities"]}'
: 這是指定了要調用的鏈碼函數及其參數的部分。在這里,調用了鏈碼中的GetAllAssets
函數,它是一個查詢函數,用于獲取所有資產的信息。
如果成功,應該看到以下輸出:
6.2.4 修改賬本
使用以下命令通過調用鏈碼來更新現有的數據:(直接復制,不需要改,前提是你的鏈碼和我的一樣(上一篇博客))
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 basic --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":"UpdateIdentity","Args":["identity4","P","S","V"]}'
上述語句的功能是修改id為identity4的數據
成功會返回下列輸出
2023-12-12 09:07:59.485 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200
我們再次輸出全部數據看一下
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllIdentities"]}'
?可以看到已經更改了
先前這些操作都是通過Org1進行的,如果你想通過Org2進行,通過下面的方式進入Org2
6.3 運行Org2
設置以下環境變量以運行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
設置好這些環境變量之后就ok了
后面直接調用函數就可以,方式和6.2.2-6.2.4一樣,除了函數名和輸入給函數的參數那一塊需要自行更改之外,其他的直接復制
7、關閉網絡
鏈碼里所有的函數都可以在剛剛通過Org1或者Org2進行測試
讀者可以自己多試試
測試完之后就要關閉網絡
注意:如果你沒有關閉網絡,下次再部署網絡時會出現難以預料的錯誤!!!
./network.sh down
通過上面這條語句就可以關閉網絡
8、常見問題
我這里就說說我遇到的問題
8.1?connection refused
在第5步啟動鏈碼時,如果是第一次啟動鏈碼,會從GitHub下載一些依賴,可能會出現connection refused問題
建議去配一下GitHub的SSH密鑰連接,就可以解決
8.2 不要sudo
上面的所有語句都不要加sudo
如果出現提示說權限不足,先退到上級文件夾,改一下這個文件夾的權限,設置為最高就可以
就是那個777的命令,去搜一下如何修改文件權限就能找到
我遇到的就這兩個錯誤
其他的錯誤也有,不過如果按照我上篇文章和這篇文章的步驟來的話,應該是都可以避開的
這篇教程就到此結束
后面我繼續肝一下官方文檔里的CA部分,如果搞明白了會繼續出新教程
如果能幫到你的話順手留個贊奧,謝謝好心人/doge