Hyperledger Fabric Chaincode 開發指的什么?Chaincode是什么呢?( 三 )


Page 10

Hyperledger Fabric Chaincode 開發指的什么?Chaincode是什么呢?


此外就是一些全局的或輔助的API 。
比如剛才看到的Start函數,它向指定的peer結點注冊chaincode 。
輔助類StateRangeQueryIterator與前面state范圍查詢的API有關 。
關于API的詳細說明可以打開這個鏈接看到 。但是上面基于的是最新的fabric實現,所以跟剛才講的會有很多不同 。具體以你使用fabric版本為準 。
Page 11
Hyperledger Fabric Chaincode 開發指的什么?Chaincode是什么呢?


第三部分講的是如何調試chaincode 。
在介紹具體調試步驟之前,我想先介紹一下chaincode運行的基本原理,我覺得這有助于chaincode的開發 。
首先,fabric peer結點有兩種運行模式 。一種是一般模式,在這種模式下chaincode運行在Docker容器中 。這也是fabric在production環境下的運行模式 。這就相當于給chaincode的運行提供了一個相對隔離的環境,這樣整個系統也就更加的健壯 。但是在這種模式下,調試過程就變得非常復雜 。因為一旦調試過程中發現bug,重新install,然后重新部署 。而在這個過程中,install和Docker image的build過程都比較耗時 。
所以,針對這個問題,fabric又提供了開發模式 。在這種模式下chaincode直接運行在本地,這樣chaincode的調試過程就與普通程序的調試過程完全一樣,因此開發調試過程就更加容易 。
要說明的是,我目前看的fabric1.0的代碼對于開發模式的支持還不完備,部署的時候回失敗 。
Page 12
Hyperledger Fabric Chaincode 開發指的什么?Chaincode是什么呢?


但是因為開發模式的原理比較容易理解,這里我還是以開發模式為例介紹一下chaincode的運行原理 。一般模式下,只需將chaincode的運行放在Docker容器中進行理解 。
首先,這個圖描述的是開發模式下chaincode注冊時的執行過程 。
首先,chaincode會向指定的peer結點發送相關信息,比如chaincode name 。然后,peer結點會做一些檢查,主要是看該chaincode name是否已存在 。如果不存在,則注冊成功,為其創建相應的handler,然后返回相關信息 。此后,chaincode就與peer結點建立起了聯系,并且二者始終處于互相監聽狀態 。
Page 13
Hyperledger Fabric Chaincode 開發指的什么?Chaincode是什么呢?


這個圖描述的是開發模式下chaincode Instantiate/invoke/query時的運行過程 。
首先,通過CLI或App向指定endorser結點發送Instantiate/invoke/query請求 。
endorser接收到請求之后,如果相關chaincode存在,就會將請求發送到chaincode端,并執行相應函數 。由于執行過程中,可能涉及到多次的state的讀寫,而每一次的讀寫都會涉及到底層db的操作,所以這個過程會涉及到多次與endorser結點的通信 。
最后,chaincode執行完畢之后,會發送消息給endorser結點 。如果執行成功,endorser結點就會封裝執行結果并對其endorse,并把結果返回給CLI/APP端,然后進行ordering 。這個圖里沒有給出ordering和committing的過程 。
Page 14
Hyperledger Fabric Chaincode 開發指的什么?Chaincode是什么呢?


這里給出一般模式下Chaincode的開發調試過程 。以fabric chaincode_example02為例,完全本地,并且使用fabric默認配置 。我的環境是使用vagrant方式搭建的 。
首先,啟動orderer結點,運行在solo模式下 。
然后,本地啟動一個peer結點,指定peer的名稱 。
然后,install chaincode程序,指定chaincode的名稱以及version,它們將用于命名build出來的docker image 。默認配置下,需要你的chaincode程序位于GOPATH/src路徑下,并且這個命令會將GOPATH/src下的幾乎所有文件都打包發送到指定的peer結點 。

推薦閱讀