快速搭建fabric-v1.1.0的chaincode開發環境

本文參考了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

1.首先準備好fabric v1.1.0工程和相關環境,這裏我就不贅述了。而後咱們下載fabric-v1.1.0-chaincodedev工程,按照README.md執行,終端顯示以下的結果:

  注意:執行前請保證本地的7050~7053端口沒有被其餘進程所佔用。服務器

2. 查看當前的channel情況:

  #開啓一個終端窗口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

3.編譯智能合約並安裝

 這裏以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;

4.執行智能合約

  #在終端窗口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中運行的智能合約打印的日誌:

  

 

 

 

 

 

 

到此爲止咱們的示例就講完了,最後我簡單陳述一下dev模式下和正式環境下智能合約運行有什麼不一樣:

  正式環境下:

    invoke proposal--> endorser -->docker container-->chaincode

  dev環境下:

    invoke proposal --> endorser --> chaincode

  注意:在執行過程當中chaincode要一直保持運行。

那麼chaincode是如何與 endorser之間交互的?

  只要簡單的瀏覽如下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環境,尤爲是涉及到容器之間交互通信的,可能發生沒法通信的狀況,這時你要修改一下雲服務的網絡配置:

  

相關文章
相關標籤/搜索