劉孝保,楊 林,易 斌,陰艷超,*,孫海彬,顧文娟
(1.昆明理工大學(xué)機電工程學(xué)院,云南 昆明 650500;2.云南中煙工業(yè)有限責任公司技術(shù)中心,云南 昆明 650231)
水果、蔬菜作為人類維生素和礦物質(zhì)的重要來源,為人體提供大量的營養(yǎng)[1],但是近年來農(nóng)藥殘留超標、過量使用食品添加劑、違規(guī)使用化學(xué)藥品、生產(chǎn)環(huán)境不達標[2]等事件頻發(fā),嚴重危害了消費者的健康安全,造成社會公眾信任度降低。食品質(zhì)量安全溯源系統(tǒng)利用自動識別和IT技術(shù)記錄食品從生產(chǎn)到餐桌整個過程的關(guān)鍵信息,當發(fā)生食品安全意外事件時,可以快速地定位到出現(xiàn)問題的環(huán)節(jié),明確責任主體,及時召回問題產(chǎn)品,這是有效保障食品質(zhì)量安全的方法之一[3-4]。然而傳統(tǒng)農(nóng)產(chǎn)品溯源系統(tǒng)依靠中心化數(shù)據(jù)庫來存儲、傳輸和共享信息[5-7],存在供應(yīng)鏈數(shù)據(jù)不透明、信息易被篡改、監(jiān)管效率低、社會公信力不足等問題[8-10]。區(qū)塊鏈技術(shù)具有去中心化、無法篡改、可編程和安全可信等特點[11-14],將區(qū)塊鏈技術(shù)融入到傳統(tǒng)溯源體系中,能夠有效保證食品追溯信息的安全性和可靠性[15]。
近年來,國內(nèi)外學(xué)者利用區(qū)塊鏈技術(shù)在農(nóng)產(chǎn)品質(zhì)量安全溯源領(lǐng)域進行了較為深入的探索。Abijaude等[16]提出了一種基于區(qū)塊鏈的可可溯源方法,以提高可可行業(yè)的可持續(xù)供應(yīng)鏈透明度。An等[17]提出了一種面向農(nóng)產(chǎn)品供應(yīng)鏈安全管理的區(qū)塊鏈模型,通過以太坊平臺設(shè)計了農(nóng)產(chǎn)品追溯系統(tǒng),有效解決了傳統(tǒng)溯源系統(tǒng)數(shù)據(jù)易被篡改和透明度低的問題。陶啟等[18]構(gòu)建了基于區(qū)塊鏈技術(shù)的食品質(zhì)量安全管理系統(tǒng),開發(fā)了基于危害因子的風險評估和安全溯源技術(shù),有效提高了食品質(zhì)量安全的監(jiān)管效率。于麗娜等[19]分析了農(nóng)產(chǎn)品供應(yīng)鏈溯源需求,提出了基于區(qū)塊鏈的農(nóng)產(chǎn)品供應(yīng)鏈信息追溯模型,用以保障供應(yīng)鏈信息的安全存儲和共享。孫俊等[20]為了解決傳統(tǒng)水產(chǎn)品追溯系統(tǒng)數(shù)據(jù)存儲不安全的問題,將區(qū)塊鏈技術(shù)融入現(xiàn)有水產(chǎn)品溯源系統(tǒng),提高了追溯數(shù)據(jù)的可靠性。許繼平等[21]通過分析稻米供應(yīng)鏈信息流轉(zhuǎn)特點,構(gòu)建了基于區(qū)塊鏈的稻米供應(yīng)鏈監(jiān)管模型,定制化設(shè)計了多業(yè)務(wù)邏輯監(jiān)管智能合約,并結(jié)合實際案例對系統(tǒng)進行驗證分析。上述研究通過區(qū)塊鏈技術(shù)實現(xiàn)了農(nóng)產(chǎn)品質(zhì)量安全溯源,有效解決了傳統(tǒng)溯源系統(tǒng)存在的問題,但是將農(nóng)產(chǎn)品追溯信息直接寫入?yún)^(qū)塊鏈后,隨著節(jié)點數(shù)量的拓展和交易數(shù)據(jù)的劇增,區(qū)塊鏈數(shù)據(jù)查詢效率低和存儲負載過大的問題也隨之出現(xiàn)[22]。
為解決上述問題,部分學(xué)者將區(qū)塊鏈技術(shù)與數(shù)據(jù)庫相結(jié)合。楊信廷等[23]設(shè)計了基于區(qū)塊鏈的果蔬溯源數(shù)據(jù)存儲模型,提出了“區(qū)塊鏈”+“數(shù)據(jù)庫”鏈上鏈下協(xié)同存儲架構(gòu),鏈上鏈下協(xié)同驗證溯源數(shù)據(jù)的安全性,有效提高了區(qū)塊鏈數(shù)據(jù)的查詢效率。劉雙印等[24]采用區(qū)塊鏈技術(shù)構(gòu)建了農(nóng)產(chǎn)品質(zhì)量安全追溯系統(tǒng),提出了鏈上鏈下雙模協(xié)同存儲策略,解決了區(qū)塊鏈網(wǎng)絡(luò)中節(jié)點負載過大和查詢效率低的問題。許繼平等[25]構(gòu)建了基于糧油供應(yīng)鏈的鏈上鏈下雙模存儲機制,提高了區(qū)塊鏈的運行效率。鏈上鏈下協(xié)同存儲方案雖然緩解了存儲壓力,但系統(tǒng)中心化程度也隨之提高[26]。部分學(xué)者通過多鏈架構(gòu)擴充了區(qū)塊鏈溯源總體容量。于華竟等[27]采用多鏈架構(gòu)構(gòu)建了雜糧區(qū)塊鏈追溯系統(tǒng),以追溯鏈為主鏈,各企業(yè)間多鏈為從鏈,將公開信息存儲在主鏈,隱私數(shù)據(jù)存儲在從鏈,緩解了單鏈存儲壓力。孫傳恒等[28]將區(qū)塊鏈多鏈架構(gòu)運用到果蔬溯源應(yīng)用場景中,在供應(yīng)鏈各環(huán)節(jié)間創(chuàng)建多條追溯鏈,將追溯信息隔離存儲在多條鏈上以緩解數(shù)據(jù)存儲壓力。此外,部分學(xué)者提出了有向無環(huán)圖(directed acyclic graph,DAG)區(qū)塊鏈[29-31],通過將傳統(tǒng)區(qū)塊鏈單鏈結(jié)構(gòu)變成DAG的網(wǎng)狀拓撲結(jié)構(gòu),有效提升了區(qū)塊鏈的并發(fā)性和可擴展性。上述研究在果蔬質(zhì)量安全溯源方面取得了一些顯著的成果,利用區(qū)塊鏈技術(shù)構(gòu)建具有去中心化、數(shù)據(jù)不可篡改、安全可信的果蔬質(zhì)量安全溯源體系,成功提高了農(nóng)產(chǎn)品供應(yīng)鏈的可追溯性和安全性。但目前基于區(qū)塊鏈的食品溯源系統(tǒng)僅存儲食品流通過程中的部分信息,溯源信息的深度不足,且傳統(tǒng)區(qū)塊鏈采用順序表的存儲結(jié)構(gòu),溯源數(shù)據(jù)無法關(guān)聯(lián)地存儲,導(dǎo)致了溯源數(shù)據(jù)間關(guān)聯(lián)性缺失及數(shù)據(jù)查詢效率低等問題。
基于以上問題,本研究提出了一種圖區(qū)塊鏈模型。首先構(gòu)建果蔬供應(yīng)鏈深度溯源圖區(qū)塊鏈模型,利用圖理論設(shè)計圖狀區(qū)塊數(shù)據(jù)結(jié)構(gòu),將傳統(tǒng)區(qū)塊鏈結(jié)構(gòu)中順序表的存儲結(jié)構(gòu)改變?yōu)楸阌谏疃人菰葱畔⒋鎯Φ膱D結(jié)構(gòu),以實現(xiàn)深度溯源信息的關(guān)聯(lián)存儲。在此基礎(chǔ)上,設(shè)計圖區(qū)塊鏈映射模型,通過該模型建立物理區(qū)塊數(shù)據(jù)與圖區(qū)塊鏈模型之間的映射關(guān)系。然后根據(jù)果蔬供應(yīng)鏈流程邏輯結(jié)構(gòu)建立“圖區(qū)塊頂點”“圖區(qū)塊邊”“圖區(qū)塊標簽”以及“圖區(qū)塊屬性”組成的圖區(qū)塊數(shù)據(jù)架構(gòu),設(shè)計并編寫數(shù)據(jù)存儲、查詢與權(quán)限管理智能合約。最后,基于XuperChain平臺開發(fā)圖區(qū)塊鏈模型,并與傳統(tǒng)區(qū)塊鏈進行性能對比。本研究可為實現(xiàn)基于區(qū)塊鏈的果蔬供應(yīng)鏈深度溯源、數(shù)據(jù)的快速查詢和開銷平衡的研究提供新的方法和思路。
果蔬供應(yīng)鏈是在果蔬生產(chǎn)原料供應(yīng)商、生產(chǎn)企業(yè)、收儲企業(yè)、加工企業(yè)、物流公司、銷售商、消費者等眾多參與者之間建立的一種協(xié)作關(guān)系。果蔬供應(yīng)鏈溯源信息具有高深度、高關(guān)聯(lián)性的特點。供應(yīng)鏈包括生產(chǎn)、收儲、加工、運輸、銷售5 個環(huán)節(jié),每個環(huán)節(jié)又包含多個亞環(huán)節(jié),每個亞環(huán)節(jié)又包含多個步驟,例如生產(chǎn)環(huán)節(jié)包括選種、播種、施肥、打藥、灌溉、修枝、采收等亞環(huán)節(jié),其中施肥亞環(huán)節(jié)又包含一次施肥、追加施肥等多個步驟。供應(yīng)鏈溯源信息主要由參與實體及產(chǎn)品之間復(fù)雜的關(guān)系構(gòu)成[32],例如農(nóng)民與農(nóng)場之間是工作關(guān)系、肥料與農(nóng)作物之間是施肥關(guān)系、各企業(yè)之間是交易關(guān)系等。因此,本研究提取了供應(yīng)鏈各環(huán)節(jié)關(guān)鍵信息并將其劃分為實體數(shù)據(jù)與關(guān)系數(shù)據(jù),如表1所示。
表1 果蔬供應(yīng)鏈關(guān)鍵信息分類Table 1 Key information classification of the fruit and vegetable supply chain
果蔬供應(yīng)鏈深度溯源是對供應(yīng)鏈全流程、全生命周期所涉及的數(shù)據(jù)以及數(shù)據(jù)之間的關(guān)系進行溯源。目前通過傳統(tǒng)區(qū)塊鏈構(gòu)建的果蔬供應(yīng)鏈溯源系統(tǒng)主要存在以下問題:1)溯源信息深度不足。果蔬供應(yīng)鏈溯源信息具有高深度的特點。對于果蔬產(chǎn)品來說,亞環(huán)節(jié)所涉及的深度溯源信息較一般商品更為重要,但現(xiàn)有通過區(qū)塊鏈技術(shù)構(gòu)建的果蔬供應(yīng)鏈溯源系統(tǒng)并沒有存儲供應(yīng)鏈各環(huán)節(jié)的深度信息,多數(shù)僅限于上鏈單段果蔬產(chǎn)品流通過程中的部分數(shù)據(jù)。當發(fā)生食品安全問題時,難以實現(xiàn)全產(chǎn)業(yè)鏈的追蹤溯源,無法快速確定出現(xiàn)問題的環(huán)節(jié)。2)溯源數(shù)據(jù)關(guān)聯(lián)性不足。果蔬供應(yīng)鏈追溯數(shù)據(jù)具有高信息關(guān)聯(lián)性。傳統(tǒng)區(qū)塊鏈只能實現(xiàn)串行化的賬本增加操作,數(shù)據(jù)存儲具有隨機性,無法將溯源數(shù)據(jù)之間的關(guān)聯(lián)性很好地進行表征與存儲,導(dǎo)致數(shù)據(jù)之間缺少關(guān)聯(lián)關(guān)系,進而無法將供應(yīng)鏈各環(huán)節(jié)數(shù)據(jù)和業(yè)務(wù)進行有效串聯(lián),增加了供應(yīng)鏈數(shù)據(jù)處理和監(jiān)管的難度。3)查詢效率低。果蔬供應(yīng)鏈溯源系統(tǒng)需要存儲果蔬全生命周期的大量數(shù)據(jù),消費者進行一次溯源查詢操作涉及生產(chǎn)、收儲、加工、運輸、銷售多個環(huán)節(jié),需要查詢多條記錄。然而傳統(tǒng)區(qū)塊鏈系統(tǒng)查詢功能較為單一,查詢結(jié)果具有局限性[33],查詢操作非常消耗系統(tǒng)資源和時間,相較于傳統(tǒng)數(shù)據(jù)庫查詢效率低。
由于傳統(tǒng)區(qū)塊鏈在果蔬供應(yīng)鏈區(qū)塊鏈模型構(gòu)建中存在問題,本研究提出基于圖區(qū)塊鏈的果蔬供應(yīng)鏈深度溯源模型(圖1)。其基本思路為:首先通過物聯(lián)網(wǎng)設(shè)備采集供應(yīng)鏈各參與主體溯源數(shù)據(jù),并將其規(guī)整為實體數(shù)據(jù)和關(guān)系數(shù)據(jù)的形式來表征數(shù)據(jù)之間的關(guān)聯(lián)性;然后調(diào)用智能合約將數(shù)據(jù)上傳到區(qū)塊鏈網(wǎng)絡(luò),網(wǎng)絡(luò)中的節(jié)點對數(shù)據(jù)進行打包排序后生成物理圖區(qū)塊;最后通過圖區(qū)塊鏈映射模型建立物理區(qū)塊數(shù)據(jù)與圖區(qū)塊鏈模型之間的映射關(guān)系,將物理區(qū)塊中實體數(shù)據(jù)映射成圖區(qū)塊的區(qū)塊頂點,關(guān)系數(shù)據(jù)映射成圖區(qū)塊的區(qū)塊邊。供應(yīng)鏈各企業(yè)主體、監(jiān)管部門與消費者都可以通過調(diào)用合約向圖區(qū)塊鏈網(wǎng)絡(luò)發(fā)起溯源查詢請求,不同主體可在權(quán)限范圍內(nèi)查詢果蔬供應(yīng)鏈信息,以實現(xiàn)果蔬產(chǎn)品的深度溯源。
圖1 果蔬供應(yīng)鏈深度溯源圖區(qū)塊鏈模型Fig.1 In-depth traceability graph blockchain model of the fruit and vegetable supply chain
2.1.1 圖區(qū)塊結(jié)構(gòu)
圖區(qū)塊由區(qū)塊頂點集和區(qū)塊邊集組成(圖2)。在此基礎(chǔ)上,定義屬性集P=(Property1,Property2,…,Propertyn)來擴展區(qū)塊頂點和區(qū)塊邊,定義標簽對區(qū)塊頂點進行分類,標簽的類型由具體的業(yè)務(wù)場景定義,例如果蔬供應(yīng)鏈不同環(huán)節(jié)頂點定義為不同類型標簽。每個區(qū)塊頂點集中的元素在基于業(yè)務(wù)交易的圖區(qū)塊賬本中對應(yīng)一筆實體型交易,而在基于圖區(qū)塊的賬本中對應(yīng)一個區(qū)塊頂點。區(qū)塊邊集中的每個元素可以用一個二元組(m,n)表示,其中m代表起始區(qū)塊頂點,n代表目標區(qū)塊頂點,區(qū)塊邊定義的屬性集表示兩頂點之間的關(guān)系,每個區(qū)塊邊集中的元素在基于業(yè)務(wù)交易的圖區(qū)塊賬本中對應(yīng)一筆關(guān)系型交易,而在基于圖區(qū)塊的賬本中對應(yīng)一個區(qū)塊邊。
圖2 圖區(qū)塊結(jié)構(gòu)Fig.2 Graph block structure
在一個圖區(qū)塊G=(V,E)(E為區(qū)塊邊集(edge))中,區(qū)塊邊具有方向性,區(qū)塊頂點集中任意兩元素之間的邊存在單向和雙向兩種情況,單向情況時,每個區(qū)塊頂點m&V擁有一個出度或一個入度。出度Sout=|{e=(m,n)|e∈E}|,表示區(qū)塊頂點引用數(shù)量(m“引用”了n),入度Sin=|{e=(m,n)|e∈E}|,表示m被引用的次數(shù)。當Sin=0時,稱m為一個端區(qū)塊頂點。雙向情況時,每個區(qū)塊頂點m&V∪n&V擁有一個出度或一個入度。圖區(qū)塊G=(V,E)具有復(fù)雜性,一般而言,基于圖區(qū)塊的賬本對每個區(qū)塊頂點的出度和入度沒有要求,通常一個區(qū)塊頂點能夠同時被多個新生成區(qū)塊頂點引用,從而能夠清晰地存儲具有復(fù)雜業(yè)務(wù)關(guān)系場景的數(shù)據(jù)。同時,新生成的區(qū)塊頂點可以引用圖區(qū)塊中任意一個端區(qū)塊頂點。
2.1.2 圖區(qū)塊鏈存儲模型
由于圖區(qū)塊鏈存儲了深度溯源信息,較傳統(tǒng)單一溯源信息在數(shù)據(jù)量上有所增加,所以存儲冗余率有所增加。因此,本研究設(shè)計了圖區(qū)塊鏈存儲模型,該模型的核心思想是在保證圖區(qū)塊鏈安全性的前提下,減少圖區(qū)塊鏈網(wǎng)絡(luò)中的副本數(shù)量以減少存儲冗余。圖區(qū)塊鏈存儲模型中包含用戶節(jié)點、驗證節(jié)點、排序節(jié)點、全節(jié)點4 種角色(圖3)。用戶節(jié)點為原始數(shù)據(jù)的擁有者,需要對原始數(shù)據(jù)進行標準化和規(guī)范化處理;驗證節(jié)點負責驗證交易的合法性;排序節(jié)點負責交易的排序打包;全節(jié)點負責存儲所有用戶節(jié)點的數(shù)據(jù);一個節(jié)點可以同時擁有多種角色。其中最核心的是全節(jié)點,其是完整副本的保存者,其余節(jié)點只存儲部分副本數(shù)據(jù),網(wǎng)絡(luò)中只有一少部分節(jié)點為全節(jié)點。圖區(qū)塊鏈網(wǎng)絡(luò)中完整副本的數(shù)量減少,攻擊者只需要在控制少于50%節(jié)點數(shù)的情況下即可篡改圖區(qū)塊鏈數(shù)據(jù),在一定程度上降低了圖區(qū)塊鏈的安全性。但果蔬供應(yīng)鏈場景有海量的節(jié)點不斷地加入圖區(qū)塊鏈系統(tǒng),攻擊者想控制圖區(qū)塊鏈系統(tǒng)中少部分節(jié)點也幾乎不可能實現(xiàn)。
圖3 圖區(qū)塊鏈存儲模型Fig.3 Graph blockchain storage model
2.1.3 物理圖區(qū)塊結(jié)構(gòu)
果蔬供應(yīng)鏈各節(jié)點通過物聯(lián)網(wǎng)設(shè)備采集數(shù)據(jù),并基于此數(shù)據(jù)構(gòu)建物理圖區(qū)塊鏈模型。如圖4所示,物理圖區(qū)塊分為兩部分。第1部分包含前一圖區(qū)塊哈希(pre hash)、圖區(qū)塊身份(graph block ID)、圖哈希根(graph hash root,GR)、圖區(qū)塊哈希(graphblock hash)、數(shù)字簽名(digital signature)以及時間戳(timestamp)等。其中Graph block hash=Hash(Pre hash+Graph block ID+Graph hashroot+Digital signature+Timestamp),采用SHA-256哈希算法計算出圖區(qū)塊哈希值,無論圖區(qū)塊中任何部分發(fā)生細微的改變,均會引起輸出值(graph block hash)的明顯改變。第2部分包含若干業(yè)務(wù)數(shù)據(jù),業(yè)務(wù)數(shù)據(jù)分為實體數(shù)據(jù)(標注為V1,V2,……)和關(guān)系數(shù)據(jù)(標注為R1,R2,……)兩類。
圖4 物理圖區(qū)塊結(jié)構(gòu)Fig.4 Physical graph block structure
2.1.4 圖區(qū)塊加密算法
區(qū)塊鏈技術(shù)的安全性通常從數(shù)據(jù)、網(wǎng)絡(luò)、共識、合約4 個方面分析。圖區(qū)塊鏈基于傳統(tǒng)區(qū)塊鏈的技術(shù)架構(gòu)對區(qū)塊數(shù)據(jù)結(jié)構(gòu)進行改進,保留了傳統(tǒng)區(qū)塊鏈網(wǎng)絡(luò)、共識、合約技術(shù)的底層框架。因此,本研究主要考慮圖區(qū)塊鏈數(shù)據(jù)的安全性,根據(jù)圖區(qū)塊數(shù)據(jù)結(jié)構(gòu)構(gòu)建圖區(qū)塊加密算法,圖區(qū)塊內(nèi)所有業(yè)務(wù)數(shù)據(jù)根據(jù)圖區(qū)塊加密算法得到最終的哈希值,稱之為圖哈希根。任意一個業(yè)務(wù)數(shù)據(jù)被篡改時,圖哈希根均會發(fā)生改變,通過此方式保障圖區(qū)塊鏈數(shù)據(jù)的安全。以圖4物理圖區(qū)塊為例,圖區(qū)塊加密運算過程為:
步驟1)首先計算圖區(qū)塊中某個實體數(shù)據(jù)V1的哈希值,稱為hash VI。
V1→Hash V1
步驟2)找到剛訪問的實體數(shù)據(jù)V1的第一個未被訪問的鄰接實體數(shù)據(jù),計算出該實體數(shù)據(jù)與兩實體數(shù)據(jù)之間連接的關(guān)系數(shù)據(jù)的哈希值,然后將計算得到的哈希值進行串接,再進行哈希運算,得到新的哈希值。接著再遍歷V1未被訪問到的鄰接實體數(shù)據(jù),重復(fù)此步驟,直到V1所有鄰接實體數(shù)據(jù)全部被訪問為止。
V2→Hash V2
R1→Hash R1
步驟3)依次訪問步驟2未被訪問的鄰接實體數(shù)據(jù),然后依次訪問各鄰接實體數(shù)據(jù)未被訪問的鄰接實體數(shù)據(jù),直到所有實體數(shù)據(jù)都被訪問為止,并計算出最終的圖哈希根。
Hash V1V2R1V3R2V4R3R4V5R5R6→GR
在圖區(qū)塊鏈網(wǎng)絡(luò)中,用戶節(jié)點發(fā)起交易提案請求后,交易被提交至驗證節(jié)點進行合法性驗證后簽名;將帶有簽名的交易發(fā)送給排序節(jié)點進行排序打包;打包的交易被發(fā)送到全節(jié)點,全節(jié)點接收交易并將其放入緩存區(qū)中,當緩存區(qū)中交易達到一定數(shù)量時,將交易寫入自己賬本并通過映射機制將交易信息映射到圖區(qū)塊中。映射過程主要由以下2 個部分組成:1)建立物理圖區(qū)塊到圖區(qū)塊的數(shù)據(jù)映射協(xié)議;2)通過區(qū)塊頂點映射和區(qū)塊邊映射配置方案構(gòu)建圖區(qū)塊鏈。具體映射規(guī)則和映射流程如下。
物理圖區(qū)塊和圖區(qū)塊數(shù)據(jù)類型和格式存在一定的差異,會影響圖區(qū)塊鏈構(gòu)建的完整性和一致性。因此,首先需要設(shè)計物理圖區(qū)塊數(shù)據(jù)到圖區(qū)塊的數(shù)據(jù)映射協(xié)議,保證圖區(qū)塊鏈構(gòu)建前后數(shù)據(jù)的一致性和完整性。在物理圖區(qū)塊中,追溯數(shù)據(jù)以JSON文檔的形式存儲,因此本研究設(shè)計的映射協(xié)議中,物理圖區(qū)塊JSON文檔中的鍵名稱在圖區(qū)塊中映射為屬性名稱,值字段類型映射為該屬性的類型,每一行用來描述該屬性的具體值映射為對應(yīng)區(qū)塊頂點或區(qū)塊邊該屬性的具體值。除此之外,還需解決數(shù)據(jù)類型和格式異構(gòu)問題。本研究通過對物理圖區(qū)塊中存在的屬性類型進行整理分析后,定義了圖區(qū)塊數(shù)據(jù)映射協(xié)議(表2),以最大程度地保留元數(shù)據(jù)。特別地,本研究對物理圖區(qū)塊中數(shù)組數(shù)據(jù)類型進行了特殊處理,數(shù)組用于將多個值存為一個鍵。在映射到圖區(qū)塊之后,對于作為屬性的數(shù)組,將數(shù)組數(shù)據(jù)用逗號隔開作為字串存儲,表示其屬性值。
表2 物理圖區(qū)塊-圖區(qū)塊數(shù)據(jù)映射Table 2 Physical graph block-graph block data mapping
根據(jù)圖區(qū)塊的映射協(xié)議進行圖區(qū)塊的模式構(gòu)建,包括區(qū)塊頂點模式構(gòu)建和區(qū)塊邊模式構(gòu)建。區(qū)塊頂點模式構(gòu)建:獲取選定的物理圖區(qū)塊賬本中實體數(shù)據(jù)的元數(shù)據(jù),按照映射協(xié)議建立所有的屬性字段,實體數(shù)據(jù)的所有屬性映射成為區(qū)塊頂點的所有屬性,實體數(shù)據(jù)的lable字段屬性映射成為區(qū)塊頂點的lable屬性。以圖5中JSON文檔為例,以JSON數(shù)據(jù)中l(wèi)abel字段來創(chuàng)建區(qū)塊頂點的標簽,其區(qū)塊頂點為生產(chǎn)類區(qū)塊頂點。JSON數(shù)據(jù)中屬性對象3 個屬性映射為該區(qū)塊頂點的所有屬性,其對應(yīng)的屬性值一一映射為區(qū)塊頂點屬性的具體屬性值。
圖5 圖區(qū)塊頂點映射Fig.5 Graph block vertex mapping
區(qū)塊邊模式構(gòu)建:基于關(guān)系數(shù)據(jù)字段配置構(gòu)建區(qū)塊邊模式,提取關(guān)系中的指向信息,明確關(guān)系的起始區(qū)塊頂點信息。以圖6中施肥區(qū)塊邊為例,首先建立一個施肥的關(guān)系類型,然后根據(jù)基于字段配置的方法(如圖7中賬本的start字段指向施肥邊的起始區(qū)塊頂點,end字段指向施肥邊的目標區(qū)塊頂點),確定施肥區(qū)塊邊的指向信息,從平衡復(fù)合肥17-17-17區(qū)塊頂點指向陽光玫瑰葡萄區(qū)塊頂點。JSON數(shù)據(jù)中relationship(關(guān)系)對象3 個屬性映射為該區(qū)塊邊的所有屬性,其對應(yīng)的屬性值一一映射為區(qū)塊邊屬性的具體屬性值。
圖6 圖區(qū)塊邊映射Fig.6 Graph block edge mapping
圖7 某果蔬供應(yīng)鏈圖區(qū)塊數(shù)據(jù)架構(gòu)示意圖Fig.7 Schematic diagram of graph block data architecture of the fruit and vegetable supply chain
果蔬供應(yīng)鏈參與主體主要是生產(chǎn)企業(yè)、收儲企業(yè)、加工企業(yè)、物流企業(yè)、銷售企業(yè)等。根據(jù)果蔬供應(yīng)鏈涉及的主體,本研究按照區(qū)塊頂點、區(qū)塊邊、區(qū)塊頂點標簽、區(qū)塊頂點與區(qū)塊邊屬性集進行時間和空間層面的劃分,果蔬供應(yīng)鏈圖區(qū)塊數(shù)據(jù)架構(gòu)如圖7所示。
按照實體數(shù)據(jù)建立圖區(qū)塊頂點。果蔬供應(yīng)鏈各參與主體將采集的業(yè)務(wù)數(shù)據(jù)解析成實體數(shù)據(jù)和關(guān)系數(shù)據(jù),圖區(qū)塊頂點由實體數(shù)據(jù)構(gòu)建,如在圖7中有農(nóng)民、農(nóng)場、種子、農(nóng)作物等圖區(qū)塊頂點,并根據(jù)實體數(shù)據(jù)具體內(nèi)容構(gòu)建圖區(qū)塊頂點的屬性集合,例如農(nóng)場頂點包含名稱、地址、聯(lián)系方式3 個屬性。
按照流程建立圖區(qū)塊頂點標簽。根據(jù)果蔬供應(yīng)鏈的流程環(huán)節(jié),將圖區(qū)塊頂點分為“生產(chǎn)”“收儲”“加工”“運輸”“銷售”5 個類型。它們以不同顏色進行區(qū)分,如圖7所示。
按照關(guān)系數(shù)據(jù)建立圖區(qū)塊邊。不同區(qū)塊頂點之間通過具有方向的區(qū)塊邊連接起來組成復(fù)雜的圖區(qū)塊,根據(jù)關(guān)系數(shù)據(jù)的內(nèi)容構(gòu)建圖區(qū)塊邊,例如施肥邊由肥料頂點指向農(nóng)作物頂點,其中劑量、人員、時間組成施肥邊的屬性集。
智能合約是一種用算法和程序來編制合同條款部署在區(qū)塊鏈上且可按照規(guī)則自動執(zhí)行的計算機協(xié)議[34],可為去中心化的果蔬供應(yīng)鏈主體之間搭建自信任的交易環(huán)境,通過智能合約將傳統(tǒng)供應(yīng)鏈上通過人的信任主導(dǎo)的業(yè)務(wù)往來替換為以計算機信任的交易模式。在圖區(qū)塊鏈模型中,用戶的業(yè)務(wù)信息存儲和查詢操作都通過智能合約來實現(xiàn)。本研究根據(jù)限值數(shù)據(jù)結(jié)構(gòu)設(shè)計了溯源數(shù)據(jù)存儲智能合約,智能合約讀取果蔬溯源數(shù)據(jù)并與限值進行對比,通過判斷溯源數(shù)據(jù)是否在限值內(nèi)來嚴格管控果蔬產(chǎn)品質(zhì)量安全,最終得到的判斷結(jié)果與溯源數(shù)據(jù)一起打包寫入圖區(qū)塊鏈,寫入成功后,返回當前交易哈希,其偽代碼設(shè)計如算法1所示。
算法1 溯源數(shù)據(jù)存儲算法輸入:溯源數(shù)據(jù)TraceData(農(nóng)藥殘留抑制率inhibition ratio)輸出:交易哈希Tx 1.節(jié)點peer調(diào)用合約的invoke上鏈請求2.ctx->arg(admin) //獲取節(jié)點公鑰地址3.if(!isadmin(id)) //判斷是否擁有寫入權(quán)限4.if(admin!=fetcher)5.return false//返回失敗6.ctx->put_object(inhibition ratio) //讀取上鏈數(shù)據(jù)7.if(!isarg(inhibition ratio)) //ctx->arg(inhibition ratio) //判斷上鏈數(shù)據(jù)格式是否符合要求8.return format error //返回上鏈失敗原因9.elseif (!isarg(inhibition ratio)> inhibition ratio limit) //判斷上鏈數(shù)據(jù)是否在限制內(nèi)10.return“抑制率超標”//返回上鏈失敗原因11.return ok(id) //上鏈成功返回交易id
數(shù)據(jù)成功寫入圖區(qū)塊鏈系統(tǒng)后,供應(yīng)鏈各企業(yè)主體、監(jiān)管部門與消費者通過查詢合約讀取圖區(qū)塊鏈中數(shù)據(jù)及用戶的查詢請求信息,查詢請求信息包括區(qū)塊頂點和區(qū)塊邊的屬性集合,根據(jù)查詢請求信息遍歷圖區(qū)塊鏈后返回查詢結(jié)果,其偽代碼設(shè)計如算法2所示。
算法2 溯源數(shù)據(jù)查詢算法輸入:數(shù)據(jù)查詢請求request list[]輸出:查詢結(jié)果result 1.節(jié)點peer調(diào)用合約的query查詢請求2.ctx->arg(admin) //獲取節(jié)點公鑰地址3.if(!isadmin(id)) //判斷是否擁有寫入權(quán)限4.if(admin!=fetcher)5.return false 6.ctx->arg(list[MATCH(N:lable)-[key value]]) //獲取查詢請求7.procedure BFS(graph,start_vertex) //根據(jù)屬性值進行深度優(yōu)先遍歷區(qū)塊頂點8.if start vertex in end vertices[]//遍歷起始頂點9.return true 10.for temp vertex in currentN vertex//遍歷目標頂點11.if !visit[temp_vertex]//判斷已遍歷頂點12.set visit ture(temp vertex)//標記以遍歷頂點13.DFS(temp_vertex,end_vertices[])14.set_visit_true(temp_vertex)//遍歷成功15.return true 16.End procedure//結(jié)束遍歷17.traceinfo:= QueryState(records) //遍歷全部數(shù)據(jù)18.return result
身份權(quán)限管理算法是圖區(qū)塊鏈重要的組成部分,直接關(guān)系到圖區(qū)塊鏈的數(shù)據(jù)安全管理。合約根據(jù)訪問者身份信息來判斷節(jié)點權(quán)限,其偽代碼設(shè)計如算法3所示。
算法3權(quán)限管理算法輸入:節(jié)點身份ID輸出:權(quán)限等級1.節(jié)點peer調(diào)用合約的permissions權(quán)限判斷請求2.ctx->arg(admin) //獲取節(jié)點公鑰地址3.if(!is企業(yè)節(jié)點(id)) //判斷是否是企業(yè)節(jié)點4.可查詢相鄰企業(yè)的全部產(chǎn)品關(guān)聯(lián)信息5.elseif(!is消費者節(jié)點(id)) //判斷是否是消費者節(jié)點6.可查詢其購買產(chǎn)品的關(guān)聯(lián)信息7.elseif(!is監(jiān)管節(jié)點(id)) //判斷是否是監(jiān)管節(jié)點8.可查詢?nèi)啃畔?/p>
實驗開發(fā)環(huán)境為Intel?CoreTMi7-10875H CPU@2.30GHz的主機,利用VMware Workstation16軟件建立虛擬機來模擬真實節(jié)點。其中,圖區(qū)塊鏈系統(tǒng)基于百度的超級鏈系統(tǒng)(XuperChain v5.1軟件)開源項目搭建環(huán)境,選擇go、C++語言作為測試的主要編程語言,具體的環(huán)境配置如表3所示。為了更好地驗證所提圖區(qū)塊鏈模型的性能,選擇百度超級鏈系統(tǒng)進行對比實驗,圖區(qū)塊鏈系統(tǒng)和百度超級鏈系統(tǒng)在同一環(huán)境下運行,圖區(qū)塊鏈和百度超級鏈網(wǎng)絡(luò)均包含3 個節(jié)點、2 個Orderer節(jié)點,且均采用Tdpos共識排序服務(wù),本實驗數(shù)據(jù)來自廣西某農(nóng)業(yè)有限公司陽光玫瑰葡萄溯源檔案。
表3 實驗環(huán)境配置Table 3 Experimental environment configuration
首先準備好百度超級鏈編譯運行的環(huán)境,然后在此基礎(chǔ)上建立圖區(qū)塊鏈網(wǎng)絡(luò)。圖8A展示了圖區(qū)塊鏈的區(qū)塊配置信息,包括圖區(qū)塊鏈名稱、圖區(qū)塊鏈賬本信息、節(jié)點IP信息等。圖8B展示了圖區(qū)塊鏈節(jié)點配置信息,包括圖區(qū)塊鏈版本、圖區(qū)塊鏈共識方法、排序節(jié)點信息等。圖8C展示了圖區(qū)塊鏈P2P網(wǎng)絡(luò)配置信息,主要包括節(jié)點端口、節(jié)點cert目錄、種子節(jié)點netUrl信息等。圖8D展示了圖區(qū)塊鏈智能合約賬號配置信息,包括賬號名稱、賬號訪問控制列表(access control lists,ACL)等。圖8E、F分別展示了圖區(qū)塊鏈存儲智能合約和查詢智能合約的部分代碼。
圖8 圖區(qū)塊網(wǎng)絡(luò)配置Fig.8 Graph block network configuration
通過構(gòu)建供應(yīng)鏈生產(chǎn)環(huán)節(jié)的圖區(qū)塊鏈驗證本研究提出的面向果蔬供應(yīng)鏈圖區(qū)塊鏈的可行性。實驗通過加入圖區(qū)塊鏈網(wǎng)絡(luò)的2 個節(jié)點(peer1、peer2)進行,peer1節(jié)點測試寫入生產(chǎn)環(huán)節(jié)的實體數(shù)據(jù)信息,peer2節(jié)點測試寫入生產(chǎn)環(huán)節(jié)的關(guān)系數(shù)據(jù)信息。通過測試節(jié)點終端發(fā)出相應(yīng)的指令,如圖9所示。其中peer1節(jié)點發(fā)出寫入“實體數(shù)據(jù)信息”指令,上傳所涉及到的實體數(shù)據(jù)信息,經(jīng)過圖區(qū)塊鏈網(wǎng)絡(luò)驗證節(jié)點驗證提案信息的合法性。驗證通過后,由存儲智能合約將提交的業(yè)務(wù)信息寫入物理圖區(qū)塊鏈中,隨后通過映射模型將相關(guān)的實體數(shù)據(jù)信息生成圖區(qū)塊鏈中對應(yīng)的區(qū)塊頂點。peer2節(jié)點發(fā)出寫入“關(guān)系數(shù)據(jù)信息”指令,首先需要對提案信息進行驗證,驗證通過后,仍由存儲智能合約將提交的業(yè)務(wù)信息寫入物理圖區(qū)塊鏈中,隨后通過映射模型將相關(guān)的關(guān)系數(shù)據(jù)信息生成圖區(qū)塊中對應(yīng)的區(qū)塊邊。
圖9 圖區(qū)塊終端發(fā)出測試指令Fig.9 Graph block terminal issue for test instruction
農(nóng)場提供的陽光玫瑰葡萄供應(yīng)鏈生產(chǎn)環(huán)節(jié)部分信息如表4所示。將表4生產(chǎn)環(huán)節(jié)信息明細作為物理圖區(qū)塊鏈的基礎(chǔ)數(shù)據(jù)。
表4 陽光玫瑰葡萄供應(yīng)鏈生產(chǎn)環(huán)節(jié)相關(guān)信息Table 4 Information about Shine Muscat production
生產(chǎn)環(huán)節(jié)用戶節(jié)點向相關(guān)信息發(fā)起提案,經(jīng)過驗證排序之后寫入物理圖區(qū)塊賬本,通過映射機制將實體數(shù)據(jù)映射成圖區(qū)塊中的頂點,關(guān)系數(shù)據(jù)映射成圖區(qū)塊中的邊,各頂點和邊連接形成供應(yīng)鏈生產(chǎn)環(huán)節(jié)的圖區(qū)塊,如圖10所示。
圖10 圖區(qū)塊生成Fig.10 Graph block generation
由于果蔬供應(yīng)鏈溯源信息具有高深度、高關(guān)聯(lián)性的特點,因此對果蔬供應(yīng)鏈的深度信息進行關(guān)聯(lián)存儲是實現(xiàn)深度溯源的關(guān)鍵。然而傳統(tǒng)區(qū)塊鏈并沒有存儲全供應(yīng)鏈的深度信息,且只能實現(xiàn)串行化的賬本增加操作,數(shù)據(jù)的寫入具有隨機性,導(dǎo)致數(shù)據(jù)之間缺失關(guān)聯(lián)關(guān)系。圖區(qū)塊鏈利用圖理論對區(qū)塊數(shù)據(jù)結(jié)構(gòu)進行改進,將傳統(tǒng)區(qū)塊鏈結(jié)構(gòu)中順序表的存儲結(jié)構(gòu)改變?yōu)楸阌谏疃人菰葱畔⒋鎯Φ膱D結(jié)構(gòu)。如圖10所示,該圖區(qū)塊存儲了陽光玫瑰葡萄生產(chǎn)環(huán)節(jié)的深度信息,包含農(nóng)場、農(nóng)民、農(nóng)作物、肥料等15 個頂點和工作、生長、施肥、施藥等16 個邊,分別代表存儲了15 條實體數(shù)據(jù)和16 條關(guān)系數(shù)據(jù),其中施肥邊關(guān)聯(lián)肥料與農(nóng)作物頂點、工作邊關(guān)聯(lián)農(nóng)民與農(nóng)場頂點,溯源數(shù)據(jù)在區(qū)塊中以圖的形式存儲,通過區(qū)塊邊將區(qū)塊頂點連接在一起,實現(xiàn)數(shù)據(jù)的關(guān)聯(lián)存儲,關(guān)系數(shù)據(jù)直接地將各環(huán)節(jié)實體數(shù)據(jù)整合集成起來。用戶進行一次追溯查詢操作可以快速遍歷供應(yīng)鏈過程中涉及的全部實體數(shù)據(jù)和關(guān)系數(shù)據(jù),從而實現(xiàn)對果蔬供應(yīng)鏈的深度溯源。
分別在圖區(qū)塊鏈和百度超級鏈系統(tǒng)上進行多組對比實驗,通過查詢數(shù)據(jù),對比分析圖區(qū)塊鏈模型的查詢效率性能。圖區(qū)塊鏈和百度超級鏈系統(tǒng)分別寫入相同的溯源數(shù)據(jù),然后分別進行查詢操作,記錄一次查詢的響應(yīng)時間,進行對比實驗,再通過更改查詢數(shù)量,觀察分析圖區(qū)塊鏈模型在不同查詢數(shù)量情況下的查詢效率是否比傳統(tǒng)區(qū)塊鏈系統(tǒng)有所優(yōu)化。
圖11中橫坐標是查詢數(shù)量,縱坐標是查詢時間,能夠反映圖區(qū)塊鏈和百度超級鏈進行查詢操作的響應(yīng)時間,為了減小隨機誤差的影響,每次實驗均測試10 次取平均值。通過對實驗結(jié)果進行分析,當查詢數(shù)量為100 條時,百度超級鏈查詢時間為750 ms,而圖區(qū)塊鏈查詢時間為65 ms,當查詢數(shù)量增加至1 000 條時,超級鏈查詢時間為6 273 ms,而圖區(qū)塊鏈查詢時間僅為425 ms,圖區(qū)塊鏈模型比超級鏈模型查詢效率提升大約13 倍,可以看出圖區(qū)塊鏈系統(tǒng)的查詢效率比傳統(tǒng)區(qū)塊鏈系統(tǒng)明顯提升。
圖11 數(shù)據(jù)查詢時間Fig.11 Data query time
通過Stress軟件測試查詢數(shù)量1~1 000 條期間圖區(qū)塊鏈系統(tǒng)和傳統(tǒng)區(qū)塊鏈環(huán)境下系統(tǒng)查詢開銷的情況,結(jié)果如表5所示。圖區(qū)塊鏈系統(tǒng)在查詢操作時,查詢效率相對傳統(tǒng)區(qū)塊鏈環(huán)境大幅提升,且查詢開銷不但沒有明顯增加,甚至比傳統(tǒng)區(qū)塊鏈環(huán)境更低。因此本研究提出的圖區(qū)塊鏈模型實現(xiàn)了數(shù)據(jù)快速查詢和開銷的平衡。
表5 1~1 000 次查詢期間區(qū)塊鏈系統(tǒng)查詢開銷Table 5 Query overhead of blockchain system during the period of 1–1 000 queries
本研究在果蔬供應(yīng)鏈圖區(qū)塊鏈深度溯源模型的基礎(chǔ)上,以某陽光玫瑰葡萄供應(yīng)鏈為應(yīng)用對象,構(gòu)建了果蔬圖區(qū)塊鏈信息溯源系統(tǒng)。該葡萄供應(yīng)鏈包含葡萄的生產(chǎn)、收儲、加工、運輸、銷售多個環(huán)節(jié),記錄了葡萄的生長信息、環(huán)境信息、人員信息、農(nóng)事信息、加工信息、存儲信息、保鮮信息、運輸信息、銷售信息等。若采用傳統(tǒng)結(jié)構(gòu)區(qū)塊存儲溯源信息,存在溯源數(shù)據(jù)關(guān)聯(lián)性不足、查詢效率低等問題,因此采用本系統(tǒng)進行優(yōu)化。本系統(tǒng)部分運行頁面如圖12所示,圖12A為用戶登錄頁面,用戶通過上傳個人信息注冊賬號即可登錄本系統(tǒng),圖12B為數(shù)據(jù)上鏈頁面,用戶可通過該頁面上傳溯源數(shù)據(jù),圖12C為信息查詢頁面,用戶可通過該頁面查看歷史上鏈數(shù)據(jù)。
圖12 系統(tǒng)運行界面Fig.12 System working interface
針對傳統(tǒng)區(qū)塊鏈構(gòu)建的果蔬溯源系統(tǒng)存在追溯信息不全面、數(shù)據(jù)關(guān)聯(lián)性不足、查詢效率低等問題,本研究提出了一種基于圖區(qū)塊鏈的果蔬深度溯源模型,設(shè)計了圖狀結(jié)構(gòu)的區(qū)塊數(shù)據(jù)結(jié)構(gòu)與物理圖區(qū)塊鏈模型,并由映射模型建立物理圖區(qū)塊與圖區(qū)塊中區(qū)塊頂點和區(qū)塊邊的對應(yīng)關(guān)系。根據(jù)果蔬供應(yīng)鏈流程邏輯結(jié)構(gòu)建立“圖區(qū)塊頂點”“圖區(qū)塊邊”“圖區(qū)塊標簽”以及“圖區(qū)塊屬性”組成的圖區(qū)塊數(shù)據(jù)架構(gòu),并定制化設(shè)計智能合約,保障果蔬供應(yīng)鏈上各主體之間正常的業(yè)務(wù)協(xié)作。該模型解決了傳統(tǒng)果蔬供應(yīng)鏈區(qū)塊鏈模型存在的溯源信息深度不足、溯源數(shù)據(jù)關(guān)聯(lián)性不足、查詢效率低等問題,實現(xiàn)了對果蔬供應(yīng)鏈的深度溯源。
目前的研究獲得了階段性的成果,但仍然存在一些問題需要進一步探討,如還需要對圖區(qū)塊鏈所涉及的共識機制算法進行深入研究,從而克服圖區(qū)塊鏈的安全性、可擴展性障礙,相較于傳統(tǒng)區(qū)塊鏈,圖區(qū)塊共識要求難度有所提升,實現(xiàn)圖區(qū)塊共識應(yīng)是未來重點研究的方向之一。