許俊曉,崔昊楊,江超,江友華
(上海電力大學 電子與信息工程學院, 上海 200090)
信息安全一直是電網(wǎng)信息化與數(shù)字化[1-3]進程中的重要研究課題。在2020年,英國電力市場結算機構Elexon與能源供應商People′s Energy均不同程度遭受了網(wǎng)絡攻擊[4],盡管用戶信息安全未受到嚴重泄露威脅,但也給人工智能時代下的用戶隱私信息與存儲安全問題敲響了警鐘。目前,針對電力用戶海量數(shù)據(jù)信息均以中心化存儲的模式為主,極易遭受單點攻擊。基于區(qū)塊鏈[5-6]去中心化分布式信息管理方法,則能通過密鑰加密[7]、Hash加密[8]等技術保證信息數(shù)據(jù)的安全性[9]。同時,利用通用共識機制并結合加密和星際文件系統(tǒng)(IPFS)等方法,即可實現(xiàn)多節(jié)點廣義多模通信[10-11]。然而,受區(qū)塊鏈各節(jié)點數(shù)據(jù)維護和存儲壓力過大影響,節(jié)點服務器運行效率日益低下的問題正逐步顯現(xiàn)。
針對單鏈多點方案在海量信息處理中遇到的難題,有學者提出了多鏈多節(jié)點的解決方案,如雙鏈方案[12]、主從鏈方案[13]等。而針對多鏈數(shù)據(jù)隔離問題,則相應發(fā)展了跨鏈技術[14],如文獻[15]采用基于側鏈和中繼鏈跨鏈實現(xiàn)了物聯(lián)網(wǎng)的多域認證;文獻[16]通過中繼鏈技術實現(xiàn)能源交易不同主體的數(shù)據(jù)資產流通等。鑒于電力用戶具有物理空域強分散性、數(shù)字空間多樣多維海量特性,利用多鏈技術與跨鏈技術實現(xiàn)信息的安全管理具有重要現(xiàn)實意義。但目前針對海量電力用戶信息的多區(qū)塊鏈數(shù)據(jù)存儲和跨鏈查詢方法,仍少有文獻報道。為此,文中將采用Hyperledger Fabric[17]構建電力用戶信息區(qū)塊鏈管理系統(tǒng),在保證信息安全性和隱私性的前提下,通過創(chuàng)建多數(shù)據(jù)通道來實現(xiàn)多鏈并行,將賬本數(shù)據(jù)多路隔離,交由不同的節(jié)點維護,以減輕每個節(jié)點的維護任務。同時通過設置中間人節(jié)點結合鍵值查詢方法實現(xiàn)了跨鏈查詢,避免多鏈間出現(xiàn)“數(shù)據(jù)孤島”問題,利于數(shù)據(jù)的交流和統(tǒng)計分析。
為實現(xiàn)系統(tǒng)的安全管理和高效運行,采用Hyperledger Fabric模塊化架構方法構建區(qū)塊鏈。文中設計不同模塊以實現(xiàn)系統(tǒng)功能,使用鏈碼[18](Chaincode)完成節(jié)點和區(qū)塊鏈的信息交互。
為安全高效地管理電力用戶信息,文中設計了節(jié)點注冊、多通道創(chuàng)建、電力用戶信息上鏈以及電力用戶信息查詢4個模塊,系統(tǒng)模塊組成如圖1所示。節(jié)點注冊模塊負責通過使用Fabric的準入機制嚴格把控參與賬本維護的節(jié)點,實現(xiàn)對于鏈上信息的安全隱私保護,同時監(jiān)控每一筆交易的源頭,實現(xiàn)信息修改的責任追溯。文中要保證電力用戶信息的安全和隱私,因此系統(tǒng)中的節(jié)點由省級至縣級電力公司的信息管理部門組成。

圖1 電力用戶信息管理系統(tǒng)組成
多通道創(chuàng)建模塊負責使用Fabric的多通道技術實現(xiàn)多鏈并行,以減輕節(jié)點存儲壓力。通道本質上是賬本的邏輯概念,單一通道內的節(jié)點共同維護相同賬本,通道外的節(jié)點與通道內的賬本信息完全隔離,因此單個通道可被視為單一單鏈。一個通道可以含多個節(jié)點,一個節(jié)點也可以參與多個通道賬本的維護。文中采用按省劃分的方法構建多個通道,同省的節(jié)點進入一個通道,維護該省的賬本信息。
電力用戶信息上鏈模塊負責通過鏈碼將電力用戶的個人信息(例如姓名、用戶編號、開戶地址等)和用電信息(例如用電量、繳費金額、用電類型等)上鏈存儲。根據(jù)用戶的開戶地址,各省份的用戶信息被記錄在各自省份通道的賬本上,由該省節(jié)點進行維護。電力用戶信息查詢模塊負責通過Fabric的鍵值查詢功能對鏈上對應數(shù)據(jù)進行查詢。但通道間存在數(shù)據(jù)隔離,不利于數(shù)據(jù)的交流或統(tǒng)計。因此,除了各省節(jié)點之外,文中還設置了一個中間人節(jié)點,該節(jié)點擁有進入所有通道的權限,通過該節(jié)點可進行跨鏈查詢操作。
節(jié)點的注冊由Fabric CA完成。Fabric CA采用分層公開密鑰基礎結構(PKI)[19],公私鑰和數(shù)字證書由各注冊節(jié)點頒發(fā)。具體而言,省、市、縣各級電力公司的信息管理部門均需通過Fabric CA完成節(jié)點注冊以獲得公私鑰和數(shù)字證書,用于保證數(shù)據(jù)的安全隱私,未持有正確公私鑰和證書的節(jié)點無法參與系統(tǒng)操作。公私鑰主要用于交易簽名,文中使用橢圓曲線加密算法(ECC)[20]進行簽名操作,ECC在使用更小的密鑰時,能夠提供比傳統(tǒng)RSA加密算法更快的運行速度及更高的安全性能。
Fabric CA使用橢圓曲線加密算法得出成組的非對稱公私鑰,先隨機生成正整數(shù)k作為私鑰,接著計算Q=kP,Q就作為公鑰,其他人無法從公開的公鑰倒推出相應的私鑰[20]。公私鑰被用于交易簽名,每一筆交易都需要發(fā)起人節(jié)點使用私鑰簽名,其他節(jié)點驗簽成功后交易才能完成。首先發(fā)起人節(jié)點將交易信息M進行Hash加密處理[21]得到h,并隨機產生一個整數(shù)r以及計算點rP(x,y),根據(jù)r、h和k計算出驗證數(shù)s,如式(1)所示,然后將交易信息M與簽名{rP(x,y),s}發(fā)送給其它節(jié)點。
(1)
其他節(jié)點接收到M與簽名后,先對M進行Hash處理得到h,使用公鑰Q計算點R,計算公式見式(2),由于Q=Kp,因此式(3)成立。最后,對比R與rP,若兩者相等則驗簽成功。通過簽名和驗簽操作,每一筆交易過程會十分清晰且不可篡改,保證了電力用戶信息管理系統(tǒng)內數(shù)據(jù)的安全。
(2)
(3)
為防止攻擊者偽造公鑰而影響交易簽名,客戶端會對所有節(jié)點的數(shù)字證書進行驗證。證書中包含公鑰,公鑰的簽名等信息,證書生成及驗證的過程如圖2所示。節(jié)點注冊成功后,會生成公私鑰A,CA使用自身私鑰B對節(jié)點公鑰A進行加密,得到簽名C,并將簽名C與公鑰A存入證書中。節(jié)點進行工作時,其證書需要通過驗證。客戶端先從CA處獲取公鑰B,對證書中的簽名C進行解密,接著將解密后的公鑰a與公鑰A對比,查看是否相同,相同則通過驗證。只有擁有合法證書的節(jié)點才能參與賬本的維護,保證了鏈上電力用戶信息的安全隱私。

圖2 證書生成及驗證流程
節(jié)點注冊完成后,需要創(chuàng)建多通道實現(xiàn)多鏈并行,以減輕節(jié)點存儲任務。如圖3所示,系統(tǒng)按省劃分通道,各省節(jié)點只需維護各省的賬本信息。賬本中的區(qū)塊信息主要由前一區(qū)塊哈希值,時間戳和包含用戶信息的Markle樹根等組成。

圖3 多通道結構
文中使用Fabric的configtxgen模塊和peer模塊創(chuàng)建多個通道。通道創(chuàng)建流程如圖4所示。首先開通通道(Channel),以用戶的開戶地址省份為劃分標準。在Profile配置文件中設置通道的組織名稱,使用Configtxgen模塊運行Profile文件生成各省份通道的初始塊文件channel.tx。channel.tx規(guī)定了Channel中包含了哪些組織,它最終會被用作Channel的配置原型,通過填補成為賬本的genesis塊。channel.tx創(chuàng)建成功后,執(zhí)行jion命令將各省的Peer節(jié)點加入各省的通道。加入的具體流程如下:首先通過channel.tx讀取Channel的genesis塊數(shù)據(jù);接著調用CreateLedger方法根據(jù)該數(shù)據(jù)創(chuàng)建Peer節(jié)點的本地Channel賬本;最后調用createChain方法創(chuàng)建針對此Channel使用的鏈對象,使用InitializeChannel方法初始化了Peer節(jié)點間的Gossip連接服務,由此Peer節(jié)點可以向其他節(jié)點索要區(qū)塊的數(shù)據(jù)并將其添加到本地的Channel賬本。各省節(jié)點加入后,執(zhí)行更新命令更新錨節(jié)點,錨節(jié)點的作用是了解其他通道內成員的信息,檢查其是否同時屬于本通道。文中利用多通道技術構建多鏈并分散存儲任務,可以避免出現(xiàn)每個節(jié)點服務器都存儲過量用戶數(shù)據(jù)的情況,減輕節(jié)點的存儲壓力。

圖4 多通道創(chuàng)建流程
節(jié)點和通道創(chuàng)建完成后,需要將用戶信息上鏈管理,而信息上鏈、查詢的操作都需要鏈碼來實現(xiàn)。鏈碼,也稱智能合約,是一段部署在Docker容器中的程序。鏈碼負責客戶端程序與Fabric賬本的數(shù)據(jù)交互,節(jié)點可以通過鏈碼在客戶端發(fā)起交易和查詢信息。首先我們通過鏈碼聲明一個結構體,將用戶的個人信息(例如姓名、用戶編號、開戶地址等)和用電信息(例如用電量、繳費金額、用電類型等)與結構體中的鍵值一一對應(見表1和表2),用于將數(shù)據(jù)封裝成對象,并將用戶編號(EntityID)定為查詢鍵值。為了完成信息的上鏈和查詢,文中使用了Fabric的Shim系統(tǒng)包與客戶端進行通信。

表1 電力用戶個人信息結構體組成

表2 電力用戶用電信息結構體組成
1.4.1 信息上鏈
完成電力用戶信息上鏈需要調用Shim包中的ChaincodeStubinterface接口,使用接口中的讀取方法(GetState)和寫入方法(PutState)將信息寫入賬本,具體設計流程如圖5所示。節(jié)點將用戶信息上傳至客戶端,客戶端業(yè)務層先將信息封裝為數(shù)據(jù)對象Power,接著將Power序列化為字節(jié)數(shù)組,調用鏈碼,上傳字節(jié)數(shù)組。鏈碼通過接口獲取字節(jié)數(shù)組后,首先判斷上傳數(shù)組的參數(shù)個數(shù)是否符合要求,若不符合則返回錯誤,若符合則將數(shù)組反序列化為Power。反序列化后,鏈碼通過GetState(Power. EntityID)檢查用戶號EntityID是否已經(jīng)存在,若存在則返回錯誤,若不存在則通過PutState(Power)發(fā)起交易,將數(shù)據(jù)寫入賬本。節(jié)點證書驗證、交易簽名驗簽成功后,交易完成,用戶信息成功上鏈。

圖5 電力用戶信息上鏈流程
1.4.2 跨鏈信息查詢
為打破通道間的數(shù)據(jù)隔離,實現(xiàn)數(shù)據(jù)交流,文中設計了一種方案,設置中間人節(jié)點,結合InvokeChaincode方法實現(xiàn)跨鏈鏈碼調用,用于全局數(shù)據(jù)查詢。InvokeChaincode是Shim系統(tǒng)包的ChaincodeStubinterface接口中用作調用外部鏈碼的方法,使用InvokeChaincode方法可以對本通道的賬本進行讀寫操作。但當使用InvokeChaincode調用外部通道的鏈碼時,只有GetState方法等讀取方法可以響應,因此 InvokeChaincode方法只能讀取外部通道的賬本信息,并不能寫入信息。而讀取信息也是有條件的,即需要侵入外部通道的鏈碼,否則由于通道間存在數(shù)據(jù)隔離,僅僅使用 InvokeChaincode方法無法調用外部通道的賬本數(shù)據(jù)。
為此,文中提出了中間人節(jié)點,可作為兩條不同通道的“溝通橋梁”。在Fabric中,單一節(jié)點可以加入多個不同通道,因此該節(jié)點也可以獲取不同通道中的賬本信息。如圖6所示,Peer3加入了Channel1和Channel2通道,有權限獲取兩者的賬本信息,能夠調用雙方的鏈碼,公共物理節(jié)點Peer3即為中間人節(jié)點。以Peer3節(jié)點為中間通道,當Channel1的Peer1節(jié)點使用InvokeChaincode方法,上傳 Channel2的通道ID(ChannelID)和鏈碼名稱(ChaincodeName)參數(shù)對Channel2的賬本信息進行調用操作后,該方法會將上傳的ChannelID和ChaincodeName進行拼接形成新的賬本名稱—ChName。拼接成功后,調用handleInvokeChaincode方法,并傳入ChName以及Order節(jié)點發(fā)來的通道ID(ChID)和交易編號(Txid)。Order節(jié)點是獨立于Peer節(jié)點外,用于交易排序的節(jié)點,它通過Grpc[22]與各個節(jié)點連接。handleInvokeChaincode方法調用成功后,先調用createChannel函數(shù),使用ChID和Txid創(chuàng)建一個txCtxID通道,此通道與上文Channel不同,是Handler中的通道,只用于消息的收發(fā)。通道構建成功后,向Order節(jié)點發(fā)送InvokeChaincode上傳的ChName,由Order節(jié)點對Peer3節(jié)點提出鏈碼調用的請求,調用成功后將消息記錄在txCtxID通道返回。文中將InvokeChaincode方法和中間人節(jié)點結合,成功實現(xiàn)了電力用戶信息的跨鏈鏈碼調用。
借助跨鏈鏈碼調用可以實現(xiàn)全局電力用戶信息查詢。首先使用CA完成中間人節(jié)點的注冊,此CA必須與之前節(jié)點注冊使用的CA相同。接著,將中間人節(jié)點加入所有的通道中。中間人節(jié)點設置成功后,通過鏈碼完成查詢操作,具體設計流程如圖7所示。

圖6 跨鏈調用結構

圖7 電力用戶信息查詢流程
首先節(jié)點將用戶編號(EntityID)、所在省份的通道ID(ChannelID)和該通道的賬本名稱(ChaincodeName)通過客戶端業(yè)務層上傳,接著判斷該用戶是否為本省用戶,是則直接調用本通道鏈碼,否則通過InvokeChaincode(ChaincodeName, ChannelID)進行跨鏈鏈碼調用,查詢用戶對應省份通道的賬本。調用鏈碼成功后,先判斷上傳的EntityID的參數(shù)是否符合要求,若不符合則返回錯誤,若符合則使用GetState(EntityID)查詢該鏈碼的賬本,讀取EntityID對應的數(shù)據(jù)對象。最后判斷讀取的數(shù)據(jù)對象是否為Null,是則返回錯誤,否則返回查詢結果。
為迎合國家電網(wǎng)的需求,文中設計了系統(tǒng)的現(xiàn)實落地方案。首先,系統(tǒng)中的節(jié)點均由省級至區(qū)/縣級電力公司的信息管理部門構成,實現(xiàn)信息數(shù)據(jù)的安全存儲以及信息管理的責任追溯。接著以省份為通道劃分的標準實現(xiàn)多通道管理,每個省份通道擁有固定數(shù)量的節(jié)點,維護該省的用戶信息,以分散信息處理的壓力。最后設置中間人節(jié)點,打破通道間的信息隔離。由于中間人節(jié)點是各通道間的“交通樞紐”,其重要性等級較高,因此中間人節(jié)點均由省級部門構成,各省節(jié)點通過該節(jié)點實現(xiàn)信息數(shù)據(jù)的交流及共享。
采用Hyperledger Fabric搭建聯(lián)盟區(qū)塊鏈系統(tǒng),整個測試的組成包括1個CA節(jié)點,3個Peer節(jié)點,其中Peer0為中間人節(jié)點,3個Org通道,3個Orderer排序節(jié)點,其名稱與所在組織或通道如表3所示。系統(tǒng)的測試是在虛擬機上完成的,虛擬機的配置如表4所示。

表3 系統(tǒng)節(jié)點組成

表4 虛擬機配置
首先驗證系統(tǒng)的信息上鏈功能,在節(jié)點注冊,通道創(chuàng)建和鏈碼實例化完成之后,通過客戶端上傳兩個不同省份的測試用戶信息,這兩個用戶的信息被分開寫入Org1(上海市)和Org2(北京市)兩個通道的賬本,上鏈的后臺記錄如圖8所示。
驗證系統(tǒng)的本鏈和跨鏈信息查詢功能,通過前端輸入用戶編號(EntityID)、所在省份的通道ID(ChannelID)和該通道的賬本名稱(ChaincodeName)查詢記錄在不同通道賬本上的兩個用戶的完整記錄,查詢成功后將結果通過Web前端界面顯示,查詢成功后結果如圖9所示。

圖8 上鏈后臺記錄

圖9 本/跨鏈查詢結果界面及后臺記錄
文中使用區(qū)塊鏈性能測試工具Hyperledger Caliper對系統(tǒng)和測試單鏈進行吞吐量測試,測試分為兩輪,第一輪兩者擁有5個節(jié)點,另一輪兩者擁有15個節(jié)點。每輪測試在相同環(huán)境下進行了兩次,每一次測試15回,兩次測試交易次數(shù)txNumber分別為500和1 500,測試數(shù)據(jù)如圖10所示。

圖10 系統(tǒng)吞吐量測試數(shù)據(jù)
當兩者節(jié)點數(shù)量為5時,對文中系統(tǒng)和測試單鏈進行txNumber為500的測試,兩者的平均吞吐量分別為163.8 tps和163.1 tps。當txNumber上升為1 500后,兩者平均吞吐量下降為155.1 tps和149.5 tps。在交易量大量增加后,文中系統(tǒng)和測試單鏈的吞吐量下降率分別為5.3%和8.3%。
當兩者節(jié)點數(shù)量為15時,文中系統(tǒng)和測試單鏈的平均吞吐量在txNumber為500的情況下,分別為163.1 tps和162.5 tps。當txNumber上升為1 500后,兩者平均吞吐量下降為154.2 tps和148.3 tps,吞吐量下降率分別為5.5%和8.7%。結果證明,節(jié)點數(shù)量翻倍增長后,系統(tǒng)吞吐量變化不大,而在交易任務不斷增加的情況下,文中系統(tǒng)具有比單鏈系統(tǒng)更高的運行效率。
文章針對單鏈情況下節(jié)點存儲壓力過大的問題,提出了多鏈管理及跨鏈查詢的方法,并設計了電力用戶信息區(qū)塊鏈管理系統(tǒng)。系統(tǒng)使用Fabric構建聯(lián)盟區(qū)塊鏈,在設置節(jié)點注冊以保證用戶信息安全隱私的前提下,利用多通道技術實現(xiàn)多鏈并行,減輕單個節(jié)點的存儲壓力,避免節(jié)點服務器運行效率低下。為了避免通道間數(shù)據(jù)無法交流,文中通過設置中間人節(jié)點結合鍵值查詢方法實現(xiàn)跨鏈查詢。最后文中完成并測試了系統(tǒng)消息上鏈及跨鏈查詢的功能,并且對比了文中系統(tǒng)與單鏈系統(tǒng)的吞吐量及其下降率,結果證明文中系統(tǒng)更加高效。
綜上,所述方法不僅保證了電力用戶信息的安全隱私,實現(xiàn)了數(shù)據(jù)的融通共享,也確保了信息處理的高效穩(wěn)定,對推動國家電網(wǎng)智能化升級,企業(yè)數(shù)字化轉型提供了一定的參考和借鑒。