朱冠燁, 裴倫浩, 郭彥輝
(中國聯(lián)合網(wǎng)絡通信有限公司濟南軟件研究院, 濟南 250000)
區(qū)塊鏈是按照一定的共識規(guī)則將數(shù)據(jù)存儲于不同區(qū)塊,并以一定的哈希規(guī)則組合相連的數(shù)據(jù)結構,通過密碼學的方式保證其不可篡改的分布式賬本[1]。 憑借“不可篡改”、“可追溯”等優(yōu)良特性,近年來區(qū)塊鏈技術發(fā)展如火如荼,眾多大型企業(yè)紛紛將區(qū)塊鏈技術作為重點的突破方向。 比較經(jīng)典的區(qū)塊鏈應用,如比特幣、以太坊、超級賬本等,在各行業(yè)已經(jīng)投入使用。 聯(lián)通鏈BCS 系統(tǒng)是由中國聯(lián)通軟件研究院自研的區(qū)塊鏈產(chǎn)品,BCS 是集區(qū)塊鏈部署、運維、節(jié)點管控、應用等能力于一身的可視化操作平臺,支持以租戶的方式在聯(lián)通云上快速構建穩(wěn)定、安全的生產(chǎn)級區(qū)塊鏈網(wǎng)絡,降低用戶對區(qū)塊鏈底層技術的獲取成本,實現(xiàn)業(yè)務數(shù)據(jù)快速、穩(wěn)定、安全上鏈。
傳統(tǒng)的區(qū)塊鏈部署方法較為冗雜,部署時需要進行各主機的適配和區(qū)塊鏈調(diào)度的聯(lián)調(diào),使用過程中主機資源不足時,進行資源擴展的過程較為復雜,常常影響業(yè)務數(shù)據(jù)的使用。 隨著云技術越來越成熟,騰訊云、阿里云、聯(lián)通云等提供了各類資源池和環(huán)境沙箱,資源支撐彈性調(diào)度。 基于此,本文從云環(huán)境出發(fā),進行了區(qū)塊鏈平臺搭建的嘗試。
容器是指與系統(tǒng)其他部分隔離開的一系列進程,類似于一個封閉的箱子,該箱子提供了某些應用所需的全部依賴[2]。 由于容器的封閉性及其完備性,使得容器化的程序具有較高的可移植性。 容器技術的出現(xiàn),使得復雜的業(yè)務過程可以進行解耦,按照功能模塊進行微服務拆分,各模塊各司其職,當某個模塊運行中斷時也不會使其他模塊受到影響。 因此,如果對區(qū)塊鏈平臺進行微服務拆分,當某個子模塊出現(xiàn)資源不足或者故障時,也不會影響區(qū)塊鏈平臺的業(yè)務使用。
kubernetes(k8s)是一個開源,以集群方式部署調(diào)度容器應用,彈性伸縮以及運維容器集群的系統(tǒng)[3]。 區(qū)塊鏈服務底層基于k8s 引擎調(diào)度,因各節(jié)點之間調(diào)用復雜,各節(jié)點又可能面臨資源擴縮的問題,傳統(tǒng)的本地集群部署方式運維復雜,因此,區(qū)塊鏈云化部署變得十分必要。
BCS 系統(tǒng)架構如圖1 所示。 通常一個完整的區(qū)塊鏈平臺系統(tǒng)調(diào)用邏輯如下:前端業(yè)務層用于和不同的業(yè)務系統(tǒng)對接,提供區(qū)塊鏈對外服務的接口,例如提供數(shù)據(jù)上鏈、查詢等操作支撐,當用戶發(fā)送前臺的區(qū)塊鏈操作請求之后,請求會轉發(fā)到區(qū)塊鏈SDK調(diào)度層,即區(qū)塊鏈平臺后臺服務,后臺服務會對前臺的請求進行判斷和轉發(fā),如果是對平臺本身的操作,則進行數(shù)據(jù)庫交互;如果請求到了智能合約,則轉發(fā)到智能合約層[4];如果請求到了區(qū)塊鏈引擎或者k8s 引擎,則轉發(fā)至相應的服務接口處。 當請求涉及到區(qū)塊鏈操作時,區(qū)塊鏈底層服務會對交易進行排序、打包、記賬等一系列操作,生成新的交易區(qū)塊并廣播到所有區(qū)塊,該過程在區(qū)塊鏈底層服務層完成,完成一次完整的前臺請求調(diào)用區(qū)塊鏈服務。
圖1 BCS 系統(tǒng)架構圖Fig. 1 BCS system architecture diagram
按照區(qū)塊鏈平臺的工作流程,本文提出了基于微服務拆分的區(qū)塊鏈平臺部署方法,如圖2 所示。首先需要進行云集群的搭建,目前市面上流行的云開發(fā)環(huán)境都提供了直接可用的k8s 集群環(huán)境;之后申請云環(huán)境配套的數(shù)據(jù)庫、共享存儲等資源;根據(jù)區(qū)塊鏈各個模塊的功能特點,進行區(qū)塊鏈平臺微服務拆分、服務鏡像構建、部署;最后,對部署的平臺進行可用性驗證。
圖2 基于微服務拆分的區(qū)塊鏈平臺部署方法Fig. 2 Blockchain platform deployment method based on microservices
每個模塊需要構建其服務鏡像,以區(qū)塊鏈引擎模塊為例,對鏡像構建以及應用部署過程介紹如下:
在編寫鏡像構建的Dockerfile 時,需要先將啟動fabric 的配置文件,根據(jù)實際環(huán)境進行修改;在構建鏡像時,需要將fabric 的引擎程序和區(qū)塊鏈節(jié)點模板放在同一目錄下,并將啟動區(qū)塊鏈節(jié)點的配置共享文件放在共享存儲的磁盤上,鏡像構建完畢,推送至鏡像倉庫。
部署時需要編寫該服務模塊啟動使用的yaml文件,使用deployment 的方式將該服務啟動起來。首先需要為該pod 提供掛載的PV 和PVC,配置好鏡像拉取策略進行鏡像拉取,指定好服務的pod 對應的資源量和指定容器的服務端口。 需要注意的是,因為區(qū)塊鏈引擎需要調(diào)用智能合約部分,需要指定好智能合約的上傳路徑,在環(huán)境變量中進行配置,將GOPATH 環(huán)境變量配置在啟動文件中。
最后通過kubernetes 中service 的部署方式,將容器的服務端口暴露出去,實現(xiàn)不同服務模塊之間互訪,完成配置。 所有的服務部署完畢,通過嘗試調(diào)用智能合約是否成功即可查看平臺是否部署成功。
區(qū)塊鏈的應用場景很多,依托于區(qū)塊鏈的加密特性以及智能合約的業(yè)務場景結合,在運營商領域,區(qū)塊鏈的核心應用場景還是存證相關的業(yè)務,常見的場景如關聯(lián)交易業(yè)務、供應鏈黑名單、供應鏈協(xié)同存證等等。 為了支撐以上業(yè)務數(shù)據(jù)存證上鏈需求,需要開發(fā)相應的智能合約函數(shù),通過對智能合約的請求頻次統(tǒng)計發(fā)現(xiàn),以下兩個智能合約接口調(diào)用最為頻繁,分別為:stub.PutState(args[0],[]byte(args[1])) , stub.GetState(args[0]),其中前者實現(xiàn)了將數(shù)據(jù)以key-value 的形式存入狀態(tài)數(shù)據(jù)庫;后者可以通過key 值對數(shù)據(jù)進行查詢,因此,通過對智能合約的讀、寫可以測試平臺的穩(wěn)定性,本文主要使用智能合約中最常用的存儲鍵值(putstate)和查詢鍵值(querystate)兩個函數(shù)進行測試。
Fabric 的落地策略會對系統(tǒng)的性能產(chǎn)生一定的影響,落地策略主要包括4 個參數(shù):BatchTimeout(出塊響應時間),MaxMessageCount(區(qū)塊最大交易數(shù)),AbsoluteMaxBytes ( 區(qū) 塊 最 大 存 儲 量),PreferredMaxBytes(單筆最大交易數(shù)據(jù)量),本文在實驗時,為了簡化模型,盡量避免使用時間超時出塊策略的同時,多次調(diào)整參數(shù)后,統(tǒng)一采用響應時間為2 s,最大交易數(shù)為100 筆,最大存儲量為99 MB,單筆最大交易512 KB 來進行測試。
為了模擬區(qū)塊鏈平臺實際使用時的情形,本文對不同的狀態(tài)數(shù)據(jù)庫進行了壓力測試,通過不同數(shù)據(jù)量的情形分別測試,得到的結果如圖3、圖4 所示:隨著數(shù)據(jù)量的增加,請求時延有增加,但是并沒有出現(xiàn)超時的情形,CPU 的利用率也保持在合理的范圍內(nèi),沒有出現(xiàn)異常情形,說明平臺穩(wěn)定運行,滿足生產(chǎn)需求。
圖3 不同狀態(tài)數(shù)據(jù)庫批量讀寫平均請求時延曲線Fig. 3 The average request latency for batch reads and writes of two state databases during a single request
圖4 不同狀態(tài)數(shù)據(jù)庫批量讀寫-Peer 節(jié)點CPU 使用量變化曲線Fig. 4 CPU batch read-writing usage of Node Peer in different state databases
為了解決區(qū)塊鏈平臺的云部署問題,本文基于微服務拆分的方式提出了一種基于微服務的區(qū)塊鏈平臺快速云部署方法,解決了動態(tài)資源擴展復雜的問題,基于云環(huán)境的區(qū)塊鏈安全性更高。 經(jīng)驗證,平臺性能穩(wěn)定,能滿足正常的生產(chǎn)需求。
區(qū)塊鏈的部署一直較為復雜,涉及到的節(jié)點交互情形較多,本文通過將容器服務鏡像直接進行封裝,可以通過后續(xù)流水線的方式進行一鍵部署,大大簡化了原有的部署過程。 后續(xù)工作中,將更加關注區(qū)塊鏈平臺的應用情形,將平臺推廣到更多的業(yè)務場景中去。