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