方 軼,叢林虎,楊珍波
1(海軍航空大學,煙臺 264001)
2(92349 部隊,淄博 255100)
2008年,中本聰發(fā)表了一篇名為《Bitcoin:A Peerto-Peer Electronic Cash System》的論文,提出了一種基于密碼學的電子貨幣,并命名為比特幣(Bitcoin)[1].區(qū)塊鏈(Blockchain)技術作為比特幣的底層技術,包含了P2P、分布式存儲、共識機制、智能合約、密碼學等計算機技術,具有去中心化、匿名性、存儲數(shù)據(jù)不可篡改、可追溯的特點[2],使區(qū)塊鏈成為近些年來信息技術中最受關注的焦點之一并使其迅速發(fā)展.
最初區(qū)塊鏈技術更多地被應用在金融領域,能夠使交易不通過第三方可信任機構完成,同時還能很大程度上確保交易的匿名性、交易數(shù)據(jù)安全以及交易數(shù)據(jù)可追溯.如今,區(qū)塊鏈技術已經成為又一項能夠引領信息時代變革的新技術,其應用已經不僅僅局限于數(shù)字金融領域.在醫(yī)療數(shù)據(jù)存儲領域[3],薛騰飛等人進行了基于區(qū)塊鏈的醫(yī)療數(shù)據(jù)共享模型研究,為實現(xiàn)智慧醫(yī)療以及醫(yī)療大數(shù)據(jù)提供了基礎平臺;在能源領域[4]方面,張俊等人在智能分布式電力能源系統(tǒng)中采用區(qū)塊鏈技術,提出了一種分布式存儲方案;同時區(qū)塊鏈技術在身份認證[5]、投票系統(tǒng)[6]等方面有著廣闊的應用前景.然而仍然有許多領域還未進行區(qū)塊鏈技術應用方面的探索,尤其是在軍事、氣象、地理等對數(shù)據(jù)安全性要求較高的領域還存在著很大的研究空間.
相比于區(qū)塊鏈研究的熱度,對智能合約的研究大多是基于區(qū)塊鏈技術上進行的.研究內容主要是智能合約的運行環(huán)境、技術平臺、合約協(xié)議以及應用場景推廣等方面[7].本文主要研究了基于區(qū)塊鏈的數(shù)字化智能合約應用,針對航空導彈業(yè)務場景進行了區(qū)塊鏈系統(tǒng)及智能合約的開發(fā).
總體上,一個區(qū)塊鏈應用主要由數(shù)據(jù)層、網絡層、共識層、激勵層、合約層和應用層[8],具體如圖1所示.本文所做的主要是合約層的工作.
圖1 區(qū)塊鏈基本架構
按照區(qū)塊鏈網絡的開放程度,區(qū)塊鏈可以分為以下三類:公有鏈、聯(lián)盟鏈和私有鏈.區(qū)塊鏈技術隨著比特幣的提出進入到人們的視野,近些年來有許多區(qū)塊鏈研究人員、基金會、企業(yè)、聯(lián)盟以及活躍的區(qū)塊鏈愛好者在區(qū)塊鏈開源平臺方面進行了大量的工作,出現(xiàn)了諸多優(yōu)秀的區(qū)塊鏈平臺,如公有鏈平臺以太坊(Ethereum)、聯(lián)盟鏈平臺超級賬本Hyperledger.
2013年末,年僅19 歲的俄羅斯程序員Vitalik Buterin發(fā)布了Ethereum 初版白皮書,標志著Ethereum 項目正式啟動.Ethereum 平臺使用的加密貨幣Ether (以太幣)也被人們稱為第二代加密貨幣[9].
以太坊平臺實現(xiàn)的突破就是它支持用戶自行編寫智能合約,發(fā)行自己的數(shù)字貨幣.以太坊平臺允許用戶使用Sodility 編程語言編寫智能合約.Sodility 是一種語法類似JavaScript 的高級語言,并且是圖靈完備的.編寫好的智能合約運行于EVM (以太坊虛擬機) 中,EVM 是一個沙盒環(huán)境,可以嚴格控制內部訪問權限,保證智能合約運行時的安全.
區(qū)塊鏈中引入了共識機制.共識機制的作用是在決策權高度分散的去中心化系統(tǒng)中使各個節(jié)點高效地達成共識,保持所有分布式賬本數(shù)據(jù)的同步.區(qū)塊鏈中使用的共識機制主要有:PoW (工作量證明機制)、PoS(股權證明機制)、DPoS (股份授權證明機制)、PBFT(實用拜占庭容錯算法)[10].比特幣與以太坊所使用的都是PoW 共識算法.
Linux 基金會開原組織于2015年12月啟動了名為Hyperledger 的開源項目[11],意在多方共同打造區(qū)塊鏈技術的企業(yè)級應用平臺,至今已匯集了眾多行業(yè)企業(yè)精英.Hyperledger 中5 個重要子項目如表1.
表1 Hyperledger 重要子項目信息
其中Fabric 社區(qū)活躍度最高,版本更新最快,采用了模塊化架構設計,支持可插拔組件的開發(fā)與使用.Fabric 的主要組件包括:客戶端(Client)、網絡節(jié)點(Peer)、CA (Certificate Authority)節(jié)點和排序服務節(jié)點(Orderer).
其中客戶端的主要作用是和Fabric 系統(tǒng)進行交互,實現(xiàn)對區(qū)塊鏈系統(tǒng)的操作.客戶端主要有命令行客戶端(CLI)以及用Fabric SDK 開發(fā)的應用客戶端.網絡節(jié)點是區(qū)塊鏈去中心化P2P 網絡中的對等節(jié)點,按照功能可以分為背書節(jié)點(Endorser)和確認節(jié)點(Committer).背書節(jié)點主要對交易提案進行模擬執(zhí)行以及背書驗證.確認節(jié)點主要負責驗證交易的合法性,并更新和維護區(qū)塊鏈數(shù)據(jù)與賬本狀態(tài).
CA 節(jié)點主要負責為Fabric 網絡中的成員提供基于數(shù)字證書的身份信息,可以生成或取消成員的身份證書.Fabric 可以通過CA 節(jié)點實現(xiàn)節(jié)點權限控制的管理.
排序服務節(jié)點主要負責對各個節(jié)點發(fā)送的交易提供排序服務,并使所有記賬節(jié)點達成共識.之后排序節(jié)點按照一定規(guī)則確定交易順序之后,將數(shù)據(jù)發(fā)送給各個節(jié)點,把交易數(shù)據(jù)持久化到區(qū)塊鏈賬本中.
各個組件相互關系如圖2所示.
圖2 Fabric 組件關系示意圖
以太坊與超級賬本是兩個在區(qū)塊鏈技術發(fā)展過程中具有劃時代意義的項目,以太坊的出現(xiàn)標志著區(qū)塊鏈進入到2.0 時代,超級賬本項目則代表區(qū)塊鏈3.0 時代.除此之外,還有許多區(qū)塊鏈平臺,如比特股(BitShares)[12]、瑞波幣(Ripple)[13]、以及中國的趣鏈(Hyperchain)[14]活躍于世界比特幣舞臺上.表2是幾種區(qū)塊鏈平臺的對比.
要將區(qū)塊鏈技術應用于部隊導彈業(yè)務數(shù)字化登記工作中,首先需要選擇合適的開發(fā)平臺.根據(jù)部隊實際情況,選用聯(lián)盟鏈開發(fā)平臺Hyperledger Fabric 更符合部隊實際,因為聯(lián)盟鏈相比公有鏈和私有鏈具有用戶證書頒發(fā)、用戶身份識別的功能,具有PKI 體系的認證機制,能有效控制入網用戶的各種權限.
表2 部分區(qū)塊鏈平臺對比
1994年,Szabo N 首次提出了智能合約(smart contract)的概念[15].智能合約的本質是一段運行于網絡中的模塊化、可重用、自動執(zhí)行的腳本代碼,同時它還具有兩個重要的特點:圖靈完備與沙箱隔離.也正是由于智能合約的特點,使其在被提出的初期并沒有得到廣泛的關注與應用.隨著比特幣、區(qū)塊鏈以及各種區(qū)塊鏈開源平臺的出現(xiàn),才使得智能合約由概念逐步落地實現(xiàn),如今智能合約已經成為區(qū)塊鏈應用中的重要組成部分.
智能合約在區(qū)塊鏈應用中的地位相當于現(xiàn)實生活中的合同,加入區(qū)塊鏈的用戶都要遵照智能合約來完成特定的行為,開發(fā)者可以通過編寫智能合約規(guī)定用戶的行為.智能合約開發(fā)完成后需要部署于區(qū)塊鏈網絡中,部署后的智能合約對用戶是不可見的,保證了智能合約的隱私性,開發(fā)者可以在使用過程中對智能合約進行修改、升級.
在Fabric 中,智能合約也被稱為Chaincode (鏈碼),即鏈上代碼,主要分為系統(tǒng)鏈碼和用戶鏈碼,在區(qū)塊鏈應用開發(fā)中設計并編寫的鏈碼指的是用戶鏈碼.在Fabirc 中,訪問、修改、查詢賬本都是通過調用部署的鏈碼完成的,一般使用Go 語言編寫,通過Fabric 官方提供的API,實現(xiàn)規(guī)定接口的代碼,這些API 位于Fabric 源碼中的Shim 包下.同時,鏈碼之間也可以相互調用.與以太坊中的智能合約一樣,Fabric 中鏈碼也運行于一個沙盒環(huán)境——Docker 容器中,與背書節(jié)點的運行互相隔離.目前Fabric 支持使用Go、Java、Node.js 三種編程語言進行鏈碼開發(fā),其中Go 語言是支持最好、最穩(wěn)定的,因此本文選擇Go 語言進行Fabric 鏈碼的開發(fā).Fabric 中智能合約的運行情況如圖3所示.
圖3 智能合約執(zhí)行流程圖
首先,用戶通過客戶端(SDK/CLI)發(fā)起一個提案,背書節(jié)點通過調用Shim 包的方法創(chuàng)建賬本仿真交易執(zhí)行內容,并通過Shim 包對智能合約進行初始化和參數(shù)調用;背書節(jié)點模擬提案執(zhí)行,分別執(zhí)行讀賬本和寫賬本操作,模擬更新狀態(tài)數(shù)據(jù);若返回執(zhí)行成功,則開始執(zhí)行背書操作,若返回失敗,返回錯誤碼500;背書節(jié)點對交易結果進行背書簽名,并將帶有背書結果和背書簽名的交易提案返回客戶端進行背書認證.
目前,部隊航空導彈業(yè)務登記工作形式主要是手工登記.手工登記方式存在著諸多問題及安全隱患,如:存儲過于集中、數(shù)據(jù)溯源困難、筆跡不清、書寫習慣或格式不統(tǒng)一、重復填寫、易被篡改等.區(qū)塊鏈技術有著去中心化、數(shù)據(jù)可追溯、防篡改的特點,因此基于區(qū)塊鏈技術,對航空導彈業(yè)務登記工作進行數(shù)字化,能夠很大程度上解決目前手工登記方式存在的“痛點”問題.本文以航空導彈業(yè)務為應用場景,進行區(qū)塊鏈架構設計、智能合約設計與開發(fā).
根據(jù)區(qū)塊鏈的基本架構,合約層是部署于數(shù)據(jù)層、網絡層和共識層之上的.因此在對智能合約進行設計之前,需要首先對區(qū)塊鏈架構進行設計.
與傳統(tǒng)區(qū)塊鏈架構相比,本文研究的某型航空導彈業(yè)務數(shù)字化登記中不需要出現(xiàn)類似于比特幣系統(tǒng)中貨幣的概念,因此不需要激勵層,合約層之上即為應用層,二者通過客戶端(CLI/SDK)關聯(lián)起來.在傳統(tǒng)區(qū)塊鏈架構的基礎上進行具體設計與改進,如圖4所示.
圖4 某型航空導彈業(yè)務數(shù)字化登記區(qū)塊鏈架構
在Fabric 中,有兩種支持KVS 存儲的數(shù)據(jù)庫可提供選擇使用,一種是默認的LevelDB,另一種是可以配置選擇的CouchDB.這里選用的是CouchDB,因為Fabric 支持對CouchDB 的富查詢(Rich Query),同時CouchDB 還有圖形化管理界面,為開發(fā)人員提供了極大的便利,且CouchDB 支持JSON 數(shù)據(jù)格式,更適用于表格的數(shù)據(jù)存儲.Fabric 的網絡層中,節(jié)點間的P2P 網絡由Gossip協(xié)議實現(xiàn),在通道中的各個節(jié)點會持續(xù)廣播和接受Gossip 消息.通道(Channel)是Fabric 中重要的概念,多個節(jié)點之間可以組成一個通道,同一個節(jié)點也可以加入不同的通道.一個通道內部的所有節(jié)點共同維護同一個賬本,通道與通道之間互相隔離.在本文中的研究中,預設計一個orderer 節(jié)點,兩個組織Org1和Org2,每個組織都有兩個節(jié)點Peer0和Peer1,錨節(jié)點都是Peer0 節(jié)點.兩個組織中的所有節(jié)點都加入到同一個通道channel1 中.P2P 網絡拓撲結構如圖5所示.
圖5 網絡拓撲結構
共識層使用的是PBFT 共識算法,PBFT 是一種考慮了拜占庭容錯的共識算法,能夠容忍網絡中存在最多三分之一的作惡節(jié)點.相比PoW、PoS 等共識算法,PBFT 的效率更高.同時由于聯(lián)盟鏈規(guī)模相比公有鏈小很多,因此惡意節(jié)點對賬本同步的影響更大,使用PBFT 能更好地保證區(qū)塊鏈中各個節(jié)點有效達成共識.
區(qū)塊鏈應用于傳統(tǒng)應用最主要的區(qū)別是使用智能合約來實現(xiàn)主體業(yè)務邏輯,智能合約既是程序邏輯的主體,也是數(shù)據(jù)存儲的主體.航空導彈業(yè)務分為許多方面,現(xiàn)以某型航空導彈技術準備中的氣密性檢查為例進行智能合約設計.
氣密性檢查即在某個時刻記錄下內部壓力,然后進行充氣,充到一定壓力值后保持一段時間,再記錄下壓力值.如果兩個壓力值之差小于某個閾值,說明該彈氣密性檢查結論為合格,否則為不合格.
智能合約必須要實現(xiàn)Init 接口和Invoke 接口,其中Init 是對智能合約進行初始化,執(zhí)行的結果就是在狀態(tài)數(shù)據(jù)庫中創(chuàng)建一個數(shù)據(jù)庫,用來存放通過該智能合約寫入賬本的數(shù)據(jù),本文的智能合約設計中沒有考慮預先在數(shù)據(jù)庫中錄入數(shù)據(jù),因此Init 接口在實現(xiàn)過程中不需要進行操作,只需要返回一個Success 消息即可;Invoke 接口是執(zhí)行交易的接口,在本文中的作用就是調用已編寫的函數(shù).
Invoke 接口的調用操作過程如圖6所示.
圖6 Invoke 接口調用操作過程示意圖
Invoke 接口需要客戶端輸入兩個參數(shù);函數(shù)名(Function)和函數(shù)所需參數(shù)(Parameter),智能合約中的Invoke 只需要通過Shim 包中的GetFunctionAnd Parameter 方法就能接收到客戶端傳入的函數(shù)名和函數(shù)所需參數(shù),再通過編寫Invoke 內部的判別方法,就可以根據(jù)需要,通過輸入相應的函數(shù)名來指定調用編寫好的函數(shù).Invoke 接口內可提供調用的函數(shù)信息如表3所示.
根據(jù)某型航空導彈氣密性檢查操作過程以及實際業(yè)務需求,Invoke 接口中需要調用的自定義函數(shù)有:創(chuàng)建檢查記錄函數(shù)(Create)、根據(jù)導彈編號查詢檢查記錄(Query)、查詢某個編號導彈的時間戳(queryTime)、查詢某個編號導彈的不合格檢查記錄(queryJl)、查詢某個編號導彈氣密性檢測記錄的創(chuàng)建者(queryCreator)等.
表3 Invoke 接口提供的函數(shù)信息
選擇Ubuntu16.04 作為開發(fā)、運行環(huán)境,Fabric 版本為最穩(wěn)定的v1.2,Go 語言使用穩(wěn)定版本1.11.4.根據(jù)業(yè)務實際情況以及對智能合約的設計結果,開發(fā)中需要用到的Shim 包API 如表4所示.
表4 開發(fā)所需部分API
某型航空導彈技術準備中的氣密性檢查的過程中,在氣密性檢查中,需要記錄的信息有:導彈編號、檢查日期、檢查人、開始時間、開始時壓力(0.1±0.005 Mpa)、結束時間、結束時壓力(Mpa)、壓力差(Mpa)以及結論(壓力差≤0.01 Mpa 為合格),共計9 個數(shù)據(jù)項.鏈碼中定義數(shù)據(jù)格式代碼段如下:
壓力差與結論需要智能合約內部的Create 函數(shù)進行判斷的,首先計算壓力差,再根據(jù)壓力差與閾值的關系進行結論的判斷.
根據(jù)前文的設計,必須實現(xiàn)的Init 接口代碼段如下:
根據(jù)智能合約設計結果,Invoke 接口內部的具體實現(xiàn)代碼段如下:
利用Shim 包所提供的API,對每個自定義的功能函數(shù)進行編寫,然后進行部署調試.在CLI 客戶端中輸入相應指令,即可得到運行結果.
首先通過docker exec -it ci bash 命令進入到客戶端CLI 容器中,使用peer chaincode install 安裝鏈碼,安裝時需要指定通道.本文創(chuàng)建的通道名為channel1;再利用peer chaincode init 命令,對智能合約進行初始化.由于之前在實現(xiàn)Init 接口時沒有要求CLI 傳入任何參數(shù),因此輸入Function 參數(shù)和Args 參數(shù)數(shù)組時為空即可.初始化完成后,在CouchDB 中創(chuàng)建了關于該智能合約的數(shù)據(jù)庫;最后使用peer chaincode invoke 命令,輸入通道名稱、智能合約名稱以及需要傳入的Function 參數(shù)以及Args 參數(shù)數(shù)組,之后即可得到查詢結果,如圖7所示.
圖7 在客戶端中運行智能合約
智能合約的設計與開發(fā)是Fabric 平臺的核心工作之一,安裝在區(qū)塊鏈網絡的背書節(jié)點上,類似于社會中的法律合同,對業(yè)務進行了強制性的規(guī)范.通過智能合約的設計、開發(fā)與演示可以看出,相比于紙質手工登記,使用區(qū)塊鏈技術既具有傳統(tǒng)數(shù)字化登記系統(tǒng)有利于存儲、格式規(guī)范、登記速度快等優(yōu)點,同時又實現(xiàn)了去中心化的分布式存儲方式保證了登記數(shù)據(jù)可追溯、不可篡改.然而要將區(qū)塊鏈技術進一步應用于航空導彈業(yè)務登記領域,還需要進一步研究探索,后續(xù)將要進行的工作主要有:使用國密SM2和SM3 算法對Fabric 中的加密模塊進行改進,實現(xiàn)加密算法的“國產化”,進一步提高區(qū)塊鏈網絡的安全性與可靠性;對PBFT 共識算法進行優(yōu)化,降低節(jié)點之間達成共識的耗時.
在航空導彈業(yè)務場景中,本文設計并實現(xiàn)的區(qū)塊鏈系統(tǒng)及智能合約能夠實現(xiàn)無人監(jiān)督的業(yè)務數(shù)據(jù)登記錄入工作,免去了對于第三方監(jiān)督的依賴.同時還能夠保證數(shù)據(jù)的可靠性、完整性以及可追溯性,提高了數(shù)據(jù)的可信度并提高了防止數(shù)據(jù)被惡意篡改能力.引入的共識機制能夠保證數(shù)據(jù)來源的高可信度,可以有效地防止惡意節(jié)點對數(shù)據(jù)系統(tǒng)進行破壞.本文設計的系統(tǒng)使用一種NoSQL 數(shù)據(jù)庫:CouchDB 作為存儲環(huán)境,相比于傳統(tǒng)使用SQL 數(shù)據(jù)庫的數(shù)據(jù)記錄軟件,能夠有效防止SQL 注入攻擊.
智能合約是對相關業(yè)務或邏輯的代碼實現(xiàn),其目的在于不依賴于可信任的第三方執(zhí)行各種操作.如果被惡意修改會造成業(yè)務或邏輯混亂,甚至會對系統(tǒng)造破壞,因此對智能合約的保護是一項重要內容.本文提出的智能合約隱私保護措施主要是將智能合約安裝并運行于Docker 上.Docker 是一種容器,能夠實現(xiàn)虛擬化但又不同于虛擬化.容器是完全沙箱機制的,之間不存在任何接口.同時在Linux 系統(tǒng)內核中也存在著分別實現(xiàn)對容器資源隔離和資源限制的功能.智能合約運行在Docker 容器上時,能夠保證智能合約的獨立性,同時對于已經安裝在Docker 上的智能合約對外界也是不可見的,即使修改智能合約代碼,已經安裝的智能合約也不會受到影響.
本文針對部隊傳統(tǒng)航空導彈業(yè)務登記中存在的問題與隱患,提出了基于區(qū)塊鏈技術對傳統(tǒng)登記方式進行數(shù)字化的方案,并完成了智能合約的設計,最后對某型航空導彈氣密性檢測登記進行了智能合約的開發(fā)與測試,對區(qū)塊鏈技術在部隊工作中的應用進行了初步探索,安全性分析證明了該方案具有較好的可行性與有效性.