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

華爲雲區塊鏈服務的總體架構

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

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

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

區塊鏈服務平臺

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

合約鏈碼

合約鏈碼層目前提供Hyperledger 標準智能合約接口,用戶能夠根據不一樣應用場景構建不一樣的智能合約,後續將與合做夥伴一塊兒爲用戶打造通用場景智能合約庫,如供應鏈管理和溯源、供應鏈金融、數字資產、公益慈善和互聯網保險等,企業能夠在此基礎上快速構建區塊鏈應用場景。github

業務應用層

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

b361c343a1bf4d0e98101448322e2dc5.jpeg

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

本文後續章節將帶領你如何使用華爲雲區塊鏈服務快速開發和部署鏈上應用,從區塊鏈服務平臺層、鏈碼層、應用業務層闡述開發和使用的方法。json

部署區塊鏈服務

步驟1:資源準備安全

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

點擊建立Kubernetes集羣按鈕,進入建立虛擬機的界面,在集羣名稱輸入框中命名集羣的名字,按需選擇本身要使用的配置(能夠採用默認配置)並點擊下一步按鈕進入圖3界面。

在圖3的界面上選擇2臺8核16GB內存的機器,在彈性IP欄點擊如今購買彈性IP,公網彈性IP主要用於對公網發佈BCS代理的訪問地址。在雲容器引擎左側導航條中點擊資源管理/虛擬機集羣如圖4,查看集羣列表中剛建立的集羣狀態是否購買成功。

3c35a0411cce41bda3e66c4182df7584.jpeg

圖2 雲容器引擎服務總覽

bb8248764b4d444c8a294e37cd1d5372.jpeg

圖3 選擇節點機器規格

5b6f9c752e9d43758bdec89413f19c16.jpeg

圖4 集羣信息列表

步驟2:部署服務

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

8585e7425a8a4260b247002590692781.jpeg

圖5 區塊鏈服務總覽

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

2cc054df2db147208ba068b3001ece2d.jpeg

圖6 購買區塊鏈服務

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

 

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

651c3918dd244e0996f9b34dfd897d80.jpeg

圖8 區塊鏈服務訂單詳情

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

698e808cd302451e8a5cd5f691b0d775.jpeg

圖9 區塊鏈服務運行界面

開發鏈碼

鏈碼也稱爲智能合約,實質上是控制區塊鏈網絡中的不一樣實體或相關方相互交易的業務邏輯。簡言之,鏈碼將業務網絡交易封裝在代碼中,能夠調用鏈碼來設置和獲取帳本,即區塊數據或世界狀態(world state)。

步驟1:示例場景說明

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

一、 測試管理者manager建立項目和模塊;

二、 測試管理者manager根據項目名稱、模塊添加測試用例、建立人和建立時間;

三、測試人員tester根據測試用例添加測試結果、測試時間、測試人員和備註;

四、測試人員tester、測試管理者manager、開發人員developer能夠根據項目名稱、模塊查詢測試用例;根據測試用例查詢測試結果、時間、測試人員和備註。

6aed2f8d26a64b999259c2cc5232b355.png

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

步驟2:編寫鏈碼

鏈碼開發人員可從

"github.com/hyperledger/fabric/core/chaincode/shim" 模塊查看鏈碼的接口,需實現init和invoke接口。shim模塊中的接口定義以下:

d8e23d38590840088bfe9e2d6b6885fc.png

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

對於有須要初始化處理的數據,能夠在初始化函數init中編寫並在鏈碼實例化的過程當中進行。這裏咱們定義了一個示例即初始化項目名稱,代碼實現以下:

6b02f66676c84ea4bd3ad2b08bce6d60.png

接下來開始定義內部邏輯的啓用函數invoke。首先經過接口中的內置方法GetFunctionAndParameters()來獲取傳入的函數別名和參數,經過switch case或if else條件語句把以前分析的各個用戶角色能夠調用的方法起個別名,而後和內部的真實方法作好一一對應關係,並將接口對象和相應調用參數傳入對應的方法。

具體的用戶可以訪問哪一個方法的權限邏輯控制可由上層的應用app實現,鏈碼主要完成對數據的存儲和查詢的邏輯。Invoke 鏈碼示例以下:

a6cd31feb46f4f629df574f4fa2d319d.png

完成invoke函數後咱們須要給這個go文件定義好它的入口main函數,經過fabric shim包中的Start方法來啓動咱們定義的全局智能合約,保證鏈碼能夠被正確的調用,示例以下:

e67f814a43534518b969738777589904.png

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

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

cc8d2c20730a4a4b8f33479ea0ce583e.jpeg

● 查詢測試用例經過部分匹配複合主鍵將具備相同的項目名稱和模塊名稱的值查詢出來,而後經過迭代器將鍵值中的測試用例名稱截取出來存成一個列表,對其進行json序列化並做爲查詢結果返回給上層App。上層App須要對查詢的數值進行反序列化便可拿到整個用例名稱的列表,根據其餘須要查詢具體用例結果。

eac6045d320847ee8e289d3e5bd32b0a.jpeg

f654a52fefc14b00b5e42f125cbe802f.png

步驟3:安裝部署鏈碼

鏈碼編寫完成以後咱們須要把鏈碼部署到fabric集羣環境中。華爲雲區塊鏈服務提供了可視化的鏈碼生命週期管理工具。在區塊鏈服務的管理控制檯上點擊服務列表後面的鏈碼管理連接,打開圖11中的鏈碼管理登錄頁面,輸入默認的用戶名admin和用戶建立服務時所設置的密碼,登錄鏈碼管理平臺對鏈碼進行相應的操做。

36adef129c234b82b002c8431a7b13a9.jpeg

圖11 鏈碼管理登錄界面

登錄後用戶可選擇在哪一個組織的哪一個節點peer上安裝鏈代碼。如圖12所示咱們選擇在testorg的peer-1節點安裝鏈代碼。點擊右上角的安裝鏈碼按鈕,須要填寫鏈碼名稱、版本號以及爲了保證完整性的信息摘要,最後上傳一個圖13所示的鏈碼zip格式的壓縮文件。

 

圖12 鏈碼管理界面

be66f4e061bc4356b89f1a6edb6ea75d.png

圖13 鏈碼安裝界面

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

3b69dfeb82624705b7874e87cb96cd74.jpeg

圖14 鏈碼壓縮包

dbd34dcdafd641faaae6961d902aaf73.png

圖15 鏈碼壓縮包摘要信息

鏈碼使用以前須要先實例化,安裝成功之後咱們在鏈碼的操做按鈕列中能夠看到圖16實例化按鈕已經處於激活狀態。點擊實例化按鈕,選擇鏈碼背書策略,輸入鏈碼的函數名、init方法的參數如上述示例中的項目名稱testproject、選擇要實例化的通道如testchannel,而後點擊肯定按鈕,觸發鏈碼的實例化。實例化結束後可在如圖17的界面上查詢鏈碼狀態,在testchannel上能夠查看鏈碼是否已經實例化成功。

72264c4b492845539aece02781f384d0.png

圖16 鏈碼激活狀態界面

5797139a1ba3454c892da1d309b81ba7.png

圖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配置。

d3cfb094e83848cca6968da20486a2fe.png

圖18 SDK配置文件下載界面

89f7c18f2981442da88342c31a321c15.png

圖19 配置SDK文件下載界面

在訂購的區塊鏈服務狀態列表頁面上能夠查看每一個節點的狀態以及相應的證書下載功能,咱們須要下載相關的證書到sdk的配置文件所指定目錄中,使得業務應用能夠和區塊鏈節點正常的進行通信。圖20顯示了orderer節點和peer節點的證書下載連接。

f26dd03dba8e4938ab716ebb6ff1d4d7.png

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

步驟2:編寫業務應用代碼

合理配置sdk與區塊鏈節點peer的通訊後,業務層應用代碼僅需對接鏈碼的invoke和query的方法。如下示例中咱們使用sdk提供的接口ChannelClient,即先經過加載sdk配置文件生成一個sdk實例,而後傳入通道名稱和用戶信息生成一個ChannelClient對象,最後使用該ChannelClient發起一筆執行鏈碼的交易。

b632a526e16d4288afd45ece77836bcb.jpeg

圖21 ChannelClient初始化過程

在業務應用代碼中定義好一個鏈碼的數據結構ChainCodeSpec,包括ChannelClient對象、 用戶信息和鏈碼名稱等,在ChannelClient初始化時給其賦值。將鏈碼的invoke和query方法定義成結構體方法,能夠很簡單的在發起交易的時候完成數據傳遞如圖22所示。

bb560a1a3e404e61af7511bf5d9c03ee.jpeg

圖22 調用鏈碼的invoke和query方法

步驟3:測試業務應用代碼

下面咱們簡單的定義一個main方法如圖23來測試一下咱們的代碼。首先聲明以前在鏈碼管理網站實例化的鏈碼信息,即鏈碼名稱chaicodetest,實例化的通道名稱testchannel,用戶使用的是組織內的普通用戶。其次,定義兩個測試方法建立測試用例和查詢測試用例。

建立測試用例create_testcases須要按順序傳入4個參數即項目名稱、模塊名稱、測試用例名稱和測試用例描述,調用invoke方法將一次交易寫入區塊鏈。查詢測試用例query_testcases方法傳入項目名稱和模塊名稱,查詢測試用例信息。

6f158581e1154754bf2f243dbbef69df.jpeg

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

以後咱們使用go run來執行這個測試用例,如圖24咱們能夠看到已經生成testchannel實例並與區塊鏈節點創建鏈接。爲了確認交易是否正常,鏈碼是否正確保存以前用例的複合鍵值索引,咱們登錄區塊鏈節點並用「docker logs <容器id>」命令咱們能夠看到如圖25中爲每筆交易建立的區塊。圖26鏈碼容器也可檢查咱們以前鏈碼打印的日誌來肯定是否能夠正確查詢測試用例。

e2dc5a149e1348f3ab3aff588fddb403.png

圖24 SDK代碼執行結果

0dfd601518f54fd8b263995dbb913a2c.png

圖25 查看區塊鏈節點peer中的運行結果

9697e8651d244dbf9e3aa942ed9bb0a7.png

圖26 鏈碼運行結果

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

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

https://github.com/cloud1230/testsystem

相關文章
相關標籤/搜索