這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前言
Hyperledger fabric,什麼是Hypeledger,什麼是Fabric?Hypeledger從字面上的意思是超級賬本,它是Linux基金會於2015年12月啟動了名為“超級賬本”的開源項目,旨在推動各方協作,共同打造基於區塊鏈的企業級分散式總帳底層技術,用於構建支撐業務的行業應用和平台,以便支援各種各樣的商業應用情境。Fabric是超級賬本中的一個項目,為商業區塊鏈應用提供底層支援.Fabric是由IBM、數字資產和Blockstream等三家公司的代碼整合而成.
準備工作
- 環境準備(Ubuntu)
a. 安裝go的開發環境
b. 安裝git工具及環境配置
c. 利用git下載Fabric源碼.
git clone https://github.com/hyperledger/fabric.git (最好下載在go配置路徑的src檔案夾下)
- 技能準備
2.1 Fabric項目主要是使用go語言進行編寫,所有需要具備go語言的基礎知識.
a.基本的go文法知識.
b.go的並發知識.
c.一定的項目架構的設計模式思想
2.2 通過Fabric項目部署的peer網路節點間的資料互動是屬於不同的service(進程)間的通訊,使用的是gRPC(Google的遠端程序呼叫協議).所以需要掌握gRPC的基本用法和知識.而互動的資料格式使用的是 Protocol Buffers.
閱讀方式-HOW
step 1 瞭解Fabric項目下的各個模組包的作用,Fabric源碼項目是由不同的模組包組成的,瞭解各個模組包的作用有助於快速尋找到你需要閱讀的源碼類.模組和包劃分可參考http://qukuaiwang.com.cn/news/722.html. Fabric項目主要有三大模組peer和Order和fabric-ca,其中fabric-ca模組需要另外下源碼.本文討論的是Fabric的源碼,只包括peer和Order兩個模組.其他的Fabric源碼中的不同的包都是為這兩個模組服務.
step 2選定你要閱讀和理解的模組部分.
這裡寫圖片描述
圖中peer和o-service的屬於Fabric源碼中的模組內容.
step 3 模組的源碼閱讀(舉例說明)
注意
:Docker部署Fabric網路需要的鏡像是通過編譯Fabric的源碼的模組部分而來的,比如說,Fabric網路中的Peer鏡像是通過make Peer模組的源碼而來的.
eg
如果選定的是閱讀Order模組的源碼,需要對照利用Order模組的源碼編譯產生的Order Docker鏡像來啟動的Order容器.
3.1是fabric部署的網路節點啟動的docker容器展示圖.-----圖中可以看到最後一個容器啟動的資訊啟動的是Order容器,啟動時候啟動並執行命令是"orderer",Container Service開放的連接埠是7050連接埠,用於gRPC服務通訊.
這裡寫圖片描述
3.2 進入到Fabric源碼目錄的檔案夾,找到main.go入口檔案.
這裡寫圖片描述
3.3 main.go入口檔案的代碼理解
說明main.go檔案中的第三方包
kingpin - 一個Go(golang)命令列和flag解析器支援子命令.
//命令變數的的初始化,appvar ( app = kingpin.New("orderer", "Hyperledger Fabric orderer node") start = app.Command("start", "Start the orderer node").Default() version = app.Command("version", "Show version information"))//入口函數mainfunc main() { //開始解析命令kingpin switch kingpin.MustParse(app.Parse(os.Args[1:])) { // "start" command case start.FullCommand(): logger.Infof("Starting %s", metadata.GetVersionInfo()) conf := config.Load() initializeLoggingLevel(conf) initializeProfilingService(conf) grpcServer := initializeGrpcServer(conf)//初始化gPRC服務配置 initializeLocalMsp(conf) signer := localmsp.NewSigner() manager := initializeMultiChainManager(conf, signer) server := NewServer(manager, signer) ab.RegisterAtomicBroadcastServer(grpcServer.Server(), server) logger.Info("Beginning to serve requests") grpcServer.Start()//啟動服務 // "version" command case version.FullCommand(): fmt.Println(metadata.GetVersionInfo()) }}
1.Order的Docker容器運行起來的時候初始化命令是"orderer",而初始化命令參數flag預設的是"start",start = app.Command("start", "Start the orderer node").Default()
2.解析命令是switch的是"start" command,啟動並執行是start.FullCommand()
分支下的代碼,執行的是一些初始化的操作,接下來就可以具體查看Order模組的源碼初始化的細節.
參考連結
Protocol Buffers的學習筆記
gRPC學習筆記