張 斌,李大鵬,蔣 銳,王小明
(南京郵電大學(xué)通信與信息工程學(xué)院,江蘇 南京 210003)
供應(yīng)鏈是通過上游和下游進行聯(lián)系,把商品從生產(chǎn)端流向消費者的一個網(wǎng)狀結(jié)構(gòu)[1],它將供應(yīng)流程中各環(huán)節(jié)企業(yè)進行串聯(lián),提高了企業(yè)間的協(xié)同效率,讓企業(yè)的經(jīng)濟效益實現(xiàn)最大化[2]。供應(yīng)鏈的高效運作是經(jīng)濟發(fā)展的重要保障,但在傳統(tǒng)的供應(yīng)鏈管理模式溯源中,由于供應(yīng)鏈環(huán)節(jié)參與者較多、管理結(jié)構(gòu)復(fù)雜等原因?qū)е缕涿媾R著以下瓶頸:如信息不能夠得到有效的共享、數(shù)據(jù)追蹤比較復(fù)雜且信息不具有完全可信性等[3]。這些問題會造成消費者對其購買商品產(chǎn)生信任危機,同時市場秩序也會由于不良商家的不誠信行為產(chǎn)生不穩(wěn)定因素[4]。
區(qū)塊鏈是一種新興技術(shù),它具有去中心化、不可篡改、匿名性和數(shù)據(jù)可追溯的特點,這些特點使得它在解決傳統(tǒng)溯源系統(tǒng)中帶有天然的信任優(yōu)勢[5]。該技術(shù)可以在不完全可信的環(huán)境中實現(xiàn)可信的數(shù)據(jù)管理,同時也能夠記錄2個主體之間的交易,而無需中介機構(gòu)的干預(yù)[6]。隨著區(qū)塊鏈技術(shù)的發(fā)展,人們普遍認為其可以顛覆性地改變社會現(xiàn)有的信任問題[7]。
為了從區(qū)塊鏈技術(shù)中受益,各個行業(yè)都在積極地對其進行研究[8]。Rewatkar等人[9]把區(qū)塊鏈技術(shù)與電子投票系統(tǒng)進行結(jié)合,保證了選民身份和選票的安全,有助于建立對選舉制度的信任。Subramanian等人[10]將物聯(lián)網(wǎng)技術(shù)與區(qū)塊鏈技術(shù)相結(jié)合,構(gòu)建了二手電動車供應(yīng)鏈交易平臺,從而各參與方可以產(chǎn)生信任、透明、不可變的記錄。陳飛等人[11]利用區(qū)塊鏈技術(shù)對食品的信息進行溯源,解決了供應(yīng)鏈中各企業(yè)之間的信任問題。張朝棟等人[12]結(jié)合區(qū)塊鏈和側(cè)鏈技術(shù)實現(xiàn)了供應(yīng)鏈溯源,保證了溯源數(shù)據(jù)的不可篡改性同時也提高了系統(tǒng)的吞吐量。Chen等人[13]將區(qū)塊鏈技術(shù)與人員信息管理相結(jié)合,為提高區(qū)塊鏈系統(tǒng)的存儲能力,提出把明文數(shù)據(jù)根據(jù)數(shù)據(jù)的重要程度進行分割,重要數(shù)據(jù)直接上鏈,不重要的數(shù)據(jù)存儲在數(shù)據(jù)庫中并對其進行哈希運算得到哈希值,哈希值存儲在鏈上。
在上文所提利用區(qū)塊鏈技術(shù)解決對應(yīng)領(lǐng)域問題中,都是直接把溯源數(shù)據(jù)的部分或全部存儲在區(qū)塊鏈上,由于區(qū)塊鏈技術(shù)的特點使得它在面對溯源這種存在大量數(shù)據(jù)的場景時存儲能力會成為系統(tǒng)的主要瓶頸。由此本文提出一種鏈下擴展存儲方案,該方案通過結(jié)合中心化存儲和區(qū)塊鏈技術(shù)各自的優(yōu)勢,把明文數(shù)據(jù)存儲在中心化數(shù)據(jù)庫中,明文數(shù)據(jù)的哈希值和對哈希值進行簽名的簽名值存儲在區(qū)塊鏈上。最后采用以太坊區(qū)塊鏈對上述方案進行實現(xiàn)并測試,測試結(jié)果表明,本文所提方案能夠提升溯源系統(tǒng)整體的響應(yīng)速度且減少溯源數(shù)據(jù)占用區(qū)塊鏈中的內(nèi)存。
區(qū)塊鏈技術(shù)最早可以追溯到2008年11月1日,中本聰在“密碼朋克”表發(fā)了一篇題為《比特幣:一種點對點式的電子現(xiàn)金系統(tǒng)》的論文。雖然不同版本的區(qū)塊鏈其所針對解決問題的場景有所不同,但它們的系統(tǒng)基礎(chǔ)架構(gòu)基本一致,其結(jié)構(gòu)如圖1所示,主要包含應(yīng)用層、合約層、激勵層、共識層、網(wǎng)絡(luò)層和數(shù)據(jù)層[14]。
數(shù)據(jù)層是用來保存區(qū)塊鏈數(shù)據(jù)的,每個區(qū)塊都由區(qū)塊頭和區(qū)塊體2個部分組成[15]。網(wǎng)絡(luò)層主要包含P2P網(wǎng)絡(luò)架構(gòu)、傳播機制和驗證機制,保證了區(qū)塊鏈上各個節(jié)點數(shù)據(jù)的同步,是礦工挖礦成功后把區(qū)塊同步出去的基礎(chǔ)[16]。共識層的主要功能是實現(xiàn)區(qū)塊鏈網(wǎng)絡(luò)中所有交易的確認,不同的共識算法其所面對的使用場景不同[17]。激勵層的主要功能是對發(fā)行機制和分配機制的實現(xiàn),以此保證數(shù)字貨幣的不斷發(fā)行和對挖礦用戶的獎勵[18]。合約層主要運行智能合約,是實現(xiàn)復(fù)雜業(yè)務(wù)的基礎(chǔ),它為區(qū)塊鏈技術(shù)與實際場景結(jié)合提供了可能[19]。應(yīng)用層主要對區(qū)塊鏈的應(yīng)用場景和案例進行實現(xiàn)。區(qū)塊鏈通過這些技術(shù)的結(jié)合,解決了一直存在的信任構(gòu)建問題[20]。
“智能合約”(Smart Contract)這個術(shù)語至少可以追溯到1995年,它是被尼克·薩博(Nick Szabo)首次提出的。智能合約將一組數(shù)字承諾定義為:一條在程序運行中實施并存儲在區(qū)塊鏈上的協(xié)議[21],它可以通過提供自動交易來促進安全可靠的業(yè)務(wù)活動,而無需外部銀行、法院或公證人等外部金融系統(tǒng)的監(jiān)督[22]。Solidity是實現(xiàn)智能合約的一種編程語言,它可以部署在EVM虛擬機上運行[23]。這種形式的出現(xiàn)簡化了一些重復(fù)性的確認工作。
哈希函數(shù)又稱消息摘要算法,其無需借助任何密鑰就可以將任意長度的二進制值映射成一個固定長度的哈希值[24]。它具有單向不可逆的特性,即對于任意值不管進行多少次哈希運算都會得到相同的結(jié)果,但是不能通過哈希結(jié)果反推原始數(shù)據(jù)的值。如果輸入值產(chǎn)生微小的變化,其得到的結(jié)果也是截然不同的,因此可以利用此特性保證數(shù)據(jù)的完整性和防偽造性[25]。雖然哈希算法有出現(xiàn)哈希碰撞的可能,但概率是極低的,利用哈希碰撞去修改原始數(shù)據(jù)得到相同的哈希值,幾乎是不可能的。
SM2國密算法是由我國國家密碼管理局于2010年發(fā)布的一種非對稱加密算法,加密和解密使用的不是同一個密鑰。相較于RSA加密算法來說,SM2加密算法具有存儲空間小、密鑰生成速度快、加密解密時間短的特點,它不僅保證了消息的完整性,還可驗證消息來源的合法性[26]。本方案中,主要采用該加密算法對數(shù)據(jù)上傳者的身份進行確認,保證信息上傳者身份是可靠的。
在當前的區(qū)塊鏈溯源系統(tǒng)中,主要是結(jié)合區(qū)塊鏈技術(shù)和智能合約對溯源數(shù)據(jù)直接進行鏈上存儲,這會因為溯源數(shù)據(jù)量較大,產(chǎn)生大量內(nèi)存被浪費問題。也有部分系統(tǒng)采用鏈上存儲哈希值的方式對溯源數(shù)據(jù)進行保存,但不能保證信息上傳者身份的可靠性。因此本文結(jié)合SHA-256哈希算法和SM2加密算法,提出一種鏈下擴展存儲方案,其具體設(shè)計將在第2章進行詳細介紹。
在供應(yīng)鏈中主要由原材料生產(chǎn)企業(yè)、運輸企業(yè)、商品生產(chǎn)企業(yè)、商品銷售企業(yè)4類企業(yè)構(gòu)成。一條供應(yīng)鏈中所涉及的企業(yè)集合為Q={q1,q2,…,qn},其中qi需要上鏈的信息集合M={M1,M2,…,Mk}進行表示。數(shù)據(jù)傳遞順序是按照Q集合中的順序進行的,q1是指原材料生產(chǎn)企業(yè),qn表示的是銷售企業(yè)。如果節(jié)點qi在節(jié)點qj前面,即i+1=j,則把qi稱為qj的上游企業(yè),反之則稱qj為qi的下游企業(yè)。
本文提出鏈上數(shù)據(jù)存儲設(shè)計方案是基于以下2點考慮的:1)保證鏈下數(shù)據(jù)的不可篡改性。2)確定數(shù)據(jù)上傳者的身份信息。針對第1點,采用SHA-256哈希算法,利用哈希算法的單向性,保證鏈下數(shù)據(jù)的不可篡改。如果鏈上數(shù)據(jù)有部分被修改,則其得到的哈希結(jié)果是不一樣的。對于第2點,選擇非對稱加密的方式,企業(yè)方使用SM2加密算法產(chǎn)生的私鑰對明文數(shù)據(jù)產(chǎn)生的哈希值進行簽名,保證上傳數(shù)據(jù)者身份是確定的。上鏈信息包含以下2個部分:哈希值和簽名值,其中哈希值如式(1)所示,簽名值如式(2)所示。
Hashi=hash(Hashp,Mi)
(1)
Signi=Signature(Hashi,SKi)
(2)
其中hash是通過SHA-256哈希算法對括號內(nèi)數(shù)據(jù)進行哈希運算的函數(shù)。Hashp表示當前企業(yè)的上游企業(yè)的哈希值,其值可以直接從區(qū)塊鏈上獲取。但在使用前需要利用上游企業(yè)的簽名值對其進行校驗,驗證通過后才能使用,這保證了上游企業(yè)哈希值的可靠性,其校驗方法如式(3)所示。如果簽名值未通過校驗,則拒絕接受上游企業(yè)產(chǎn)品。Hashi表示當前企業(yè)數(shù)據(jù)的哈希值。Signature是通過SM2加密算法對括號內(nèi)的哈希值進行簽名的函數(shù),企業(yè)利用自身私鑰SKi對Hashi進行簽名得到當前企業(yè)上鏈簽名值Signi。在計算當前企業(yè)明文數(shù)據(jù)的哈希值時會包含其上游企業(yè)的哈希值,選擇這種存儲方式是因為當消費者在進行商品驗證時,在獲取鏈下明文數(shù)據(jù)后,只需要讀取最后一個企業(yè)的鏈上哈希值與簽名值即可完成驗證,而不必將所有企業(yè)的鏈上數(shù)據(jù)都進行獲取。通過這種存儲設(shè)計可以提高溯源系統(tǒng)的驗證效率。
res=verifySign(Signi-1,Hashp,PKi-1)
(3)
其中verifySign是對當前簽名進行校驗的函數(shù)。Signi-1為企業(yè)qi-1的簽名值,Hashp表示企業(yè)qi-1存在鏈上的哈希值,PKi-1表示企業(yè)qi-1的公鑰,res為true時則表示驗證通過。
基于2.2節(jié)的鏈上數(shù)據(jù)存儲設(shè)計,本文提出鏈下擴展存儲方案。為說明該方案的流程,首先給出其整體結(jié)構(gòu)如圖2所示。
圖2中上鏈數(shù)據(jù)生成模塊的實現(xiàn)方法如2.2節(jié)所示,它對商品各個環(huán)節(jié)產(chǎn)生的明文數(shù)據(jù)進行處理并把明文數(shù)據(jù)產(chǎn)生的哈希值和簽名值結(jié)果通過部署智能合約的方式存儲在區(qū)塊鏈中。在企業(yè)集合Q中,各企業(yè)數(shù)據(jù)存儲流程如圖3所示。
1)企業(yè)需要把公鑰通過智能合約上傳到鏈上,利用區(qū)塊鏈的不可篡改性保證下游企業(yè)得到的上游企業(yè)公鑰是完全可信的。
2)企業(yè)qi從區(qū)塊鏈上獲取上游企業(yè)qi-1的Hashi-1、Signi-1和PKi-1,并對其進行簽名校驗。
3)如果簽名驗證成功則企業(yè)qi把自身數(shù)據(jù)按照式(1)和式(2)對其明文數(shù)據(jù)Mi進行處理,生成數(shù)據(jù)Hashi和Signi,并把其上傳到鏈上。
4)企業(yè)qi將該企業(yè)鏈上數(shù)據(jù)存儲的位置addressi、明文數(shù)據(jù)Mi和上游企業(yè)數(shù)據(jù)在其對應(yīng)數(shù)據(jù)庫表的存儲位置pid保存在數(shù)據(jù)庫中。id是由數(shù)據(jù)庫按照自增原則自動生成的。
由于q1企業(yè)沒有上游企業(yè),因此它沒有pid字段也不必對鏈上的數(shù)據(jù)進行獲取。qn企業(yè)增加了一個productNum字段,該字段可找到qn企業(yè)的數(shù)據(jù)并且可以通過pid的值向上追蹤獲得商品從原材料到銷售的全部數(shù)據(jù),用于對商品的數(shù)據(jù)進行溯源。
基于區(qū)塊鏈的溯源系統(tǒng)主要是保證商品數(shù)據(jù)的真實性并對錯誤數(shù)據(jù)進行溯源,找到問題企業(yè)。本文提出的鏈下擴展存儲方案溯源數(shù)據(jù)驗證流程如圖4所示。
消費者把商品編號productNum輸入到服務(wù)器端后,服務(wù)器端首先從數(shù)據(jù)庫中得到qn企業(yè)鏈上信息存儲的位置和該商品從q1到qn企業(yè)的所有信息。商品信息按照式(1)所示方式進行哈希運算生成哈希值Hashd,然后通過鏈上信息存儲位置addressn獲得Hashn、Signn和PKn,并對其按照式(3)進行校驗。如果res校驗結(jié)果為true則將Hashd和Hashn進行對比,相同則返回true代表商品數(shù)據(jù)未發(fā)生改變,不同則返回false代表商品信息有誤發(fā)生改變。如果res校驗結(jié)果為false則直接返回,代表商品信息有誤發(fā)生改變。
如果消費者驗證商品信息后發(fā)現(xiàn)商品信息存在部分被篡改的情況,則溯源系統(tǒng)會把數(shù)據(jù)庫中關(guān)于該商品的所有信息按照算法1對問題企業(yè)進行定位。由于當前企業(yè)鏈上存儲的哈希值與其上游企業(yè)的哈希值有關(guān),因此驗證過程中需要從第1個企業(yè)開始進行驗證。其中g(shù)etPK表示從鏈上獲取企業(yè)qi的公鑰,getHash表示從鏈上獲取企業(yè)qi的哈希值,getSign表示從鏈上獲取企業(yè)qi的簽名值。
算法1 問題企業(yè)定位。
輸入:鏈下各企業(yè)數(shù)據(jù)集合Mi和addressi,公鑰存儲合約地址addressp。
輸出:數(shù)據(jù)錯誤企業(yè)集合E。
Begin
E;
Hashb1=getHash(address1)
if(hash(M1) !=Hashb1){
E.add(q1);
}
Hashbpre=Hashb1//保存上游企業(yè)鏈上哈希
for(i=2; i<=n-1; i++){
Hashbi=getHash(addressi)
Hashdi=hash(Hashbpre,Mi)
if(Hashbi!=Hashdi){
E.add(qi)
}
Hashbpre=Hashbi
}
PK=getPK(addressp,qn)
Hashbn=getHash(addressn)
Signn=getSign(addressn)
res=verifySign(Signn,Hashbn,PKn)
if(res==false||hash(Hashbpre,Mn) !=Hashbn){
return E.add(qn)
}
return E;
End
q1沒有上游企業(yè),所以單獨對其數(shù)據(jù)進行校驗。除qn企業(yè)外其他企業(yè)的鏈上簽名值已經(jīng)在數(shù)據(jù)進行傳遞的過程中完成了校驗,如果其簽名值有誤,則不會再有后續(xù)流程,因而在進行問題企業(yè)定位時直接將鏈下數(shù)據(jù)的哈希值與鏈上存儲的哈希值進行對比即可。對于qn企業(yè)沒有下游企業(yè),其簽名值未經(jīng)過校驗,需要單獨對其執(zhí)行一次簽名值校驗過程。下游不能保證上游企業(yè)鏈下數(shù)據(jù)的可靠性,所以在下游企業(yè)進行哈希運算時代入的上游企業(yè)哈希值是在上輪校驗時從鏈上得到的,每輪校驗結(jié)束時需要對其進行更新。通過驗證n次即可發(fā)現(xiàn)數(shù)據(jù)發(fā)生變更的企業(yè)集合E。
系統(tǒng)技術(shù)架構(gòu)如圖5所示。
溯源系統(tǒng)使用B/S架構(gòu),在服務(wù)器端選擇Java語言進行實現(xiàn),采用Spring+SpringMVC+MyBatis的開源框架對用戶端發(fā)送的信息進行分層處理,減少系統(tǒng)整體的耦合性。Web3j是Java應(yīng)用與區(qū)塊鏈網(wǎng)絡(luò)進行數(shù)據(jù)交互的一個輕量級Java開發(fā)庫,實現(xiàn)了JSON RPC接口的協(xié)議封裝。對于用戶展示層采用BootStrap+jQuery+JSP完成與用戶交互界面的搭建,方便企業(yè)對溯源數(shù)據(jù)進行上傳和查詢。本次實驗選用Ganache作為以太坊網(wǎng)絡(luò),它是基于本地內(nèi)存的以太坊測試網(wǎng)絡(luò),主要用于開發(fā)和測試,實現(xiàn)了真實以太坊網(wǎng)絡(luò)的完整功能。
企業(yè)產(chǎn)生數(shù)據(jù)的明文存儲在數(shù)據(jù)庫中。結(jié)合供應(yīng)鏈管理系統(tǒng)的場景,本次設(shè)計包含以下5類表:原材料生產(chǎn)企業(yè)信息表、運輸企業(yè)信息表、商品生產(chǎn)企業(yè)信息表、商品銷售信息表和企業(yè)登錄信息表。
原材料生產(chǎn)企業(yè)信息表如表1所示,原材料信息合約地址是原材料數(shù)據(jù)哈希值與簽名值在區(qū)塊鏈中的存儲位置,可以通過加載該合約地址獲取到鏈上存儲的哈希值與簽名值。
表1 原材料生產(chǎn)企業(yè)信息表
運輸企業(yè)信息表如表2所示,pid字段用來對上游企業(yè)信息進行定位。為了對比上鏈數(shù)據(jù)中只包含文本數(shù)據(jù)和哈希值與簽名值2種方案占用內(nèi)存的大小,在運輸和銷售階段不再添加該環(huán)節(jié)產(chǎn)生的圖片信息。
表2 運輸企業(yè)信息表
商品生產(chǎn)企業(yè)信息表如表3所示。
表3 商品生產(chǎn)企業(yè)信息表
銷售企業(yè)信息表如表4所示,其中product_num字段表示商品編號,用于追蹤校驗。
表4 商品銷售企業(yè)信息表
企業(yè)登錄信息表如表5所示。其中用戶以太坊地址用于企業(yè)賬戶與鏈上數(shù)據(jù)交互。duty字段為自定義的字段,該字段不同值代表了不同的用戶身份,其中1表示原材料生產(chǎn)企業(yè),2表示運輸企業(yè),3表示商品生產(chǎn)企業(yè),4表示商品銷售企業(yè)。
表5 企業(yè)登錄信息表
在區(qū)塊鏈溯源系統(tǒng)中,智能合約是用戶對數(shù)據(jù)上鏈的一種規(guī)范約束,它使用編程語言Solidity在Remix開發(fā)平臺上進行開發(fā)[27]。在智能合約的設(shè)計上,本次設(shè)計總共分為2個合約:企業(yè)公鑰保存合約和信息存儲合約。
企業(yè)公鑰保存合約是由平臺監(jiān)管方進行部署的,也只有平臺監(jiān)管方才能夠?qū)ζ髽I(yè)公鑰進行上傳。其變量和函數(shù)如表6所示。
表6 企業(yè)公鑰保存合約中的變量與函數(shù)
平臺監(jiān)管方通過setEnterprisePK對企業(yè)進行注冊并上傳企業(yè)公鑰,在企業(yè)上傳數(shù)據(jù)時需要通過ifLegitimate函數(shù)先對其賬戶地址進行校驗,如果該企業(yè)公鑰沒有在企業(yè)公鑰保存合約中存儲則拒絕其上傳企業(yè)數(shù)據(jù)請求。下游企業(yè)通過getPK函數(shù)對上游企業(yè)的公鑰進行獲取。
信息存儲合約是由企業(yè)在上傳信息時進行部署的。其變量和函數(shù)如表7所示。
表7 信息存儲合約中的變量與函數(shù)
合約中的哈希值和簽名值是在部署合約時通過構(gòu)造函數(shù)傳入的。為保證同一信息只能夠使用一次,合約中設(shè)置一個標志finishFlag。下游企業(yè)在對當前企業(yè)數(shù)據(jù)驗證時,finishFlag必須是false,當把物品交由下游企業(yè)后當前企業(yè)需對該標志狀態(tài)進行更改,任何人都不能再對哈希值與簽名值進行更改,避免同一標簽再次復(fù)活。在還沒有對物品交付前,防止企業(yè)因為疏忽輸錯數(shù)據(jù),允許企業(yè)通過updateValue函數(shù)對其鏈上值進行修改,但只允許修改1次,修改完成后需要把標志modifyFlag設(shè)置為true。
溯源系統(tǒng)需要對企業(yè)注冊、商品信息上傳和溯源查詢等功能進行實現(xiàn)。其中企業(yè)注冊頁面如圖6所示。
當用戶注冊完成,并認證通過后服務(wù)器會把SM2加密算法生成的私鑰通過郵件的方式通知企業(yè)進行保存,公鑰則上傳到鏈上用于下游企業(yè)對上游企業(yè)的加密數(shù)據(jù)進行驗證。企業(yè)在上傳生產(chǎn)信息時需要將私鑰同時進行上傳,保證上傳者身份是可靠的。
商品生產(chǎn)企業(yè)創(chuàng)建商品信息頁面如圖7所示。
其上傳信息與表3中需要上傳的一致,上游企業(yè)相關(guān)聯(lián)的id是通過上傳上游企業(yè)合約地址進行獲取的,企業(yè)私鑰用于對當前企業(yè)產(chǎn)生數(shù)據(jù)進行簽名,對于表3中在該頁面沒有上傳的值可以直接從登錄用戶中進行獲取。另外3類企業(yè)上傳信息頁面與本頁面類似,只是上傳的數(shù)據(jù)不同,不再進行展示。
當消費者拿到商品后,可以通過商品的編號在溯源查詢頁面進行查詢。為驗證本方案的可行性,簡化了溯源流程,對每一類企業(yè)只包含了一個節(jié)點。查詢結(jié)果如圖8所示。
在頁面的最下方展示了溯源數(shù)據(jù)的驗證結(jié)果。如果數(shù)據(jù)正確則展示溯源數(shù)據(jù)未被更改,如果錯誤會展示溯源數(shù)據(jù)被更改和數(shù)據(jù)有問題的企業(yè)的集合。
本系統(tǒng)實現(xiàn)是在Windows環(huán)境下進行的,固態(tài)硬盤容量是512 GB,內(nèi)存大小為16 GB,處理器使用的是AMD R7 4800H。系統(tǒng)軟件開發(fā)環(huán)境版本如表8所示。
表8 系統(tǒng)軟件開發(fā)環(huán)境版本
首先對溯源數(shù)據(jù)全部上鏈數(shù)據(jù)和本文所提方案在內(nèi)存占用上進行對比。通過記錄10次二者存儲上鏈數(shù)據(jù)大小后取平均值,其對比結(jié)果如表9所示。
表9 上鏈數(shù)據(jù)占用內(nèi)存大小對比
本文所提出的方案只需要每個企業(yè)把所產(chǎn)生數(shù)據(jù)的哈希值和簽名值存儲到區(qū)塊鏈中即可,SHA-256加密后的大小為32 B,SM2簽名要經(jīng)過ASN.1編碼,其長度在70~72 B變化,因此上鏈數(shù)據(jù)占用內(nèi)存的大小在102~104 B之間。溯源數(shù)據(jù)全部上鏈時,由于在設(shè)計運輸信息和銷售信息中未涉及圖片的存儲以用來對溯源數(shù)據(jù)只包含文本數(shù)據(jù)形成對照,在這2個環(huán)節(jié)鏈上存儲數(shù)據(jù)的大小略小于本文方案,但在原材料信息和生產(chǎn)信息中其內(nèi)存占用大小明顯大于本文所提方案。
最后對溯源數(shù)據(jù)全部上鏈和本文所提方案2種方式的數(shù)據(jù)上傳響應(yīng)時間和溯源信息校驗時間2方面進行對比,其結(jié)果分別如圖9和表10所示。
表10 溯源信息校驗時間對比
在各企業(yè)對商品各階段信息進行上傳時分別在合約部署前和部署后對系統(tǒng)時間進行讀取,然后把其相減即可得到合約部署響應(yīng)時間。由圖9中可以看出,在上鏈數(shù)據(jù)值有文字信息時二者響應(yīng)時間幾乎相同,但如果企業(yè)需要保存圖片信息時,二者響應(yīng)時間差別較大。因此本方案在一定程度上可以提高系統(tǒng)對溯源數(shù)據(jù)保存的響應(yīng)速度。
當輸入商品編號后,在商品溯源信息開始校驗前與校驗完成后分別對系統(tǒng)當前時間進行讀取,然后相減得到溯源信息驗證時間。溯源數(shù)據(jù)全部上鏈時不會存在溯源數(shù)據(jù)發(fā)生篡改,因此不存在問題企業(yè)定位環(huán)節(jié)。本方案在溯源信息沒有被篡改的條件下驗證時間遠小于溯源數(shù)據(jù)全部上鏈的時間,即使是溯源信息出現(xiàn)錯誤,對問題企業(yè)定位所花費的時間也較短。
本文針對溯源數(shù)據(jù)全部上鏈會產(chǎn)生占用內(nèi)存較大增加溯源系統(tǒng)的維護成本和降低系統(tǒng)的響應(yīng)速度的問題,提出一種鏈下擴展存儲方案。該方案通過SHA-256哈希算法和SM2加密算法,在保證數(shù)據(jù)的可靠性、可溯源性和數(shù)據(jù)不可被篡改的條件下減少了鏈上數(shù)據(jù)的存儲大小,提高了區(qū)塊鏈的擴展性。最后通過以太坊區(qū)塊鏈對所提方案進行實現(xiàn),經(jīng)過性能評估,表明該方案在上鏈數(shù)據(jù)存儲內(nèi)存的占用遠小于數(shù)據(jù)全部上鏈,而在進行合約部署時的響應(yīng)時間和溯源信息校驗時間上有一定的提高。在后續(xù)工作中,可以考慮對區(qū)塊鏈共識算法進行優(yōu)化,以進一步提升區(qū)塊鏈與供應(yīng)鏈溯源結(jié)合的實用性和可靠性。