唐豪,易文龍*,趙應(yīng)丁,殷華,徐亦璐
(1.江西農(nóng)業(yè)大學(xué)計(jì)算機(jī)與信息工程學(xué)院,南昌 330045;2.江西農(nóng)業(yè)大學(xué)江西省高等學(xué)校農(nóng)業(yè)信息技術(shù)重點(diǎn)實(shí)驗(yàn)室,南昌 330044)
中國(guó)作為一個(gè)農(nóng)產(chǎn)品生產(chǎn)大國(guó),農(nóng)產(chǎn)品質(zhì)量安全問(wèn)題一直備受關(guān)注,但農(nóng)產(chǎn)品從生長(zhǎng)成熟、檢測(cè)入市到消費(fèi)者食用的整個(gè)流通是一個(gè)開放過(guò)程,它會(huì)受諸多因素影響,如有生長(zhǎng)環(huán)境、生產(chǎn)過(guò)程、人為管理、有害生物侵襲等因素,因此,在整個(gè)流通環(huán)節(jié)中,加強(qiáng)農(nóng)產(chǎn)品質(zhì)量檢測(cè)數(shù)據(jù)管理對(duì)提升其質(zhì)量安全監(jiān)管有著促進(jìn)作用。以傳統(tǒng)數(shù)據(jù)庫(kù)管理系統(tǒng)為代表的檢測(cè)管理系統(tǒng),它只是完成了檢測(cè)項(xiàng)目、檢測(cè)流程、參與人員及角色等描述從物理世界到數(shù)字世界的轉(zhuǎn)變,但是數(shù)據(jù)主要存儲(chǔ)在相關(guān)檢測(cè)單位或其他利益方,并沒(méi)有完全提升消費(fèi)者對(duì)農(nóng)產(chǎn)品檢測(cè)數(shù)據(jù)的可信度。區(qū)塊鏈?zhǔn)且环N去中化、存儲(chǔ)數(shù)據(jù)不可篡改、帶時(shí)間戳的分布式賬本。近年來(lái),有學(xué)者將區(qū)塊鏈技術(shù)應(yīng)用到農(nóng)產(chǎn)品品質(zhì)安全監(jiān)管中[1-2],提高了數(shù)據(jù)的可信度。洪坤明等[3]基于區(qū)塊鏈設(shè)計(jì)開發(fā)了分層多用戶的水產(chǎn)養(yǎng)殖品質(zhì)量追溯系統(tǒng);吳曉彤等[4]以區(qū)塊鏈系統(tǒng)為基礎(chǔ),利用數(shù)據(jù)分片實(shí)現(xiàn)農(nóng)產(chǎn)品信息的分布式安全存儲(chǔ);于合龍等[5]基于區(qū)塊鏈對(duì)水稻供應(yīng)鏈溯源信息進(jìn)行保護(hù)模型研究,均使用區(qū)塊鏈技術(shù)保證食品的安全追溯,有效解決了食品信息的不透明和可篡改等問(wèn)題。原因在于數(shù)據(jù)管理相關(guān)參與者在和自節(jié)點(diǎn)上記錄與維護(hù)同一數(shù)據(jù)賬本,并且向該賬本插入數(shù)據(jù)時(shí),需要滿足一定數(shù)量節(jié)點(diǎn)的共識(shí)后才能修改,從而保障數(shù)據(jù)去中心化數(shù)據(jù)管理的可靠性;區(qū)塊鏈中哈希函數(shù)對(duì)農(nóng)產(chǎn)品檢測(cè)數(shù)據(jù)完整性的校驗(yàn)[6],使得上鏈數(shù)據(jù)不可篡改,一旦發(fā)生數(shù)據(jù)安全事故,能夠?qū)Τ霈F(xiàn)問(wèn)題的環(huán)節(jié)進(jìn)行有效的溯源與追責(zé),這樣保證了監(jiān)管部門、檢測(cè)人員、消費(fèi)者三方建立安全、透明的檢測(cè)服務(wù)流程,提高了檢測(cè)數(shù)據(jù)的可信度。
然而與傳統(tǒng)數(shù)據(jù)庫(kù)管理系統(tǒng)比較,現(xiàn)有區(qū)塊鏈系統(tǒng)在性能上存在查詢效率低,查詢操作簡(jiǎn)單且功能有限,數(shù)據(jù)擴(kuò)展不靈活等問(wèn)題[7]。為使得安全可信的檢測(cè)數(shù)據(jù)能夠高效實(shí)時(shí)上鏈,可通過(guò)鏈上鏈下結(jié)合的數(shù)據(jù)存儲(chǔ)方式來(lái)緩解[8]。在農(nóng)產(chǎn)品質(zhì)量檢測(cè)工作中,檢測(cè)站的工作人員涉及的數(shù)據(jù)描述較為復(fù)雜,一方面是農(nóng)產(chǎn)品的類別范圍廣與屬性跨度大,另一方面檢測(cè)結(jié)果有可能是圖片或視頻等多模態(tài)數(shù)據(jù),如果大面積實(shí)時(shí)上傳該類材料,區(qū)塊鏈系統(tǒng)會(huì)難以應(yīng)對(duì)如此龐大的吞吐量,導(dǎo)致事務(wù)提交的延遲高,限制了檢測(cè)數(shù)據(jù)上鏈效率。針對(duì)上述問(wèn)題,設(shè)計(jì)了一種鏈上鏈下結(jié)合的農(nóng)產(chǎn)品檢測(cè)數(shù)據(jù)存儲(chǔ)方案,通過(guò)采用區(qū)塊鏈與鏈下數(shù)據(jù)庫(kù)相結(jié)合的鏈上鏈下數(shù)據(jù)存儲(chǔ)模式,將快速增長(zhǎng)的數(shù)據(jù)量存儲(chǔ)在鏈下傳統(tǒng)數(shù)據(jù)庫(kù),僅將數(shù)據(jù)關(guān)鍵字段上鏈,以應(yīng)對(duì)高吞吐量的情形,并融合布隆過(guò)濾器至緩存層。
區(qū)塊鏈?zhǔn)怯梢粋€(gè)個(gè)交易區(qū)塊組成的鏈?zhǔn)浇Y(jié)構(gòu),每個(gè)區(qū)塊存儲(chǔ)著某個(gè)時(shí)間階段的交易數(shù)據(jù),其本質(zhì)就是通過(guò)哈希函數(shù)將這些區(qū)塊串起來(lái),從而使區(qū)塊里的內(nèi)容不可篡改。如圖1所示,區(qū)塊鏈每個(gè)區(qū)塊都由區(qū)塊頭和區(qū)塊體構(gòu)成,區(qū)塊頭存儲(chǔ)了前一區(qū)塊哈希、時(shí)間戳、版本號(hào)、隨機(jī)數(shù)和默克爾樹根等區(qū)塊主要信息,而區(qū)塊體存儲(chǔ)默克爾樹除根節(jié)點(diǎn)外的所有節(jié)點(diǎn),其中最底層的葉子交易A至交易D存儲(chǔ)交易事務(wù)數(shù)據(jù)本身,默克爾樹的中間節(jié)點(diǎn)存儲(chǔ)其下一層節(jié)點(diǎn)的哈希值,由下至上構(gòu)建成一棵滿二叉樹型結(jié)構(gòu)。從區(qū)塊鏈的第一區(qū)塊(創(chuàng)世區(qū)塊)開始,通過(guò)在當(dāng)前區(qū)塊存儲(chǔ)前一區(qū)塊哈希值的方式,從而形成一種鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。
圖1 區(qū)塊鏈結(jié)構(gòu)Fig.1 Blockchain structure
分布式數(shù)據(jù)庫(kù)是由一群分布在不同地方的計(jì)算機(jī)系統(tǒng)軟件組成,這群系統(tǒng)具有本身的局部數(shù)據(jù)庫(kù),然后通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)連接,形成整個(gè)全局?jǐn)?shù)據(jù)庫(kù)。與傳統(tǒng)數(shù)據(jù)庫(kù)相比,分布式數(shù)據(jù)庫(kù)具有高效高量可擴(kuò)展、穩(wěn)定可靠低成本等顯著優(yōu)勢(shì)。
1.2.1 高效高量可擴(kuò)展
分布式數(shù)據(jù)庫(kù)采用分庫(kù)分表的方式,將數(shù)據(jù)分散的存儲(chǔ)到多個(gè)節(jié)點(diǎn),實(shí)現(xiàn)平滑地?cái)U(kuò)展??稍诤笃谑褂秒A段根據(jù)業(yè)務(wù)訪問(wèn)量和數(shù)據(jù)存儲(chǔ)量的增長(zhǎng),動(dòng)態(tài)平滑地增加存儲(chǔ)節(jié)點(diǎn)[9],提升數(shù)據(jù)庫(kù)的性能和容量,以滿足業(yè)務(wù)連續(xù)性要求。
1.2.2 安全可靠低成本
分布式數(shù)據(jù)庫(kù)采用多副本機(jī)制,副本間通過(guò)一致性算法保持?jǐn)?shù)據(jù)的一致性,如Raft、Paxos等。當(dāng)系統(tǒng)中的局部發(fā)生故障,其他節(jié)點(diǎn)仍舊還可繼續(xù)工作,不會(huì)造成數(shù)據(jù)丟失,解決單點(diǎn)故障的問(wèn)題,從而保障數(shù)據(jù)存儲(chǔ)的安全可靠。同時(shí)分布式數(shù)據(jù)庫(kù)克服了物理中心數(shù)據(jù)庫(kù)的弱點(diǎn),業(yè)務(wù)訪問(wèn)針對(duì)局部數(shù)據(jù)庫(kù)的節(jié)點(diǎn),而且單個(gè)事務(wù)處理消耗的成本也會(huì)比集中式數(shù)據(jù)庫(kù)顯著降低。
布隆過(guò)濾器是一種概率性的二進(jìn)制數(shù)據(jù)結(jié)構(gòu),它是一個(gè)有固定位數(shù)的bit向量或者說(shuō)是bit數(shù)組,內(nèi)部結(jié)構(gòu)十分簡(jiǎn)潔,在進(jìn)行數(shù)據(jù)讀取和寫入操作方面有著很好的性能,時(shí)間復(fù)雜度為O(1),同時(shí)空間占用率也有很大優(yōu)勢(shì)。布隆過(guò)濾器的內(nèi)部結(jié)構(gòu)是一個(gè)映射關(guān)系,如果需要將集合域中的某個(gè)元素映射到布隆過(guò)濾器中,首先將這個(gè)元素通過(guò)k個(gè)哈希函數(shù)計(jì)算生成k個(gè)哈希值,并對(duì)全部生成哈希值對(duì)應(yīng)位置的數(shù)組位標(biāo)為1 。不過(guò)布隆過(guò)濾器在檢索某元素是否存在指定集合域時(shí)有一定的錯(cuò)誤概率[10-11],會(huì)產(chǎn)生誤判,布隆過(guò)濾器誤判率的計(jì)算公式為
(1)
式(1)中:p為布隆過(guò)濾器誤判率;k為哈希函數(shù)個(gè)數(shù);m為布隆過(guò)濾器長(zhǎng)度;n為輸入的元素個(gè)數(shù)。
根據(jù)式(1)可以看出,誤判率可通過(guò)增加m、減少n或k進(jìn)行降低。當(dāng)布隆過(guò)濾器數(shù)組m長(zhǎng)度固定,n的大小受主觀使用因素變化很大,因此k的取值變得尤為重要,只有求得k的極值,才能確保誤判率最小。對(duì)式(1)兩邊取對(duì)數(shù)進(jìn)行推導(dǎo)可得
(2)
將式(2)代入式(1)中可得
(3)
化簡(jiǎn)得
(4)
基于區(qū)塊鏈的農(nóng)產(chǎn)品可信檢測(cè)的存儲(chǔ)架構(gòu)共分為5個(gè)層次,如圖2所示,鏈下數(shù)據(jù)庫(kù)、區(qū)塊鏈數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)、合約、應(yīng)用5個(gè)層次。應(yīng)用層是區(qū)塊鏈系統(tǒng)和用戶使用的交互接口層,為用戶提供應(yīng)用和服務(wù);合約層是執(zhí)行智能合約的關(guān)鍵所在[12],封裝了區(qū)塊鏈系統(tǒng)運(yùn)行的各類代碼腳本,是區(qū)塊鏈系統(tǒng)的核心技術(shù);網(wǎng)絡(luò)層是采用了對(duì)等互聯(lián)網(wǎng)絡(luò)(peer to peer,P2P)技術(shù),它具備去中心化的數(shù)據(jù)傳播和驗(yàn)證機(jī)制。在傳統(tǒng)的區(qū)塊鏈系統(tǒng)中,數(shù)據(jù)層以日志存儲(chǔ)的方式進(jìn)行數(shù)據(jù)的分布式存儲(chǔ),用戶上傳的數(shù)據(jù)會(huì)首先記錄到最底層的葉子交易中,然后通過(guò)哈希函數(shù)運(yùn)算得到哈希值保存在葉子節(jié)點(diǎn)中,由下至上依次組合運(yùn)算形成新的哈希,最終得到根哈希保存在區(qū)塊頭中。而本研究的思路是在區(qū)塊鏈架構(gòu)的基礎(chǔ)上引入一個(gè)鏈下數(shù)據(jù)庫(kù)。檢測(cè)站的工作人員錄入的數(shù)據(jù)將分為兩部分存儲(chǔ),鏈下數(shù)據(jù)庫(kù)負(fù)責(zé)存儲(chǔ)大部分的數(shù)據(jù),鏈上區(qū)塊鏈只存儲(chǔ)檢測(cè)信息主要字段。首先將檢測(cè)數(shù)據(jù)存儲(chǔ)到鏈下數(shù)據(jù)庫(kù)中,然后選取數(shù)據(jù)中的主要字段上鏈,如數(shù)據(jù)集1中的P1字段為上鏈存儲(chǔ),P2、P3、P4字段則在鏈下數(shù)據(jù)庫(kù)存儲(chǔ),由鏈下數(shù)據(jù)庫(kù)提供大容量存儲(chǔ),區(qū)塊鏈提供數(shù)據(jù)安全防篡改的保證。
圖2 基于區(qū)塊鏈農(nóng)產(chǎn)品可信檢測(cè)數(shù)據(jù)的存儲(chǔ)方法架構(gòu)Fig.2 Storage method architecture of agricultural products trusted detection data based on blockchain
利用區(qū)塊鏈技術(shù)構(gòu)建的農(nóng)產(chǎn)品檢測(cè)數(shù)據(jù)管理系統(tǒng),其可信、可追溯特性保障了檢測(cè)站工作人員和農(nóng)產(chǎn)品消費(fèi)者對(duì)檢測(cè)數(shù)據(jù)的可信度;同時(shí)其分布式、哈希函數(shù)驗(yàn)證的存儲(chǔ)特性,不僅能夠減少網(wǎng)絡(luò)單點(diǎn)存儲(chǔ)故障、數(shù)據(jù)丟失問(wèn)題,也能夠防止他人惡意篡改檢測(cè)數(shù)據(jù)的可能。如圖3所示,將圖像、視頻等多大容量的檢測(cè)數(shù)據(jù)存儲(chǔ)在本地檢測(cè)機(jī)構(gòu),再借助哈希函數(shù)將上述文件生成數(shù)據(jù)摘要與擬定的重要農(nóng)產(chǎn)品檢測(cè)字段的內(nèi)容哈希化上鏈。鏈下數(shù)據(jù)庫(kù)可選用諸如SQL Server、MySQL等性能穩(wěn)定的關(guān)系型或NoSQL非關(guān)系型數(shù)據(jù)庫(kù)。由于MYSQL數(shù)據(jù)庫(kù)開源、功能完善,選用此數(shù)據(jù)庫(kù)作為鏈下數(shù)據(jù)庫(kù)。用戶將數(shù)據(jù)按批次全部存儲(chǔ)在鏈下數(shù)據(jù)庫(kù),鏈下數(shù)據(jù)庫(kù)將用戶存儲(chǔ)的數(shù)據(jù)主要字段進(jìn)行打包。當(dāng)數(shù)據(jù)存放批次達(dá)到給定數(shù)量閾值時(shí),計(jì)算其Hash摘要值并上傳至區(qū)塊鏈。如需查看完整的數(shù)據(jù)存儲(chǔ)信息,可通過(guò)該 Hash 值解密成原始字段,回至鏈下數(shù)據(jù)庫(kù)進(jìn)行查看。該存儲(chǔ)模式具備鏈下檢測(cè)數(shù)據(jù)大容量,鏈上數(shù)據(jù)完整性優(yōu)點(diǎn)。
區(qū)塊鏈和傳統(tǒng)數(shù)據(jù)庫(kù)在屬性上不同的關(guān)鍵點(diǎn),互相利用并增強(qiáng)彼此的特性。一是傳統(tǒng)的區(qū)塊鏈吞吐量隨著參與區(qū)塊鏈的節(jié)點(diǎn)處理能力的增加而降低,然而,在分布式數(shù)據(jù)庫(kù)的情況下,吞吐量隨著節(jié)點(diǎn)的增加而增加,但區(qū)塊鏈與數(shù)據(jù)庫(kù)中的事務(wù)延遲相比,區(qū)塊鏈中的事務(wù)延遲通常較高,因此,通過(guò)使用鏈下數(shù)據(jù)庫(kù),可以根據(jù)需要降低延遲;二是因?yàn)閭鹘y(tǒng)的區(qū)塊鏈平臺(tái)使用分布式鍵值對(duì)數(shù)據(jù)庫(kù)LevelDB作為底層數(shù)據(jù)庫(kù)[13],不支持歷史數(shù)據(jù)中的復(fù)雜查詢,許多應(yīng)用程序都需要這些查詢來(lái)檢索所需的信息,而傳統(tǒng)數(shù)據(jù)庫(kù)對(duì)歷史數(shù)據(jù)的查詢可以通過(guò)使用多版本并發(fā)控制來(lái)支持;三是區(qū)塊鏈不可變性或不可篡改性,在數(shù)據(jù)庫(kù)系統(tǒng)中,可以通過(guò)禁止在數(shù)據(jù)庫(kù)中刪除和更新的機(jī)制來(lái)實(shí)現(xiàn)這種抗篡改能力;四是區(qū)塊鏈的去中心化、分布式多節(jié)點(diǎn)特性,隨著與傳統(tǒng)數(shù)據(jù)庫(kù)的結(jié)合,在各線下節(jié)點(diǎn)中存儲(chǔ)相同的數(shù)據(jù)并上鏈存儲(chǔ),動(dòng)態(tài)平滑地增加存儲(chǔ)節(jié)點(diǎn),以滿足業(yè)務(wù)連續(xù)性要求。
數(shù)字字母組合為哈希值圖3 鏈上鏈下存儲(chǔ)模式Fig.3 On-chain storage mode
區(qū)塊鏈底層使用LevelDB數(shù)據(jù)庫(kù),其核心是由多個(gè)排序字符串表(sorted string table ,SSTable )以不同的層次組織構(gòu)成的日志結(jié)構(gòu)合并樹(log-structured-merge-tree,LSM-tree)存儲(chǔ)架構(gòu),通過(guò)消除隨機(jī)寫入轉(zhuǎn)化為順序?qū)懭?,從而提供良好的寫入性能。圖4為L(zhǎng)evelDB存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)記錄的存儲(chǔ)介質(zhì)為內(nèi)存和磁盤文件。在進(jìn)行寫入操作時(shí),k-v(key-value)鍵對(duì)首先被寫入MemTable(memory table)中緩存,當(dāng) MemTable 填滿后將其鎖定并轉(zhuǎn)換為不可變的MemTable,隨后下放到磁盤中形成新的SSTable并追加到輔助存儲(chǔ)器第0層中。當(dāng)進(jìn)行查詢操作時(shí)需要第0~n-1層逐級(jí)搜索它,直到查找到第一個(gè)符合要求的記錄為止。因此,通常需要讀取多個(gè)表才能找到一個(gè)鍵,這會(huì)導(dǎo)致讀取放大,而布隆過(guò)濾器常用于減少讀取放大。
圖4 融合布隆過(guò)濾器的LSM-tree存儲(chǔ)架構(gòu) Fig.4 LSM-tree storage architecture that incorporates Bloom filters
加入布隆過(guò)濾器可在數(shù)據(jù)查詢時(shí)首先在數(shù)據(jù)緩存層搜索,如果k鍵不存在或者過(guò)期,再對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢,并把查詢結(jié)果放進(jìn)緩存[14];如果數(shù)據(jù)庫(kù)查詢結(jié)果為空,則不放進(jìn)緩存。如果每次查詢一個(gè)不存在k-v對(duì),而緩存中沒(méi)有數(shù)據(jù),每次都要去查詢數(shù)據(jù)庫(kù),消耗了其查詢性能。查詢一個(gè)數(shù)據(jù)庫(kù)中不存在的數(shù)據(jù),這也就是常見(jiàn)的緩存穿透問(wèn)題。使用布隆過(guò)濾器可以快速判斷元素是否已經(jīng)存在,避免頻繁訪問(wèn)磁盤[15]。用戶發(fā)出查詢請(qǐng)求,判斷是否命中布隆過(guò)濾器,如是則繼續(xù)查詢數(shù)據(jù)庫(kù),否則直接返回,該k鍵一定不存在對(duì)應(yīng)的value值。將數(shù)據(jù)庫(kù)中的空值存儲(chǔ)到緩存層中,查詢空值就不會(huì)直接訪問(wèn)數(shù)據(jù)庫(kù),即限定了在緩存層中訪問(wèn),進(jìn)一步提高了數(shù)據(jù)查詢效率。同時(shí)布隆過(guò)濾器不需要存儲(chǔ)元素本身,所以對(duì)某些數(shù)據(jù)要求嚴(yán)格保密的情況下安全性更好。
本系統(tǒng)是基于區(qū)塊鏈的農(nóng)產(chǎn)品可信檢測(cè)存儲(chǔ)方法的分布式存儲(chǔ)系統(tǒng),系統(tǒng)功能模塊中的用戶管理模塊和檢測(cè)信息管理模塊需要借助智能合約實(shí)現(xiàn)在區(qū)塊鏈平臺(tái)上的可信數(shù)據(jù)存儲(chǔ)和讀取。在區(qū)塊鏈中,智能合約的一次執(zhí)行相當(dāng)于數(shù)據(jù)庫(kù)中的一個(gè)事務(wù),并且事務(wù)的提交是以區(qū)塊為單位,而不是以每個(gè)事務(wù)為單位。與傳統(tǒng)數(shù)據(jù)庫(kù)相比,在事務(wù)處理方面同樣需要滿足事務(wù)的原子性、一致性、隔離性和持久性特性,并且區(qū)塊鏈系統(tǒng)加入可追溯性,確保鏈上的數(shù)據(jù)環(huán)環(huán)相扣,如某個(gè)階段服務(wù)器出現(xiàn)問(wèn)題,錯(cuò)誤數(shù)據(jù)可保障有據(jù)可依,有鏈可循。如果區(qū)塊鏈運(yùn)行在不可信環(huán)境,事務(wù)的處理過(guò)程還需要考慮區(qū)塊鏈系統(tǒng)所采用的共識(shí)協(xié)議影響[16-17],因?yàn)槭聞?wù)的處理包含模擬、驗(yàn)證等過(guò)程,當(dāng)其共識(shí)協(xié)議達(dá)成之后,每個(gè)節(jié)點(diǎn)才會(huì)執(zhí)行區(qū)塊內(nèi)的事務(wù)。
如圖5所示,用戶管理模塊主要針對(duì)相關(guān)檢測(cè)站的工作人員的管理,工作人員注冊(cè)為系統(tǒng)管理員后方可使用系統(tǒng)提供的服務(wù)。在首次注冊(cè)使用時(shí),系統(tǒng)通過(guò)事務(wù)處理1.1~1.5步驟添加用戶,生成區(qū)塊鏈賬戶,將用戶的注冊(cè)信息通過(guò)Hash算法計(jì)算成私密摘要。接著發(fā)布智能合約,將該Hash摘要值存儲(chǔ)上鏈并反饋給用戶,同時(shí)該摘要值綁定了所在檢測(cè)站點(diǎn),如出現(xiàn)問(wèn)題可追溯查詢,針對(duì)錯(cuò)誤工作糾正處理。檢測(cè)信息管理模塊用于檢測(cè)站點(diǎn)工作人員對(duì)檢測(cè)數(shù)據(jù)的上傳和管理。上傳檢測(cè)信息時(shí),工作人員先將批量檢測(cè)信息按批次存儲(chǔ)到本地鏈下數(shù)據(jù)庫(kù),當(dāng)鏈下數(shù)據(jù)庫(kù)存儲(chǔ)的檢測(cè)數(shù)據(jù)存放批次達(dá)到給定數(shù)量閾值時(shí),系統(tǒng)通過(guò)事務(wù)處理2.1~2.5步驟添加檢測(cè)信息。首先系統(tǒng)進(jìn)行預(yù)處理,將上傳的檢測(cè)數(shù)據(jù)計(jì)算成一段Hash值,將該Hash值與鏈上已存儲(chǔ)的Hash值進(jìn)行對(duì)比,確保檢測(cè)數(shù)據(jù)信息的唯一性。然后系統(tǒng)會(huì)將上傳的檢測(cè)數(shù)據(jù)通過(guò)Hash算法解密后以文本信息顯示在web端頁(yè)面中,供給各站點(diǎn)人員與消費(fèi)者正常查看。上傳的檢測(cè)數(shù)據(jù)擁有唯一的檢測(cè)編號(hào)作為標(biāo)識(shí),可通過(guò)該標(biāo)識(shí)查詢其他站點(diǎn)的檢測(cè)數(shù)據(jù),如對(duì)某個(gè)檢測(cè)結(jié)果存在疑問(wèn),可聯(lián)系該站點(diǎn)工作人員進(jìn)行討論,并對(duì)錯(cuò)誤檢測(cè)信息進(jìn)行修改。當(dāng)系統(tǒng)通過(guò)事務(wù)處理3.1~3.7步驟進(jìn)行查詢時(shí),由于融合布隆過(guò)濾器,查詢的編號(hào)會(huì)優(yōu)先進(jìn)行緩存層進(jìn)行查詢,判斷該編號(hào)是否存在,如不存在返回空值,如存在則調(diào)用智能合約返回檢測(cè)信息。
圖5 區(qū)塊鏈?zhǔn)聞?wù)處理交互時(shí)序圖Fig.5 Blockchain transaction processing interaction sequence diagram
整個(gè)系統(tǒng)啟動(dòng)運(yùn)行需要在區(qū)塊鏈網(wǎng)絡(luò)和環(huán)境的支持,首先拉取系統(tǒng)啟動(dòng)所需要的 docker 鏡像,然后生成各組織的證書、通道、創(chuàng)世區(qū)塊以及各節(jié)點(diǎn),接著安裝、實(shí)例化鏈碼并進(jìn)行調(diào)用,最終完成整個(gè)區(qū)塊鏈后臺(tái)的啟動(dòng)。
制訂了兩種實(shí)驗(yàn)方案:有、無(wú)融合布隆過(guò)濾器的區(qū)塊鏈農(nóng)產(chǎn)品檢測(cè)系統(tǒng)性能對(duì)比,來(lái)驗(yàn)證了研究方案的系統(tǒng)查詢效率。實(shí)驗(yàn)環(huán)境采用了3個(gè)阿里云服務(wù)器作為檢測(cè)環(huán)節(jié)中的參與方線上記賬節(jié)點(diǎn),其軟硬件詳細(xì)配置為:系統(tǒng)鏡像為Ubuntu 16.04 64位,支撐環(huán)境為go1.15.3 linux/amd64,支撐軟件為Docker version 18.09.7,硬件環(huán)境為1核CPU、2 GB 內(nèi)存、40 GB 硬盤、1 M帶寬。
首先對(duì)系統(tǒng)本身進(jìn)行運(yùn)行測(cè)試,在此次基礎(chǔ)上逐步增加查詢次數(shù),根據(jù)查詢耗時(shí)來(lái)評(píng)價(jià)其查詢效率;其次在同等環(huán)境中,加入布隆過(guò)濾器,測(cè)試其在以上兩個(gè)方面查詢效率的變化情況。圖6為有無(wú)布隆過(guò)濾器下查詢已有元素,圖7為有無(wú)布隆過(guò)濾器下查詢空值元素。
圖6 有、無(wú)布隆過(guò)濾器下查詢已有元素Fig.6 Query existing elements with or without a Bloom filter
圖7 有、無(wú)布隆過(guò)濾器下查詢空值元素Fig.7 Query null-valued elements with or without a Bloom filter
實(shí)驗(yàn)結(jié)果(圖6、圖7)表明,在同等實(shí)驗(yàn)環(huán)境中,對(duì)系統(tǒng)中的已有元素進(jìn)行查詢時(shí),加入布隆過(guò)濾器后在查詢效率上有所提升,但提升程度不大;對(duì)空值元素進(jìn)行查詢時(shí),加入布隆過(guò)濾器后對(duì)查詢效率有顯著提升。該實(shí)驗(yàn)結(jié)果表明在鏈上鏈下存儲(chǔ)結(jié)合模式中,加入布隆過(guò)濾器,不僅能在保證檢測(cè)數(shù)據(jù)在區(qū)塊鏈中的安全可信存儲(chǔ),而且在數(shù)據(jù)查詢性能提升方面有較大的改善。
區(qū)塊鏈?zhǔn)且粋€(gè)多方參與記錄數(shù)據(jù)的可信賬本,其開放透明、可追溯和不可篡改等特性給農(nóng)產(chǎn)品檢測(cè)信息的可信存儲(chǔ)提供了保障?;趨^(qū)塊鏈對(duì)檢測(cè)數(shù)據(jù)分類存儲(chǔ),即大文件檢測(cè)數(shù)據(jù)的源文件存儲(chǔ)在本地?cái)?shù)據(jù)庫(kù),該文件的哈希摘要與重要的檢測(cè)字段打包在鏈上數(shù)據(jù)庫(kù)存儲(chǔ),能夠有效地保障檢測(cè)數(shù)據(jù)的完整性,同時(shí)布隆過(guò)濾器的引入能夠提升區(qū)塊鏈系統(tǒng)的查詢效率。本文方法為農(nóng)產(chǎn)品質(zhì)量安全檢測(cè)提供了一種可信的技術(shù)方案與應(yīng)用案例。