本文參考了fabric官方文檔:http://hyperledger-fabric.readthedocs.io/en/latest/peer-chaincode-devmode.html?highlight=peer-chaincodedevhtml
在fabric中peer節點有一個chaincodedev模式,在這個模式下面你能夠不須要去實例化一個docker容器再去執行智能合約,能夠在本地直接運行,這樣更加方便你調試。git
爲了避免重複造輪子,做者創建了一個github工程:https://github.com/luckydogchina/fabric-v1.1.0-chaincodedevgithub
==================================================================================docker
注意:執行前請保證本地的7050~7053端口沒有被其餘進程所佔用。服務器
#開啓一個終端窗口A,進入 fabric-v1.1.0-chaincodedev/chaincodedev網絡
cd $fabric-v1.1.0-chaincodedev/chaincodedev區塊鏈
#枚舉當前已經存在的channelui
FABRIC_CFG_PATH=./sampleconfig peer channel list
顯示結果以下:阿里雲
能夠清楚的看到,此時已經建立了兩個channel test一、test2;spa
這裏以example02智能合約爲例:
#開啓一個新終端B,進入fabric的example目錄下
cd $fabric/examples/chaincode/go/chaincode_example02
#編譯出智能合約
go build
#運行智能合約在本地,注意必定要保持運行狀態
CORE_CHAINCODE_LOGLEVEL=debug CORE_PEER_ADDRESS=127.0.0.1:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./chaincode_example02
#在終端窗口A中執行安裝命令:
FABRIC_CFG_PATH=./sampleconfig peer chaincode install -n mycc -v 0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
#初始化智能合約,根據不一樣的智能合約要求,要填入不一樣的參數
FABRIC_CFG_PATH=./sampleconfig peer chaincode instantiate -n mycc -v 0 -c '{"Args":["init","a","100","b","200"]}' -o 127.0.0.1:7050 -C test1
注意:此時你已經在 channel test1中安裝了智能合約 chaincode_example02;
#在終端窗口A中執行如下命令:
FABRIC_CFG_PATH=./sampleconfig peer chaincode invoke -n mycc -c '{"Args":["invoke","a","b","10"]}' -o 127.0.0.1:7050 -C test1
注意:此時a向b轉了10元錢,a的帳戶餘額應爲90,b的帳戶餘額應爲210;
#執行查詢命令
FABRIC_CFG_PATH=./sampleconfig peer chaincode query -n mycc -c '{"Args":["query","b"]}' -o 127.0.0.1:7050 -C test1 #查詢a的餘額
FABRIC_CFG_PATH=./sampleconfig peer chaincode query -n mycc -c '{"Args":["query","b"]}' -o 127.0.0.1:7050 -C test1 #查詢b的餘額
此時咱們能夠看到窗口B中運行的智能合約打印的日誌:
正式環境下:
invoke proposal--> endorser -->docker container-->chaincode
dev環境下:
invoke proposal --> endorser --> chaincode
注意:在執行過程當中chaincode要一直保持運行。
只要簡單的瀏覽如下fabric的源碼你就會發現,fabric中主要有如下幾個grpc通信服務:
eventhub:用於事件流服務,客戶端調用此服務向peer註冊監聽事件;
broadcast:用於交易的廣播,client向orderer提交交易的時候用的就是這個服務;
deliver:提交區塊,peer節點經過這個服務從orderer節點拉取新生成的塊;
chaincode:智能合約與endorser之間通信服務;
gossip:流言服務,用於同一個組織下的peer之間進行數據的同步(Anchor節點向其餘節點同步區塊帳本).
爲何智能合約和fabric之間還有一個grpc通信服務?這是由於智能合約一般有讀取和寫入區塊鏈帳本的行爲,區塊鏈帳本是在endorser節點本地保存的,而智能合約是在endorser節點的docker容器中運行的,它沒法直接endorser節點本地從讀取數據,只有經過endorser節點中轉才能完成讀寫數據的動做。chaincodes server的端口默認爲7052,因此咱們在模擬運行的時候要告訴智能合約peer chaincode server的服務地址是 127.0.0.1:7052。那麼有同志要問了,在本文的環境中peer也是在容器裏面運行的,爲何你指定的地址是127.0.0.1,很簡單,peer容器的7052端口綁定的是本地的7052端口,因此你向本地地址發送就能夠了。
另外在阿里雲服務器上運行docker-compose環境,尤爲是涉及到容器之間交互通信的,可能發生沒法通信的狀況,這時你要修改一下雲服務的網絡配置: