唐經緯,王玲芳,李楊
(1.中國科學院大學,北京 100049;2.中國科學院聲學研究所國家網絡新媒體工程技術研究中心,北京 100190)
在大數據時代,單一數據價值有限,數據不斷地被收集分析,才能用于引領科技創新和經濟增長[1]。數據流通交易是釋放數據價值的有效途徑,也是不可避免的趨勢和需求[2],現已有大量中心化數據交易平臺出現,但存在隱私和安全等問題。信息中心網絡是一種以數據信息為中心的網絡架構,包括NDN、MobilityFirst、SEANet[3]等項目,其分布式的數據交付模式可解決中心式數據交易如單點故障的部分問題,但此模式又給數據服務的計量提出了新的需求,且存在分布式場景下的安全與隱私問題[4]。
隨著區塊鏈技術不斷發展,各行業都在探索與區塊鏈的結合應用[5-6],引入區塊鏈能一定程度解決第三方服務的不可信問題[2]。針對分布式場景下的數據交易,文中提出一種基于區塊鏈上Merkle 樹的細粒度數據交易計量及驗證方法,并通過在以太坊私有鏈上的部署實現驗證。
現有的數據交易平臺主要可以分為集中式和分布式兩類[7]。
集中式數據交易平臺主要由互聯網企業以及政府兩類組織機構運營,集中式數據交易模式又可分為托管模式和聚合模式[7]。托管模式數據所有方將數據上傳至第三方數據交易中心托管數據,所有者對數據的后續使用與交易可能失去控制。聚合式數據所有方各自保存和管理自身數據,一定程度解決托管式失去對數據控制的問題,但是聚合平臺有能力在數據流經平臺時,獲取并留存數據[8]。此外集中模式均存在單點故障問題。
分布式平臺主要結合區塊鏈,建立一個無第三方的數據交易平臺,交易鏈上記錄,避免單點故障,各方用戶通過鏈上記錄達成協商,直接發起交易。文獻[9]設計了一種基于區塊鏈的自動數據交易框架,數據加密上傳,但需用戶主動上傳數據到中心式的存儲服務器。文獻[4,10]構建基于區塊鏈的計算任務市場架構以及文獻[11]提出的數據交易解決方案,均將數據在鏈下分布式存儲,無第三方保存數據副本的問題。但兩個方案需要在鏈下非匿名通信協商交易。
區塊鏈是一種分布式數字賬本系統,將數據區塊按照時間順序組合成鏈式結構,由去中心化系統中各節點共享和維護[12]。區塊鏈憑借不可篡改性以及可追溯性,使得其在數據資產交易領域有所應用,區塊鏈可以構建數據資產交易的索引,幫助數據溯源確權。以太坊區塊鏈首次引入智能合約[13],為區塊鏈提供更多數字貨幣外的應用場景[6]。區塊鏈常用共識算法有工作量證明(Proof of Work,PoW)、權益證明(Proof of Stake,PoS)等[14]。
區塊鏈的數據存儲根據存儲位置分為鏈上存儲和鏈下存儲。
在區塊鏈上進行大量數據的存儲是不可接受的[15],在區塊鏈存儲數據會導致所有節點均存儲副本,在節點數眾多時開銷巨大,以太坊通過燃氣費設計來限制用戶的存儲和計算。
常見與區塊鏈結合的存儲方式是基于分布式存儲的鏈下存儲方案,指將數據的哈希值或鏈下存儲的索引存于鏈上,如星際文件系統(Inter Planetary File System,IPFS)[16]。結合IPFS 進行數據存儲時在鏈上存儲數據的索引哈希值,能夠保證數據到鏈下查詢獲取并驗證是否篡改。
文中提出一種區塊鏈上智能合約中基于Merkle樹的數據塊細粒度數據交易及驗證方法,結合IPFS存儲,提供數據交易、數據獲取過程中細粒度計量和驗證。該方法可以在鏈上無需信任地完成密鑰交付,在數據獲取過程多次進行結算,基于Merkle 樹的驗證方法也提供了不同大小數據交易的伸縮能力。
鏈上存儲采用基于智能合約的存儲。在以太坊虛擬機(Ethereum Virtual Machine,EVM)的智能合約中,計算與存儲均需要以gas 為單位的執行開銷支付費用,為限制用戶向鏈上大量存儲,設置了每32 B 的鏈上數據存儲開銷為20 000 gas,作為對比加法操作開銷為3 gas,乘法操作為5。因此鏈上數據通常只存儲賬戶狀態數據、交易數據以及智能合約數據,保證賬本的可觀察性、可驗證性及智能合約的可執行性。
鏈下存儲采用IPFS。IPFS 將文件存儲為默克爾有向無環圖(Merkle Directed Acyclic Graph,Merkle-DAG),文件被拆分為擁有獨自的哈希指紋作為標識的數據塊,標識稱為內容標識符(Content Identifier,CID)用于訪問數據塊或文件,數據塊再通過鏈接節點呈樹結構排列連接[17]。每一個數據塊將被賦予CID,以Merkle-DAG 的形式分塊存儲,分塊均擁有獨立CID,并作為索引構建有向無環圖,鏈接分塊需要增加鏈接塊從而能夠將分塊恢復數據文件,鏈接塊同樣將擁有獨立CID。在該方案中需要利用此特性,因此存儲數據時DO 需要提取原始數據(Original Data,OD)的CID 用于后續加密傳輸。而數據在IPFS存儲時各數據塊均為數據密文(Encrypted Data,ED)。
由于非對稱加密和對稱加密的性能差距顯著,對稱加密適用于加密大文件,采用非對稱加密和對稱加密兩階段的方式,IPFS 數據采用AES 對稱加密處理,對稱密鑰SKAES進行非對稱加密處理。
對稱加密階段,將需要上傳到IPFS 的文件進行AES 的ECB 模式加密,數據切割成分組長度相等的塊,各塊獨立加密[18],在IPFS 按數據塊獲取后也能夠單獨解密,不需要其他數據塊就能正確得到塊的明文。使用IPFS 存儲的默認數據塊大小為256 kB,在進行AES 加密時能夠在不進行填充的情況下加密,密文數據塊與明文數據塊的占用存儲空間相同。最末尾數據塊可能存在未存滿情況,僅需根據AES 加密需求進行少量填充。而CID 作為獲取數據的索引,在鏈上同樣需要進行加密,得到多個CID密文Enc(CID,SKAES),CID 密文數量為需要上鏈的數據量。
非對稱加密階段,DO 監聽數據請求者(Data User,DU)向鏈上發起的交易請求,請求發生時DO 能夠獲得DU 的公鑰PKDU,則使用PKDU加密AES 對稱密鑰SKAES得到密鑰密文Enc(SKAES,PKDU)然后上鏈,從而保證密鑰傳輸的安全。DU 監聽到DO 的上鏈日志,則用自己的以太坊地址的私鑰SKDU進行解密得到SKAES,再解密Enc(CID,SKAES),得到實際存儲的CID 再進行數據的獲取。由于提供的CID 只能獲取整個數據的一部分,因此需要多次獲取多份CID 才能夠下載到完整的數據,從而實現細粒度的數據交易控制。根據此特性,可以控制數據的獲取粒度為分塊數量,從而在數據獲取的過程中即可進行價值計量。而在數據的存儲階段則可以設置IPFS 的Merkle-DAG 分支數量,若分支數量較小則能夠以更小的粒度進行計量。
該文方案中,注冊包含用戶身份注冊及數據注冊兩類。各身份實體均是EVM 模型下的外部賬戶,通過公私鑰對的形式向區塊鏈注冊。身份注冊將在鏈上對DO 及DU 身份進行記錄,數據在交易合約中進行注冊,供后續下載時索引和使用。合約管理方(Contract Manager,CM)可以要求實體用戶提供真實身份及注冊匿名賬號的映射關系,進行監管。由于鏈上數據的透明性,映射信息的提供和保管均由CM在鏈下進行。針對匿名問題,盡管用戶以匿名地址的方式加入區塊鏈網絡,但仍有被獲取真實信息、追蹤到真實實體的可能[19]。該方案中一個實體可以通過多個不同賬戶注冊,從而一定程度上避免追蹤,但是在注冊階段要求實體主動向CM 提供對應關系,從而保障賬戶均受監管。數據注冊流程如圖1 所示。

圖1 數據注冊流程圖
數據注冊時提供元數據,包括描述信息、所有者、數據大小、價格、CID 密文等,DO 可以根據自己的數據價值進行定價,總價值需要與數據的大小錨定。該方法支持在較大數據傳輸時,確保已下載的數據和已支付的款項相一致,而非在交易結束后進行一次性的結算。一個文件的各部分數據有可能存儲有用的數據信息,因此在傳輸過程中出現故障時,該方法可以保證支付金額和獲取數據的價值對等。
在數據獲取階段采用多輪微驗證及微支付完成,具體獲取流程如圖2 所示。該方法中針對鏈上存儲開銷進行優化,使用區塊鏈中事件日志的形式進行消息存放,較大程度減少執行開銷。

圖2 數據交易流程圖
1)DU 訂閱數據注冊合約,根據訂閱的鏈上日志發現自己需求的數據,主動向鏈上發起交易請求,發起請求時提供己方公鑰PKDU給DO,用于加密對稱密鑰SKAES。隨后DO 根據日志請求,響應對稱密鑰密文Enc(SKAES,PKDU)。
2)DO 在鏈上監聽到DU 的日志請求,上傳單輪次的IPFS 數據CID 密文Enc(CID,SKAES)進行傳輸,并通過數據交易合約自動調用通證質押合約,進行當前交易部分的數據的微支付,實現單次密文調用。
3)數據獲取和驗證同時進行,DU 向臨近區塊鏈節點訂閱日志,收到屬于自己的日志消息則用己方私鑰SKDU解密得到CID 明文,再向IPFS 發起數據下載。當完成下載后通過交易發起時收到的對稱密鑰對數據塊進行解密,完成數據獲取。再利用解密的數據,通過構建Merkle 樹的方法獲得Merkle 根,向鏈上發起驗證日志記錄。若直接獲取所有數據塊的CID,則獲取日志和驗證日志條數將與數據塊數量一致,而單個文件被分塊存儲后可能由數萬塊構成,因此獲取以及驗證的代價極大。該方法中利用IPFS的DAG 結構,DO 僅提供中間鏈接節點,從而DU 能夠自行獲取子節點,減少獲取開銷;再利用Merkle 樹將數據塊統一驗證,減少驗證開銷。Merkle 樹的構建需要單輪獲取的所有數據塊明文,逐一生成塊的哈希值,作為Merkle 樹的葉節點內容。中間節點哈希值由它的兩個子節點內容的哈希值再次進行哈希獲得,根節點則是整棵樹結構的最頂部節點,同樣由兩個子節點內容的哈希值組成。構建完成后將根節點哈希值記錄上鏈,DO 監聽到反饋的驗證日志,對比日志中的Merkle 根哈希值和己方生成的哈希值是否一致,完成微驗證。
4)數據在DU 獲取并在DO 驗證通過后,DO 重復執行第2)、3)步,直到DU 獲取到全部數據塊,結束數據獲取過程。
該方案采用以太坊PoW 共識私有鏈進行測試,測試環境:Intel(R) Xeon(R) Silver 4208 CPU@2.10 GHz,128G 內存,CentOS Linux release 7.9.2009(Core)操作系統,以太坊使用geth 客戶端實例,golang版本1.17.3。
使用PoW 共識算法的情況下,共識速度為平均13~15 s 生成一個新區塊,遠慢于智能合約數據交易處理速度的毫秒量級,因此交易過程中性能瓶頸會出現在共識算法產生新區塊處,在測試時不考慮共識速度影響。通過實驗得到相關智能合約函數調用開銷如表1 所示。

表1 智能合約函數調用開銷
函數調用中單次開銷最大為constructor,但該函數用于在合約首次部署上鏈時調用,且合約全生命周期中僅調用一次,因此不是開銷總和最大方法。表中requestData 函數雖然單次調用開銷最小,但是其調用次數與數據大小相關,若單輪獲取量較少,則能夠控制為更小的計量以及驗證的粒度,但調用總開銷增加。
不同數據大小下,驗證方法的執行開銷對比如圖3 所示。基準方法為基于每個數據塊CID 進行驗證,優化方法為該方案采用的基于Merkle 樹的方式聚合驗證。從圖中可以看出,當數據較小時,兩種方法的開銷基本一致,而當數據量增大到10 MB 及以上時,兩方法開銷差異增大,10 MB 數量級時開銷優化方法執行開銷比基準方法降低65%。該文方法的優勢在于數據量較大時,通過Merkle 樹進行聚合的驗證,極大降低了與區塊鏈的驗證次數,如在100 MB數據大小時,該文方法驗證次數相比對比方法降低99.75%,因此減少執行開銷。

圖3 不同數據大小驗證方法執行開銷對比
不同數據大小下,驗證耗時對比如圖4 所示。如前文所述,實驗的PoW 共識速度為平均出塊時間15 s,遠大于驗證耗時,因此對比中排除共識生成區塊耗時,僅包含交易驗證交互的時間。

圖4 不同數據大小驗證耗時對比
從圖4 中可發現,在數據量較小時,兩種方法的驗證耗時均在50 μs 量級,但在數據量增大時優化方法的驗證耗時一直保持在50 μs 量級,而基準方法則會隨著數據大小增加而線性增加,在數據大小為500 MB 時,優化方法比基準方法驗證耗時減少88%。在驗證時由于Merkle 樹可以直接驗證單輪傳輸的所有數據塊,因此只需要向鏈上發送一個樹根哈希值即可驗證,而每塊均獨立驗證的方式則需要接收數據塊數量的哈希值,驗證時間隨塊數量線性增加。
文中研究了現有數據交易方案及其缺陷,提出了一種基于Merkle 樹的快速驗證方法,結合IPFS 存儲,實現數據塊細粒度交易計量,最后進行實驗驗證。實驗結果表明,該方法能夠實現數據塊級別細粒度的數據計量,在鏈上高效穩定完成計量、交易與驗證。該文方案適用于大數據服務,仍有部分設計需要改進,如數據獲取時發生錯誤可能導致需重新獲取錯誤部分的索引并下載,導致效率低下;無整合眾多的小型數據能力。在未來工作中,需進一步研究設計以改進上述問題。