景 旭 秦源澤
(西北農(nóng)林科技大學(xué)信息工程學(xué)院, 陜西楊凌 712100)
基于區(qū)塊鏈技術(shù)實(shí)現(xiàn)農(nóng)產(chǎn)品溯源,可以有效提升信息的完整性、可追溯性及可信性,能實(shí)現(xiàn)多個(gè)主體協(xié)作信任,有利于供應(yīng)鏈管理的技術(shù)創(chuàng)新與模式升級(jí)[1-2],對(duì)于提升農(nóng)產(chǎn)品的質(zhì)量保障,進(jìn)而從食源上保證人民生命健康具有重要意義。
基于區(qū)塊鏈技術(shù)的特點(diǎn),國(guó)內(nèi)外學(xué)者在農(nóng)產(chǎn)品溯源方面開(kāi)展了廣泛的研究。YANG等[3]針對(duì)農(nóng)產(chǎn)品追溯系統(tǒng)提出了基于q-ROF集(q-Rung orthopair fuzzy)的設(shè)計(jì)模型選擇決策算法。GEORGE等[4]提出了基于區(qū)塊鏈和產(chǎn)品標(biāo)識(shí)符的餐廳溯源模型,從供應(yīng)鏈的不同利益相關(guān)者獲取數(shù)據(jù)并分離,應(yīng)用食品質(zhì)量指數(shù)(Food quality index,F(xiàn)QI)算法生成FQI值。許繼平等[5]提出了適用于糧油食品供應(yīng)鏈的雙模型存儲(chǔ)機(jī)制和管理供應(yīng)鏈信息的智能合約,實(shí)現(xiàn)了糧油食品供應(yīng)鏈信息的采集、查詢(xún)、監(jiān)控和追溯。葛艷等[6]提出了基于區(qū)塊鏈的危害分析及關(guān)鍵控制點(diǎn)(Hazard analysis and critical control points,HACCP)的質(zhì)量溯源模型,設(shè)計(jì)智能合約實(shí)現(xiàn)溯源數(shù)據(jù)的上下鏈和質(zhì)量自動(dòng)判斷。任守綱等[7]基于信譽(yù)監(jiān)督機(jī)制改進(jìn)了拜占庭容錯(cuò)算法,構(gòu)建了基于聯(lián)盟鏈的農(nóng)作物全產(chǎn)業(yè)鏈信息溯源平臺(tái)??梢钥闯?,在現(xiàn)有基于區(qū)塊鏈的農(nóng)產(chǎn)質(zhì)量溯源研究中,基本上均假設(shè)整個(gè)產(chǎn)業(yè)鏈的生產(chǎn)活動(dòng)在一個(gè)組織內(nèi)完成,并通過(guò)一個(gè)固定溯源碼將各環(huán)節(jié)的生產(chǎn)信息依次記錄在區(qū)塊鏈中,按照既定溯源碼反向追溯實(shí)現(xiàn)溯源。它僅適用于單組織管理的產(chǎn)業(yè)鏈溯源,沒(méi)有考慮產(chǎn)業(yè)鏈分為多個(gè)組織后跨組織溯源的問(wèn)題,導(dǎo)致不同組織在賬本中的數(shù)據(jù)缺乏邏輯上的連續(xù)性與完整性。
在實(shí)際農(nóng)業(yè)生產(chǎn)環(huán)境中,農(nóng)資供應(yīng)、田間生產(chǎn)、場(chǎng)內(nèi)加工與儲(chǔ)藏、電商銷(xiāo)售等生產(chǎn)環(huán)節(jié)在時(shí)間和空間上跨度均比較大[8],所以每個(gè)生產(chǎn)環(huán)節(jié)基本由相互獨(dú)立的組織承擔(dān),在同一個(gè)組織內(nèi)部的不同環(huán)節(jié)也基本由相互獨(dú)立的部門(mén)承擔(dān)。不同組織的生產(chǎn)溯源信息通過(guò)組織間的合同交易關(guān)聯(lián),合同交易一般依賴(lài)第三方中心機(jī)構(gòu)管理。合同交易時(shí),采購(gòu)商向供應(yīng)商發(fā)起采購(gòu)意向書(shū),供應(yīng)商擬定合同,與采購(gòu)商簽署交易合同。雙方均對(duì)合同簽名,合同生效,交易完成。
針對(duì)上述問(wèn)題,結(jié)合生產(chǎn)實(shí)踐中合同交易的過(guò)程,提出一種面向獼猴桃質(zhì)量溯源的聯(lián)盟鏈跨組織鏈上合同交易機(jī)制。將現(xiàn)實(shí)供應(yīng)鏈中交易雙方對(duì)合同條款簽字確認(rèn)的過(guò)程,轉(zhuǎn)移到聯(lián)盟鏈上。通過(guò)兩次鏈上的關(guān)聯(lián)確認(rèn),實(shí)現(xiàn)跨組織的不可否認(rèn)交易。保證交易雙方權(quán)益,無(wú)需依賴(lài)第三方中心機(jī)構(gòu)管理,更好地發(fā)揮供應(yīng)鏈的不同組織在溯源體系中的作用。本文選擇聯(lián)盟鏈搭建獼猴桃全產(chǎn)業(yè)鏈溯源系統(tǒng)的區(qū)塊鏈網(wǎng)絡(luò),借助智能合約技術(shù)將獼猴桃生產(chǎn)的過(guò)程信息價(jià)值化;采用散列值上鏈減輕鏈上壓力;通過(guò)組織間交易合同的合同編號(hào)關(guān)聯(lián)產(chǎn)業(yè)鏈的溯源數(shù)據(jù)、責(zé)任人和責(zé)任企業(yè),組織與組織間的交易合同可使獼猴桃在全產(chǎn)業(yè)鏈的溯源數(shù)據(jù)在鏈上具有邏輯連續(xù)性,當(dāng)單節(jié)點(diǎn)偽造數(shù)據(jù)時(shí),其他環(huán)節(jié)信息無(wú)法追溯,可快速定位到問(wèn)題組織。
按照開(kāi)放程度,區(qū)塊鏈可以劃分為公有鏈[9]、私有鏈[10]和聯(lián)盟鏈[11]。公有鏈的訪(fǎng)問(wèn)門(mén)檻低、節(jié)點(diǎn)數(shù)目過(guò)多、共識(shí)時(shí)間較長(zhǎng)、交易速度慢,不符合交易頻繁的區(qū)塊鏈溯源系統(tǒng)對(duì)性能和效率的要求。私有鏈由中心機(jī)構(gòu)管理,交易不需要所有節(jié)點(diǎn)確認(rèn),違背了去中心化的初衷[12],鏈上數(shù)據(jù)存在被私自修改的可能,不能從根本上解決作弊問(wèn)題。聯(lián)盟鏈?zhǔn)怯啥鄠€(gè)機(jī)構(gòu)共同管理的組織體系,聯(lián)盟鏈的Fabric ca身份認(rèn)證服務(wù)依賴(lài)于PKI體系[13]和密碼技術(shù)[14]以保證網(wǎng)絡(luò)具有安全可靠的準(zhǔn)入制;聯(lián)盟鏈有靈活的智能合約[15]定制機(jī)制,可以滿(mǎn)足供應(yīng)鏈不同組織復(fù)雜多變的業(yè)務(wù)需求;聯(lián)盟鏈可以支持多種共識(shí)機(jī)制[16],交易效率較高,可以滿(mǎn)足用戶(hù)無(wú)感知的溯源需求[17]。在獼猴桃全產(chǎn)業(yè)鏈溯源中,產(chǎn)業(yè)鏈的上下游主體在現(xiàn)實(shí)中既存在競(jìng)爭(zhēng)關(guān)系,也有一定信任關(guān)系,構(gòu)成天然的聯(lián)盟組織鏈條[18-19],因此本研究選用聯(lián)盟鏈搭建獼猴桃全產(chǎn)業(yè)鏈溯源系統(tǒng)的區(qū)塊鏈網(wǎng)絡(luò)。通過(guò)分析獼猴桃從農(nóng)業(yè)合作社采購(gòu)生產(chǎn)資料、田間生產(chǎn)到銷(xiāo)售、運(yùn)輸至消費(fèi)者手中的整個(gè)產(chǎn)業(yè)鏈,本研究將獼猴桃全產(chǎn)業(yè)鏈分為農(nóng)資采購(gòu)、種植采摘、生產(chǎn)加工、質(zhì)檢、銷(xiāo)售物流等5個(gè)生產(chǎn)環(huán)節(jié)。每個(gè)生產(chǎn)環(huán)節(jié)由相互獨(dú)立又相互依賴(lài)的組織承擔(dān),構(gòu)成聯(lián)盟鏈中的組織單位,包括農(nóng)資電商、農(nóng)業(yè)合作社、加工廠(chǎng)、質(zhì)檢部門(mén)、電商平臺(tái)。聯(lián)盟各個(gè)組織在實(shí)際生產(chǎn)中是相互獨(dú)立的實(shí)體,除了農(nóng)資電商、電商平臺(tái)無(wú)生產(chǎn)環(huán)節(jié)外,其余生產(chǎn)組織均有產(chǎn)、購(gòu)、儲(chǔ)、加、銷(xiāo)等環(huán)節(jié),而各個(gè)組織聯(lián)合在一起構(gòu)成了獼猴桃完整的產(chǎn)業(yè)鏈。
每個(gè)組織詳細(xì)記錄獼猴桃當(dāng)前生產(chǎn)過(guò)程的數(shù)據(jù),包括生產(chǎn)基本信息、物聯(lián)網(wǎng)設(shè)備實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù)、生產(chǎn)活動(dòng)記錄等。通過(guò)跨組織鏈上合同交易機(jī)制,完成以上5個(gè)組織生產(chǎn)活動(dòng)溯源數(shù)據(jù)的鏈接,構(gòu)成全產(chǎn)業(yè)鏈的數(shù)據(jù)鏈條閉環(huán)。以消費(fèi)者的訂單號(hào)作為溯源碼,消費(fèi)者通過(guò)溯源碼在賬本中查詢(xún)?cè)撆潍J猴桃在聯(lián)盟鏈內(nèi)不同生產(chǎn)階段的交易合同編號(hào),完成獼猴桃在各個(gè)生產(chǎn)組織有關(guān)產(chǎn)地、獼猴桃品質(zhì)等溯源信息查詢(xún)。消費(fèi)者僅能溯源獼猴桃質(zhì)量相關(guān)的數(shù)據(jù),監(jiān)管部門(mén)溯源到每個(gè)生產(chǎn)環(huán)節(jié)的責(zé)任企業(yè)和責(zé)任人?;诼?lián)盟鏈的獼猴桃全產(chǎn)業(yè)鏈溯源體系結(jié)構(gòu)如圖1所示。
圖1 基于聯(lián)盟鏈的獼猴桃全產(chǎn)業(yè)鏈溯源體系結(jié)構(gòu)Fig.1 Traceability architecture of kiwi fruit industry chain based on consortium blockchain
在圖1中,各組織通過(guò)分工合作形成產(chǎn)業(yè)鏈。農(nóng)資電商平臺(tái)負(fù)責(zé)獼猴桃生產(chǎn)資料的采購(gòu)、儲(chǔ)藏和銷(xiāo)售。農(nóng)業(yè)合作社負(fù)責(zé)農(nóng)資采購(gòu)和獼猴桃的種植、施肥、噴藥、采摘和銷(xiāo)售等過(guò)程。加工廠(chǎng)負(fù)責(zé)獼猴桃的采購(gòu)、分揀、脫毛、糖檢等,并按照品質(zhì)為獼猴桃商品裝箱、冷庫(kù)儲(chǔ)藏和銷(xiāo)售。質(zhì)檢部門(mén)負(fù)責(zé)獼猴桃的質(zhì)量檢測(cè)。電商平臺(tái)負(fù)責(zé)獼猴桃商品采購(gòu)、銷(xiāo)售和物流。組織平臺(tái)的Web服務(wù)器通過(guò)建立資源客戶(hù)端與區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn)連接,使用代表合法身份的數(shù)字證書(shū)[20]與公鑰私鑰[21]證明身份,調(diào)用已安裝的智能合約在聯(lián)盟中進(jìn)行交易。
在圖1中,通過(guò)組織間的協(xié)同與鏈上合同交易實(shí)現(xiàn)產(chǎn)業(yè)鏈的監(jiān)督。通過(guò)對(duì)比跨組織的采購(gòu)合同與銷(xiāo)售合同數(shù)量,監(jiān)管部門(mén)可實(shí)現(xiàn)跨組織全產(chǎn)業(yè)鏈的監(jiān)管;通過(guò)農(nóng)資采購(gòu)量、生產(chǎn)環(huán)境數(shù)據(jù)可預(yù)估合作社的產(chǎn)量,比對(duì)合作社銷(xiāo)售量與預(yù)估值,判斷合作社是否使用劣質(zhì)農(nóng)資;通過(guò)比對(duì)加工廠(chǎng)采購(gòu)量與銷(xiāo)售量,判斷加工廠(chǎng)是否采購(gòu)劣質(zhì)獼猴桃;通過(guò)電商平臺(tái)采購(gòu)量與銷(xiāo)售量比對(duì),判斷是否存在電商平臺(tái)采購(gòu)劣質(zhì)獼猴桃。監(jiān)管部門(mén)通過(guò)比對(duì)各個(gè)組織在賬本中的采購(gòu)合同與銷(xiāo)售信息可監(jiān)管每個(gè)環(huán)節(jié)交易量,實(shí)現(xiàn)獼猴桃全產(chǎn)業(yè)鏈的質(zhì)量監(jiān)測(cè),以及發(fā)生質(zhì)量問(wèn)題時(shí)可追責(zé)至具體企業(yè)與責(zé)任人。
在聯(lián)盟鏈的合同交易過(guò)程中,交易合同由聯(lián)盟鏈內(nèi)所有組織成員節(jié)點(diǎn)共同管理。不同階段的合同交易業(yè)務(wù)對(duì)應(yīng)不同鏈碼,客戶(hù)端通過(guò)SDK提供的API構(gòu)建交易提案請(qǐng)求,并使用代表客戶(hù)端合法身份的證書(shū)對(duì)交易簽名(sign),sign過(guò)程對(duì)應(yīng)實(shí)際供應(yīng)鏈交易方簽署合同的過(guò)程。客戶(hù)端發(fā)起交易提案后,將事務(wù)提交給背書(shū)節(jié)點(diǎn)進(jìn)行背書(shū)簽名;收集到足夠數(shù)量的簽名后,將交易發(fā)送給排序節(jié)點(diǎn)打包成區(qū)塊;區(qū)塊被發(fā)送到主節(jié)點(diǎn),主節(jié)點(diǎn)傳播給記賬節(jié)點(diǎn),完成記賬后交易結(jié)束。利用靈活的智能合約體系和聯(lián)盟鏈的不可篡改[22]、時(shí)間戳[23-24]等特性,可以有效地將繁雜耗時(shí)的合同簽署過(guò)程用交易雙方兩次鏈上合同交易生成交易的方式保存在區(qū)塊鏈賬本中。
以加工廠(chǎng)與電商組織的交易流程為例,聯(lián)盟鏈內(nèi)跨組織鏈上合同交易流程如圖2所示。
圖2 聯(lián)盟鏈內(nèi)跨組織鏈上合同交易流程Fig.2 Cross-organization contract transaction process within consortium blockchain
詳細(xì)步驟包括:
(1)電商采購(gòu)方按照采購(gòu)計(jì)劃在加工廠(chǎng)銷(xiāo)售平臺(tái)填寫(xiě)采購(gòu)單,包括品名、數(shù)量、價(jià)格、交易平臺(tái)信息、采購(gòu)人信息等,系統(tǒng)生成一個(gè)采購(gòu)單號(hào)(SaleOrderNum)。為將責(zé)任實(shí)體信息與采購(gòu)信息關(guān)聯(lián),以保證責(zé)任實(shí)體信息完整性和減輕鏈上壓力,采用sha256安全散列算法[25]生成實(shí)體信息的散列值,將實(shí)體信息標(biāo)識(shí)、實(shí)體信息的散列值和采購(gòu)信息共同上鏈。采購(gòu)訂單的具體數(shù)據(jù)項(xiàng)見(jiàn)表1。
(2)加工廠(chǎng)客戶(hù)端通過(guò)創(chuàng)建資源客戶(hù)端以連接peer0.factory.itcast.cn節(jié)點(diǎn)(FactoryNode),電商平臺(tái)客戶(hù)端以相同方式連接peer0.dj.itcast.cn節(jié)點(diǎn)(DsNode)。在合同交易前,兩個(gè)節(jié)點(diǎn)需要安裝相同的鏈碼,負(fù)責(zé)兩組織合同交易及相關(guān)業(yè)務(wù)。加工廠(chǎng)銷(xiāo)售平臺(tái)自動(dòng)判斷庫(kù)存是否滿(mǎn)足電商采購(gòu)單的需求;確認(rèn)信息無(wú)誤后,將訂單信息作為交易合同的內(nèi)容,通過(guò)FactoryNode調(diào)用智能合約將銷(xiāo)售合同信息上鏈,實(shí)現(xiàn)向聯(lián)盟鏈發(fā)起銷(xiāo)售合同交易;將加工廠(chǎng)本地?cái)?shù)據(jù)庫(kù)中銷(xiāo)售單狀態(tài)變更為3,等待電商組織向區(qū)塊鏈發(fā)起采購(gòu)合同交易。
表1 采購(gòu)訂單數(shù)據(jù)項(xiàng)Tab.1 Purchase order data items
(3)電商采購(gòu)方通過(guò)DsNode在當(dāng)前通道賬本中查詢(xún)加工廠(chǎng)銷(xiāo)售交易合同信息,調(diào)用智能合約發(fā)起采購(gòu)確認(rèn),達(dá)成合同交易;對(duì)應(yīng)state的key值是S+SaleOrderNum,value是訂單信息散列值與采購(gòu)方信息散列值;當(dāng)采購(gòu)意向合同交易完成后,將電商本地?cái)?shù)據(jù)庫(kù)的采購(gòu)單狀態(tài)變更為1,采購(gòu)入庫(kù)完成。
(4)加工廠(chǎng)銷(xiāo)售方以S+SaleOrderNum為state的key值,通過(guò)FactoryNode在當(dāng)前通道賬本中查詢(xún)采購(gòu)交易合同信息;確認(rèn)無(wú)誤后,對(duì)加工廠(chǎng)數(shù)據(jù)庫(kù)的銷(xiāo)售單的狀態(tài)變更為1,銷(xiāo)售出庫(kù)完成。采購(gòu)方、銷(xiāo)售方的鏈上交易完成,并且雙方組織的本地?cái)?shù)據(jù)庫(kù)入庫(kù)、出庫(kù)均完成,跨組織鏈上合同交易完成。
采購(gòu)合同單編號(hào)生成算法OrderPost表示采購(gòu)員提交訂單(輸入數(shù)據(jù)+責(zé)任實(shí)體信息散列)獲取采購(gòu)合同編號(hào),其中,QueryByMonkeyPickAndCount表示按訂單品名和數(shù)量查找前一生產(chǎn)階段的銷(xiāo)售交易合同編號(hào);QueryBySaleId表示按照電商平臺(tái)工商號(hào)查詢(xún)平臺(tái)信息;QueryByFacotryId表示按照加工廠(chǎng)工商號(hào)查詢(xún)加工廠(chǎng)信息;QueryByCustomer表示按照采購(gòu)員工號(hào)查詢(xún)采購(gòu)員信息;Hash表示使用sha256算法對(duì)參數(shù)生成定長(zhǎng)的散列值;Left(20,str)表示對(duì)字符串取前20位操作;CurNum表示合同編號(hào)。采購(gòu)合同單編號(hào)生成如算法1所示。
算法1:OrderPost(FactoryId;SaleId;OrderCustomerId;MonkeyPick;Count;OrderDate;Price);
輸入:{FactoryId; SaleId; OrderCustomerId ; MonkeyPick; Count; OrderDate; Price};
輸出:{CurNum};
CoopSaleInfoNum= QueryByMonkeyPickAndCount(MonkeyPick, Count)
SaleHash = Hash(QueryBySaleId(SaleId))
FactoryHash= Hash(QueryByFacotryId(FacotyId))
OrderCustomerHash = Hash(QueryByCustomerId (CustomerId))
CurNum = Left(20, Hash(PreOrgNum,OrderCustomerId,OrderCustomerHash, Price))
return CurNum
加工廠(chǎng)發(fā)起銷(xiāo)售合同交易算法,Trade表示加工廠(chǎng)客戶(hù)端將銷(xiāo)售交易合同(業(yè)務(wù)處理過(guò)的數(shù)據(jù)args[])上鏈。其中,stub.GetState()_length表示判斷當(dāng)前通道賬本中是否存在state的key值為“F+args[0]”的交易合同;TradeContent表示交易合同結(jié)構(gòu)體,all_fileds表示交易合同結(jié)構(gòu)體的具體數(shù)據(jù)項(xiàng),對(duì)應(yīng)表1字段2~12;Marsh表示將交易合同結(jié)構(gòu)體的格式轉(zhuǎn)換成可上鏈的json格式。加工廠(chǎng)發(fā)起銷(xiāo)售合同交易如算法2所示。
算法2:(this*TracePlantCC)Trade(stub shim.ChaincodeStubInterface, args[]string)peer.Response;
輸入:{args[]};
輸出:{更新區(qū)塊鏈賬本new_chain };
if stub.GetState("F"+args[0])_length != 0;
return Exit
else:
var tradeInfo TradeContent:
var i =1;
for field in all_fileds:
tradeInfo.filed <- args[i++]
new_chain = stub.PutState("F"+args[0], Marsh(tradeInfo));
return
在聯(lián)盟內(nèi)跨組織鏈上合同交易流程中,各組織可采用當(dāng)前組織的采購(gòu)交易合同編號(hào)作為溯源碼。每個(gè)組織的交易合同編號(hào)與前一個(gè)生產(chǎn)組織交易合同編號(hào)在鏈上直接關(guān)聯(lián),隨著生產(chǎn)流程和組織交易動(dòng)態(tài)生成。消費(fèi)者最終的訂單編號(hào)生成規(guī)則同組織交易合同編號(hào)規(guī)則類(lèi)似,消費(fèi)者訂單編號(hào)與電商采購(gòu)獼猴桃的交易合同編號(hào)直接關(guān)聯(lián)。這種類(lèi)似merkle樹(shù)[26]結(jié)構(gòu)的交易合同編號(hào)編碼方式,使得聯(lián)盟鏈的每個(gè)組織的交易合同在賬本中構(gòu)成一條完整的合同鏈條。
本文以陜西齊峰果業(yè)有限公司的獼猴桃全產(chǎn)業(yè)鏈為研究模型,包含產(chǎn)前、產(chǎn)中和產(chǎn)后多階段,是關(guān)聯(lián)農(nóng)資采購(gòu)、種植采摘、生產(chǎn)加工、第三方質(zhì)檢、物流銷(xiāo)售等多環(huán)節(jié)的完整鏈狀結(jié)構(gòu)。本文研究跨組織鏈上合同交易業(yè)務(wù)場(chǎng)景下的溯源平臺(tái)要求參與方之間信息共享、風(fēng)險(xiǎn)共擔(dān),最終實(shí)現(xiàn)“多贏(yíng)”。溯源信息來(lái)源于物聯(lián)網(wǎng)設(shè)備數(shù)據(jù)、第三方檢測(cè)數(shù)據(jù)、生產(chǎn)活動(dòng)信息等。每個(gè)組織的溯源信息及責(zé)任實(shí)體散列值通過(guò)智能合約記錄到聯(lián)盟鏈通道賬本中,并以當(dāng)前組織采購(gòu)交易合同編號(hào)作為溯源碼對(duì)組織內(nèi)獼猴桃生產(chǎn)溯源信息進(jìn)行記錄和追溯。
圖3 聯(lián)盟內(nèi)溯源信息邏輯結(jié)構(gòu)Fig.3 Logical structure of traceability information within consortium blockchain
根據(jù)聯(lián)盟鏈跨組織鏈上合同交易機(jī)制,結(jié)合獼猴桃全產(chǎn)業(yè)鏈溯源業(yè)務(wù)的實(shí)際需求,針對(duì)各個(gè)組織設(shè)計(jì)了一種單個(gè)生產(chǎn)環(huán)節(jié)溯源數(shù)據(jù)的存儲(chǔ)方案。某一環(huán)節(jié)的鏈上溯源數(shù)據(jù)包括溯源信息散列值,責(zé)任人身份證號(hào)、責(zé)任組織工商號(hào)與其信息散列值。具體鏈下溯源數(shù)據(jù)和責(zé)任實(shí)體明文信息存儲(chǔ)在各自組織的數(shù)據(jù)庫(kù)中。實(shí)現(xiàn)“鏈上鏈下雙存儲(chǔ)”的數(shù)據(jù)存儲(chǔ)方案,提供了對(duì)同一批次的獼猴桃與生產(chǎn)活動(dòng)、責(zé)任人、責(zé)任企業(yè)等信息進(jìn)行關(guān)聯(lián)的數(shù)據(jù)化方案。追溯數(shù)據(jù)采用Key-Value的方式進(jìn)行存儲(chǔ),將生產(chǎn)環(huán)節(jié)責(zé)任人身份證號(hào)(IdNumber)、責(zé)任人信息散列值(staffHash)、本地?cái)?shù)據(jù)庫(kù)溯源信息記錄標(biāo)識(shí)(InfoId)和溯源信息散列值(InfoHash)封裝,作為Value寫(xiě)入賬本,Key則采用當(dāng)前生產(chǎn)階段字母+當(dāng)前組織訂單編號(hào)的組合,作為賬本Value中InfoId的索引和唯一標(biāo)識(shí)。
在溯源系統(tǒng)內(nèi),不同組織平臺(tái)通過(guò)聯(lián)盟鏈內(nèi)跨組織鏈上合同交易機(jī)制,保證各個(gè)組織的溯源信息在區(qū)塊鏈內(nèi)邏輯具有完整性與一致性。鏈上的采購(gòu)、銷(xiāo)售合同交易經(jīng)過(guò)聯(lián)盟組織的成員節(jié)點(diǎn)共識(shí)后以交易的方式記錄在賬本中,交易信息公開(kāi)透明。通過(guò)消費(fèi)者溯源碼與各個(gè)組織的交易合同編號(hào)對(duì)一個(gè)批次的獼猴桃進(jìn)行標(biāo)識(shí),實(shí)際生產(chǎn)活動(dòng)中,各個(gè)組織以生產(chǎn)環(huán)節(jié)首字母和組織的交易合同編號(hào)作為state的key值,按照追溯數(shù)據(jù)鏈上存儲(chǔ)結(jié)構(gòu),對(duì)當(dāng)前組織內(nèi)所有生產(chǎn)環(huán)節(jié)的溯源數(shù)據(jù)依次上鏈。電商平臺(tái)與加工廠(chǎng)、加工廠(chǎng)與合作社、合作社與農(nóng)資平臺(tái)之間的交易合同編號(hào)在聯(lián)盟內(nèi)形成一條完整的鏈,各個(gè)交易合同編號(hào)又對(duì)各個(gè)組織溯源信息進(jìn)行關(guān)聯(lián),進(jìn)而將整個(gè)聯(lián)盟內(nèi)同一批次獼猴桃的溯源信息在賬本中關(guān)聯(lián)成一條完整的鏈。聯(lián)盟內(nèi)溯源信息邏輯結(jié)構(gòu)如圖3所示。
以加工廠(chǎng)工序?yàn)槔榻B溯源數(shù)據(jù)上鏈流程。加工廠(chǎng)從合作社采購(gòu)一批獼猴桃,需要經(jīng)過(guò)臨時(shí)儲(chǔ)藏、脫毛、糖分檢測(cè)、質(zhì)量測(cè)量、第三方抽樣、裝箱包裝和冷藏等環(huán)節(jié),加工廠(chǎng)組織使用采購(gòu)合同編號(hào)與生產(chǎn)環(huán)節(jié)首字母作為key值,依次對(duì)各個(gè)生產(chǎn)環(huán)節(jié)溯源數(shù)據(jù)散列值同該環(huán)節(jié)負(fù)責(zé)人、責(zé)任企業(yè)的散列值等信息執(zhí)行上鏈操作。
獼猴桃溯源流程包括:消費(fèi)者和監(jiān)管部門(mén)通過(guò)溯源碼進(jìn)行溯源,通過(guò)最終生成的溯源碼在鏈上獲取各個(gè)組織的溯源碼,分別調(diào)用相應(yīng)的智能合約查詢(xún)各組織的溯源數(shù)據(jù),包括從賬本獲取某一組織的某一個(gè)生產(chǎn)環(huán)節(jié)的溯源數(shù)據(jù)標(biāo)識(shí)、責(zé)任人身份證號(hào)、企業(yè)工商號(hào)與各自散列值。通過(guò)溯源信息標(biāo)識(shí)查詢(xún)組織本地?cái)?shù)據(jù)庫(kù),獲取溯源數(shù)據(jù)與實(shí)體的明文信息,計(jì)算得出對(duì)應(yīng)明文的sha256散列值,以鏈上的散列為標(biāo)準(zhǔn),對(duì)鏈下的溯源數(shù)據(jù)生成散列值進(jìn)行校驗(yàn)。根據(jù)校驗(yàn)結(jié)果,判斷鏈下數(shù)據(jù)是否被篡改,如果發(fā)生篡改,消費(fèi)者端顯示溯源異常,監(jiān)管部門(mén)可進(jìn)一步追責(zé)具體責(zé)任人和責(zé)任企業(yè)。
本文研究了一種面向獼猴桃質(zhì)量溯源的聯(lián)盟鏈跨組織鏈上合同交易機(jī)制,基于這種聯(lián)盟鏈內(nèi)跨組織鏈上合同交易機(jī)制設(shè)計(jì)并實(shí)現(xiàn)了獼猴桃質(zhì)量溯源系統(tǒng)。選擇Hyperledger Farbic 1.4搭建區(qū)塊鏈網(wǎng)絡(luò),操作系統(tǒng)是64位的Ubuntu16.04LTS,內(nèi)存4 GB,磁盤(pán)空間40 GB。測(cè)試環(huán)境如下:
(1)基本環(huán)境:安裝Hyperledger Fabric的依賴(lài)容器服務(wù)docker19.03.6,使用命令行sudo apt install docker.io,完成后安裝應(yīng)用程序docker-compose,使用命令行sudo apt install docker-compose,使用腳本下載fabric鏡像。
(2)溯源系統(tǒng)區(qū)塊鏈網(wǎng)絡(luò):在crypto-config.yaml中配置聯(lián)盟組織與節(jié)點(diǎn)信息,在configtx.yaml中配置創(chuàng)世區(qū)塊和通道(Channel)信息;采用solo共識(shí)算法,將每個(gè)區(qū)塊最大打包時(shí)間間隔為2 s、區(qū)塊的最大交易數(shù)為10筆、區(qū)塊最大字節(jié)數(shù)為32 MB;在docker-compose.yaml中配置網(wǎng)絡(luò)的容器信息,使用cryptogen工具和ca服務(wù)器為聯(lián)盟網(wǎng)絡(luò)生成組織結(jié)構(gòu)和身份文件;使用configtxgen生成創(chuàng)始區(qū)塊和生成通道文件、錨節(jié)點(diǎn)更新文件等;每個(gè)組織配置了鍵值對(duì)數(shù)據(jù)庫(kù)leveldb備份區(qū)塊鏈數(shù)據(jù),運(yùn)行docker-compose up-d啟動(dòng)區(qū)塊鏈網(wǎng)絡(luò)。測(cè)試區(qū)塊鏈網(wǎng)絡(luò)的節(jié)點(diǎn)信息如表2所示。
(3)服務(wù)器與區(qū)塊鏈網(wǎng)絡(luò)交互環(huán)境:組織的Web服務(wù)器通過(guò)Fabric-SDK-Go與區(qū)塊鏈網(wǎng)絡(luò)交互,智能合約實(shí)現(xiàn)組織業(yè)務(wù)邏輯;使用beego框架搭建服務(wù)器,前端使用bootstrap4.0搭建自適應(yīng)頁(yè)面框架;通過(guò)data組件、JQuery和Ajax等進(jìn)行前后端數(shù)據(jù)交互,組織通過(guò)權(quán)限控制管理存儲(chǔ)各組織本地明文信息mysql數(shù)據(jù)庫(kù);終端用戶(hù)使用手機(jī)App或?yàn)g覽器連接組織節(jié)點(diǎn)。
(4)區(qū)塊鏈賬本查看工具:選擇peer0.jg.itcast.cn節(jié)點(diǎn)(可以選擇通道內(nèi)任意peer節(jié)點(diǎn))配置區(qū)塊鏈瀏覽器(Hyperledger Explorer),用于隨時(shí)查看當(dāng)前通道內(nèi)賬本的交易和區(qū)塊信息,包括區(qū)塊高度、區(qū)塊哈希、交易發(fā)起組織、鏈碼信息、背書(shū)節(jié)點(diǎn)等。
(1)跨組織鏈上交易
采購(gòu)人員登陸銷(xiāo)售組織平臺(tái)下單,銷(xiāo)售管理人員驗(yàn)證訂單合法后向區(qū)塊鏈發(fā)起交易,采購(gòu)人員在賬本中查詢(xún)銷(xiāo)售方的銷(xiāo)售意向,最后向區(qū)塊鏈發(fā)起采購(gòu)確認(rèn),如圖4a所示。雙方鏈上合同交易完成,跨組織交易結(jié)束。賬本中對(duì)應(yīng)的合同交易信息如圖4b所示。
圖4 跨組織交易確認(rèn)Fig.4 Inter-organizational transaction confirmation
(2)消費(fèi)者溯源
以消費(fèi)者對(duì)單號(hào)2976e176b0f9726ae4ac溯源為例,在賬本中僅需查找得到加工廠(chǎng)溯源碼452935032f6296b9086a和合作社溯源碼Ob25f0fc68959230a96f。按照各組織溯源碼查詢(xún)鏈上溯源信息id與散列值;根據(jù)id查詢(xún)組織本地?cái)?shù)據(jù)庫(kù),將得到的明文信息拼成字符串;比對(duì)校驗(yàn)拼接字符串的sha256散列值與鏈上對(duì)應(yīng)id的散列值;校驗(yàn)成功后顯示獼猴桃的產(chǎn)地、生產(chǎn)廠(chǎng)家、銷(xiāo)售物流和獼猴桃糖分、農(nóng)藥殘留等質(zhì)量相關(guān)的明文信息,如圖5所示。
圖5 溯源功能結(jié)果Fig.5 Traceability function results
(3)當(dāng)前上鏈交易信息
測(cè)試以加工廠(chǎng)節(jié)點(diǎn)通過(guò)調(diào)用智能合約,上鏈批次c6a5591f41a93e92c253的分揀生產(chǎn)數(shù)據(jù)為例。
通過(guò)Hyperledger Explorer顯示該交易所在的區(qū)塊信息,如圖6a所示,其中區(qū)塊號(hào)(區(qū)塊高度)為2528,區(qū)塊哈希為32bec7de71de4b4f29a46f2aa701cb c7ea057a8170e84afb7f38df ba65450a88,前一區(qū)塊哈希為6ef2f0cd71654ac99ee9ee72952ce81bba625b6db 5c996c03bd33 c9946693209。上鏈交易具體信息如圖 6b所示,其中Txid為dac8e34bbf52873c0bc44e 0239 ff3a8e67989feOe0b616c90550784e5bf07341,調(diào)用鏈碼為FactoryCC,寫(xiě)入賬本state的key為"Ac6a5591f41a93e92c253"(環(huán)節(jié)字母+交易合同編號(hào))、value為"ldNumber:545875188508145 26X,staffHash:c00664771475d987abl24cea6d292eab23eb 87bf46838012116b33151bc3da64,Infold:c6a5591f41 a93e92c253,InfoldHash:b092e4b7b66ac96175ea28dd 4776ba06640d7a5a38561a14894075897d5f9633"(操作人員身份證號(hào)、信息散列值、溯源數(shù)據(jù)號(hào)、溯源信息散列值)等信息。
圖6 交易信息上鏈Fig.6 Uploading transactional information to blockchain
(4)用戶(hù)數(shù)據(jù)上鏈時(shí)間
分別測(cè)試1×104、3×104、5×104、7×104、9×104、1.1×105條記錄的上鏈時(shí)間,取相同記錄運(yùn)行10次的時(shí)間作為上鏈時(shí)間,測(cè)試結(jié)果如圖7所示。
圖7 上鏈交易時(shí)間Fig.7 Time of uploading transactional data to blockchain
由圖7可以看出,用戶(hù)在不同上鏈數(shù)據(jù)條數(shù)下,執(zhí)行一次上鏈操作平均用時(shí)約102 ms,不受賬本中記錄總量影響。這是由于如果網(wǎng)絡(luò)中上鏈交易量不能達(dá)到生成區(qū)塊的交易條數(shù)時(shí),上鏈一條數(shù)據(jù)與配置文件設(shè)置的最大出塊時(shí)間2 s一致,上鏈交易時(shí)間由設(shè)置的出塊條件和共識(shí)算法決定。
(5)鏈上溯源效率
與其他非合同交易機(jī)制的區(qū)塊鏈溯源系統(tǒng)(簡(jiǎn)稱(chēng)非合同機(jī)制)相比,本文溯源模型采用合同交易機(jī)制(簡(jiǎn)稱(chēng)合同機(jī)制)增加了訂單查詢(xún)和校驗(yàn)過(guò)程。通過(guò)測(cè)試state的key鍵遍歷查詢(xún)方法,在賬本數(shù)據(jù)總量分別為1×104、3×104、5×104、7×104、9×104、1.1×105條記錄的條件下,設(shè)置1、200、400、600、800、1 000、1 200批次6組溯源實(shí)驗(yàn)在非合同機(jī)制與合同機(jī)制的查詢(xún)時(shí)間。為了避免偶然性誤差每個(gè)數(shù)據(jù)項(xiàng)都取10次實(shí)驗(yàn)的平均值作為結(jié)果。
非合同機(jī)制與合同機(jī)制的溯源查詢(xún)時(shí)間效率η計(jì)算公式為
(1)
式中tA——聯(lián)盟鏈兩組織交易合同模式下消費(fèi)者進(jìn)行批次溯源的時(shí)間
tB——不使用訂單交易只通過(guò)唯一標(biāo)識(shí)在各組織內(nèi)部進(jìn)行批次溯源的時(shí)間
N=|η(A,B)|,r表示相關(guān)系數(shù),其計(jì)算公式為
(2)
式中 Cov(X,Y)——X、Y的協(xié)方差
D(X)、D(Y)——X、Y的方差
當(dāng)賬本數(shù)據(jù)量相差兩萬(wàn)條數(shù)據(jù)時(shí),查詢(xún)時(shí)間變化很小,對(duì)比賬本中存在104條記錄和1.1×105條記錄查詢(xún)時(shí)間如圖8所示,6組溯源實(shí)驗(yàn)在不同存儲(chǔ)條數(shù)下的N如表3所示。
圖8 查詢(xún)效率對(duì)比Fig.8 Comparison of query efficiency
表3 不同存儲(chǔ)條件下不同批次的溯源效率Tab.3 N of different batches under different storage conditions%
由圖8可以看出,在1×104和1.1×105的存儲(chǔ)條數(shù)下,批次查詢(xún)1 000條完整溯源數(shù)據(jù),查詢(xún)時(shí)間由5.843×104ms變?yōu)?.554×104ms,平均每條完整溯源時(shí)間延長(zhǎng)7.11 ms。
由表3可以得出,在存儲(chǔ)1×104、3×104、5×104、7×104、9×104、1.1×105條記錄的條件下,r=0.097 6,表明查詢(xún)時(shí)間效率變化率與區(qū)塊鏈網(wǎng)絡(luò)中的存儲(chǔ)條數(shù)變化關(guān)系不大。在批次查詢(xún)1、200、400、600、800、1 000、1 200條記錄條件下,r=-0.819,N與批次查詢(xún)條數(shù)呈負(fù)線(xiàn)性相關(guān),且查詢(xún)條數(shù)超過(guò)1 200條后,N趨近0。跨組織鏈上合同交易機(jī)制在實(shí)際溯源系統(tǒng)的應(yīng)用中,隨著溯源批次量增加,對(duì)效率的影響變小。
本文所設(shè)計(jì)聯(lián)盟內(nèi)跨組織鏈上交易合同機(jī)制,相對(duì)于大多數(shù)區(qū)塊鏈溯源系統(tǒng),溯源效率影響很小,在用戶(hù)可接受范圍內(nèi)。
(1)以獼猴桃全產(chǎn)業(yè)鏈生產(chǎn)為研究對(duì)象,提出了聯(lián)盟鏈跨組織鏈上合同交易機(jī)制。該機(jī)制通過(guò)交易雙方在鏈上發(fā)起采購(gòu)合同交易和銷(xiāo)售合同交易,將現(xiàn)實(shí)中雙方簽字確認(rèn)合同的過(guò)程以交易的形式保存在區(qū)塊鏈賬本中。聯(lián)盟鏈的各個(gè)組織使用當(dāng)前組織交易合同編號(hào)作為溯源碼,使得每個(gè)組織的溯源碼與前一生產(chǎn)組織的溯源碼在鏈上直接關(guān)聯(lián),產(chǎn)業(yè)鏈各個(gè)組織的溯源數(shù)據(jù)通過(guò)鏈上環(huán)環(huán)相扣的溯源碼實(shí)現(xiàn)邏輯串聯(lián)。生產(chǎn)環(huán)節(jié)數(shù)據(jù)上鏈時(shí)將溯源數(shù)據(jù)散列值與現(xiàn)實(shí)中代表責(zé)任實(shí)體的標(biāo)識(shí)同散列值一同上鏈,不僅減輕了鏈上數(shù)據(jù)壓力,同時(shí)解決了數(shù)據(jù)庫(kù)主鍵易篡改、追責(zé)效率低等問(wèn)題。通過(guò)跨組織數(shù)據(jù)協(xié)調(diào)校準(zhǔn),實(shí)現(xiàn)監(jiān)管部門(mén)監(jiān)管全產(chǎn)業(yè)鏈。本研究有效解決了實(shí)際生產(chǎn)中同一個(gè)批次獼猴桃溯源信息在多組織的聯(lián)盟鏈賬本的邏輯的連續(xù)性與完整性問(wèn)題,有利于提升獼猴桃質(zhì)量溯源可信度,保障獼猴桃生產(chǎn)質(zhì)量。
(2)基于Hyperledger Fabric搭建了一個(gè)獼猴桃全產(chǎn)業(yè)鏈溯源平臺(tái),實(shí)現(xiàn)了跨組織的鏈上合同交易、消費(fèi)者質(zhì)量溯源和監(jiān)管追責(zé);當(dāng)區(qū)塊鏈網(wǎng)絡(luò)中上鏈交易量較大時(shí),用戶(hù)上鏈一條數(shù)據(jù)的平均時(shí)間約為102 ms;當(dāng)區(qū)塊鏈網(wǎng)絡(luò)中上鏈交易量較小時(shí),上鏈數(shù)據(jù)與最大出塊的平均時(shí)間約為2 s;通過(guò)對(duì)比合同機(jī)制與非合同機(jī)制溯源的查詢(xún)效率,可以看出本系統(tǒng)平均每條完整溯源平均時(shí)間延長(zhǎng)約7.11 ms,在用戶(hù)可接受范圍內(nèi)。