Fabric-sample 是官方提供給初學 Hyperledger Fabric 的人使用的一套範例,github 連結在這裡,我下面所示範的是v2.2的版本,我不確定你看到的時候已經更新到哪裡了,至少保證2.2是這樣玩! 請放心服用
首先我們先讓環境符合 Hyperledger Fabric 的需求,以下是我的環境
部署完成後的架構會長這樣
基本套件
安裝 docker
安裝 go
取得 fabric-sample
完成後就會像這樣
這樣就算完成環境的準備了,接下來…
fabric 其實是由許多的container組合而成的服務,官方提供的 sample 中會建出1個 orderer、2個 peer 與2個 org,我們直接用官方提供的 script 進行演練。
進入操作資料夾位置
這邊可以看到幾個資料夾,我們針對重點進行說明
啟動 fabric 的 container 吧
完成後可以看到3個container啟動了,分別是 peer0.org2.example.com、peer0.org1.example.com 和 orderer.example.com
至此代表 fabric 環境已經建立完成了
如果看過前面介紹 Hyperledger Fabric ,相信你已經大略了解 channel 的重要性,部署 channel 便會用到上面提到的 configtx ,透過該 yaml 檔可以定義整個 Fabric 的走向,再加上區塊鏈不可逆的特性,初始區塊是非常重要的,記得開始部署前先想好自己要的架構再部署,否則就是無限的重頭。這裡因為官方都幫你設定好了,就直接下手吧
完成後可以看到這句小小的提示
至此代表 channel 建立成功並且 peer 也加入 channel
Chaincdoe 就是核心啦,官方 script 都幫妳寫好了就簡單這個指令下下去就對了
完成後可以看到這令人匪夷所思的結語
「Chaincode initialization is not required」什麼意思呢? 是不是部署出錯了?
別擔心,因為2.2開始此 script 只是幫你把預設的 chaincode 打包好並且安裝在 peer 和 channel 中,而1.4的則是連 init 都幫你完成了,所以如果你是從1.4跳到2.2的話,別緊張~這一切還在掌控中。
接著,我們便需要手動 init 該 chaincode。在 init 之前請先切換身分成 peer0.org1.example.com (當然你要使用 peer0.org2.example.com 也可以),才可以接續操作喔!
身份切換完成後,便可以 init 已安裝的 chaincode 了,如下
當你看到如下圖的提示訊息,便代表 init 成功了,接著便可以嘗試查詢帳本內容
這樣一個熱騰騰的 Hyperledger Fabric 的服務便完成了,真是可喜可賀!!
好啦,如果你只是想要透過 fabric-sample 先成功部署出來的話,上述的過程就足夠了,接下來我們會來拆解上述過程中跑出來的訊息所代表的意思
在此步驟中,我們主要是透要取得 peer 、orderer 與 org 的相關憑證與金鑰,在沒有 ca server 的狀況下,Fabric 提供一個產金鑰的套件叫做「cryptogen」,此套件的原理跟 openssl 差不多~有興趣的自己去找資料。
我們會提供他一個設定檔,定義出我們有幾個 organization 、該 organization 有幾個 peer、同時我們會有幾個 orderer 等資訊,因此我們先來看看 script 輸出的流程
在圖中我們可以看到提供給 cryptogen 的 config 檔案,以下先貼出 org1 的設定
前面比較不需要說明,org 的 Name 和 Domain 在此進行定義,EnableNodeOUs 則是 Fabric 中 policy 會用到的一種功能,未來在針對 fabric ca 的時候會在說明,這邊先知道就好。
下面 Template 與 Users 的部分雖然註解也有說明了,我這邊就簡要的提一下:
Org2 的部分也相同,這邊就跳過,接著來看看 orderer 的
對 orderer 來說就相對簡單一點,前面的 Name、Domain、EnableNodeOUs 是相同的意思,代過
Spec 則是你會用到的主機名稱,在實際的 fabric 環境中我們會使用多主機的方式進行分布式部署,而在 k8s 的環境中更是會透過多個 pod 組合成一個完整的 k8s 環境,因此此處便需要定義你環境中會用的主機名稱或是域名。 此範例因為都在 localhost,所以就不需要設定額外的域名了。
當產生完這些金鑰與憑證後,script 便會開始產生創世區塊,也就是前面所說會用到的 configtx.yaml,因為該 yaml 的內容太多了這邊實在沒辦法一次說完,因此先針對執行的指令進行說明
接著就是啟動各個 container,當然所有設定檔都已經先行完成了,在 fabric-samples/test-network/docker 資料夾中,以後在 k8s 部署的時候再說明。
channel 的部分我們將所有的指令分成兩個部分來看
主要來說在創建通道前,我們要提供一些訊息給通道知道,例如有多少組織在上面跑、組織對外溝通的 anchorpeer 是誰等
接著就是實際建立通道的時候了,首先先根據先前產生的通道初始訊息 (mychannel.tx) 進行搭建通道的初始區塊 (mychannel.block)
由於 fabric-sample 預設是有啟用 TLS 的服務,因此此處必須將 cafile 帶入執行參數中,所以指令才會這麼長,當你看到下圖的狀況,即代表你成功創建通道了!
接著將兩個組織加入此通道之中,並且告訴通道組織中的 anchorpeer 是誰
這邊或許有小夥伴會搞混,上面不是已經知道 anchorpeer 是誰了嗎? 為甚麼還要再說一次?
上面產出的 Org1MSPanchors.tx 有注意到副檔名嗎? 沒錯,他對於通道來說只是一個敘述設定檔,因此必須透過 *.tx 這個檔案告訴通道說,org1 和 org2 的 anchorpeer 是誰,這樣才會確實在該通道上運行。
之後看到上圖,就可以結束這回合了!!
接著就是部署 chaincode 的時間啦,首先 fabric 預設是會使用 go 進行部署,畢竟整個 fabric 就是透過 go 寫出來的,當然她也支援 java、javascript,有興趣的可以試著透過 java 等方式部署看看
在部署之前,系統會先幫你透過 go 安裝一些相依的組件,會先運行下列指令,在 script 輸出的狀況下應該是看不到的
完成後查看檔案會多了一個 vendor 的檔案,這是該 chaincode 會用到的相依檔案
接著我們要將 chaincode 打包成 tar 檔,讓 peer 可以進行安裝。
之後便是讓兩個組織的 peer 安裝該 tar 檔
當完成此步驟後,系統會輸出一串 packet ID,這個 ID 是根據你所安裝的 chaincode 隨機產出的代碼,主要用於識別在通道的 chaincode。
通常當看到這個 packet ID 即代表 chaincode 已經安裝完成了,不過我們還是可以透過指令查看在 peer 上已經安裝的 chaincode
接著讓我們允許該 chaincode 允許在我們的通道上運行吧!!
這時候我們可以來看看,在通道上的組織們是不是都批准了該 chaincode 的運行,當組織都批准後便會出現下圖狀況
當組織們都批准這隻 chaincode 之後,我們便可以把 chaincode 上傳到通道上進行使用了;是的不要懷疑,你上面剛剛作的所有事情都只是把 chaincode 安裝到 peer,並且允許他運行而已,不代表他已經在通道中使用了!
完成上船之後,我就來檢查看看該 channel 上的 chaincode 有哪些
這樣就恭喜你完成了 chaincode 的部署了!! 也恭喜你終於看完了整個 fabric 的部署流程了!!
乾,不得不說這真的很煩,裡面的毛很多,一下又要因為權限失敗、一下又因為網路失敗、還有ㄊㄇㄉ版本問題,搞的心很累。前期因為版本的問題,用的設定檔會有點不一樣,尤其不知道原理的時候看著 script 跑完之後心裡只有一種「阿…然後呢?」的想法,拆他 script 的時候也花了不少時間去理解他到底在公三小,希望這篇可以提升你對於 fabric 的一些流程概念,這樣之後手動分布式部署、手動k8s 部署都是遵從這些規則,之後再慢慢更新吧,我先睡了…
じゃあまたね