段冉陽,周文輝,魏 驍,王 龍
(華北計算機(jī)系統(tǒng)工程研究所,北京100083)
食品安全溯源體系是指在食品產(chǎn)供銷的各個環(huán)節(jié)(包括種植養(yǎng)殖、生產(chǎn)、流通以及銷售與餐飲服務(wù)等)中,食品質(zhì)量安全及其相關(guān)信息能夠被順向追蹤(生產(chǎn)源頭-消費(fèi)終端)或者逆向回溯(消費(fèi)終端-生產(chǎn)源頭),從而使食品的整個生產(chǎn)經(jīng)營活動始終處于有效監(jiān)控之中[1]。 但目前使用的食品溯源技術(shù)方案仍然以傳統(tǒng)記錄方式為主,存在以下幾方面的問題:
(1)數(shù)據(jù)共享仍然缺乏[2]。 目前食品安全溯源主要依托于物流網(wǎng)絡(luò)等進(jìn)行實(shí)現(xiàn),但物流信息僅僅是整個供應(yīng)鏈上的部分信息,供應(yīng)鏈中如食品生產(chǎn)信息、包裝信息等無法進(jìn)行記錄和追溯,而這些信息的完整性與真實(shí)性對于增加產(chǎn)品的可信度有著極大的幫助。更多的信息錄入可以讓消費(fèi)者能夠更完整、更直觀地了解到產(chǎn)品從產(chǎn)生到消費(fèi)的全部流程,讓更多的參與方加入進(jìn)來,在提高產(chǎn)品溯源信息完整性的同時,加入更多的背書主體,提高產(chǎn)品溯源信息的真實(shí)性與可靠性。
(2)信息存儲中心化[3]。 在目前主流的產(chǎn)品溯源供應(yīng)鏈中,主要采用中心化的信息存儲模式,需要參與產(chǎn)品供應(yīng)鏈上的某一方進(jìn)行管理和維護(hù)。 但是,不論是生產(chǎn)方、運(yùn)輸方還是銷售方,均為產(chǎn)品供應(yīng)鏈上的利益相關(guān)方,當(dāng)有不利于其自身的信息產(chǎn)生時,很有可能出現(xiàn)篡改賬本或者謊稱賬本信息由于技術(shù)原因而丟失的情況出現(xiàn),很難保證產(chǎn)品溯源信息的真實(shí)性和有效性。
(3)信息存儲孤島化[4]。 目前主流的系統(tǒng)在整個商品供應(yīng)鏈中,存在信息孤島問題。通常情況下,參與產(chǎn)品供應(yīng)鏈的各方具有多個不同的信息系統(tǒng),各個信息系統(tǒng)之間很難進(jìn)行交互,這會導(dǎo)致信息同步困難、信息核對繁瑣、數(shù)據(jù)交互不均衡等問題,為日后的使用埋下諸多隱患。 尤其是隨著使用時間增長,產(chǎn)品溯源系統(tǒng)產(chǎn)生的數(shù)據(jù)量增多,對多個系統(tǒng)的重復(fù)審計成本也將大大增加。
區(qū)塊鏈技術(shù)被認(rèn)為是近年來最具顛覆性和革命性的創(chuàng)新之一[5],已在金融、貿(mào)易[6]、物流[7]、征信[8]、公益、物聯(lián)網(wǎng)、共享經(jīng)濟(jì)等諸多領(lǐng)域嶄露頭角[9],其本質(zhì)上是提供信任保障的技術(shù),具有去中心、自動化和可信任的理念與特性,能提供較為有效的數(shù)據(jù)保護(hù)[10],十分契合人們對新型食品安全溯源系統(tǒng)的需求。 因此,為了解決上述傳統(tǒng)食品溯源系統(tǒng)中存在的問題,本文提出一種基于區(qū)塊鏈技術(shù)的食品溯源系統(tǒng)設(shè)計方案。
區(qū)塊鏈技術(shù)發(fā)展到現(xiàn)在,形成了多樣的區(qū)塊鏈體系,其中最具代表性的區(qū)塊鏈體系有3 個:比特幣系統(tǒng)中使用的比特幣(Bitcoin) 區(qū)塊鏈系統(tǒng)[11]、 以太坊(Ethereum)區(qū)塊鏈[12]和在2015 年由Linux 基金會發(fā)起的超級賬本(Hyperledger Fabric)開源區(qū)塊鏈項目[13]。 下面將從區(qū)塊鏈性質(zhì)、共識算法及運(yùn)行模式、智能合約和貨幣類型,綜合食品安全溯源的實(shí)際使用需求,對上述3 種區(qū)塊鏈系統(tǒng)進(jìn)行比較。 3 種區(qū)塊鏈特點(diǎn)如表1 所示。
表1 3 種典型區(qū)塊鏈特點(diǎn)對比表
現(xiàn)今食品溯源系統(tǒng)中,數(shù)據(jù)種類十分復(fù)雜且數(shù)量龐大[14],同時根據(jù)不同的食品,相關(guān)溯源信息需要不斷變更,這要求使用的區(qū)塊鏈系統(tǒng)具備較靈活的數(shù)據(jù)存儲系統(tǒng)和智能合約系統(tǒng),通過對不同種類食品的智能合約的編寫,達(dá)到對食品數(shù)據(jù)的精確統(tǒng)計;同時,參與食品溯源系統(tǒng)中的各個參與方本身均為傳統(tǒng)供應(yīng)鏈上的合作方,在現(xiàn)實(shí)中存在一定的信任關(guān)系,有著一定程度的信任積累,且供應(yīng)鏈上各個供應(yīng)方相對固定,無需面對整個公共網(wǎng)絡(luò),存在惡意節(jié)點(diǎn)的可能性比較小;另外,由于供應(yīng)鏈上參與方較多,各參與方需要寫入和維護(hù)的數(shù)據(jù)比較復(fù)雜,因此需要更快的區(qū)塊產(chǎn)生速度和更高效的區(qū)塊鏈網(wǎng)絡(luò)。
針對以上食品溯源系統(tǒng)的使用特點(diǎn),綜合3 種區(qū)塊鏈技術(shù)的特點(diǎn)進(jìn)行分析,Hyperledger Fabric 區(qū)塊鏈網(wǎng)絡(luò)的特點(diǎn)和優(yōu)勢十分契合食品安全溯源體系的實(shí)際情況和使用需求。 因此,本文采用Hyperledger Fabric 區(qū)塊鏈系統(tǒng)作為底層架構(gòu),對基于區(qū)塊鏈的食品安全溯源系統(tǒng)進(jìn)行設(shè)計與實(shí)現(xiàn)。
在區(qū)塊鏈與溯源系統(tǒng)相結(jié)合的研究中,相關(guān)從業(yè)人員也進(jìn)行了許多積極的嘗試,但大都集中在貴重物品溯源與單一物品溯源中,首先信息量相對較小,同時需要管理的產(chǎn)品數(shù)量并不大,因此所有溯源信息往往在一個賬本中進(jìn)行維護(hù)。 本文旨在利用Hyperledger Fabric 的多賬本、模塊化等特性,對日常食品的溯源系統(tǒng)進(jìn)行構(gòu)建,在一定程度上增加整個溯源系統(tǒng)的靈活性,提高整體溯源系統(tǒng)的效率和數(shù)據(jù)吞吐能力。
食品溯源系統(tǒng)的主要溯源對象為消費(fèi)者經(jīng)常購買的食品,選擇的溯源食品種類應(yīng)當(dāng)對食品原材料來源、加工生產(chǎn)過程、運(yùn)輸條件等有較高要求。 牛奶作為日常飲食的一種,深受各類人群,尤其是老年人和青少年兒童的喜愛。 但是由于目前生產(chǎn)鮮牛奶的廠商眾多,目前市場流通的鮮牛奶品質(zhì)良莠不齊,同時鮮牛奶容易變質(zhì),需要相對嚴(yán)格的存儲和運(yùn)輸環(huán)境,當(dāng)產(chǎn)生產(chǎn)品質(zhì)量問題時,傳統(tǒng)記錄手段很難對相關(guān)責(zé)任人進(jìn)行定位。 因此,消費(fèi)者們對鮮牛奶的食品溯源有著極大的需求,下面就以某品牌鮮牛奶為例,構(gòu)建基于Hyperledger Fabric區(qū)塊鏈的食品溯源系統(tǒng)。
基于上文的分析,利用Hyperledger Fabric 聯(lián)盟區(qū)塊鏈技術(shù)構(gòu)建基于區(qū)塊鏈的食品安全溯源系統(tǒng),系統(tǒng)的整體模型如圖1 所示。
在圖1 中,列舉了直接參與牛奶食品供應(yīng)鏈的食品生產(chǎn)方、運(yùn)輸方、加工方以及銷售方,同時引入消費(fèi)者和監(jiān)管方進(jìn)行實(shí)時的查詢和監(jiān)管等操作。 每個參與方在實(shí)際的區(qū)塊鏈網(wǎng)路體系中為一個組織(Org),每個組織中可以根據(jù)實(shí)際信息錄入情況設(shè)置節(jié)點(diǎn)(Peer),每個組織中至少包含一個節(jié)點(diǎn)。各個節(jié)點(diǎn)負(fù)責(zé)對各自的相關(guān)信息,如原料采集信息、分裝加工信息、物流信息以及銷售信息等進(jìn)行錄入,錄入的信息經(jīng)智能合約判斷合法后,通過區(qū)塊鏈節(jié)點(diǎn)上鏈,各個區(qū)塊鏈節(jié)點(diǎn)同步交易信息,進(jìn)行區(qū)塊生成,形成共識的區(qū)塊鏈數(shù)據(jù)。消費(fèi)者和相關(guān)監(jiān)管部門利用區(qū)塊鏈節(jié)點(diǎn)進(jìn)行相關(guān)信息的管理、查詢等操作,使整個食品供應(yīng)鏈上的食品安全數(shù)據(jù)全過程真實(shí)、透明、不可篡改,達(dá)到食品安全信息可追溯、可查詢、可信任的目的。
根據(jù)參與方分工的不同,各個參與方對應(yīng)節(jié)點(diǎn)也具備不同的功能,并對牛奶溯源過程中的相關(guān)數(shù)據(jù)進(jìn)行寫入和維護(hù)。下面對各個參與方對應(yīng)的組織和節(jié)點(diǎn)進(jìn)行設(shè)置,同時定義各個組織需要寫入和維護(hù)的數(shù)據(jù)信息。 各個參與方對應(yīng)的組織和節(jié)點(diǎn)如表2 所示。
圖1 基于Hyperledger Fabric 區(qū)塊鏈的食品安全溯源系統(tǒng)整體模型
表2 各參與方與組織對應(yīng)關(guān)系表
根據(jù)上文所述的基于區(qū)塊鏈的食品安全溯源系統(tǒng)整體模型,進(jìn)行該系統(tǒng)軟件架構(gòu)設(shè)計。 軟件架構(gòu)整體分為三大部分[15],分別為基礎(chǔ)層、數(shù)據(jù)層和應(yīng)用層?;A(chǔ)層為Fabric 區(qū)塊鏈基礎(chǔ)框架;數(shù)據(jù)層主要包括分布式數(shù)據(jù)存儲、共識機(jī)制、智能合約、鏈碼以及相關(guān)交易數(shù)據(jù),同時提供權(quán)限管理等功能;應(yīng)用層主要利用Fabric 區(qū)塊鏈網(wǎng)絡(luò)提供的各種語言版本的SDK 進(jìn)行功能的編寫和調(diào)用,包括溯源信息錄入、溯源信息查詢、溯源信息監(jiān)管等操作。 食品溯源系統(tǒng)軟件架構(gòu)圖如圖2 所示。
圖2 食品溯源系統(tǒng)軟件架構(gòu)圖
基于上文所述的食品安全溯源系統(tǒng)的整體模型和軟件架構(gòu),利用Hyperledger Fabric 區(qū)塊鏈技術(shù)的特點(diǎn),可以實(shí)現(xiàn)相關(guān)食品安全信息的基本操作,包括信息錄入、信息更新、信息監(jiān)管以及信息查詢等功能,各參與方根據(jù)實(shí)際需求,通過相關(guān)的管理應(yīng)用與相應(yīng)區(qū)塊鏈系統(tǒng)進(jìn)行交互,完成整體食品安全溯源系統(tǒng)的功能實(shí)現(xiàn),食品溯源系統(tǒng)基本交互操作示意圖如圖3 所示。
圖3 食品溯源系統(tǒng)基本交互操作示意圖
同時,利用Hyperledger Fabric 區(qū)塊鏈體系對智能合約的支持,可以根據(jù)實(shí)際的使用情況,對具體的應(yīng)用場景進(jìn)行專用的智能合約編寫,相關(guān)參與方進(jìn)行協(xié)商確定觸發(fā)條件,利用智能合約自動執(zhí)行的特點(diǎn),自動化地執(zhí)行相關(guān)信息的上聯(lián)操作,簡化工作步驟和工作流程,在提高整體工作效率的同時,降低人為參與的風(fēng)險,提高數(shù)據(jù)的有效性。智能合約工作原理示意圖如圖4 所示。
圖4 智能合約工作原理示意圖
Hyperledger Fabric 由五大核心模塊組成,分別為peer、orderer、cryptogen、configtxgen 以及configtxlator。 其中,peer和orderer 屬于系統(tǒng)模塊,主要構(gòu)成Hyperledger Fabric 的基礎(chǔ)系統(tǒng),直接參與系統(tǒng)的運(yùn)行,并以守護(hù)進(jìn)程的方式在 后 臺 長 期 運(yùn) 行;cryptogen、configtxgen 和configtxlator 屬于工具模塊,主要負(fù)責(zé)區(qū)塊鏈系統(tǒng)中的包括證書文件、創(chuàng)世區(qū)塊等相關(guān)文件的生成以及完成相關(guān)區(qū)塊鏈操作等工作,不直接參與系統(tǒng)運(yùn)行。Hyperledger Fabric 五大核心模塊的基本功能如表3 所示。
利用上述五大核心模塊,可以構(gòu)建Hyperledger Fabric聯(lián)盟區(qū)塊鏈的基礎(chǔ)區(qū)塊鏈網(wǎng)絡(luò),該網(wǎng)絡(luò)由Fabric-CA、peer 節(jié)點(diǎn)和orderer 節(jié)點(diǎn)3 個基本組成部分構(gòu)成,各個peer 節(jié)點(diǎn)可以根據(jù)功能不同細(xì)分為不同種類,并組成組織(Org)。
表3 Hyperledger Fabric 核心模塊基本功能表
peer 節(jié)點(diǎn)與orderer 節(jié)點(diǎn)構(gòu)成了基本的區(qū)塊鏈網(wǎng)絡(luò)之后,下一步需要對相關(guān)交易數(shù)據(jù)進(jìn)行處理和上鏈,對已完成的交易和上鏈數(shù)據(jù)進(jìn)行存儲,并保證每個peer 節(jié)點(diǎn)的數(shù)據(jù)存儲是一致的,這一過程成為共識達(dá)成。 Hyper-Ledger Fabric 區(qū)塊鏈系統(tǒng)中的共識達(dá)成基本過程如圖5所示。
Hyperledger Fabric 區(qū)塊鏈系統(tǒng)共識達(dá)成過程分為以下4 個基本步驟:
(1)由區(qū)塊鏈中的一個節(jié)點(diǎn)peer0(領(lǐng)導(dǎo)節(jié)點(diǎn))發(fā)起交易,交易中含有相關(guān)交易內(nèi)容以及peer0 的數(shù)字簽名,交易信息會根據(jù)該交易定義的相關(guān)節(jié)點(diǎn)(這里假設(shè)相關(guān)節(jié)點(diǎn)為peer1、peer2 以及peer3)信息進(jìn)行廣播;
(2)相關(guān)背書節(jié)點(diǎn)peer1、peer2 以及peer3 對交易的內(nèi)容以及peer0 的簽名進(jìn)行驗(yàn)證,保證該交易的有效性和合法性;
(3)peer0 等待交易的背書結(jié)果,當(dāng)結(jié)果滿足交易要求時,peer0 向orderer 節(jié)點(diǎn)集群提交該筆交易, 排序節(jié)點(diǎn)根據(jù)相關(guān)排序算法對交易進(jìn)行排序;
(4)一段時間后,orderer 節(jié)點(diǎn)集群將這段時間內(nèi)的所有交易排序打包,形成交易區(qū)塊并進(jìn)行廣播,所有提交節(jié)點(diǎn)接收交易區(qū)塊并生成賬本信息, 實(shí)現(xiàn)交易數(shù)據(jù)的上鏈操作。
圖5 Hyperledger Fabric 區(qū)塊鏈系統(tǒng)共識達(dá)成過程
對基于Hyperledger Fabric 的食品溯源系統(tǒng)的設(shè)計共分為三部分, 分別為網(wǎng)絡(luò)模塊設(shè)計、 智能合約模塊設(shè)計以及接口模塊設(shè)計。
網(wǎng)絡(luò)模塊設(shè)計主要建立牛奶溯源系統(tǒng)的區(qū)塊鏈內(nèi)部邏輯,牛奶溯源系統(tǒng)的區(qū)塊鏈內(nèi)部邏輯結(jié)構(gòu)如圖6 所示。
參與到整個牛奶溯源系統(tǒng)中的參與方分別為生產(chǎn)方、加工方、運(yùn)輸方以及銷售方,每個參與方用一個組織進(jìn)行代表, 每個組織中設(shè)置一個節(jié)點(diǎn)模擬實(shí)際工作情況,對牛奶溯源相關(guān)數(shù)據(jù)進(jìn)行維護(hù)和修改等操作。 各參與方與區(qū)塊鏈組織對應(yīng)關(guān)系如表2 所示。
圖6 牛奶溯源系統(tǒng)的區(qū)塊鏈內(nèi)部邏輯結(jié)構(gòu)圖
智能合約模塊設(shè)計主要包括各參與方的鏈碼名稱命名命及工作內(nèi)容確定。首先根據(jù)牛奶溯源系統(tǒng)中的實(shí)際環(huán)境和工作內(nèi)容,設(shè)置溯源系統(tǒng)中的各個參與方需要維護(hù)的牛奶信息種類,確定智能合約的名稱,具體對應(yīng)關(guān)系如表4 所示。
表4 各參與方維護(hù)信息對應(yīng)表
在本系統(tǒng)中,共需要記錄牛奶的7 項信息。 確定了智能合約的名稱和對應(yīng)功能,對智能合約實(shí)現(xiàn)功能進(jìn)行設(shè)計,主要設(shè)計以下幾個功能:
(1)queryMilk():該功能實(shí)現(xiàn)對牛奶溯源信息的查詢,需要傳入1 個參數(shù),參數(shù)為牛奶編號(如Milk1),查詢結(jié)果返回Milk1 對應(yīng)的相關(guān)信息;
(2)createMilk():該功能需要傳入共8 個參數(shù),第一個參數(shù)為需要創(chuàng)建的牛奶編號,其余7 各參數(shù)分別對應(yīng)牛奶溯源系統(tǒng)中的7 項數(shù)據(jù);
(3)changedata():該功能實(shí)現(xiàn)對指定牛奶相關(guān)信息的修改,需要傳入3 個參數(shù),第1 個參數(shù)指定需要修改的牛奶編號,第2 個參數(shù)指定需要修改的信息標(biāo)簽,第3個參數(shù)為具體修改的值;
(4)getMilkHistory():該功能實(shí)現(xiàn)對指定牛奶的所有歷史信息進(jìn)行查詢,包括信息錄入或修改的記錄,實(shí)現(xiàn)對該牛奶的溯源需求,需要傳入1 個參數(shù),指定想要查詢的牛奶編號。
接口模塊設(shè)計主要通過Fabric-Nodejs-SDK 進(jìn)行實(shí)現(xiàn),主要分為兩個部分,分別為query.js 腳本與invoke.js腳本。 query.js 腳本主要調(diào)用queryMilk()和getMilkHistory()兩種功能;invoke.js 腳本主要調(diào)用createMilk()和changedata()兩種功能。
Hyperledger Fabric 的牛奶溯源系統(tǒng)搭建的硬件環(huán)境采用Ubuntu 虛擬機(jī)完成,利用Docker 容器模擬多機(jī)環(huán)境進(jìn)行封裝,具體性能如表5 所示。
表5 系統(tǒng)搭建硬件環(huán)境
系統(tǒng)搭建的軟件環(huán)境如表6 所示。
環(huán)境搭建完成后,利用Hyperledger Fabric 提供的5 個核心模塊對牛奶溯源系統(tǒng)進(jìn)行實(shí)際搭建。
基于Hyperledger Fabric 的牛奶溯源系統(tǒng)搭建完成后,以Milk1 為例,對相關(guān)功能進(jìn)行測試。
表6 系統(tǒng)搭建軟件環(huán)境
(1)createMilk():創(chuàng)建Milk1,并對Milk1 中的所有溯源信息置空;
(2)queryMilk():對Milk1 進(jìn)行查詢,結(jié)果如圖7 所示,可以看出Milk1 已經(jīng)被創(chuàng)建,且所有溯源信息均為空;
圖7 Milk1 查詢結(jié)果(未錄入)
(3)changedata():對Milk1 中的相關(guān)數(shù)據(jù)進(jìn)行寫入,并再次進(jìn)行queryMilk()操作,結(jié)果如圖8 所示,可以看出Milk1 的相關(guān)信息已經(jīng)改變,溯源信息不再為空;
圖8 Milk1 查詢結(jié)果(已錄入)
(4)getMilkHistory():對Milk1 的歷史信息進(jìn)行查詢,部分結(jié)果如圖9 所示。
圖9 Milk1 歷史記錄查詢結(jié)果(部分)
完成基本功能測試后,對本文設(shè)計的牛奶溯源系統(tǒng)進(jìn)行性能測試,利用多次讀寫的方式對牛奶溯源系統(tǒng)進(jìn)行測試。
編寫腳本對本系統(tǒng)進(jìn)行重復(fù)寫入操作,寫入次數(shù)500 次,實(shí)測區(qū)塊生成平均時長均小于3 s;編寫腳本對牛奶溯源信息進(jìn)行重復(fù)讀取操作,讀取次數(shù)500 次,未發(fā)生錯誤,具備一定的可用性。
本文研究了一種基于Hyperledger Fabric 區(qū)塊鏈的食品溯源系統(tǒng),分析了目前的食品溯源系統(tǒng)存在的問題;同時,對現(xiàn)今主流的區(qū)塊鏈系統(tǒng)進(jìn)行篩選,選定Hyperledger Fabric 聯(lián)盟區(qū)塊鏈平臺構(gòu)建食品溯源系統(tǒng)并進(jìn)行實(shí)際搭建;搭建完成后對食品溯源系統(tǒng)中的相關(guān)功能進(jìn)行了模擬測試,并對整個系統(tǒng)進(jìn)行了簡單的性能測試。
跟據(jù)測得的結(jié)果,本文提出的基于Hyperledger Fabric區(qū)塊鏈的食品溯源系統(tǒng)基本滿足當(dāng)前消費(fèi)者對食品溯源系統(tǒng)的需求,解決了傳統(tǒng)食品溯源系統(tǒng)中存在的數(shù)據(jù)量缺乏、存儲信息中心化等問題,保證了食品溯源數(shù)據(jù)的完整性、有效性與不可篡改性。