劉東偉,張學(xué)旺,郭曉金
(1.重慶郵電大學(xué) 通信與信息工程學(xué)院,重慶 400065;2.重慶郵電大學(xué) 軟件工程學(xué)院,重慶 400065)
隨著比特幣的興起,區(qū)塊鏈技術(shù)受到了各行各業(yè)的廣泛關(guān)注。2016年,國務(wù)院印發(fā)的《“十三五”國家信息化規(guī)劃》首次將區(qū)塊鏈列為我國的國家信息化規(guī)劃,并將其作為戰(zhàn)略前沿技術(shù)之一。“區(qū)塊鏈+教育”也逐漸成為國內(nèi)外教育學(xué)領(lǐng)域?qū)<谊P(guān)注的一個(gè)研究發(fā)展方向,依據(jù)區(qū)塊鏈技術(shù)所具有的數(shù)據(jù)公開透明和不可篡改特性,將其應(yīng)用于教育的學(xué)信管理、資質(zhì)證明等方面,有助于教育領(lǐng)域的改革發(fā)展。
目前國外的部分教育機(jī)構(gòu)已經(jīng)開始利用區(qū)塊鏈技術(shù)進(jìn)行學(xué)位證書的頒發(fā)。文獻(xiàn)[1]提出了基于以太坊的教育記錄方案系統(tǒng)設(shè)計(jì),該方案系統(tǒng)能夠?qū)崿F(xiàn)學(xué)位證書信息的存儲(chǔ)和驗(yàn)證,但基于挖礦機(jī)制,交易處理效率低。文獻(xiàn)[2]提出了基于區(qū)塊鏈平臺(tái)多鏈的學(xué)位證書驗(yàn)證方案,該方案系統(tǒng)仍然基于挖礦機(jī)制,交易處理效率仍不高。而本文針對(duì)學(xué)位證書存證的教育業(yè)務(wù)場(chǎng)景,為解決交易吞吐量低以及中心化存儲(chǔ)所具有的單點(diǎn)故障問題,采用了超級(jí)賬本作為底層區(qū)塊鏈技術(shù)平臺(tái),并利用Kafka技術(shù)實(shí)現(xiàn)交易的快速分發(fā)處理,以此提高學(xué)位證書存儲(chǔ)的交易吞吐量。
區(qū)塊鏈基于圖1所示的鏈?zhǔn)絽^(qū)塊數(shù)據(jù)結(jié)構(gòu),一個(gè)區(qū)塊中包含了區(qū)塊頭和區(qū)塊體兩部分[3]。區(qū)塊頭中包含了前一個(gè)區(qū)塊的哈希散列值、Merkle根、時(shí)間戳、版本號(hào)和其它信息。其中Merkle根是由區(qū)塊體中所有交易信息的總哈希值生成,前一個(gè)區(qū)塊的哈希散列值作為區(qū)塊間的連接索引,將區(qū)塊按照時(shí)間順序連接起來,形成一條主鏈。時(shí)間戳用于給每一個(gè)生成的區(qū)塊確定時(shí)間,確保該區(qū)塊無法偽造。其它信息根據(jù)共識(shí)機(jī)制[4]的不同可能會(huì)含有隨機(jī)數(shù)、目標(biāo)哈希值等數(shù)據(jù)。而區(qū)塊體中的交易信息由Merkle樹[5]進(jìn)行存儲(chǔ),這種存儲(chǔ)結(jié)構(gòu)能夠確保交易信息篡改后Merkle根值發(fā)生變化,確保交易信息無法篡改。區(qū)塊鏈底層依托于P2P網(wǎng)絡(luò)[6],每一個(gè)節(jié)點(diǎn)都持有該賬本的副本,所有副本同步更新。除非擁有網(wǎng)絡(luò)中絕大部分節(jié)點(diǎn)的控制權(quán),否則更改網(wǎng)絡(luò)中單個(gè)節(jié)點(diǎn)的數(shù)據(jù)毫無意義。

圖1 區(qū)塊結(jié)構(gòu)
Kafka作為一個(gè)分布式、可分區(qū)和可復(fù)制的消息系統(tǒng)[7],具有高吞吐量和低延遲特性,其架構(gòu)如圖2所示。將Kafka機(jī)制應(yīng)用于區(qū)塊鏈網(wǎng)絡(luò)的交易共識(shí),能夠提高區(qū)塊鏈網(wǎng)絡(luò)的交易處理速度。
Kafka以主題為單位區(qū)分所發(fā)消息的類別,每個(gè)主題包含一個(gè)或多個(gè)分區(qū),每個(gè)分區(qū)都是一個(gè)順序的、不可變的消息隊(duì)列,用于存儲(chǔ)新增的消息。Producer和Consumer異步生產(chǎn)和消費(fèi)消息,Producer負(fù)責(zé)向Broker發(fā)送消息,Consumer負(fù)責(zé)從Broker消費(fèi)消息。Kafka通過分區(qū)備份機(jī)制實(shí)現(xiàn)Broker集群的可靠性和穩(wěn)定性,每個(gè)分區(qū)的數(shù)據(jù)副本存儲(chǔ)到多個(gè)Broker上。通過選舉機(jī)制將其中一個(gè)Broker作為該分區(qū)的主節(jié)點(diǎn),其余的Broker作為從節(jié)點(diǎn),主節(jié)點(diǎn)負(fù)責(zé)處理所有的讀寫請(qǐng)求,從節(jié)點(diǎn)存儲(chǔ)一個(gè)副本并和主節(jié)點(diǎn)保持?jǐn)?shù)據(jù)同步。
Broker集群狀態(tài)需要通過Zookeeper進(jìn)行管理維護(hù),通過Zookeeper watch機(jī)制監(jiān)測(cè)Consumer和Broker元數(shù)據(jù)信息的變更。當(dāng)主節(jié)點(diǎn)宕機(jī),Zookeeper會(huì)監(jiān)測(cè)到變化信息并通過選舉機(jī)制從剩下的Broker中重新產(chǎn)生一個(gè)主節(jié)點(diǎn),以此確保主節(jié)點(diǎn)宕機(jī)后并不會(huì)影響集群工作。Zookeeper集群管理服務(wù)要求集群中半數(shù)以上的節(jié)點(diǎn)處于可用狀態(tài),在兼顧工作效率與節(jié)約資源的情況下,Zookeeper集群節(jié)點(diǎn)應(yīng)設(shè)置為奇數(shù)個(gè),滿足2*n+1個(gè),其中n為容錯(cuò)節(jié)點(diǎn)數(shù),集群節(jié)點(diǎn)數(shù)最小為3。一般來說,Broker數(shù)量越多,數(shù)據(jù)可靠性越高,但是數(shù)量過多也會(huì)影響整體性能。

圖2 Kafka消息訂閱與發(fā)布
目前的區(qū)塊鏈平臺(tái)主要有比特幣、以太坊和Linux基金會(huì)的開源項(xiàng)目超級(jí)賬本。其中比特幣和以太坊作為公有鏈,基于挖礦共識(shí)機(jī)制,交易處理效率低。任意節(jié)點(diǎn)都可以加入網(wǎng)絡(luò)并共享賬本,不利于數(shù)據(jù)的隱私保護(hù)。而超級(jí)賬本作為許可鏈,通過成員管理服務(wù)和通道隔離機(jī)制實(shí)現(xiàn)網(wǎng)絡(luò)節(jié)點(diǎn)身份認(rèn)證和賬本數(shù)據(jù)的隱私保密,并將節(jié)點(diǎn)進(jìn)行角色分類和職責(zé)分工,具有更高的交易處理能力。
本系統(tǒng)設(shè)計(jì)以Hyperledger Fabric作為區(qū)塊鏈平臺(tái),通過web前臺(tái)系統(tǒng)實(shí)現(xiàn)用戶交互。前臺(tái)系統(tǒng)用戶主要分為系統(tǒng)管理員、普通用戶和審核機(jī)構(gòu)用戶。系統(tǒng)管理員主要實(shí)現(xiàn)前臺(tái)系統(tǒng)的用戶管理和權(quán)限分配等功能。普通用戶主要為學(xué)生用戶,負(fù)責(zé)發(fā)起學(xué)位證書信息的登記、查詢、更改等交易提案。審核機(jī)構(gòu)用戶主要為各大高校用戶,負(fù)責(zé)審核登記、更改、吊銷學(xué)位證書信息世界狀態(tài)。圖3為本系統(tǒng)的層次結(jié)構(gòu)設(shè)計(jì),主要由區(qū)塊鏈底層平臺(tái)、智能合約、業(yè)務(wù)層和應(yīng)用層組成。

圖3 系統(tǒng)結(jié)構(gòu)層次
應(yīng)用層采用Jquery+Bootstrap+HTML5等前端框架實(shí)現(xiàn)前臺(tái)系統(tǒng)用戶交互的WEB頁面,主要功能有:用戶注冊(cè)登錄,學(xué)位證書信息的登記更改、詳情查看、吊銷、歷史記錄和學(xué)位證書信息所屬高校類別、學(xué)位類別和年月等維度的統(tǒng)計(jì)分析。業(yè)務(wù)層作為后端服務(wù),負(fù)責(zé)給Web前端功能提供Restful接口,通過Fabric-Java-SDK與區(qū)塊鏈網(wǎng)絡(luò)交互,實(shí)現(xiàn)賬本狀態(tài)的寫入和更新,同時(shí)負(fù)責(zé)對(duì)接其它業(yè)務(wù)系統(tǒng)。智能合約通過GRPC接口與區(qū)塊鏈底層平臺(tái)交互,實(shí)現(xiàn)對(duì)學(xué)位證書信息的賬本狀態(tài)更改。Hyperledger Fabric主要提供成員管理服務(wù)、共識(shí)服務(wù)、鏈碼服務(wù)和安全密碼服務(wù)。CA(certificate authority)模塊主要提供成員管理服務(wù),為節(jié)點(diǎn)的加入和離開提供成員身份證書注冊(cè)和注銷功能。共識(shí)服務(wù)主要實(shí)現(xiàn)交易提案的分階段驗(yàn)證,并采用Gossip協(xié)議實(shí)現(xiàn)數(shù)據(jù)分發(fā),保證同一個(gè)鏈上不同節(jié)點(diǎn)區(qū)塊數(shù)據(jù)的一致性。鏈碼服務(wù)通過合約程序執(zhí)行學(xué)位證書相關(guān)業(yè)務(wù)邏輯。密碼安全服務(wù)主要提供密鑰生成、哈希運(yùn)算、簽名校驗(yàn)和加解密等基礎(chǔ)功能。賬本狀態(tài)由CounchDB存儲(chǔ),與默認(rèn)LevelDB數(shù)據(jù)庫相比,其支持富查詢和建立索引,查詢效率更高。
本設(shè)計(jì)為了兼顧系統(tǒng)的高可用性和高交易吞吐量,采用圖4所示的含有3個(gè)組織和Kafka集群的系統(tǒng)網(wǎng)絡(luò)節(jié)點(diǎn)架構(gòu)[8]。根據(jù)業(yè)務(wù)合約方法和賬本狀態(tài)變化,圖4中前臺(tái)系統(tǒng)的交易提案主要?jiǎng)澐忠姳?。
圖4中的CA節(jié)點(diǎn)作為成員服務(wù)提供商(membership service provider,MSP),結(jié)合PKI(public key infrastructure)技術(shù),基于標(biāo)準(zhǔn)的X.509證書格式為節(jié)點(diǎn)成員提供注冊(cè)、數(shù)字證書發(fā)行和數(shù)字證書延期與吊銷,實(shí)現(xiàn)節(jié)點(diǎn)之間數(shù)據(jù)傳輸?shù)暮灻万?yàn)證。記賬節(jié)點(diǎn)負(fù)責(zé)驗(yàn)證區(qū)塊交易并記賬,維護(hù)狀態(tài)數(shù)據(jù)和賬本副本。同時(shí)在鏈碼實(shí)例化的時(shí)候,背書策略會(huì)指定每個(gè)組織中的一個(gè)記賬節(jié)點(diǎn)動(dòng)態(tài)充當(dāng)背書節(jié)點(diǎn)角色,用于接收前臺(tái)系統(tǒng)的交易背書請(qǐng)求,模擬執(zhí)行交易提案并對(duì)結(jié)果進(jìn)行簽名背書。主節(jié)點(diǎn)是由每個(gè)組織通過選舉機(jī)制產(chǎn)生并與排序服務(wù)節(jié)點(diǎn)通信,負(fù)責(zé)接收排序服務(wù)廣播的新區(qū)塊,并通過Gossip協(xié)議實(shí)現(xiàn)組織內(nèi)各記賬節(jié)點(diǎn)賬本數(shù)據(jù)的同步。記賬節(jié)點(diǎn)數(shù)據(jù)同步過程大體如下:

圖4 系統(tǒng)節(jié)點(diǎn)架構(gòu)

表1 系統(tǒng)交易提案類型
一個(gè)記賬節(jié)點(diǎn)接收到消息后,隨機(jī)地選擇K個(gè)節(jié)點(diǎn)進(jìn)行消息發(fā)送。節(jié)點(diǎn)之間會(huì)有一個(gè)基于反熵的狀態(tài)同步過程,每個(gè)節(jié)點(diǎn)周期性地與鄰居節(jié)點(diǎn)交換保存的數(shù)據(jù)并對(duì)比本地?cái)?shù)據(jù)和鄰居節(jié)點(diǎn)保存的數(shù)據(jù),檢查是否有缺失或過期的數(shù)據(jù),并進(jìn)行本地節(jié)點(diǎn)數(shù)據(jù)的更新。
Kafka集群主要用于提高區(qū)塊鏈網(wǎng)絡(luò)的交易處理速度,由于Kafka無法保證一個(gè)主題中多個(gè)分區(qū)間消息的有序性,本系統(tǒng)通過在區(qū)塊鏈網(wǎng)絡(luò)啟動(dòng)時(shí)創(chuàng)建一個(gè)編號(hào)為0的分區(qū),確保從排序服務(wù)節(jié)點(diǎn)提交到Kafka的交易消息有序性。同時(shí)區(qū)塊鏈網(wǎng)絡(luò)中只創(chuàng)建一個(gè)通道,確保圖中3個(gè)組織節(jié)點(diǎn)都屬于一條鏈,實(shí)現(xiàn)不同組織節(jié)點(diǎn)賬本數(shù)據(jù)和狀態(tài)數(shù)據(jù)的同步共享。圖4中一個(gè)通道對(duì)應(yīng)Kafka的一個(gè)主題,排序服務(wù)節(jié)點(diǎn)在不同階段充當(dāng)不同的角色。接收交易階段時(shí),排序服務(wù)節(jié)點(diǎn)充當(dāng)生產(chǎn)者,負(fù)責(zé)將交易轉(zhuǎn)發(fā)給Kafka集群,并通過權(quán)限檢查轉(zhuǎn)發(fā)給對(duì)應(yīng)通道的主題。消息處理階段時(shí),排序服務(wù)節(jié)點(diǎn)充當(dāng)消費(fèi)者,從Kafka集群中獲取交易信息,并把交易排序、分割打包成區(qū)塊,通過原子廣播給組織內(nèi)的主節(jié)點(diǎn)。
其中Kafka集群應(yīng)滿足條件1
前臺(tái)系統(tǒng)發(fā)起表1中的交易提案后,直到賬本狀態(tài)發(fā)生變化或返回學(xué)位證書信息的世界狀態(tài),經(jīng)歷了圖5所示的共識(shí)過程[9]。

圖5 交易共識(shí)過程
(1)交易背書
交易背書是對(duì)交易進(jìn)行背書的規(guī)則,本文以大多數(shù)子規(guī)則成立的隱含元策略作為背書策略,滿足背書策略才是有效的交易。圖5中,有3個(gè)背書節(jié)點(diǎn),當(dāng)前臺(tái)系統(tǒng)提交學(xué)位證書交易提案后,背書節(jié)點(diǎn)會(huì)調(diào)用鏈碼模擬執(zhí)行交易提案的內(nèi)容并生成讀寫集,同時(shí)調(diào)用交易系統(tǒng)鏈碼ESCC(endorsement system chaincode)對(duì)讀寫集結(jié)果進(jìn)行結(jié)構(gòu)轉(zhuǎn)換和簽名背書,只有交易獲得2個(gè)及以上的背書數(shù)量才會(huì)標(biāo)記為有效的交易。
(2)構(gòu)造交易請(qǐng)求并發(fā)送給排序服務(wù)節(jié)點(diǎn)
前臺(tái)系統(tǒng)收集交易背書并進(jìn)行簽名驗(yàn)證,如果交易提案只是進(jìn)行賬本查詢,則不會(huì)構(gòu)造交易發(fā)送給排序節(jié)點(diǎn)。如果交易提案對(duì)賬本狀態(tài)進(jìn)行更改,則會(huì)重新構(gòu)造該交易并發(fā)送給排序服務(wù)。排序服務(wù)會(huì)根據(jù)交易信封中的指定通道名稱,在通道內(nèi)按照時(shí)間順序?qū)邮盏降慕灰走M(jìn)行排序并生成區(qū)塊。
(3)交易驗(yàn)證并同步區(qū)塊
記賬節(jié)點(diǎn)負(fù)責(zé)對(duì)接收到的區(qū)塊交易進(jìn)行有效性驗(yàn)證,主要包括背書策略驗(yàn)證和雙花檢測(cè)。校驗(yàn)時(shí)會(huì)對(duì)模擬執(zhí)行時(shí)狀態(tài)數(shù)據(jù)版本和提交交易時(shí)狀態(tài)數(shù)據(jù)版本進(jìn)行比較,如果版本不一致,則校驗(yàn)失敗,標(biāo)記為無效交易。同時(shí)會(huì)驗(yàn)證是否符合指定的背書策略,不滿足也標(biāo)記為無效的交易。對(duì)于區(qū)塊中有效的交易,記賬節(jié)點(diǎn)會(huì)記錄到賬本數(shù)據(jù)并同步更新狀態(tài)數(shù)據(jù)庫的世界狀態(tài)。
智能合約也稱為鏈碼,運(yùn)行在由背書節(jié)點(diǎn)進(jìn)程獨(dú)立出的安全Docker容器中,用于處理被網(wǎng)絡(luò)成員認(rèn)可的業(yè)務(wù)邏輯,對(duì)鏈碼執(zhí)行結(jié)果達(dá)成一致后才能實(shí)現(xiàn)賬本狀態(tài)的更改。網(wǎng)絡(luò)中每個(gè)記賬節(jié)點(diǎn)都會(huì)存儲(chǔ)圖3中的賬本數(shù)據(jù)和狀態(tài)數(shù)據(jù),驗(yàn)證通過的交易最終會(huì)打包生成區(qū)塊,并以區(qū)塊文件的形式存儲(chǔ)在每個(gè)記賬節(jié)點(diǎn)的賬本數(shù)據(jù)中,而基于Key-Value存儲(chǔ)結(jié)構(gòu)的狀態(tài)數(shù)據(jù)庫負(fù)責(zé)記錄交易執(zhí)行的狀態(tài)結(jié)果。本文以學(xué)位證書編號(hào)作為唯一鍵值,保證每條數(shù)據(jù)記錄的唯一性。合約中建立了圖6所示的學(xué)位證書DegreeInfo結(jié)構(gòu),承載學(xué)位證書信息的具體屬性。

圖6 學(xué)位證書屬性結(jié)構(gòu)
結(jié)合表1中的交易提案,對(duì)于驗(yàn)證通過的交易,鏈碼可以通過PutState(key,value)、GetState(key)、DelState(key)、GetHistoryForKey(key)等方法實(shí)現(xiàn)學(xué)位證書的登記、修改、吊銷和歷史狀態(tài)查詢等功能,其中key為學(xué)位證書編碼,value為序列化的DegreeInfo結(jié)構(gòu)信息。以上對(duì)學(xué)位信息的增刪改是指在區(qū)塊鏈中記錄下對(duì)數(shù)據(jù)所發(fā)生的交易,即作為一筆交易記錄在賬本數(shù)據(jù)中[10],而狀態(tài)數(shù)據(jù)只是記錄交易執(zhí)行的結(jié)果。
依照?qǐng)D4,采用Kafka集群、Orderer排序節(jié)點(diǎn)集群和3個(gè)組織方式驗(yàn)證本系統(tǒng)設(shè)計(jì)的可行性和正確性。其中為了避免單點(diǎn)故障和腦裂問題,選擇3個(gè)Zookeeper節(jié)點(diǎn),為了滿足容錯(cuò)的最小節(jié)點(diǎn)數(shù),選擇4個(gè)Kafka節(jié)點(diǎn),共使用表2所示的19臺(tái)PC機(jī)作為網(wǎng)絡(luò)節(jié)點(diǎn),測(cè)試環(huán)境配置見表3。

表2 系統(tǒng)節(jié)點(diǎn)

表3 實(shí)驗(yàn)配置
針對(duì)不同的高校類別和學(xué)位類型,測(cè)試用例分別采集了50張學(xué)士學(xué)位證書、30張碩士學(xué)位證書和30張博士學(xué)位證書。因篇幅原因,這里以東北師范大學(xué)的學(xué)士學(xué)位證書為例。
系統(tǒng)用戶通過前臺(tái)系統(tǒng)發(fā)起證書登記請(qǐng)求,登記成功后會(huì)在區(qū)塊鏈網(wǎng)絡(luò)中生成一筆交易。圖7左邊為測(cè)試用例上鏈后的世界狀態(tài),圖7右上角為該筆交易在賬本數(shù)據(jù)的交易記錄詳情,從圖7中可以看出兩者的交易號(hào)一致。

圖7 測(cè)試用例及驗(yàn)證結(jié)果
交易吞吐量是指單位時(shí)間能夠完成交易的最高個(gè)數(shù),本系統(tǒng)交易吞吐量的測(cè)試方法為:通過頻率可調(diào)的交易生成器隨機(jī)生成交易,以每300筆交易為單位,依次向區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn)發(fā)送300-1200筆交易,并在統(tǒng)計(jì)時(shí)間內(nèi)記錄區(qū)塊鏈上的交易數(shù)量,通過取平均數(shù)方式得到穩(wěn)定的網(wǎng)絡(luò)交易吞吐量。圖8是交易數(shù)量分別為300、600、900和1200筆的4組測(cè)試實(shí)驗(yàn),每組交易重復(fù)執(zhí)行30次的實(shí)驗(yàn)結(jié)果,表4為4組實(shí)驗(yàn)穩(wěn)定交易吞吐量結(jié)果。
從圖8和表4可以看出,除了網(wǎng)絡(luò)波動(dòng)造成的個(gè)別組次結(jié)果差異較大,系統(tǒng)交易吞吐量維持在180-250Tps,而比特幣區(qū)塊鏈的每秒交易是7筆,以太坊區(qū)塊鏈交易每秒大約為幾十筆,本系統(tǒng)設(shè)計(jì)的交易吞吐量更高。

圖8 交易吞吐量測(cè)試結(jié)果

表4 穩(wěn)定吞吐量結(jié)果
本文結(jié)合區(qū)塊鏈技術(shù)所具有的優(yōu)點(diǎn),提出了一種基于區(qū)塊鏈的學(xué)位證書信息存證系統(tǒng)設(shè)計(jì)。學(xué)位證書信息由區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn)共同維護(hù),安全性更高。將Kafka機(jī)制應(yīng)用于區(qū)塊鏈交易信息處理,能夠提升區(qū)塊鏈的交易處理速度,相比于使用比特幣區(qū)塊鏈和以太坊區(qū)塊鏈實(shí)現(xiàn)學(xué)位證書信息存儲(chǔ)驗(yàn)證,本系統(tǒng)的交易吞吐量性能表現(xiàn)更優(yōu)。實(shí)際生產(chǎn)環(huán)境下,區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn)數(shù)量將更多,將進(jìn)一步考慮節(jié)點(diǎn)的數(shù)量對(duì)交易速度的影響。