鄒秀清,羅得寸,林 平,沈世平,謝振平,王玉玨,丁 勇
1.桂林電子科技大學(xué)計(jì)算機(jī)與信息安全學(xué)院,廣西桂林541004
2.江蘇省無錫市河道堤閘管理處,江蘇無錫214031
3.江南大學(xué)數(shù)字媒體學(xué)院,江蘇無錫214122
“河長制”首創(chuàng)于浙江長興,最早推廣地是江蘇無錫[1].2016年底,隨著中央《關(guān)于全面推行河長制的意見》文書的下達(dá),全國各地已嚴(yán)格推行“河長制”.中國各省份從上至下已明確了省、市、縣、鄉(xiāng)4 個(gè)級(jí)別的河長[2],共同領(lǐng)導(dǎo)并組織地方水域的環(huán)境污染治理工作.全國各地區(qū)政府都在努力加大對(duì)河長制信息化的建設(shè)力度,相應(yīng)地開發(fā)出了許多河長制管理信息系統(tǒng).很多省份的河長制管理信息系統(tǒng)的信息覆蓋手段多種多樣,如網(wǎng)頁、手機(jī)APP 和微信公眾號(hào)等,同時(shí)與軟件相匹配的硬件設(shè)施包括物聯(lián)網(wǎng)檢測站、地理信息系統(tǒng)等也發(fā)展得較為完善.部分地區(qū)的河長制信息系統(tǒng)還結(jié)合了大數(shù)據(jù)、云計(jì)算等前沿的計(jì)算機(jī)技術(shù),共同促進(jìn)了智慧化的河長制管理信息系統(tǒng)的建設(shè).
河長制河道管理制度是以河長責(zé)任制為驅(qū)動(dòng)的河道生態(tài)環(huán)境保護(hù)制度.因此,河道治理工作數(shù)據(jù)的可信性、公開透明性是河長責(zé)任制得到有效發(fā)揮的重要前提.盡管河長制信息化建設(shè)在不斷推進(jìn),一些問題仍然得不到有效的解決.在傳統(tǒng)的河長制信息管理系統(tǒng)中,其中心化的數(shù)據(jù)管理方式使得河道治理工作數(shù)據(jù)難以做到可信和透明.因此,在河長制信息管理系統(tǒng)實(shí)際運(yùn)行過程中,一方面治理數(shù)據(jù)容易被篡改使得河長制缺乏公信力;另一方面數(shù)據(jù)的不公開透明使得各部門之間形成信息孤島,治理工作效率低下,許多實(shí)質(zhì)性的問題難以得到有效的解決.
傳統(tǒng)的河長制管理信息系統(tǒng)需要維護(hù)大量的數(shù)據(jù)信息,通常會(huì)針對(duì)性地建立專題數(shù)據(jù)庫進(jìn)行數(shù)據(jù)存儲(chǔ).專題數(shù)據(jù)庫往往采用中心化程度很高的關(guān)系型數(shù)據(jù)庫服務(wù),這類中心化數(shù)據(jù)庫存儲(chǔ)的數(shù)據(jù)始終存在著安全隱患.一旦中心數(shù)據(jù)庫被攻破,大量數(shù)據(jù)的可信性就無法得到保證.然而,河長制信息管理系統(tǒng)往往會(huì)有部分?jǐn)?shù)據(jù)需要面向公眾,并且需要保證信息的透明公開和可追溯,同時(shí)為了數(shù)據(jù)存儲(chǔ)的安全性,需要對(duì)重點(diǎn)水質(zhì)信息的存儲(chǔ)做冗余備份.當(dāng)中心化的河長制信息管理系統(tǒng)數(shù)據(jù)庫遭受外部攻擊,或是人為操作失誤導(dǎo)致核心數(shù)據(jù)丟失時(shí),系統(tǒng)需要將原先數(shù)據(jù)核驗(yàn)還原,從而保證整個(gè)系統(tǒng)的穩(wěn)定運(yùn)行.
區(qū)塊鏈[3]作為一種新興的互聯(lián)網(wǎng)技術(shù),其底層采用的是分布式數(shù)據(jù)存儲(chǔ)、點(diǎn)對(duì)點(diǎn)傳輸、共識(shí)機(jī)制、加密算法等核心技術(shù).區(qū)塊鏈上的數(shù)據(jù)具有不可篡改、公開透明、永久保存的特性,它們分布在各個(gè)節(jié)點(diǎn)中,不會(huì)因?yàn)橹行墓?jié)點(diǎn)出現(xiàn)故障而導(dǎo)致整體崩潰,可以實(shí)現(xiàn)安全可靠的數(shù)據(jù)備份.因此,本文針對(duì)河長制管理信息系統(tǒng)存在的問題,采用區(qū)塊鏈技術(shù)設(shè)計(jì)一種去中心化、安全可信、可維護(hù)的區(qū)塊鏈河長制水質(zhì)信息存證系統(tǒng).
目前,河長制信息建設(shè)已有較多有效的實(shí)施案例.文獻(xiàn)[4]結(jié)合德州市的實(shí)際情況,明確了本市河湖信息平臺(tái)的兩期建設(shè)任務(wù),從河長制信息門戶網(wǎng)站、工作管理系統(tǒng)、河長制APP、微信公眾號(hào)服務(wù)、無人機(jī)應(yīng)用等多個(gè)方面系統(tǒng)地建設(shè)德州市智慧河湖長平臺(tái).文獻(xiàn)[5]針對(duì)河長制實(shí)施過程中的信息單一、不對(duì)稱等問題,利用移動(dòng)終端、移動(dòng)互聯(lián)、GIS、可視化等信息技術(shù)提出了基于河長制的河道動(dòng)態(tài)保護(hù)監(jiān)管新模式.文獻(xiàn)[6]為實(shí)現(xiàn)河長制管理精細(xì)化、聯(lián)防聯(lián)控高效化和社會(huì)監(jiān)督公開化的河湖管理保護(hù)體系,采用云計(jì)算、大數(shù)據(jù)、二三維影像、物聯(lián)網(wǎng)等先進(jìn)技術(shù)提出建設(shè)“互聯(lián)網(wǎng)+”的河長制信息管理平臺(tái).
區(qū)塊鏈在眾多領(lǐng)域都發(fā)揮著關(guān)鍵的作用.隨著區(qū)塊鏈的快速發(fā)展,中國的金融業(yè)迎來了新的發(fā)展機(jī)遇.文獻(xiàn)[7]指出,區(qū)塊鏈和金融業(yè)結(jié)合應(yīng)用涉及到關(guān)于數(shù)字貨幣的發(fā)行和流通、支付結(jié)算、證券交易、數(shù)字票據(jù)等多個(gè)方面.文獻(xiàn)[8]梳理了供應(yīng)鏈金融特征,發(fā)現(xiàn)了區(qū)塊鏈與供應(yīng)鏈金融業(yè)務(wù)之間的匹配性關(guān)系,并在此基礎(chǔ)上分析了區(qū)塊鏈技術(shù)在供應(yīng)鏈金融方面的應(yīng)用結(jié)合點(diǎn).文獻(xiàn)[9]將區(qū)塊鏈的技術(shù)與金融證券業(yè)的登記、清算、結(jié)算等業(yè)務(wù)流程相結(jié)合,推動(dòng)了證券金融業(yè)的發(fā)展.在電子商務(wù)存在安全隱患的大環(huán)境下,文獻(xiàn)[10]將區(qū)塊鏈技術(shù)運(yùn)用到電商產(chǎn)品的溯源防偽、存儲(chǔ)物流、商品存儲(chǔ)等方面,在一定程度上規(guī)范了電子商務(wù)市場.
此外,區(qū)塊鏈技術(shù)在安全隱私領(lǐng)域也有突出表現(xiàn).文獻(xiàn)[11]為防止智能電網(wǎng)中的中心服務(wù)器遭受敵手的攻擊以及存儲(chǔ)數(shù)據(jù)被惡意篡改的現(xiàn)象發(fā)生,選取多個(gè)基站組成智能電網(wǎng)中的聯(lián)盟鏈存儲(chǔ)網(wǎng)絡(luò)系統(tǒng),保證了智能電網(wǎng)中的信息可以安全存儲(chǔ).由于架構(gòu)和資源的約束,物聯(lián)網(wǎng)技術(shù)不能友好地適應(yīng)多種安全技術(shù).文獻(xiàn)[12]將區(qū)塊鏈與物聯(lián)網(wǎng)相結(jié)合,不僅增強(qiáng)了物聯(lián)網(wǎng)中物與物之間的聯(lián)系,而且也為物聯(lián)網(wǎng)系統(tǒng)的正常運(yùn)行提供了安全的技術(shù)保障.
在溯源信息領(lǐng)域,區(qū)塊鏈的應(yīng)用相當(dāng)廣泛.在假冒偽劣產(chǎn)品日益增多的社會(huì)背景下,文獻(xiàn)[13]將區(qū)塊鏈技術(shù)同IC 芯片卡相結(jié)合,設(shè)計(jì)了一種安全的防偽系統(tǒng),為防偽市場提出了新的技術(shù)參考.文獻(xiàn)[14]提出基于區(qū)塊鏈技術(shù)的RFID 大數(shù)據(jù)溯源安全模型,在RFID 溯源物品的生產(chǎn)、加工、銷售等多個(gè)環(huán)節(jié)建立區(qū)塊鏈賬本,從而實(shí)現(xiàn)了RFID 大數(shù)據(jù)溯源的安全管理.
針對(duì)當(dāng)前河長制信息管理系統(tǒng)中存在的中心化程度過高、數(shù)據(jù)容易被篡改、無法公開透明、系統(tǒng)安全性難以得到保證等問題,本文提出了一種基于區(qū)塊鏈技術(shù)的河長制信息管理系統(tǒng).該系統(tǒng)利用區(qū)塊鏈技術(shù)的特性,解決了傳統(tǒng)河長制信息管理系統(tǒng)中存在的弊端,從而實(shí)現(xiàn)了河長制信息管理系統(tǒng)中關(guān)鍵水質(zhì)信息的透明公開、可追溯、可信任.本系統(tǒng)是以區(qū)塊鏈作為底層可信數(shù)據(jù)存儲(chǔ)的網(wǎng)絡(luò)環(huán)境,同時(shí)還包括了智能合約、SDK 應(yīng)用接口以及上層Web 河長制信息管理系統(tǒng)頁面.
智能合約層負(fù)責(zé)對(duì)交易數(shù)據(jù)的背書以及對(duì)區(qū)塊鏈分布式賬本的讀寫;SDK 接口層為應(yīng)用層提供相關(guān)水質(zhì)信息的存證功能服務(wù);河長制信息管理系統(tǒng)的Web 頁面主要記錄并展示河道治理工作,可分為工作展示模塊和區(qū)塊鏈功能模塊.工作展示模塊包含了對(duì)河長治理工作歷史進(jìn)展和最新進(jìn)展的相關(guān)介紹;區(qū)塊鏈功能模塊則是向各部門用戶提供關(guān)鍵河道水質(zhì)信息的上鏈和鏈上查詢的服務(wù).
本文對(duì)基于區(qū)塊鏈的河長制信息管理系統(tǒng)中的河道水質(zhì)信息的上鏈、查詢功能進(jìn)行測試,測試結(jié)果表明:本方案能夠在實(shí)現(xiàn)數(shù)據(jù)去中心化管理、防篡改、公開透明的前提下使系統(tǒng)的性能和效率方面基本達(dá)到實(shí)際的應(yīng)用需求.與傳統(tǒng)的河長制信息管理系統(tǒng)相比,本文設(shè)計(jì)實(shí)現(xiàn)的河長制信息管理系統(tǒng)首次將河長制與區(qū)塊鏈技術(shù)相結(jié)合,利用區(qū)塊鏈為系統(tǒng)中的重要信息提供數(shù)據(jù)存證,進(jìn)而擴(kuò)展系統(tǒng)中的數(shù)據(jù)信息可追溯、模糊數(shù)據(jù)的鏈上核驗(yàn)還原等功能.本方案旨在打造一個(gè)數(shù)據(jù)信息更加牢固、不易篡改、不易丟失的新型可信的河長制信息管理系統(tǒng).
區(qū)塊鏈根據(jù)用戶范圍可以劃分成公有鏈、聯(lián)盟鏈和私有鏈.其中聯(lián)盟鏈和私有鏈都是針對(duì)特定企業(yè)機(jī)構(gòu),與公有鏈中任何人都可以參與的無權(quán)限設(shè)定不同,聯(lián)盟鏈和私有鏈對(duì)參與者進(jìn)行嚴(yán)格的權(quán)限規(guī)定[15].超級(jí)賬本(Hyperledger Fabric)是一種面向企業(yè)級(jí)項(xiàng)目開發(fā)的開源聯(lián)盟區(qū)塊鏈應(yīng)用框架,最初是由Linux 基金會(huì)在2015年12月主導(dǎo)發(fā)起的項(xiàng)目之一.超級(jí)賬本基于模塊化的框架設(shè)計(jì)理念,提供了可插拔的共識(shí)機(jī)制、成員身份管理服務(wù)、節(jié)點(diǎn)數(shù)據(jù)庫、背書策略以及驗(yàn)證策略等,非常靈活易于擴(kuò)展.超級(jí)賬本目前提供基于Kafka 消息隊(duì)列的共識(shí)機(jī)制[16],通過排序節(jié)點(diǎn)分離出區(qū)塊鏈網(wǎng)絡(luò)的共識(shí)服務(wù),在性能方面優(yōu)于大多數(shù)公有鏈和其他聯(lián)盟鏈.
超級(jí)賬本作為聯(lián)盟區(qū)塊鏈的開源框架,在設(shè)計(jì)上偏向于聯(lián)盟架構(gòu)的特性.首先,超級(jí)賬本包含了一個(gè)成員服務(wù)提供者模塊,用于對(duì)新加入成員的授權(quán)以及系統(tǒng)內(nèi)成員權(quán)限的管控.其次,超級(jí)賬本的節(jié)點(diǎn)類型分為4 種,包括證書(CA)節(jié)點(diǎn)、背書(Endorser)節(jié)點(diǎn)、排序(Orderer)節(jié)點(diǎn)、提交(Committer)節(jié)點(diǎn).業(yè)務(wù)分離的節(jié)點(diǎn)有利于區(qū)塊鏈網(wǎng)絡(luò)的彈性伸縮,提高了系統(tǒng)的可擴(kuò)展性.同時(shí),超級(jí)賬本為平臺(tái)應(yīng)用提供支持遠(yuǎn)程調(diào)用的GRPC 接口[17]和封裝完整的SDK.GRPC 為超級(jí)賬本底層的各種節(jié)點(diǎn)提供彼此交互的通道,使節(jié)點(diǎn)相互連接組成P2P 網(wǎng)絡(luò),并且節(jié)點(diǎn)之間的通信遵循分布式網(wǎng)絡(luò)的Gossip 協(xié)議.封裝之后的SDK 可供應(yīng)用平臺(tái)訪問聯(lián)盟區(qū)塊鏈中的資源.應(yīng)用層通過超級(jí)賬本封裝的SDK 訪問區(qū)塊鏈中的數(shù)據(jù),包括賬本、區(qū)塊交易、智能合約、事件以及權(quán)限管理服務(wù).賬本是超級(jí)賬本的核心組件,它由記賬節(jié)點(diǎn)和共識(shí)機(jī)制共同維護(hù),其交易內(nèi)容存儲(chǔ)在負(fù)責(zé)記賬的節(jié)點(diǎn)中;智能合約即超級(jí)賬本中的鏈碼模塊,以代碼的形式描述交易過程中的邏輯;在區(qū)塊鏈資源調(diào)用過程中的發(fā)生事件都可以被相關(guān)服務(wù)訪問;權(quán)限管理負(fù)責(zé)成員、節(jié)點(diǎn)對(duì)賬本的寫入以及訪問權(quán)限控制.超級(jí)賬本的架構(gòu)如圖1所示.
圖1 超級(jí)賬本架構(gòu)Figure 1 Framework of Hyperledger Fabric
區(qū)塊鏈技術(shù)的重要特征之一就是保證實(shí)現(xiàn)安全可靠的交易.從收到平臺(tái)應(yīng)用的交易請(qǐng)求開始到完成交易數(shù)據(jù)上鏈的整個(gè)流程中,超級(jí)賬本中不同類型的節(jié)點(diǎn)會(huì)執(zhí)行不同的任務(wù)流程.超級(jí)賬本中參與交易過程的實(shí)體主要分為平臺(tái)應(yīng)用、CA 服務(wù)、Endorser 節(jié)點(diǎn)、Orderer 節(jié)點(diǎn)、Committer 節(jié)點(diǎn)[18],各部分的功能如下:
1)平臺(tái)應(yīng)用
平臺(tái)用戶是一種應(yīng)用程序客戶端.應(yīng)用程序客戶端訪問區(qū)塊鏈之前,首先需要調(diào)用CA 服務(wù)來獲取身份證書進(jìn)行注冊,完成注冊后才可以通過身份證書對(duì)區(qū)塊鏈中網(wǎng)絡(luò)進(jìn)行相關(guān)操作.應(yīng)用程序在上鏈時(shí),通過調(diào)用SDK 向區(qū)塊鏈網(wǎng)絡(luò)發(fā)起一個(gè)交易提案(proposal),只有合法有效的交易提案才會(huì)被記錄到賬本當(dāng)中.
2)CA 服務(wù)
CA 是超級(jí)賬本中的證書頒發(fā)機(jī)構(gòu),是超級(jí)賬本內(nèi)一個(gè)可選的組件.CA 在實(shí)際應(yīng)用中采用樹形分層結(jié)構(gòu),包含一個(gè)根部CA 和至少一個(gè)中間CA.CA 的主要功能是對(duì)網(wǎng)絡(luò)內(nèi)各個(gè)實(shí)體的身份證書進(jìn)行管理,負(fù)責(zé)Fabric 網(wǎng)絡(luò)內(nèi)所有實(shí)體(identity)身份的注冊,負(fù)責(zé)對(duì)數(shù)字證書的簽發(fā),包括身份證書(ECerts)、交易證書(TCerts)以及對(duì)證書的續(xù)簽或吊銷.
3)Endorser 節(jié)點(diǎn)
Endorser 節(jié)點(diǎn)負(fù)責(zé)接收來自應(yīng)用平臺(tái)的交易提案,對(duì)提案完成合法性檢驗(yàn)并進(jìn)行權(quán)限控制;確定提案提交者有權(quán)執(zhí)行操作之后,根據(jù)背書策略模擬運(yùn)行交易;完成模擬后的狀態(tài)變化將會(huì)以背書形式返回給客戶端程序.
4)Orderer 節(jié)點(diǎn)
Orderer 節(jié)點(diǎn)在區(qū)塊鏈網(wǎng)絡(luò)中負(fù)責(zé)排序的作用,將全網(wǎng)中的合法交易進(jìn)行全局排序,并將排序之后的節(jié)點(diǎn)打包成區(qū)塊,最后發(fā)送給Committer 節(jié)點(diǎn).
5)Committer 節(jié)點(diǎn)
Committer 節(jié)點(diǎn)收到Orderer 節(jié)點(diǎn)排序過的批量交易區(qū)塊后,會(huì)再次對(duì)區(qū)塊中的每筆交易進(jìn)行合法性檢查,檢查通過后將最終結(jié)果寫入賬本,并且構(gòu)成新的區(qū)塊.一個(gè)完整的超級(jí)賬本的交易記賬流程如圖2所示.
圖2 超級(jí)賬本交易流程Figure 2 Transaction process of Hyperledger Fabric
具體的交易步驟如下:
步驟1平臺(tái)的用戶作為客戶端調(diào)用SDK 向背書節(jié)點(diǎn)發(fā)起一個(gè)交易請(qǐng)求.
步驟2背書節(jié)點(diǎn)收到請(qǐng)求后,調(diào)用相應(yīng)的智能合約模擬執(zhí)行交易并對(duì)結(jié)果進(jìn)行背書,之后將背書結(jié)果返回給用戶.
步驟3用戶再將該結(jié)果發(fā)送給排序節(jié)點(diǎn),排序節(jié)點(diǎn)通過共識(shí)機(jī)制將交易打包成區(qū)塊,并交付給提交節(jié)點(diǎn).
步驟4提交節(jié)點(diǎn)將區(qū)塊分發(fā)給組織內(nèi)的記賬節(jié)點(diǎn),記賬節(jié)點(diǎn)驗(yàn)證交易合法性之后即可添加到自身賬本當(dāng)中.
基于區(qū)塊鏈的河長制信息管理系統(tǒng)需要利用區(qū)塊鏈技術(shù)維護(hù)、管理并展示河長制治理工作的相關(guān)數(shù)據(jù)信息.本文按照系統(tǒng)各個(gè)業(yè)務(wù)的內(nèi)容進(jìn)行模塊化分類,分為河長履職、河湖管理、河湖水質(zhì)、交互督辦、重點(diǎn)工作、在線辦公、公眾參與和基礎(chǔ)信息.各模塊及其子模塊功能詳情如圖3所示.
河長履職模塊負(fù)責(zé)展示河長人員信息以及記錄市級(jí)、區(qū)級(jí)河長的巡河日志;河湖管理模塊主要展示河湖信息、河道治理方案等;河湖水質(zhì)模塊負(fù)責(zé)對(duì)各類河道的水質(zhì)進(jìn)行展示與數(shù)據(jù)統(tǒng)計(jì)分析;交互督辦、重點(diǎn)工作模塊對(duì)河湖治理工作的進(jìn)度、效果、政策進(jìn)行展示;在線辦公模塊包含河長工作人員對(duì)河湖水質(zhì)信息的填報(bào)、上傳與存證,并進(jìn)行水質(zhì)檢測的公開通知;公眾參與模塊為公眾提供了一個(gè)河湖污染情況反饋的平臺(tái);基礎(chǔ)信息模塊支持系統(tǒng)對(duì)各個(gè)用戶、部門、資源、區(qū)域劃分的統(tǒng)一管理.
圖3 區(qū)塊鏈河長制系統(tǒng)功能模塊Figure 3 Function modules of blockchain-based river chief-oriented system
系統(tǒng)在線辦公模塊中的水質(zhì)填報(bào)子功能包含了河長制信息管理系統(tǒng)中的關(guān)鍵數(shù)據(jù),這些數(shù)據(jù)敏感度最高,故需要安全可靠的存儲(chǔ).傳統(tǒng)河長制信息管理系統(tǒng)的水質(zhì)填報(bào)操作流程較為簡單,部門用戶只需填寫數(shù)據(jù)并且上傳至中心數(shù)據(jù)庫.本系統(tǒng)利用區(qū)塊鏈技術(shù)對(duì)水質(zhì)信息的填報(bào)功能進(jìn)行完善,將用戶上傳的水質(zhì)信息上傳到區(qū)塊鏈網(wǎng)絡(luò)進(jìn)行存證,并且能夠根據(jù)區(qū)塊鏈中的存證數(shù)據(jù)進(jìn)行核驗(yàn)與還原.區(qū)塊鏈存證部分是以需要處理的水質(zhì)填報(bào)數(shù)據(jù)模型為基礎(chǔ),編寫智能合約和中間層的代碼,并且完成上層REST 接口[19]的封裝,為河長用戶完成水質(zhì)信息填報(bào)、上傳以及區(qū)塊鏈存證.河長用戶能夠從水質(zhì)填報(bào)模塊跳轉(zhuǎn)至區(qū)塊鏈存證展示模塊,可進(jìn)一步瀏覽區(qū)塊鏈中的交易數(shù)、區(qū)塊數(shù)、節(jié)點(diǎn)數(shù)等狀態(tài)信息,查詢最新水質(zhì)信息存證記錄、水質(zhì)信息存證變更歷史等詳細(xì)信息.
河長制信息存證系統(tǒng)主要針對(duì)河長信息管理系統(tǒng)產(chǎn)生的關(guān)鍵數(shù)據(jù)進(jìn)行安全可靠的存證,主要安全需求包含如下內(nèi)容:
1)系統(tǒng)運(yùn)行安全
在系統(tǒng)組件運(yùn)行過程中出現(xiàn)程序崩潰、節(jié)點(diǎn)異常的情況下,系統(tǒng)能夠具備一定的容錯(cuò)性,保障數(shù)據(jù)存證與查詢服務(wù)一切正常.
2)數(shù)據(jù)庫存儲(chǔ)安全
數(shù)據(jù)庫用戶訪問時(shí)應(yīng)具備密碼訪問安全性.
3)操作數(shù)據(jù)可追溯
對(duì)于敏感數(shù)據(jù)的操作需要在系統(tǒng)后臺(tái)進(jìn)行日志處理,追溯該類數(shù)據(jù)的變化情況,并且對(duì)于某類關(guān)鍵操作需要進(jìn)行安全審計(jì).
4)系統(tǒng)防御安全性
可防御一般的惡意攻擊和病毒入侵.
5)用戶權(quán)限安全
對(duì)于不同身份的用戶,系統(tǒng)需要設(shè)置不同的操作權(quán)限.管理員用戶可以在水質(zhì)信息模塊填報(bào)、上傳、存證、核驗(yàn)、恢復(fù)數(shù)據(jù),并且在水質(zhì)信息存證的同時(shí)能夠?qū)⒂脩粜畔⒁脖4嬷羺^(qū)塊鏈中;普通用戶調(diào)用存證接口將提示權(quán)限不足或存證失敗,只能通過區(qū)塊鏈的存證模塊查詢相關(guān)水質(zhì)信息.
基于區(qū)塊鏈的河長制信息管理系統(tǒng)是以數(shù)據(jù)安全存證、展示為核心的.系統(tǒng)根據(jù)平臺(tái)數(shù)據(jù)的來源類型可以劃分為靜態(tài)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù),前者是紙質(zhì)化保存下來的數(shù)據(jù),后者是通過實(shí)時(shí)考察、民眾反饋等多媒體形式上傳提交的數(shù)據(jù).平臺(tái)以這些數(shù)據(jù)為基礎(chǔ),并根據(jù)功能層次的不同將系統(tǒng)架構(gòu)劃分為應(yīng)用層、支撐層、數(shù)據(jù)層、硬件和網(wǎng)絡(luò)環(huán)境層、數(shù)據(jù)采集層.
1)應(yīng)用層
應(yīng)用層以Web 的形式展現(xiàn)系統(tǒng)各個(gè)功能模塊.
2)支撐層
支撐層為應(yīng)用層數(shù)據(jù)提供支撐服務(wù),包括河湖地理環(huán)境服務(wù)、監(jiān)控?cái)?shù)據(jù)采集服務(wù)、數(shù)據(jù)分析服務(wù)、實(shí)時(shí)在線數(shù)據(jù)服務(wù);
3)數(shù)據(jù)層
數(shù)據(jù)層負(fù)責(zé)數(shù)據(jù)存儲(chǔ).
4)環(huán)境層
環(huán)境層提供平臺(tái)運(yùn)行時(shí)所需要的網(wǎng)絡(luò)和硬件環(huán)境;
5)采集層
采集層以靜態(tài)或動(dòng)態(tài)方式獲取數(shù)據(jù)并上傳至系統(tǒng).
詳情如圖4所示.
圖4 區(qū)塊鏈河長制信息管理系統(tǒng)架構(gòu)Figure 4 Architecture of blockchain-based river chief-oriented information management system
系統(tǒng)數(shù)據(jù)層所依賴的區(qū)塊鏈分布式存儲(chǔ)環(huán)境是基于超級(jí)賬本構(gòu)建的聯(lián)盟鏈.系統(tǒng)建立在4 臺(tái)云服務(wù)器上,通過Docker 容器部署并啟動(dòng)4 個(gè)節(jié)點(diǎn)[20].聯(lián)盟鏈采用Kafka 共識(shí)機(jī)制實(shí)現(xiàn)區(qū)塊鏈賬本狀態(tài)的強(qiáng)一致性,并通過編寫智能合約實(shí)現(xiàn)對(duì)區(qū)塊鏈賬本的讀寫操作.智能合約以邏輯代碼的形式運(yùn)行在區(qū)塊鏈節(jié)點(diǎn)中,是超級(jí)賬本中間層與區(qū)塊鏈網(wǎng)絡(luò)資源交互的必要途徑.本系統(tǒng)使用Go 語言實(shí)現(xiàn)合約開發(fā),開源集成庫Shim 和Peer 可用來完成二次開發(fā).本智能合約的核心算法邏輯包含水質(zhì)信息上鏈存儲(chǔ)和鏈上查詢兩部分.
算法1智能合約水質(zhì)信息存儲(chǔ)
中間層通過GRPC 請(qǐng)求傳輸參數(shù)調(diào)用相應(yīng)智能合約,數(shù)據(jù)以JSON 數(shù)組的形式傳給智能合約.本算法以安全而簡潔的方式將JSON 數(shù)據(jù)轉(zhuǎn)換成字節(jié)流,并以數(shù)據(jù)ID 字段為鍵值寫入分布式賬本.算法需要對(duì)JSON 數(shù)據(jù)進(jìn)行合法性、完整性檢查,并通過Go 語言自帶安全的JSON 庫將JSON 數(shù)據(jù)解析到對(duì)象中,再將對(duì)象序列化成JSON 字節(jié)流保存到分布式賬本中,從而通過返回序列化成功與失敗來實(shí)現(xiàn)JSON 數(shù)據(jù)的合法性以及完整性檢查.算法關(guān)鍵步驟如下.
步驟1獲取shim.ChaincodeStuInterface 中的參數(shù)D,檢查D是否合法并且是否包含一個(gè)ID 和一個(gè)JSON 對(duì)象.若不滿足條件,則返回失敗.
步驟2調(diào)用JSON 庫的Marshall 函數(shù)將JSON 解析成對(duì)象Obj,檢查解析是否成功.若不成功則返回失敗,再調(diào)用函數(shù)將對(duì)象Obj 序列化成JSON 字節(jié)流.檢查序列化是否成功,若不成功則返回失敗.
步驟3若步驟1 和2 結(jié)果成功,則調(diào)用shim.putState(ID, bytes)將字節(jié)流保存到賬本中.
智能合約水質(zhì)信息存儲(chǔ)算法的詳細(xì)流程如圖5所示.
圖5 基于智能合約實(shí)現(xiàn)水質(zhì)信息存儲(chǔ)的流程Figure 5 Flow chart of water quality information storage algorithm based on smart contract
算法2智能合約水質(zhì)信息查詢算法
本系統(tǒng)將超級(jí)賬本的節(jié)點(diǎn)狀態(tài)數(shù)據(jù)庫設(shè)置為LevelDB[21],超級(jí)賬本通過中間層發(fā)送的查詢請(qǐng)求也為JSON 數(shù)據(jù)的格式,其中包含查詢索引.查詢存證數(shù)據(jù)需要基于數(shù)據(jù)的ID 字段或者哈希值實(shí)現(xiàn),本智能合約水質(zhì)查詢算法關(guān)鍵步驟如下:
步驟1首先需要檢查數(shù)據(jù)索引I的合法性,若數(shù)據(jù)合法,則繼續(xù)執(zhí)行查詢步驟;若不合法,則返回失敗結(jié)果.
步驟2調(diào)用shim.GetState()函數(shù)獲取賬本數(shù)據(jù)D,檢查函數(shù)調(diào)用是否成功.若調(diào)用成功,則將序列化成功后的對(duì)象值返回;若函數(shù)調(diào)用失敗或序列化失敗,則返回失敗結(jié)果.
水質(zhì)查詢算法的詳細(xì)流程如圖6所示.
圖6 基于智能合約的鏈上查詢流程Figure 6 Flow chart of data query algorithm based on smart contract
中間層是智能合約和應(yīng)用層交互的橋梁,負(fù)責(zé)接收應(yīng)用層的客戶端請(qǐng)求并調(diào)用已完成的智能合約代碼.中間層在合約調(diào)用過程中嚴(yán)格限制操作權(quán)限,只有管理員用戶才能使用水質(zhì)信息的存證功能,普通用戶只能查詢鏈上存證數(shù)據(jù).本系統(tǒng)中間層基于Fabric-go-sdk 設(shè)計(jì)開發(fā),在智能合約完成基本的存儲(chǔ)、查詢邏輯的基礎(chǔ)上進(jìn)一步完善中間層的相關(guān)功能.為實(shí)現(xiàn)高效的用戶權(quán)限管理以及向上接口服務(wù),中間層將實(shí)現(xiàn)數(shù)據(jù)上鏈和查詢的兩種算法.
算法3中間層水質(zhì)信息上鏈算法
本系統(tǒng)應(yīng)用層以Web 的形式為用戶提供服務(wù),因此中間層采用RESTful 風(fēng)格的API 接口.在數(shù)據(jù)傳輸時(shí),以HTTPS 搭載JSON 數(shù)據(jù)為安全傳輸機(jī)制防止黑客攻擊.JSON 數(shù)據(jù)包含一個(gè)索引,由數(shù)據(jù)在中心數(shù)據(jù)庫的表名和數(shù)據(jù)的ID 字段構(gòu)成.當(dāng)算法檢查用戶權(quán)限時(shí),從CA 查詢用戶是否為管理員,只有管理員用戶才能使用水質(zhì)數(shù)據(jù)存證功能.本算法的關(guān)鍵點(diǎn)在于:用戶注冊之后將私鑰保存在用戶賬戶下,當(dāng)用戶發(fā)起數(shù)據(jù)存證的請(qǐng)求提案時(shí),使用用戶的私鑰對(duì)提案進(jìn)行簽名,且提案在交易驗(yàn)證階段必須通過用戶公鑰驗(yàn)證才能寫入賬本.用戶登陸后,采用JWT 技術(shù)[22]保持用戶的在線狀態(tài)的檢測.中間層水質(zhì)信息上鏈算法的詳細(xì)流程如圖7所示.本算法的關(guān)鍵步驟如下:
步驟1在區(qū)塊鏈上部署智能合約,完成用戶的注冊和登錄.初始化連接Channel 并完成Peer 節(jié)點(diǎn)和Orderer 節(jié)點(diǎn)的實(shí)例化.
步驟2將需要上傳的水質(zhì)數(shù)據(jù)D1、調(diào)用合約名和合約函數(shù)封裝成一個(gè)請(qǐng)求體數(shù)據(jù)包,調(diào)用getUserContext(user)函數(shù),查看當(dāng)前用戶信息是否存在或已經(jīng)登陸過.若不存在或未登錄,則返回失敗結(jié)果.
步驟3查詢用戶是否在區(qū)塊鏈網(wǎng)絡(luò)中具有管理員身份.若不是,則返回失敗狀態(tài).
步驟4調(diào)用peer.sendTrasactionProposal()向背書節(jié)點(diǎn)發(fā)送交易提案.若提案失敗,則返回失敗.
圖7 中間層水質(zhì)信息上傳算法流程圖Figure 7 Flow chart of algorithm for intermediate layer water quality information uploading to chain
步驟5設(shè)置定時(shí)器,判斷提案是否超時(shí).若超時(shí),則返回失敗.
步驟6獲取背書結(jié)果并且封裝新的交易請(qǐng)求體request,通過調(diào)用系統(tǒng)內(nèi)部的封裝函數(shù)channel.sendTrasaction(request)將交易請(qǐng)求提案給Orderer 節(jié)點(diǎn).
步驟7獲取新提案的返回狀態(tài),根據(jù)狀態(tài)判斷上鏈?zhǔn)欠癯晒?若成功,則返回成功結(jié)果值交易提案的Hash;若提案不成功,則返回失敗結(jié)果.
算法4中間層水質(zhì)信息查詢算法
由于區(qū)塊鏈上的數(shù)據(jù)對(duì)所有用戶公開透明,本算法需獲取用戶登陸后在CA 服務(wù)商的證書身份來參與水質(zhì)信息的查詢.當(dāng)用戶發(fā)起查詢請(qǐng)求時(shí),算法針對(duì)用戶身份和查詢內(nèi)容進(jìn)行判斷,根據(jù)請(qǐng)求中的數(shù)據(jù)ID 或者交易的Hash 進(jìn)行鏈上查詢.算法關(guān)鍵步驟如下:
步驟1初始化Channel,并且完成Peer、Orderer 節(jié)點(diǎn)的代理.
步驟2將水質(zhì)查詢的請(qǐng)求參數(shù)中的Hash 或者ID 同鏈碼名和函數(shù)名封裝成一個(gè)request對(duì)象.
步驟3調(diào)用函數(shù)getUserContext(user),判斷當(dāng)前用戶是否存在或登錄.若不滿足條件,則返回失敗結(jié)果.
步驟4通過調(diào)用SDK 函數(shù)channel.queryByChaincode(requset)獲取查詢結(jié)果,判斷鏈上查詢結(jié)果是為空.若不滿足條件,則返回操作狀態(tài)和查詢結(jié)果.
中間層水質(zhì)信息查詢算法的詳細(xì)過程如圖8所示.
圖8 中間層水質(zhì)信息查詢算法流程圖Figure 8 Flow chart of algorithm for intermediate layer water quality information query
中間層向應(yīng)用層提供封裝的RESTful 風(fēng)格的API 接口,供應(yīng)用層調(diào)用.為實(shí)現(xiàn)本系統(tǒng)區(qū)塊鏈存證模塊以及區(qū)塊鏈信息展示模塊,設(shè)計(jì)相關(guān)接口以提供區(qū)塊鏈相關(guān)數(shù)據(jù)存儲(chǔ)與查詢服務(wù),所設(shè)計(jì)的功能接口如表1所示.
表1 RESTful 接口設(shè)計(jì)Table 1 RESTful API design
本系統(tǒng)部署在4 臺(tái)2 核4G 的Linux 云服務(wù)器上,并在服務(wù)器上搭建了超級(jí)賬本聯(lián)盟鏈網(wǎng)絡(luò)集群.集群由多個(gè)分布式節(jié)點(diǎn)構(gòu)成,超級(jí)賬本中的節(jié)點(diǎn)類型有Orderer 和Peer 兩種.Orderer 節(jié)點(diǎn)連接到Kafka 集群,利用Kafka 的共識(shí)功能完成交易的排序和打包.Peer 節(jié)點(diǎn)負(fù)責(zé)記賬,在集群中負(fù)責(zé)承擔(dān)交易背書、完成與Orderer 節(jié)點(diǎn)的通信、區(qū)塊驗(yàn)證等功能.集群的各個(gè)節(jié)點(diǎn)通過Docker 容器部署在Linux 系統(tǒng)中,每個(gè)Orderer 和Peer 維護(hù)單獨(dú)的賬本數(shù)據(jù),并且需要通過CA 管理節(jié)點(diǎn)的準(zhǔn)入權(quán)限.物理節(jié)點(diǎn)上的具體部署情況如表2所示.
表2 物理節(jié)點(diǎn)部署方案Table 2 Deployment scenario of physical node
本系統(tǒng)使用Postman 作為鏈上信息存證測試工具.Postman 可以模擬客戶端發(fā)送任意HTTP 網(wǎng)絡(luò)請(qǐng)求,接收服務(wù)端的正常響應(yīng)并顯示出返回的完整數(shù)據(jù).對(duì)于鏈上信息存證,使用Postman 發(fā)送HTTP 請(qǐng)求到后臺(tái)服務(wù)器,并且接收后臺(tái)響應(yīng)的JSON 格式的數(shù)據(jù).若在響應(yīng)數(shù)據(jù)中包含了區(qū)塊鏈上鏈產(chǎn)生的特征哈希值,并且可以使用該值查詢到原先上鏈的完整數(shù)據(jù),即可證明系統(tǒng)的存證功能測試通過.
首先將需要上傳的水質(zhì)信息封裝成JSON 格式的數(shù)據(jù),在測試工具中填寫對(duì)應(yīng)服務(wù)器IP、端口、路徑和請(qǐng)求方式.使用工具發(fā)送請(qǐng)求后獲取到的后臺(tái)響應(yīng)結(jié)果如圖9所示.
可以看出:水質(zhì)信息已作為一筆交易成功添加到區(qū)塊中,并且系統(tǒng)會(huì)返回此交易對(duì)應(yīng)的具體交易ID 作為其存在于區(qū)塊鏈的特征屬性值.獲取此交易ID 值后再次以Postman 工具修改路徑和請(qǐng)求方式,以交易ID 作為參數(shù)向服務(wù)器發(fā)送一筆新的查詢請(qǐng)求,后臺(tái)相應(yīng)結(jié)果如圖10所示.
圖9 水質(zhì)信息上鏈接口測試結(jié)果Figure 9 Test results of water quality information uploading to chain interface
圖10 水質(zhì)信息查詢接口測試結(jié)果Figure 10 Test results of water quality information querying interface
查詢結(jié)果不僅包含已上傳的水質(zhì)相關(guān)信息和特征值交易ID,還包括此條交易在經(jīng)過Orderer 節(jié)點(diǎn)排序后產(chǎn)生于區(qū)塊中的時(shí)間戳,證明其在鏈上的存在性.
系統(tǒng)底層區(qū)塊鏈性能測試使用壓力測試工具JMeter,該工具運(yùn)行需要依賴JAVA 運(yùn)行環(huán)境,在測試前需先安裝JDK.本測試工具通過建立多線程組并設(shè)置請(qǐng)求時(shí)間,在設(shè)定時(shí)間范圍內(nèi)的每個(gè)線程都會(huì)單獨(dú)發(fā)送一次請(qǐng)求,從而模擬多用戶同時(shí)在線對(duì)Web 服務(wù)器接口調(diào)用的并發(fā)場景.每秒產(chǎn)生的并發(fā)量對(duì)于調(diào)用功能接口會(huì)產(chǎn)生相當(dāng)大的負(fù)載量,用此工具測試本系統(tǒng)中的上鏈和查詢接口,并且通過測試結(jié)果中接口調(diào)用成功率、每秒的平均交易事務(wù)量S吞吐量(transaction per second, TPS)和交易平均響應(yīng)時(shí)間tRTT(round-trip time, RTT),進(jìn)一步分析系統(tǒng)底層區(qū)塊鏈的性能.
系統(tǒng)使用JMeter 分別對(duì)系統(tǒng)的資源上鏈接口和鏈上查詢接口進(jìn)行5 組不同數(shù)量級(jí)的壓力測試.首先設(shè)置線程組數(shù)分別為1 000、1 500、2 000、2 500、3 000,并且設(shè)置請(qǐng)求間隔時(shí)間為1 s;接著設(shè)置Http Request 為測試樣本,添加服務(wù)器IP、端口號(hào)、請(qǐng)求方式、請(qǐng)求參數(shù)等信息;最后為測試添加監(jiān)聽器,由監(jiān)聽器選擇測試總結(jié)報(bào)告和TPS 測試報(bào)告作為最終測試結(jié)果.經(jīng)過5 組測試獲取的結(jié)果如表3所示.
表3 RESTful 接口壓力測試結(jié)果匯總表Table 3 Summary of RESTful interface stress test results
綜合測試結(jié)果,選取模擬用戶組數(shù)為2 000 的測試結(jié)果作為本次系統(tǒng)的最優(yōu)測試情況,其對(duì)應(yīng)的上鏈接口的測試總結(jié)報(bào)告詳情如表4所示.
表4 2 000 線程數(shù)的上鏈接口壓力測試表Table 4 Uploading to chain interface pressure test table with 2 000 threads
經(jīng)過測試得到以下結(jié)果:2 000 次用戶并行請(qǐng)求對(duì)接口的調(diào)用成功率為100%,每筆交易的響應(yīng)時(shí)間為4.98 s,每秒吞吐量可達(dá)到246.3 tps,最高每秒吞吐量可達(dá)484.6 tps.具體的TPS 測試報(bào)告如圖11所示.
圖11 線程組數(shù)為2 000 的數(shù)據(jù)上鏈接口的TPS 測試報(bào)告Figure 11 Data uploading to chain Interface throughput test report with thread group number 2 000
測試報(bào)告中對(duì)應(yīng)的并行2 000 次查詢接口壓力測試的報(bào)告如表5所示.報(bào)告顯示:接口的調(diào)用成功率為100%,每筆交易的響應(yīng)時(shí)間為1.49 s,每秒吞吐量可達(dá)252.0 tps,最高每秒吞吐量為391.4 tps.具體的TPS 測試報(bào)告如圖12所示.
表5 2 000 線程數(shù)的查詢接口壓力測試Table 5 Query interface stress test with 2 000 threads
綜合接口功能驗(yàn)證情況和接口壓力測試報(bào)告可看出:本文提出的河長制信息管理系統(tǒng)能夠滿足對(duì)關(guān)鍵水質(zhì)信息的鏈上存證的功能,并在接口承載一定壓力的情況下,平均每秒的交易吞吐量可達(dá)200 tps,最高可達(dá)500 tps,接口的調(diào)用成功率較高,可以滿足一般性的系統(tǒng)要求.
圖12 線程組數(shù)為2 000 的數(shù)據(jù)查詢接口的TPS 測試報(bào)告Figure 12 TPS test report of data query interface for 2 000 threads
本文將區(qū)塊鏈技術(shù)與“河長制”相結(jié)合,將河長制系統(tǒng)中重要的水質(zhì)填報(bào)信息放在區(qū)塊鏈中存儲(chǔ),并且向用戶提供鏈上數(shù)據(jù)存儲(chǔ)證明的功能接口.使用區(qū)塊鏈對(duì)河長制數(shù)據(jù)信息加以備份,可以有效防止數(shù)據(jù)篡改.詳細(xì)的功能測試結(jié)果表明本系統(tǒng)具備完善的水質(zhì)存證功能,系統(tǒng)用戶不但可以將水質(zhì)信息上傳至區(qū)塊鏈網(wǎng)絡(luò)環(huán)境,而且可以查詢鏈上水質(zhì)信息的詳情以及追溯某條水質(zhì)信息的歷史變更情況.系統(tǒng)的數(shù)據(jù)上鏈和鏈上查詢的壓力測試結(jié)果也表明,在一定量用戶同時(shí)在線的場景下,系統(tǒng)接口的調(diào)用成功率較高,同時(shí)每秒處理的事務(wù)能力和平均響應(yīng)時(shí)間均可滿足正常的業(yè)務(wù)需求.