基於華為雲區塊鏈服務快速部署和搭建鏈上應用

程式猿da哥發表於2018-08-31

華為雲區塊鏈服務的整體架構

華為雲區塊鏈服務BCS是面向企業及開發者的高效能、高可用和高安全的區塊鏈技術平臺服務,可以幫助企業和開發人員在華為雲上快速、低成本的建立、部署和管理區塊鏈應用。

BCS基於Hyperledger1.0、kubernetes搭建,配置簡單,數分鐘內即可完成部署,提供全流程的自動化運維服務,多維度監控;支援多種高效共識演算法,切換靈活,秒級共識(2000+ TPS);多角色節點和成員可動態加入/退出;採用容器化物理資源管理;一鍵上鍊,節約80%的開發、部署成本;按需付費,減少60% 使用成本;統一運維,節約監控和運維成本;根據使用者需求進行彈性伸縮, 升級回滾;完善的使用者、祕鑰、許可權管理和隔離處理,多層加密保障,國密和同態加密等隱私處理,可靠的網路安全基礎能力,運營安全無憂。

BCS的總體邏輯架構如圖1所示的三個層次,即區塊鏈服務平臺、合約鏈碼層和業務應用層。

區塊鏈服務平臺

區塊鏈服務平臺具有極強的可靠性和擴充套件性,後續根據市場需求逐步支援Corda 和EEA 等優秀區塊鏈框架,為上層應用低成本、快速的提供高安全、高可靠、高效能的企業級區塊鏈系統。

合約鏈碼

合約鏈碼層目前提供Hyperledger 標準智慧合約介面,使用者可以根據不同應用場景構建不同的智慧合約,後續將與合作伙伴一起為使用者打造通用場景智慧合約庫,如供應鏈管理和溯源、供應鏈金融、數字資產、公益慈善和網際網路保險等,企業可以在此基礎上快速構建區塊鏈應用場景。

業務應用層

業務應用層為終端使用者提供可信、安全、快捷的區塊鏈應用。使用者可以使用華為雲提供的各種解決方案(例如供應鏈金融解決方案、遊戲行業解決方案、供應鏈溯源解決方案、新能源行業解決方案等),結合合約層快速搭建區塊鏈應用。

圖1 華為雲區塊鏈服務BCS的邏輯架構

部署區塊鏈服務

步驟1:資源準備

為了更穩定的執行區塊鏈服務需準備2臺8u16g機器來進行服務的部署。註冊並登陸華為雲賬號,進入華為雲管理控制檯, 選擇計算/雲容器引擎服務(見圖2)。

點選建立Kubernetes叢集按鈕,進入建立虛擬機器的介面,在叢集名稱輸入框中命名叢集的名字,按需選擇自己要使用的配置(可以採用預設配置)並點選下一步按鈕進入圖3介面。

在圖3的介面上選擇2臺8核16GB記憶體的機器,在彈性IP欄點選現在購買彈性IP,公網彈性IP主要用於對公網釋出BCS代理的訪問地址。在雲容器引擎左側導航條中點選資源管理/虛擬機器叢集如圖4,檢視叢集列表中剛建立的叢集狀態是否購買成功。

圖2  雲容器引擎服務總覽

圖3  選擇節點機器規格

圖4  叢集資訊列表

步驟2:部署服務

在雲管理控制檯點選區塊鏈服務進入如圖5的區塊鏈服務頁面, 點選該頁面右上角的“購買區塊鏈服務”的按鈕進入圖6。

圖5 區塊鏈服務總覽

在圖6的區塊鏈服務購買頁面中填寫區塊鏈服務名稱,選擇步驟1中建立的容器叢集。在該示例中我們建立了兩個節點組織testorg和developerorg,併為每個組織分配兩個peer節點;選擇快速拜占庭容錯共識策略,基於拜占庭容錯共識節點的最小數量為4,即3f+1,f=1;選擇ECDSA簽名演算法的成員證照分發機制;配置鏈碼管理Portal的登入密碼。

圖6  購買區塊鏈服務

區塊鏈節點的通道配置如圖7所示, 我們建立一個通道命名為testchannel, 把之前建立的組織testorg和developerorg加入該通道。完成如上配置之後, 點選下一步瀏覽該服務的概要資訊,最後提交訂單完成服務的訂購和配置過程如圖8。

圖7  區塊鏈節點的通道配置

圖8  區塊鏈服務訂單詳情

點選左側導航條的服務管理進入服務狀態查詢頁面,等待數分鐘後檢視所部署的服務狀態如圖9所示, 該服務進入成功執行狀態。

圖9  區塊鏈服務執行介面

開發鏈碼

鏈碼也稱為智慧合約,實質上是控制區塊鏈網路中的不同實體或相關方相互交易的業務邏輯。簡言之,鏈碼將業務網路交易封裝在程式碼中,可以呼叫鏈碼來設定和獲取賬本,即區塊資料或世界狀態(world state)。

步驟1:示例場景說明

該示例場景使用區塊鏈來追蹤研發團隊內的某產品的測試資料,通過查詢某個產品或者服務一段時間內的測試用例結果, 進而分析產品的功能狀態。開發人員可以查詢到失敗用例是哪些、集中在產品的哪些模組,還可以根據測試人員的名字,聯絡測試人員快速定位問題;測試管理者能根據不同測試人員的測試用例,發現問題的多少和模組的穩定程度;測試人員在系統中記錄測試結果,其他參與方可以查詢測試結果。該示例場景的基本功能說明如下。鏈碼的互動流程如圖10。

1、測試管理者manager建立專案和模組;

2、測試管理者manager根據專案名稱、模組新增測試用例、建立人和建立時間;

3、測試人員tester根據測試用例新增測試結果、測試時間、測試人員和備註;

4、測試人員tester、測試管理者manager、開發人員developer可以根據專案名稱、模組查詢測試用例;根據測試用例查詢測試結果、時間、測試人員和備註。

圖10 線下APP和鏈碼的簡單互動流程圖

步驟2:編寫鏈碼

鏈碼開發人員可從

"github.com/hyperledger/fabric/core/chaincode/shim" 模組檢視鏈碼的介面,需實現init和invoke介面。shim模組中的介面定義如下:

在定義好整個程式碼的儲存目錄結構後,開發人員需將"github.com/hyperledger/fabric/core/chaincode/shim" 加入到方法引用。

對於有需要初始化處理的資料,可以在初始化函式init中編寫並在鏈碼例項化的過程中進行。這裡我們定義了一個示例即初始化專案名稱,程式碼實現如下:

接下來開始定義內部邏輯的啟用函式invoke。首先通過介面中的內建方法GetFunctionAndParameters()來獲取傳入的函式別名和引數,通過switch case或if  else條件語句把之前分析的各個使用者角色可以呼叫的方法起個別名,然後和內部的真實方法做好一一對應關係,並將介面物件和相應呼叫引數傳入對應的方法。

具體的使用者能夠訪問哪個方法的許可權邏輯控制可由上層的應用app實現,鏈碼主要完成對資料的儲存和查詢的邏輯。Invoke 鏈碼示例如下:

完成invoke函式後我們需要給這個go檔案定義好它的入口main函式,通過fabric shim包中的Start方法來啟動我們定義的全域性智慧合約,保證鏈碼可以被正確的呼叫,示例如下:

這樣我們鏈碼的基本程式碼架構就搭建好了,開發人員可繼續填充每個方法內的邏輯,即別名所對應的真實方法的實現。我們以建立測試用例和查詢測試用例為示例說明。

● 建立測試用例以專案名稱、模組名稱及測試用例名稱構成複合主鍵,然後為它建立一個索引,再將建立好的索引存入鏈中。這樣查詢的時候就可以使用不同的組合查詢方式查詢真實需要的結果。

● 查詢測試用例通過部分匹配複合主鍵將具有相同的專案名稱和模組名稱的值查詢出來,然後通過迭代器將鍵值中的測試用例名稱擷取出來存成一個列表,對其進行json序列化並作為查詢結果返回給上層App。上層App需要對查詢的數值進行反序列化即可拿到整個用例名稱的列表,根據其他需要查詢具體用例結果。

步驟3:安裝部署鏈碼

鏈碼編寫完成之後我們需要把鏈碼部署到fabric叢集環境中。華為雲區塊鏈服務提供了視覺化的鏈碼生命週期管理工具。在區塊鏈服務的管理控制檯上點選服務列表後面的鏈碼管理連結,開啟圖11中的鏈碼管理登陸頁面,輸入預設的使用者名稱admin和使用者建立服務時所設定的密碼,登陸鏈碼管理平臺對鏈碼進行相應的操作。

圖11  鏈碼管理登陸介面

登陸後使用者可選擇在哪個組織的哪個節點peer上安裝鏈程式碼。如圖12所示我們選擇在testorg的peer-1節點安裝鏈程式碼。點選右上角的安裝鏈碼按鈕,需要填寫鏈碼名稱、版本號以及為了保證完整性的資訊摘要,最後上傳一個圖13所示的鏈碼zip格式的壓縮檔案。

圖12  鏈碼管理介面

圖13   鏈碼安裝介面

鏈碼的zip壓縮包和壓縮包的摘要資訊計算如圖14和15所示。

圖14   鏈碼壓縮包

圖15   鏈碼壓縮包摘要資訊

鏈碼使用之前需要先例項化,安裝成功以後我們在鏈碼的操作按鈕列中可以看到圖16例項化按鈕已經處於啟用狀態。點選例項化按鈕,選擇鏈碼背書策略,輸入鏈碼的函式名、init方法的引數如上述示例中的專案名稱testproject、選擇要例項化的通道如testchannel,然後點選確定按鈕,觸發鏈碼的例項化。例項化結束後可在如圖17的介面上查詢鏈碼狀態,在testchannel上可以檢視鏈碼是否已經例項化成功。

圖16  鏈碼啟用狀態介面

圖17  鏈碼例項化成功介面

開發業務層區塊鏈應用

Hyperledger fabric目前支援java,nodejs,go和python語言的sdk,供使用者選擇用不同的語言開發上層應用,使用相應的sdk呼叫部署在區塊鏈上的鏈碼。以下示例中我們選擇使用go語言開發業務層應用。

步驟1:配置fabric sdk

Hyperledger fabric官方提供了我們需要的go sdk檔案包,下載地址是:

https://github.com/hyperledger/fabric-sdk-go。目前BCS服務使用的版本commit號是035e4f9。

我們需要為fabric sdk生成相應的配置檔案和訪問區塊鏈節點的組織證照。SDK配置檔案主要包括要訪問的鏈碼名稱/版本、證照解壓的目錄位置、例項化鏈碼的通道,安裝鏈碼的節點組織/名稱。在訂購的區塊鏈服務狀態中的點選圖18中的“下載SDK配置“會彈出圖19配置視窗,完成sdk配置。

圖18  SDK配置檔案下載介面

圖19  配置SDK檔案下載介面

在訂購的區塊鏈服務狀態列表頁面上可以檢視每個節點的狀態以及相應的證照下載功能,我們需要下載相關的證照到sdk的配置檔案所指定目錄中,使得業務應用可以和區塊鏈節點正常的進行通訊。圖20顯示了orderer節點和peer節點的證照下載連結。

圖20 orderer節點和peer節點的證照下載

步驟2:編寫業務應用程式碼

合理配置sdk與區塊鏈節點peer的通訊後,業務層應用程式碼僅需對接鏈碼的invoke和query的方法。以下示例中我們使用sdk提供的介面ChannelClient,即先通過載入sdk配置檔案生成一個sdk例項,然後傳入通道名稱和使用者資訊生成一個ChannelClient物件,最後使用該ChannelClient發起一筆執行鏈碼的交易。

圖21   ChannelClient初始化過程

在業務應用程式碼中定義好一個鏈碼的資料結構ChainCodeSpec,包括ChannelClient物件、 使用者資訊和鏈碼名稱等,在ChannelClient初始化時給其賦值。將鏈碼的invoke和query方法定義成結構體方法,可以很簡單的在發起交易的時候完成資料傳遞如圖22所示。

圖22   呼叫鏈碼的invoke和query方法

步驟3:測試業務應用程式碼

下面我們簡單的定義一個main方法如圖23來測試一下我們的程式碼。首先宣告之前在鏈碼管理網站例項化的鏈碼資訊,即鏈碼名稱chaicodetest,例項化的通道名稱testchannel,使用者使用的是組織內的普通使用者。其次,定義兩個測試方法建立測試用例和查詢測試用例。

建立測試用例create_testcases需要按順序傳入4個引數即專案名稱、模組名稱、測試用例名稱和測試用例描述,呼叫invoke方法將一次交易寫入區塊鏈。查詢測試用例query_testcases方法傳入專案名稱和模組名稱,查詢測試用例資訊。

圖23  業務應用呼叫鏈碼實現端到端測試

之後我們使用go run來執行這個測試用例,如圖24我們可以看到已經生成testchannel例項並與區塊鏈節點建立連線。為了確認交易是否正常,鏈碼是否正確儲存之前用例的複合鍵值索引,我們登陸區塊鏈節點並用“docker logs <容器id>”命令我們可以看到如圖25中為每筆交易建立的區塊。圖26鏈碼容器也可檢查我們之前鏈碼列印的日誌來確定是否可以正確查詢測試用例。

圖24   SDK程式碼執行結果

圖25 檢視區塊鏈節點peer中的執行結果

圖26   鏈碼執行

本文通過一個簡單的例子介紹如何通過華為雲提供的區塊鏈服務快速的開發和搭建起一個應用,使用者可以根據所需的場景,基於本文的示例部署區塊鏈服務,開發鏈碼和業務層應用。

本文只闡述了部分程式碼的實現,完整的程式碼下載地址是:

https://github.com/cloud1230/testsystem,供開發人員參考。

華為雲區塊鏈服務:http://t.cn/RFbD7V7

相關文章