周 強,李向東,彭詩杰,姚夢輝,張 行
1(武漢市水務集團有限公司,武漢 430034)
2(湖北郵電規劃設計有限公司,武漢 430023)
區塊鏈(Blockchain)是一種分布式賬本技術,采用非對稱數字加密、時間戳、分布式共識等技術,具有去中心化、信息不可篡改、可以追溯、公開透明等特點[1,2].2008年區塊鏈作為比特幣的底層實現技術被提出,截至目前,區塊鏈已經經歷了以比特幣為代表的可編程貨幣階段(1.0 階段)和以以太坊和超級賬本為代表的可編程金融階段(2.0 階段),正在向可編程社會的3.0 階段發展[3].
隨著區塊鏈技術的不斷發展,利用區塊鏈上產生的數據,提供基于區塊鏈的區塊/交易查詢、數據信息提交等一系列操作的BaaS (Blockchain as a Service,區塊鏈即服務)逐漸成熟.BaaS 具有降低開發及使用成本,兼顧快速部署、方便易用、高安全可靠等特性,為區塊鏈應用開發者提供區塊鏈服務能力[4].BaaS 加速了區塊鏈在各個行業應用落地的步伐.
目前,區塊鏈技術在國內各領域應用場景不斷推出.貿易金融領域,2019年4月中國國投國際貿易有限公司所屬南京公司完成了內地首筆基于區塊鏈技術的跨境信用證交易;產品溯源領域,2019年1月,由中國網“一帶一路”網與中追溯源科技股份有限公司聯合發起的基于區塊鏈技術的“一帶一路”可追溯商品數據庫正式啟動,確保每一件商品都能實現來源可查,去向可追,有力杜絕假冒偽劣產品;政務民生領域,2019年6月佛山市禪城區啟動全省首個“區塊鏈+疫苗”項目建設,打造“區塊鏈+疫苗安全管理平臺”,旨在實現疫苗流通全過程的可視化監管,并簡化疫苗預約接種流程[5].此外,在公共服務、電力能源、智能制造、供應鏈、物流、電商、農業、物聯網等諸多行業領域都在探索區塊鏈應用[6–15].
智慧水務是智慧城市建設的重要組成部分,通過物聯網技術的應用,建立城市水資源信息物聯網絡,實現對取水、送水、制水、配水、排水、污水處理等各環節進行監控、識別、定位和管理,以提升水務信息智能化管理水平[16].目前國內智慧水務建設,一般運用物聯網技術,采用中心化的數據收集和處理模式,匯總IoT 設備采集的數據,并基于數據分析結果對IoT 設備發送控制指令[17].中心化的處理方案,信息的獲取和發布對用戶不透明,容易出現延時和失真,且成本高、容量有限、安全性差[18].而區塊鏈技術去中心化、信息不可篡改、公開透明的特點為解決這些問題提供了一個可行性的方案.
近兩年來,國內外企業嘗試將區塊鏈技術使用在智慧水務應用上.美國 Genesis 公司將區塊鏈技術應用于油氣田污水處理系統,為了減少當地民眾對污水處理質量的擔憂,系統中的數據采用以太坊(Ethereum)技術存儲發布,當水質變壞時系統也能預警,提高了人們對水質數據的信任度[19].在國內,搜狐網報道2019年長春水務集團聯手支付寶公司推出“最多只跑一次”和“區塊鏈代扣”服務,把代扣業務“搬”上鏈,成為全國首家把區塊鏈技術融合到民生繳費服務中的水司,實現了全程可追溯、不可篡改、實時可查詢,保證了扣費的穩定性,解決了出賬速度慢、通知慢的問題,極大提升了用戶代扣業務的便捷性、安全性.
城市智慧水務建設過程中,因為水務數據的可信度所產生的一系列責任鑒定問題.例如,智能水表故障所造成損失定量和取證,可行的做法是通過監測智能水表的健康狀態數據,根據故障的時間來定量分析損失.在此過程中,主要矛盾在于數據的真實性信任問題,在數據集中存儲管理模式下,水表生產商和水務公司之間互不信任.而引入區塊鏈技術,數據多方存儲管理和不可篡改性可以較好地解決上述問題.從上述問題出發本文針對智慧水務應用中構建區塊鏈BaaS 服務的關鍵技術進行了相關研究.首先,提出了智慧水務平臺中區塊鏈BaaS 服務體系架構.然后,基于分布式賬本存儲結構,提出智能水表健康狀態數據在區塊鏈賬本中存儲的數據模型,并提出一種健康狀態數據Merkle二叉樹驗證模型確保數據真實性和完整性;其次,并針對海量高并發健康狀態數據提出一種上鏈方案,雙緩沖隊列和多節點接入關鍵技術;最后通過對比分析驗證水務區塊鏈BaaS 服務在高并發智慧水務數據上鏈應用上的可行性和優越性.
如圖1所示,智慧水務平臺分為業務系統層和區塊鏈層.業務系統層包括了水務區塊鏈BaaS 服務及其他業務系統.水務區塊鏈BaaS 服務作為可部署的獨立單元,既可在水務內網服務器,也可在公有云中部署.其核心職責是以基于RESTful 接口方式為其他系統和平臺并提供了區塊鏈錢包注冊、數據上鏈、數據溯源和數據驗證服務.
區塊鏈層依托分布式賬本和密碼不可篡改的特性為上層應用提供可信的分布式數據網絡.其他業務系統的數據(健康狀態)通過水務區塊鏈BaaS 服務寫入至區塊鏈系統的賬本中,可通過基于區塊鏈本身的區塊鏈瀏覽器瀏覽上鏈數據,并通過基于區塊鏈本身的錢包應用來管理各智能水表的數據資產.
本文以水表計費數據的全生命周期視角出發來說明智慧水務平臺和區塊鏈BaaS 服務的交互情況.
(1)物聯網IoT 平臺通過唯一標識ID 來管理智能水表,IoT 平臺調用BaaS 服務創建錢包接口,為水表在區塊鏈上開辟一個賬戶(公鑰、私鑰),并通過TOKEN激活,使錢包賬戶和水表ID 形成一一映射;
(2)智能水表健康狀態數據通過NBIoT 傳輸方式回傳至IoT 平臺,然后調用BaaS 服務數據上鏈接口將數據寫入到該水表賬戶下交易中;
(3)通過IoT 平臺將數據發送至數據中心;
(4)數據中心調用BaaS 服務驗證接口來校驗接收的健康狀態數據是否合法或未修改.

圖1 智慧水務區塊鏈BaaS 服務總體架構圖
區塊鏈分布式賬本從功能性角度來看,類似于分布式數據庫系統.在一定程度上,分布式賬本特性與分布式數據庫相似,健康數據寫入到分布式賬本需要構建相應的數據模型和索引結構進行存儲和索引.而數據模型和索引結構合理設計,將會對數據檢索性能提升以及存儲空間優化帶來顯著成效.本文提出的健康狀態消息的分布式賬本數據模型和檢索結構主要包括3 種:智能水表基本信息模型、健康狀態模型和Merkle驗證樹模型.其中智能水表基本信息模型和健康狀態信息模型是分布式賬本存儲數據模型,而Merkle 驗證樹模型是一種基于Hash 二叉搜索樹檢索模型.
水表基本信息模型的構建的思路方法如下:在水務平臺中提交智能水表唯一標識(MN)、位置信息(Location)、生產商信息(Manufacturer)經由生產商和水務公司共同審核.通過后,根據此數據組合生成一對錢包地址和私鑰與存儲在數據庫中傳感設備基本信息形成映射綁定,算法過程如圖2所示.
1)MN+Location+ Manufacturer+Passwd 組成的字符串經過SHA256 算法得到32 位固定長度字符串;
2)再次經過SHA256 算法獲得私鑰;
3)私鑰通過SECP256K1 橢圓曲線算法得到公鑰;
4)公鑰通過SHA256 算法獲得公鑰哈希;
5)公鑰哈希通過BASE58 算法得到錢包地址.

圖2 水表基本信息模型算法流程圖
本文提出的水表基本信息模型也就是水表四元組數據通過一定算法過程,轉化為私鑰、公鑰和錢包地址三元組數據的算法過程和兩者之間關系投影,如圖3.

圖3 水表基本信息映射關系圖
智能水表回傳的健康狀態數據的數據量隨時間的累積數量成線性增長,是一種附有時間戳屬性的多源海量的結構化數據.數據組織形式是將單位時間內的健康狀態數據批量打包寫入到單筆交易中.而分布式賬本交易數據結構無法直接納入海量數據且提供高效的檢索機制,健康狀態數據并非直接逐條寫入到分布式賬本交易,而是按預先指定的規則和時間戳范圍打包成數據塊,然后將數據塊的數字指紋(Hash),并組織成上一數據塊交易哈希、智能水表錢包地址、數據塊時間范圍和數據塊哈希的數據模型然后再寫入交易中,健康狀態數據模型如圖4所示.

圖4 智能水表健康狀態數據結構
上一數據交易哈希:上一筆交易哈希,通過該哈希值,可以快速定位到上一筆裝載了健康狀態數據的交易.
智能水表錢包地址:生產這些健康數據的智能水表,用其在區塊鏈系統中的錢包地址來替代.
數據塊時間范圍:由開始時間戳和結束時間戳組成,而本交易中所寫入的健康狀態數據均在此時間范圍內,該字段的意義在于對外提供了快速的時間檢索入口.
數據塊哈希(Merkle 二叉樹):將上述時間范圍內的所有健康狀態分別計算得出的數字指紋,組織成Merkle 二叉樹模型,數據塊哈希則是此Merkle 樹根哈希.Merkle 樹完整寫入交易,為健康數據的驗證提供數據結構方面的基礎.
算法步驟如下所述:
1)將智能水表的健康狀態數據逐條按時間范圍批量打包成數據塊,單個健康狀態數據結構由智能水表唯一標識、報警代碼、實際數值和報警時間組成.將時間范圍內的數據塊哈希據、智能水表錢包地址和上一數據塊交易哈希構建JSON 格式數據塊;
2)將JSON 數據塊進行SHA256 算法計算獲得數據塊哈希(數字指紋),通過構建convert 類型交易(交易發起方和交易對家均為同一錢包賬戶)將數據塊哈希、時間范圍、水表設備錢包地址和上一數據塊交易哈希構成的數據結構,寫入到分布式賬本交易中,從而完成智能水表健康狀態數據模型的構建.
Merkle Tree,也被稱為Hash Tree,顧名思義,是一種存儲哈希值的樹數據結構.Merkle 樹的葉子由數據塊(文件或文件切片)的哈希值.非葉節點則是其對應子節點串聯哈希字符串的哈希.自底向上,最底葉節點層,和哈希列表類似,數據被分成小的數據單元塊,有相應地哈希和數據塊一一對應.逐級向上回溯,相鄰的非葉子節點兩個哈希合并成一個字符串,然后運算得出父節點哈希,遞歸計算得出根哈希,稱為Merkle Root.
由上節闡述的水表健康狀態數據模型內容可知,分布式賬本中健康狀態數據是由原始數據經過計算得出的哈希,以水表在單位時間范圍內多條健康狀態數據哈希值組織成鏈表.根據實際情況,水務BaaS 服務核心職責為水務平臺中所有業務系統提供包括健康狀態在內的數據完整性和有效性驗證服務,該服務面臨高并發、低時延的挑戰和要求,需要一種針對健康數據在內的支持高并發高性能遍歷檢索機制.而鏈表數據遍歷時間復雜度為O(n),不能滿足高性能的要求.在借鑒區塊鏈關鍵技術中Merkle 樹關鍵技術基礎上,結合水表健康狀態數據模型,提出了一種基于Merkle 二叉樹索引模型,將時間復雜度下降了一個維度,由O(n)降為O(logn).
創建水表健康數據Merkles 樹,算法步驟過程如圖5所示.

圖5 健康數據Merkle 二叉樹模型
假設某一筆交易寫入4個水表健康狀態數據.
Step 1.對水表健康狀態數據1–4 做SHA256 算法hash 運算,hash (x,y)=hash(datai),i=1,2,3,4,(x,y)=0,1.
Step 2.第2 層相鄰兩個hash 塊串聯,做SHA256 hash 運算,hashz=hash (hash(x,y)),z=0,1,(x,y)=0,1.
Step 3.第3 層重復第2 層的兩兩hash 運算,生成Merkle Root Hash,hash root=hash (hashz),z=0,1.
易得,創建Merkle 樹是O(n)復雜度(指O(n)此hash 運算),n是數據量級.
檢索水表健康數據Merkle 樹算法步驟如下:
Step 1.首先比較Root Hash是否相同,如果不同檢索其孩子hash 0和hash 1;
Step 2.hash 0 相同,hash 1 不同.檢索hash 1的孩子hash 1-0和hash 1-1;
Step 3.hash 1-0 不同,hash 1-1 相同.Hash 1-0為葉子節點,獲取其對應的健康狀態數據.
Step 4.檢索比較完畢.
健康狀態數據的驗證分為兩個步驟:智能水表設備驗證、健康狀態數據的驗證.前者的驗證方法參照上述的傳感設備可信度驗證方法,通過此驗證,則進行下一步健康狀態數據的驗證,否則,返回驗證結果未通過.健康狀態數據的驗證方法如下:
1)確認待驗證健康狀態數據時間范圍和智能水表唯一標識(數據中包含智能水表的ID);
2)根據智能水表ID和時間戳范圍檢索待驗證區塊和交易;
3)批量驗證:SHA256 算法計算多條健康狀態數據Merkle Root Hash,單條驗證:SHA256 算法計算單條健康狀態數據Hash;
4)批量驗證:對比賬本交易上Merkle Root Hash,單條驗證:對比Merkle 樹對應的葉子Hash;
5)驗證對比結果:對比一致則健康狀態數據是可信的沒有被篡改,對比不一致則健康狀態數據是不可信的已經被篡改,流程步驟如圖6所示.

圖6 健康狀態數據驗證流程圖
針對當前區塊鏈系統數據上鏈遇到的TPS 瓶頸問題,本文提出了基于雙緩沖隊列的多節點上鏈方法.如圖7所示,左側為物聯網平臺(IoT);中間為BaaS 服務,包括雙緩沖隊列和線程池兩部分;右側為聯盟鏈,其中白色節點為當前可用節點,灰色節點為當前不可用節點.IoT 回傳的數據并寫入雙緩沖隊列;消費者通過讀取緩沖隊列數據,結合聯盟鏈中當前可用節點創建上鏈任務傳入線程池任務隊列,實現多節點異步上鏈.

圖7 基于雙緩沖隊列的多節點接入
這種方式先將數據存放到雙緩沖隊列,然后通過線程池異步上鏈,使得數據上鏈過程分散到了聯盟鏈各個節點,與IoT 連接聯盟鏈上鏈的方式相比,很大程度解決了單一節點上鏈中存在的區塊鏈系統TPS 瓶頸問題.
如圖8所示,基于雙緩沖隊列實現多點接入的具體流程如下.

圖8 線程池任務發布流程
1)獲取區塊鏈節點列表,若列表為空,結束;
2)獲取聯盟鏈中可用節點列表,若列表為空,結束;
3)從雙緩沖隊列讀取數據;
4)判斷數據是否為空,不為空執行流程5),為空執行流程6);
5)根據可用節點情況構建上鏈任務;
6)交換隊列;
7)判斷線程池是否存在,不存在執行流程8),存在執行流程9);
8)創建線程池;
9)線程池分發任務;
10)多節點上鏈.
需要注意的是,在初始化線程池時,需要遵循等式Nt=Nb,其中,Nt代表線程池的最大線程數,Nb代表聯盟鏈的節點數.上鏈任務以聯盟鏈中的可用節點為基準,即任務中連接的節點為當前可用節點,并遵照平等原則,依次為節點分配任務.
本章節針對智慧水務平臺有BaaS 服務和無BaaS服務情況分別對接入區塊鏈系統功能性和效率性方面出發做對比分析,結果如表1所示.
(1)BaaS 服務降低了業務系統與區塊鏈系統間的耦合度,大大降低區塊鏈的使用門檻.通常情況下不使用BaaS 服務,各應用接入系統需各自開發相應的區塊鏈的搜索查詢、交易提交、區塊生成等服務接口,而采用BaaS 服務則可在BaaS 服務中模塊化常用功能,系統接入方無需精通或掌握區塊鏈底層技術細節,無需相關的資源環境運維投入,即可快速接入使用區塊鏈.本文中設計的面向智慧水務平臺的區塊鏈BaaS 服務為水務數據提供統一的上鏈接口,水務業務系統與底層區塊鏈系統之間實現解耦合,即便底層區塊鏈系統整體被替換情況下,亦不會影響水務數據的上鏈,降低了業務系統數據上鏈門檻,更便于后期擴展更多的業務系統數據進行快速上鏈.
(2)BaaS 服務根據高并發數據的使用場景和業務特點,拓展自定義智能水表信息和健康狀態數據模型及雙緩沖多節點接入技術,滿足個性化的高并發數據上鏈需求.區塊鏈技術去中心化的共識機制需要全網節點對系統中的每一筆交易達成共識,這種共識機制限制了區塊鏈系統的吞吐量.目前主流的區塊鏈如比特幣區塊鏈、以太坊等TPS(系統吞吐量)均在幾十、幾百,最高也不過幾千,遠遠無法滿足數以萬計的智能水表組成IoT 網絡的智慧水務系統的數據寫入速度需求.本文采用智能水表信息和健康狀態數據模型在BaaS 服務中定制化的將海量上鏈水表健康數據打包成數據塊進行上鏈,無需修改區塊鏈底層即實現高并發下海量數據的區塊鏈上鏈服務,寫入效率大大提升.

表1 BaaS 服務的優勢對比
隨著區塊鏈技術的演進和發展,以及在各行業應用中的滲透和普及,越來越多區塊鏈加行業領域的新技術和新模式將會涌現出來.本文聚焦于智慧水務加區塊鏈方向,針對水務數據特別是智能水表管理中面臨的數據可信度問題,利用區塊鏈的公開、透明和不可篡改性提供解決方案.通過建立水務區塊鏈BaaS 服務解決水務數據寫入分布式賬本中面臨的瞬時高并發量和水務數據驗證過程中檢索效率低的問題.在創新點方面:(1)提出了一種適用于智能水表健康數據在區塊鏈系統中存儲的數據結構,有效利用分布式賬本中存儲空間基礎上,提供了健康數據高效的驗證的機制.(2)提出了一種基于雙緩沖隊列和多節點接入的關鍵技術,支持百萬量級瞬時高并發的健康狀態數據寫入區塊鏈系統分布式賬本.
后續研究方向和工作聚焦在以下兩個方面:(1)將更多類型和更大量級的水務數據(排水、污水控制處理等)接入到BaaS 服務;(2)針對水務數據具備一定普適性的分布式賬本數據模型做進一步研究.