唐豪,易文龍*,趙應丁,殷華,徐亦璐
(1.江西農業大學計算機與信息工程學院,南昌 330045;2.江西農業大學江西省高等學校農業信息技術重點實驗室,南昌 330044)
中國作為一個農產品生產大國,農產品質量安全問題一直備受關注,但農產品從生長成熟、檢測入市到消費者食用的整個流通是一個開放過程,它會受諸多因素影響,如有生長環境、生產過程、人為管理、有害生物侵襲等因素,因此,在整個流通環節中,加強農產品質量檢測數據管理對提升其質量安全監管有著促進作用。以傳統數據庫管理系統為代表的檢測管理系統,它只是完成了檢測項目、檢測流程、參與人員及角色等描述從物理世界到數字世界的轉變,但是數據主要存儲在相關檢測單位或其他利益方,并沒有完全提升消費者對農產品檢測數據的可信度。區塊鏈是一種去中化、存儲數據不可篡改、帶時間戳的分布式賬本。近年來,有學者將區塊鏈技術應用到農產品品質安全監管中[1-2],提高了數據的可信度。洪坤明等[3]基于區塊鏈設計開發了分層多用戶的水產養殖品質量追溯系統;吳曉彤等[4]以區塊鏈系統為基礎,利用數據分片實現農產品信息的分布式安全存儲;于合龍等[5]基于區塊鏈對水稻供應鏈溯源信息進行保護模型研究,均使用區塊鏈技術保證食品的安全追溯,有效解決了食品信息的不透明和可篡改等問題。原因在于數據管理相關參與者在和自節點上記錄與維護同一數據賬本,并且向該賬本插入數據時,需要滿足一定數量節點的共識后才能修改,從而保障數據去中心化數據管理的可靠性;區塊鏈中哈希函數對農產品檢測數據完整性的校驗[6],使得上鏈數據不可篡改,一旦發生數據安全事故,能夠對出現問題的環節進行有效的溯源與追責,這樣保證了監管部門、檢測人員、消費者三方建立安全、透明的檢測服務流程,提高了檢測數據的可信度。
然而與傳統數據庫管理系統比較,現有區塊鏈系統在性能上存在查詢效率低,查詢操作簡單且功能有限,數據擴展不靈活等問題[7]。為使得安全可信的檢測數據能夠高效實時上鏈,可通過鏈上鏈下結合的數據存儲方式來緩解[8]。在農產品質量檢測工作中,檢測站的工作人員涉及的數據描述較為復雜,一方面是農產品的類別范圍廣與屬性跨度大,另一方面檢測結果有可能是圖片或視頻等多模態數據,如果大面積實時上傳該類材料,區塊鏈系統會難以應對如此龐大的吞吐量,導致事務提交的延遲高,限制了檢測數據上鏈效率。針對上述問題,設計了一種鏈上鏈下結合的農產品檢測數據存儲方案,通過采用區塊鏈與鏈下數據庫相結合的鏈上鏈下數據存儲模式,將快速增長的數據量存儲在鏈下傳統數據庫,僅將數據關鍵字段上鏈,以應對高吞吐量的情形,并融合布隆過濾器至緩存層。
區塊鏈是由一個個交易區塊組成的鏈式結構,每個區塊存儲著某個時間階段的交易數據,其本質就是通過哈希函數將這些區塊串起來,從而使區塊里的內容不可篡改。如圖1所示,區塊鏈每個區塊都由區塊頭和區塊體構成,區塊頭存儲了前一區塊哈希、時間戳、版本號、隨機數和默克爾樹根等區塊主要信息,而區塊體存儲默克爾樹除根節點外的所有節點,其中最底層的葉子交易A至交易D存儲交易事務數據本身,默克爾樹的中間節點存儲其下一層節點的哈希值,由下至上構建成一棵滿二叉樹型結構。從區塊鏈的第一區塊(創世區塊)開始,通過在當前區塊存儲前一區塊哈希值的方式,從而形成一種鏈式存儲結構。

圖1 區塊鏈結構Fig.1 Blockchain structure
分布式數據庫是由一群分布在不同地方的計算機系統軟件組成,這群系統具有本身的局部數據庫,然后通過計算機網絡連接,形成整個全局數據庫。與傳統數據庫相比,分布式數據庫具有高效高量可擴展、穩定可靠低成本等顯著優勢。
1.2.1 高效高量可擴展
分布式數據庫采用分庫分表的方式,將數據分散的存儲到多個節點,實現平滑地擴展。可在后期使用階段根據業務訪問量和數據存儲量的增長,動態平滑地增加存儲節點[9],提升數據庫的性能和容量,以滿足業務連續性要求。
1.2.2 安全可靠低成本
分布式數據庫采用多副本機制,副本間通過一致性算法保持數據的一致性,如Raft、Paxos等。當系統中的局部發生故障,其他節點仍舊還可繼續工作,不會造成數據丟失,解決單點故障的問題,從而保障數據存儲的安全可靠。同時分布式數據庫克服了物理中心數據庫的弱點,業務訪問針對局部數據庫的節點,而且單個事務處理消耗的成本也會比集中式數據庫顯著降低。
布隆過濾器是一種概率性的二進制數據結構,它是一個有固定位數的bit向量或者說是bit數組,內部結構十分簡潔,在進行數據讀取和寫入操作方面有著很好的性能,時間復雜度為O(1),同時空間占用率也有很大優勢。布隆過濾器的內部結構是一個映射關系,如果需要將集合域中的某個元素映射到布隆過濾器中,首先將這個元素通過k個哈希函數計算生成k個哈希值,并對全部生成哈希值對應位置的數組位標為1 。不過布隆過濾器在檢索某元素是否存在指定集合域時有一定的錯誤概率[10-11],會產生誤判,布隆過濾器誤判率的計算公式為
(1)
式(1)中:p為布隆過濾器誤判率;k為哈希函數個數;m為布隆過濾器長度;n為輸入的元素個數。
根據式(1)可以看出,誤判率可通過增加m、減少n或k進行降低。當布隆過濾器數組m長度固定,n的大小受主觀使用因素變化很大,因此k的取值變得尤為重要,只有求得k的極值,才能確保誤判率最小。對式(1)兩邊取對數進行推導可得
(2)
將式(2)代入式(1)中可得
(3)
化簡得
(4)

基于區塊鏈的農產品可信檢測的存儲架構共分為5個層次,如圖2所示,鏈下數據庫、區塊鏈數據庫、網絡、合約、應用5個層次。應用層是區塊鏈系統和用戶使用的交互接口層,為用戶提供應用和服務;合約層是執行智能合約的關鍵所在[12],封裝了區塊鏈系統運行的各類代碼腳本,是區塊鏈系統的核心技術;網絡層是采用了對等互聯網絡(peer to peer,P2P)技術,它具備去中心化的數據傳播和驗證機制。在傳統的區塊鏈系統中,數據層以日志存儲的方式進行數據的分布式存儲,用戶上傳的數據會首先記錄到最底層的葉子交易中,然后通過哈希函數運算得到哈希值保存在葉子節點中,由下至上依次組合運算形成新的哈希,最終得到根哈希保存在區塊頭中。而本研究的思路是在區塊鏈架構的基礎上引入一個鏈下數據庫。檢測站的工作人員錄入的數據將分為兩部分存儲,鏈下數據庫負責存儲大部分的數據,鏈上區塊鏈只存儲檢測信息主要字段。首先將檢測數據存儲到鏈下數據庫中,然后選取數據中的主要字段上鏈,如數據集1中的P1字段為上鏈存儲,P2、P3、P4字段則在鏈下數據庫存儲,由鏈下數據庫提供大容量存儲,區塊鏈提供數據安全防篡改的保證。

圖2 基于區塊鏈農產品可信檢測數據的存儲方法架構Fig.2 Storage method architecture of agricultural products trusted detection data based on blockchain
利用區塊鏈技術構建的農產品檢測數據管理系統,其可信、可追溯特性保障了檢測站工作人員和農產品消費者對檢測數據的可信度;同時其分布式、哈希函數驗證的存儲特性,不僅能夠減少網絡單點存儲故障、數據丟失問題,也能夠防止他人惡意篡改檢測數據的可能。如圖3所示,將圖像、視頻等多大容量的檢測數據存儲在本地檢測機構,再借助哈希函數將上述文件生成數據摘要與擬定的重要農產品檢測字段的內容哈希化上鏈。鏈下數據庫可選用諸如SQL Server、MySQL等性能穩定的關系型或NoSQL非關系型數據庫。由于MYSQL數據庫開源、功能完善,選用此數據庫作為鏈下數據庫。用戶將數據按批次全部存儲在鏈下數據庫,鏈下數據庫將用戶存儲的數據主要字段進行打包。當數據存放批次達到給定數量閾值時,計算其Hash摘要值并上傳至區塊鏈。如需查看完整的數據存儲信息,可通過該 Hash 值解密成原始字段,回至鏈下數據庫進行查看。該存儲模式具備鏈下檢測數據大容量,鏈上數據完整性優點。
區塊鏈和傳統數據庫在屬性上不同的關鍵點,互相利用并增強彼此的特性。一是傳統的區塊鏈吞吐量隨著參與區塊鏈的節點處理能力的增加而降低,然而,在分布式數據庫的情況下,吞吐量隨著節點的增加而增加,但區塊鏈與數據庫中的事務延遲相比,區塊鏈中的事務延遲通常較高,因此,通過使用鏈下數據庫,可以根據需要降低延遲;二是因為傳統的區塊鏈平臺使用分布式鍵值對數據庫LevelDB作為底層數據庫[13],不支持歷史數據中的復雜查詢,許多應用程序都需要這些查詢來檢索所需的信息,而傳統數據庫對歷史數據的查詢可以通過使用多版本并發控制來支持;三是區塊鏈不可變性或不可篡改性,在數據庫系統中,可以通過禁止在數據庫中刪除和更新的機制來實現這種抗篡改能力;四是區塊鏈的去中心化、分布式多節點特性,隨著與傳統數據庫的結合,在各線下節點中存儲相同的數據并上鏈存儲,動態平滑地增加存儲節點,以滿足業務連續性要求。

數字字母組合為哈希值圖3 鏈上鏈下存儲模式Fig.3 On-chain storage mode
區塊鏈底層使用LevelDB數據庫,其核心是由多個排序字符串表(sorted string table ,SSTable )以不同的層次組織構成的日志結構合并樹(log-structured-merge-tree,LSM-tree)存儲架構,通過消除隨機寫入轉化為順序寫入,從而提供良好的寫入性能。圖4為LevelDB存儲結構,數據記錄的存儲介質為內存和磁盤文件。在進行寫入操作時,k-v(key-value)鍵對首先被寫入MemTable(memory table)中緩存,當 MemTable 填滿后將其鎖定并轉換為不可變的MemTable,隨后下放到磁盤中形成新的SSTable并追加到輔助存儲器第0層中。當進行查詢操作時需要第0~n-1層逐級搜索它,直到查找到第一個符合要求的記錄為止。因此,通常需要讀取多個表才能找到一個鍵,這會導致讀取放大,而布隆過濾器常用于減少讀取放大。

圖4 融合布隆過濾器的LSM-tree存儲架構 Fig.4 LSM-tree storage architecture that incorporates Bloom filters
加入布隆過濾器可在數據查詢時首先在數據緩存層搜索,如果k鍵不存在或者過期,再對數據庫進行查詢,并把查詢結果放進緩存[14];如果數據庫查詢結果為空,則不放進緩存。如果每次查詢一個不存在k-v對,而緩存中沒有數據,每次都要去查詢數據庫,消耗了其查詢性能。查詢一個數據庫中不存在的數據,這也就是常見的緩存穿透問題。使用布隆過濾器可以快速判斷元素是否已經存在,避免頻繁訪問磁盤[15]。用戶發出查詢請求,判斷是否命中布隆過濾器,如是則繼續查詢數據庫,否則直接返回,該k鍵一定不存在對應的value值。將數據庫中的空值存儲到緩存層中,查詢空值就不會直接訪問數據庫,即限定了在緩存層中訪問,進一步提高了數據查詢效率。同時布隆過濾器不需要存儲元素本身,所以對某些數據要求嚴格保密的情況下安全性更好。
本系統是基于區塊鏈的農產品可信檢測存儲方法的分布式存儲系統,系統功能模塊中的用戶管理模塊和檢測信息管理模塊需要借助智能合約實現在區塊鏈平臺上的可信數據存儲和讀取。在區塊鏈中,智能合約的一次執行相當于數據庫中的一個事務,并且事務的提交是以區塊為單位,而不是以每個事務為單位。與傳統數據庫相比,在事務處理方面同樣需要滿足事務的原子性、一致性、隔離性和持久性特性,并且區塊鏈系統加入可追溯性,確保鏈上的數據環環相扣,如某個階段服務器出現問題,錯誤數據可保障有據可依,有鏈可循。如果區塊鏈運行在不可信環境,事務的處理過程還需要考慮區塊鏈系統所采用的共識協議影響[16-17],因為事務的處理包含模擬、驗證等過程,當其共識協議達成之后,每個節點才會執行區塊內的事務。
如圖5所示,用戶管理模塊主要針對相關檢測站的工作人員的管理,工作人員注冊為系統管理員后方可使用系統提供的服務。在首次注冊使用時,系統通過事務處理1.1~1.5步驟添加用戶,生成區塊鏈賬戶,將用戶的注冊信息通過Hash算法計算成私密摘要。接著發布智能合約,將該Hash摘要值存儲上鏈并反饋給用戶,同時該摘要值綁定了所在檢測站點,如出現問題可追溯查詢,針對錯誤工作糾正處理。檢測信息管理模塊用于檢測站點工作人員對檢測數據的上傳和管理。上傳檢測信息時,工作人員先將批量檢測信息按批次存儲到本地鏈下數據庫,當鏈下數據庫存儲的檢測數據存放批次達到給定數量閾值時,系統通過事務處理2.1~2.5步驟添加檢測信息。首先系統進行預處理,將上傳的檢測數據計算成一段Hash值,將該Hash值與鏈上已存儲的Hash值進行對比,確保檢測數據信息的唯一性。然后系統會將上傳的檢測數據通過Hash算法解密后以文本信息顯示在web端頁面中,供給各站點人員與消費者正常查看。上傳的檢測數據擁有唯一的檢測編號作為標識,可通過該標識查詢其他站點的檢測數據,如對某個檢測結果存在疑問,可聯系該站點工作人員進行討論,并對錯誤檢測信息進行修改。當系統通過事務處理3.1~3.7步驟進行查詢時,由于融合布隆過濾器,查詢的編號會優先進行緩存層進行查詢,判斷該編號是否存在,如不存在返回空值,如存在則調用智能合約返回檢測信息。

圖5 區塊鏈事務處理交互時序圖Fig.5 Blockchain transaction processing interaction sequence diagram
整個系統啟動運行需要在區塊鏈網絡和環境的支持,首先拉取系統啟動所需要的 docker 鏡像,然后生成各組織的證書、通道、創世區塊以及各節點,接著安裝、實例化鏈碼并進行調用,最終完成整個區塊鏈后臺的啟動。
制訂了兩種實驗方案:有、無融合布隆過濾器的區塊鏈農產品檢測系統性能對比,來驗證了研究方案的系統查詢效率。實驗環境采用了3個阿里云服務器作為檢測環節中的參與方線上記賬節點,其軟硬件詳細配置為:系統鏡像為Ubuntu 16.04 64位,支撐環境為go1.15.3 linux/amd64,支撐軟件為Docker version 18.09.7,硬件環境為1核CPU、2 GB 內存、40 GB 硬盤、1 M帶寬。
首先對系統本身進行運行測試,在此次基礎上逐步增加查詢次數,根據查詢耗時來評價其查詢效率;其次在同等環境中,加入布隆過濾器,測試其在以上兩個方面查詢效率的變化情況。圖6為有無布隆過濾器下查詢已有元素,圖7為有無布隆過濾器下查詢空值元素。

圖6 有、無布隆過濾器下查詢已有元素Fig.6 Query existing elements with or without a Bloom filter

圖7 有、無布隆過濾器下查詢空值元素Fig.7 Query null-valued elements with or without a Bloom filter
實驗結果(圖6、圖7)表明,在同等實驗環境中,對系統中的已有元素進行查詢時,加入布隆過濾器后在查詢效率上有所提升,但提升程度不大;對空值元素進行查詢時,加入布隆過濾器后對查詢效率有顯著提升。該實驗結果表明在鏈上鏈下存儲結合模式中,加入布隆過濾器,不僅能在保證檢測數據在區塊鏈中的安全可信存儲,而且在數據查詢性能提升方面有較大的改善。
區塊鏈是一個多方參與記錄數據的可信賬本,其開放透明、可追溯和不可篡改等特性給農產品檢測信息的可信存儲提供了保障。基于區塊鏈對檢測數據分類存儲,即大文件檢測數據的源文件存儲在本地數據庫,該文件的哈希摘要與重要的檢測字段打包在鏈上數據庫存儲,能夠有效地保障檢測數據的完整性,同時布隆過濾器的引入能夠提升區塊鏈系統的查詢效率。本文方法為農產品質量安全檢測提供了一種可信的技術方案與應用案例。