fabric源碼學習筆記2-chaincode啟動過程

簡介

chaincode即用戶鏈碼,它提供了基于區塊鏈分布式賬本的狀態處理邏輯。
fabric中,chaincode默認運行在docker容器中。
peer通過調用docker api來創建和啟動chaincode容器。
chaincode容器啟動后跟peer之間創建gRPC連接,雙方通過發送ChaincodeMessage來進行交互通信。
chaincode容器利用core.chaincode.shim包提供的接口來向Peer發起請求。

chaincode典型結構

用戶只需關注Init()和Invoke()函數的實現,在其中利用shim.ChaincodeStubInterface結構實現跟賬本的交互邏輯。

package main

import (
    "errors"
    "fmt"
    "github.com/hyperledger/fabric/core/chaincode/shim"
)

type DemoChaincode struct { }

func (t *DemoChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
    // more logics using stub here
    return stub.Success(nil)
}

func (t *DemoChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response
    // more logics using stub here
    return stub.Success(nil)
}

func main() {
    err := shim.Start(new(DemoChaincode))
    if err != nil {
        fmt.Printf("Error starting DemoChaincode: %s", err)
    }
}

啟動過程

chaincode首先是個普通的golang程序,其main方法調用了shim層的Start方法。
首先會進行初始化,包括讀取默認配置,創建到Peer的gRPC連接。
主要包括NewChaincodeSupportClient和chaincodeSupportClient.Register兩個方法。
初始化完成后,創建有限狀態機結構(FSM,github.com/looplab/fsm)。
FSM會根據收到的消息和當前狀態來觸發狀態轉移,并執行提前設置的操作。
Peer側也利用了類似的FSM結構來管理消息響應。
之后,利用創建好的gRPC連接開始向Peer發送第一個gRPC消息:ChaincodeMessage_REGISTER,將自身注冊到Peer上。
注冊成功后開始消息處理循環,等待接收來自Peer的消息以及自身的狀態轉移(nextState)消息。

后續過程中,chaincode和Peer利用FSM完成一系列對消息的響應運作:
1、Peer收到來自鏈碼容器的ChaincodeMessage_REGISTER消息,將其注冊到本地的一個Handler結構,返回ChaincodeMessage_REGISTERD消息發給鏈碼容器。
之后更新狀態為established(已建立),并發送ChaincodeMessage_READY消息給鏈碼側,更新狀態為ready。
2、鏈碼側收到ChaincodeMessage_REGISTERD消息后,不進行任何操作,注冊成功,更新狀態為established(已建立)。
收到ChaincodeMessage_READY消息后更新狀態為ready。
3、Peer側發出ChaincodeMessage_INIT消息給鏈碼容器,準備觸發鏈碼側初始化操作。
4、鏈碼容器收到ChaincodeMessage_INIT消息,通過Handler.handleInit()方法進行初始化。
主要包括初始化所需的ChaincodeStub結構,以及調用鏈碼代碼中Init()方法。初始化成功后,返回ChaincodeMessage_COMPLETED消息給Peer。
此時鏈碼容器進入可被調用(Invoke)狀態。
5、鏈碼被調用時,Peer發出ChaincodeMessage_TRANSACTION消息給鏈碼。
6、鏈碼收到ChaincodeMessage_TRANSACTION消息,會調用Invoke()方法。
根據Invoke方法中用戶實現的邏輯,可以發出包括ChaincodeMessage_GET_HISTORY_FOR_KEY、ChaincodeMessage_GET_QUERY_RESULT、
ChaincodeMessage_GET_STATE、ChaincodeMessage_GET_STATE_BY_RANGE、ChaincodeMessage_QUERY_STATE_CLOSE、
ChaincodeMessage_QUERY_STATE_NEXT、ChaincodeMessage_INVOKE_CHAINCODE等消息給Peer側。
Peer側收到這些消息,進行相應處理,并回復ChaincodeMessage_RESPONSE消息。
最后鏈碼側會回復調用完成的消息ChaincodeMessage_COMPLETE給Peer側。
在上述過程中,Peer和鏈碼還會不定期發送ChaincodeMessage_KEEPALIVE消息給對方,以確保在線。

相關文檔

https://github.com/yeasy/hyperledger_code_fabric/blob/master/process/chaincode_start.md

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容