華爲雲區塊鏈服務的總體架構html
華爲雲區塊鏈服務BCS是面向企業及開發者的高性能、高可用和高安全的區塊鏈技術平臺服務,能夠幫助企業和開發人員在華爲雲上快速、低成本的建立、部署和管理區塊鏈應用。java
BCS基於Hyperledger1.0、kubernetes搭建,配置簡單,數分鐘內便可完成部署,提供全流程的自動化運維服務,多維度監控;支持多種高效共識算法,切換靈活,秒級共識(2000+ TPS);多角色節點和成員可動態加入/退出;採用容器化物理資源管理;一鍵上鍊,節約80%的開發、部署成本;按需付費,減小60% 使用成本;統一運維,節約監控和運維成本;根據用戶需求進行彈性伸縮, 升級回滾;完善的用戶、祕鑰、權限管理和隔離處理,多層加密保障,國密和同態加密等隱私處理,可靠的網絡安全基礎能力,運營安全無憂。node
BCS的整體邏輯架構如圖1所示的三個層次,即區塊鏈服務平臺、合約鏈碼層和業務應用層。python
區塊鏈服務平臺git
區塊鏈服務平臺具備極強的可靠性和擴展性,後續根據市場需求逐步支持Corda 和EEA 等優秀區塊鏈框架,爲上層應用低成本、快速的提供高安全、高可靠、高性能的企業級區塊鏈系統。github
合約鏈碼算法
合約鏈碼層目前提供Hyperledger 標準智能合約接口,用戶能夠根據不一樣應用場景構建不一樣的智能合約,後續將與合做夥伴一塊兒爲用戶打造通用場景智能合約庫,如供應鏈管理和溯源、供應鏈金融、數字資產、公益慈善和互聯網保險等,企業能夠在此基礎上快速構建區塊鏈應用場景。docker
業務應用層json
業務應用層爲最終用戶提供可信、安全、快捷的區塊鏈應用。用戶可使用華爲雲提供的各類解決方案(例如供應鏈金融解決方案、遊戲行業解決方案、供應鏈溯源解決方案、新能源行業解決方案等),結合合約層快速搭建區塊鏈應用。安全
圖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。
一、測試管理者manager建立項目和模塊;
二、測試管理者manager根據項目名稱、模塊添加測試用例、建立人和建立時間;
三、測試人員tester根據測試用例添加測試結果、測試時間、測試人員和備註;
四、測試人員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/RFbDIWO