張學(xué)旺,馮家琦,殷梓杰,林金朝
1.重慶郵電大學(xué)軟件工程學(xué)院,重慶400065
2.重慶大學(xué)微電子與通信工程學(xué)院,重慶400044
隨著信息技術(shù)的快速發(fā)展,數(shù)據(jù)的產(chǎn)生和流轉(zhuǎn)快速增長(zhǎng)。海量的數(shù)據(jù)通過網(wǎng)絡(luò)在不同應(yīng)用系統(tǒng)之間共享融合,使得數(shù)據(jù)的產(chǎn)生方式和流轉(zhuǎn)方式呈現(xiàn)出多樣性、復(fù)雜性的特點(diǎn)。對(duì)于一些對(duì)數(shù)據(jù)可信性和完整性要求較高的領(lǐng)域,如食品安全、司法取證、版權(quán)管理等,在查看和操作數(shù)據(jù)時(shí)都要驗(yàn)證數(shù)據(jù)的可信性和完整性。如果缺少對(duì)數(shù)據(jù)流轉(zhuǎn)過程的記錄,就不易發(fā)現(xiàn)數(shù)據(jù)被非法篡改,也不能保障數(shù)據(jù)的可信性和完整性。因此,利用數(shù)據(jù)溯源技術(shù)記錄和追蹤數(shù)據(jù)的流轉(zhuǎn)過程變得尤為重要。
數(shù)據(jù)溯源可以理解為一種用來(lái)記錄數(shù)據(jù)流轉(zhuǎn)過程中變化的技術(shù)。Wang 等[1]在研究多源異構(gòu)數(shù)據(jù)庫(kù)之間的數(shù)據(jù)流轉(zhuǎn)時(shí),首次提出了一種可以解決“數(shù)據(jù)來(lái)自何處”以及“在追溯數(shù)據(jù)的過程中使用了哪些中間數(shù)據(jù)”這兩個(gè)問題的方案,從此開啟了數(shù)據(jù)溯源的研究。Buneman等[2]正式定義并使用了數(shù)據(jù)溯源術(shù)語(yǔ),豐富了數(shù)據(jù)溯源的含義,并從“why”和“where”兩個(gè)角度闡述數(shù)據(jù)溯源。
傳統(tǒng)數(shù)據(jù)溯源系統(tǒng)的存儲(chǔ)和管理方式都是中心化的,盡管這種方式具有查詢速度較快和使用較簡(jiǎn)單等優(yōu)點(diǎn),但是存在著單點(diǎn)問題和管理權(quán)限中心化問題,可能會(huì)破壞溯源信息的完整性和可信性。引入?yún)^(qū)塊鏈技術(shù)后將數(shù)據(jù)溯源信息存儲(chǔ)在區(qū)塊鏈中,憑借區(qū)塊鏈的去中心化、時(shí)序數(shù)據(jù)、集體維護(hù)、可編程和安全可信等特點(diǎn),可以有效地保障數(shù)據(jù)溯源信息的可信性和完整性[3]。文獻(xiàn)[4] 提出了一種基于區(qū)塊鏈技術(shù)的云數(shù)據(jù)溯源模型框架ProvChain,將溯源數(shù)據(jù)存儲(chǔ)在區(qū)塊鏈中,保證了數(shù)據(jù)的安全性。文獻(xiàn)[5] 設(shè)計(jì)了一個(gè)基于區(qū)塊鏈的云服務(wù)提供商之間的數(shù)據(jù)共享模型,可以為云計(jì)算提供數(shù)據(jù)溯源和驗(yàn)證方法。文獻(xiàn)[6] 將開放溯源模型(open provenance model,OPM)與區(qū)塊鏈結(jié)合起來(lái),設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)科學(xué)溯源管理模型—SmartProvenance。文獻(xiàn)[7] 利用區(qū)塊鏈技術(shù)為物聯(lián)網(wǎng)中的射頻識(shí)別(radio frequency identification,RFID)數(shù)據(jù)設(shè)計(jì)了一種安全的數(shù)據(jù)溯源模型,提高了RFID 數(shù)據(jù)的安全性。文獻(xiàn)[8] 提出了一種雙鏈模型,也就是將實(shí)體多維授權(quán)信息和動(dòng)態(tài)數(shù)據(jù)分別存儲(chǔ)在兩條鏈上,并在此基礎(chǔ)上設(shè)計(jì)了一種物聯(lián)網(wǎng)動(dòng)態(tài)數(shù)據(jù)信息的分層溯源機(jī)制。文獻(xiàn)[9] 提出了一種基于區(qū)塊鏈的去中心化數(shù)據(jù)溯源方法,同時(shí)設(shè)計(jì)了一套溯源數(shù)據(jù)管理的智能合約,將溯源數(shù)據(jù)存儲(chǔ)到區(qū)塊鏈上,可以確保用戶獲得的溯源數(shù)據(jù)真實(shí)可靠。
區(qū)塊鏈技術(shù)的引入雖然解決了溯源信息的可信存儲(chǔ)和管理問題,但是還不能有效解決如手機(jī)、物聯(lián)網(wǎng)設(shè)備等資源受限的輕節(jié)點(diǎn)在不可信網(wǎng)絡(luò)中驗(yàn)證溯源信息所需的證明數(shù)據(jù)過大的問題。在現(xiàn)有的區(qū)塊鏈系統(tǒng)中,輕節(jié)點(diǎn)驗(yàn)證一筆交易的有效性需要借助簡(jiǎn)單支付驗(yàn)證(simplified payment verification,SPV),而SPV 需要驗(yàn)證者(輕節(jié)點(diǎn))擁有完整的區(qū)塊頭信息才可以完成驗(yàn)證。一條區(qū)塊鏈中區(qū)塊頭的數(shù)量是隨著區(qū)塊的高度呈線性增長(zhǎng)的,因此對(duì)于一個(gè)區(qū)塊高度過高的區(qū)塊鏈,維護(hù)其完整的區(qū)塊頭信息會(huì)占用輕節(jié)點(diǎn)較多的存儲(chǔ)資源,顯然SPV 不太適用于溯源系統(tǒng)中輕節(jié)點(diǎn)的溯源信息驗(yàn)證。
本文旨在解決在區(qū)塊鏈溯源系統(tǒng)中輕節(jié)點(diǎn)客戶端驗(yàn)證溯源信息需要占用過多存儲(chǔ)資源的問題,并提出一種基于區(qū)塊鏈的數(shù)據(jù)溯源系統(tǒng)的通用實(shí)現(xiàn)方案。
區(qū)塊鏈由化名“中本聰”的學(xué)者于2008年提出并在比特幣中實(shí)現(xiàn)[10],是一種分布式共享數(shù)據(jù)賬本技術(shù),具有去中心化、不可篡改性、時(shí)序性等特點(diǎn)。
1)去中心化
在區(qū)塊鏈網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)都共同管理維護(hù)著一份數(shù)據(jù)賬本,賬本上的每一筆記錄都要經(jīng)過全網(wǎng)節(jié)點(diǎn)的合法性校驗(yàn);一筆交易只有得到足夠多節(jié)點(diǎn)的背書認(rèn)證才會(huì)寫入?yún)^(qū)塊鏈。
2)不可篡改性
區(qū)塊鏈以鏈?zhǔn)浇Y(jié)構(gòu)存儲(chǔ)數(shù)據(jù),除了創(chuàng)世區(qū)塊外,每個(gè)區(qū)塊都存儲(chǔ)了上一個(gè)區(qū)塊的Hash值。如果上游區(qū)塊A中的數(shù)據(jù)被修改,其Hash 值隨之改變,那么下游區(qū)塊B中的上一個(gè)區(qū)塊A的Hash 值也會(huì)發(fā)生改變,區(qū)塊B的Hash 值也就相應(yīng)地發(fā)生改變。
3)時(shí)序性
每個(gè)區(qū)塊中的時(shí)間戳字段賦予區(qū)塊鏈時(shí)序性,使得區(qū)塊鏈中存儲(chǔ)數(shù)據(jù)具有良好的溯源性。
區(qū)塊鏈中的每個(gè)區(qū)塊都分為區(qū)塊頭(block head)和區(qū)塊體(block body),其中區(qū)塊頭中包含前一區(qū)塊的Hash 值(prev hash)、區(qū)塊高度(height)、時(shí)間戳(timestamp)、隨機(jī)數(shù)(nonce)以及Merkle 樹根(Merkle root)等字段,而完整的Merkle 樹則存放在區(qū)塊體中,如圖1所示。
圖1 區(qū)塊數(shù)據(jù)結(jié)構(gòu)Figure 1 Block data structure
Merkle 樹(Merkle tree,MT)是Ralph Merkle[11]提出的一種二叉Hash 樹。Merkle 樹的結(jié)構(gòu)如圖2所示,其葉子節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)元素的Hash 值,而除葉子節(jié)點(diǎn)之外的節(jié)點(diǎn)存放的都是左右子節(jié)點(diǎn)的Hash 值。節(jié)點(diǎn)中Hash 值的計(jì)算公式為
圖2 Merkle 樹Figure 2 Merkle tree
式中,nodei,j表示第i層(自下而上)的第j個(gè)節(jié)點(diǎn)(從左向右)的值。
根據(jù)式(1)依次上溯便可以生成一棵Merkle 樹,而Merkle 樹的根節(jié)點(diǎn)(Merkle root)便是整棵樹的摘要。
Merkle 樹主要有2 個(gè)優(yōu)點(diǎn):1)對(duì)Merkle 樹中任意數(shù)據(jù)的篡改都會(huì)導(dǎo)致該節(jié)點(diǎn)的父節(jié)點(diǎn)及父節(jié)點(diǎn)以上的節(jié)點(diǎn)發(fā)生改變,最終導(dǎo)致根節(jié)點(diǎn)發(fā)生變化。2)在無(wú)需存儲(chǔ)數(shù)據(jù)集的情況下,可以驗(yàn)證指定數(shù)據(jù)元素是否存在于數(shù)據(jù)集中。
Merkle 樹廣泛應(yīng)用于無(wú)法保證數(shù)據(jù)可信性的P2P 網(wǎng)絡(luò),例如在區(qū)塊鏈平臺(tái)中使用Merkle樹來(lái)存儲(chǔ)交易信息,并利用Merkle 證明來(lái)驗(yàn)證一個(gè)交易是否存在于區(qū)塊鏈中。Merkle 證明的詳細(xì)流程參見2.1 節(jié)。
Merkle 山脈(Merkle mountain range,MMR)是Peter Todd[12]提出的一種Merkle 樹的變種數(shù)據(jù)結(jié)構(gòu)。在Merkle 山脈中,除葉子節(jié)點(diǎn)外其余節(jié)點(diǎn)的值都是其左右子節(jié)點(diǎn)的Hash值。Merkle 山脈可以提供類似于Merkle 證明的Merkle 山脈證明,能夠證明一個(gè)葉子節(jié)點(diǎn)是否存在于Merkle 山脈之中。與Merkle 樹的不同之處在于:Merkle 樹是一棵完美二叉樹,而Merkle 山脈允許出現(xiàn)不完美的情況,或者說(shuō)Merkle 山脈本身是由多個(gè)完美二叉樹組成的數(shù)據(jù)結(jié)構(gòu)。將Merkle 山脈設(shè)計(jì)成僅追加的數(shù)據(jù)機(jī)構(gòu),在插入時(shí)無(wú)需重構(gòu)Merkle 山脈。這個(gè)特點(diǎn)非常適用于對(duì)區(qū)塊鏈中區(qū)塊頭的承諾,只要構(gòu)建包含全部區(qū)塊頭的Merkle 山脈,就可以證明一個(gè)區(qū)塊是否存在于區(qū)塊鏈中。
如圖3(a)所示,在一個(gè)Merkle 山脈中可以有多個(gè)子Merkle 樹(稱為山峰),這些Merkle樹的根稱為峰頂;多個(gè)山峰合起來(lái)形成一片山脈,這也是Merkle 山脈的由來(lái)。在B7后追加一個(gè)新區(qū)塊B8,可以發(fā)現(xiàn)Merkle 山脈的3 座山峰變成了整個(gè)山峰,這是因?yàn)樵贛erkle 山脈中出現(xiàn)兩個(gè)高度相同的山峰會(huì)觸發(fā)合并操作。合并操作是對(duì)兩個(gè)高度相同山峰的峰頂節(jié)點(diǎn)進(jìn)行Hash 運(yùn)算后生成一個(gè)新節(jié)點(diǎn),該節(jié)點(diǎn)的左右子節(jié)點(diǎn)是需要合并的兩座山峰的峰頂節(jié)點(diǎn)。一旦追加B8,B7和B8兩個(gè)區(qū)塊就會(huì)觸發(fā)合并操作,合并成峰頂為H5、高度為2 的新山峰。因?yàn)橐呀?jīng)存在一個(gè)高度為2、峰頂為H4的山峰,所以繼續(xù)觸發(fā)合并操作。依次執(zhí)行合并操作直到?jīng)]有兩個(gè)高度相同的山峰為止,最終形成一座如圖3(b)所示的山峰。
圖3 Merkle 山脈追加節(jié)點(diǎn)Figure 3 MMR append node
當(dāng)Merkle 山脈中只有一座山峰時(shí),峰頂節(jié)點(diǎn)是Merkle 山脈的根Hash。如圖3(a)所示,在Merkle 山脈中有多個(gè)山峰的情況,此時(shí)需將多個(gè)峰頂節(jié)點(diǎn)的Hash 值合并,得到一個(gè)新的Hash 值,這個(gè)Hash 值是Merkle 山脈的根Hash。例如計(jì)算圖3(a)中Merkle 山脈的根Hash,需依次計(jì)算Hash(H3,Hash(B7,H4)),獲得Merkle 山脈的根Hash。
在基于區(qū)塊鏈的數(shù)據(jù)溯源系統(tǒng)中,全節(jié)點(diǎn)在本地維護(hù)了完整的區(qū)塊鏈,因此可以獨(dú)立地驗(yàn)證數(shù)據(jù)溯源信息的完整性和真實(shí)性。隨著時(shí)代的發(fā)展,溯源數(shù)據(jù)驗(yàn)證的發(fā)起設(shè)備越來(lái)越傾向于智能手機(jī)、物聯(lián)網(wǎng)設(shè)備等輕節(jié)點(diǎn)。這些設(shè)備的網(wǎng)絡(luò)帶寬、存儲(chǔ)等硬件資源有限,不能像全節(jié)點(diǎn)一樣實(shí)時(shí)維護(hù)完整的區(qū)塊鏈信息。區(qū)塊鏈系統(tǒng)如比特幣、以太坊等都為輕節(jié)點(diǎn)驗(yàn)證交易信息提供了SPV 方式,但SPV 不太適合于溯源系統(tǒng)中輕節(jié)點(diǎn)的溯源信息驗(yàn)證。例如在以太坊中一個(gè)區(qū)塊頭的大小約為508 字節(jié),截止到2020年9月,以太坊區(qū)塊的高度將近1 080 萬(wàn),全部區(qū)塊頭大概有5G。維護(hù)如此龐大的區(qū)塊頭信息對(duì)于輕節(jié)點(diǎn)來(lái)說(shuō)非常不友好。為解決此問題,需要分析以SPV 方法驗(yàn)證一條溯源數(shù)據(jù)的真實(shí)性和可信性的過程,驗(yàn)證過程可以分為兩個(gè)步驟:
步驟1交易包含證明。采用Merkle 證明就可以證明一條溯源數(shù)據(jù)是否存在于一棵Merkle 樹中,從而證明這條溯源數(shù)據(jù)是否存在于包含這棵Merkle 樹的區(qū)塊中。
步驟2區(qū)塊包含證明。將包含待驗(yàn)證溯源信息的區(qū)塊頭與本地維護(hù)的完整區(qū)塊頭中對(duì)應(yīng)高度的區(qū)塊頭進(jìn)行對(duì)比,從而判斷包含待驗(yàn)證溯源信息的區(qū)塊是否存在于區(qū)塊鏈中。
步驟1 是為了驗(yàn)證一條溯源信息是否存在于一個(gè)區(qū)塊中,步驟2 是為了驗(yàn)證一個(gè)區(qū)塊是否屬于區(qū)塊鏈。在驗(yàn)證過程中,交易包含證明占用的資源并不多;區(qū)塊包含證明部分的驗(yàn)證需要完整的區(qū)塊頭信息,這會(huì)占用過多的設(shè)備資源。文獻(xiàn)[13] 在FlyClient 中采用Merkle山脈高效承諾機(jī)制,將區(qū)塊包含證明所需的完整區(qū)塊頭信息降低到對(duì)數(shù)級(jí)別。本文將借鑒FlyClient 使用的Merkle 山脈承諾機(jī)制完成區(qū)塊包含證明,降低了基于輕節(jié)點(diǎn)驗(yàn)證溯源信息所需要的資源,從而提高了驗(yàn)證效率。
下面分別從交易包含證明和區(qū)塊包含證明兩方面介紹基于Merkle 山脈承諾機(jī)制的SPV方法。
交易包含證明的核心是基于Merkle 樹的Merkle 證明,其過程可以通過如下的例子加以說(shuō)明。要證明圖4中的Tx6是否屬于Merkle 樹,需要提供圖4中圈出的節(jié)點(diǎn),這些節(jié)點(diǎn)組成的集合就是Merkle 證明集合。下面給出尋找Merkle 證明集合的步驟。
圖4 Merkle 證明Figure 4 Merkle proof
步驟1從待驗(yàn)證的葉子節(jié)點(diǎn)依次向其父節(jié)點(diǎn)上溯,直至到達(dá)Merkle 樹的根節(jié)點(diǎn),經(jīng)過的路徑稱為Merkle 路徑(Merkle path)。
步驟2將Merkle 路徑上所有節(jié)點(diǎn)的兄弟節(jié)點(diǎn)按照從下而上的順序添加到Merkle 證明集合中。
經(jīng)計(jì)算可以得出Tx6的Merkle 路徑為Tx6→C →F,如圖4中實(shí)線部分所示。這條路徑上所有節(jié)點(diǎn)的兄弟節(jié)點(diǎn)集合為{Tx5,D,E},此集合就是Tx6的Merkle 證明。將集合中的節(jié)點(diǎn)與Tx6一起進(jìn)行如下運(yùn)算:
最終可以獲得Merkle root′,再將它與Merkle 樹真實(shí)的Merkle root 進(jìn)行比較,如果相等則證明Tx6存在于這棵Merkle 樹中且沒有被篡改。
根據(jù)上述例子可以分析出Merkle 證明的大小等于m ?1,其中m表示Merkle 樹的高度。因?yàn)镸ekrle 樹的葉子節(jié)點(diǎn)的數(shù)目為N= 2m?1,所以可以推導(dǎo)出擁有N個(gè)葉子節(jié)點(diǎn)的Merkle 樹所包含證明信息的大小為lbN。
交易包含證明可以快速輕量地驗(yàn)證一筆交易是否存在于區(qū)塊中是因?yàn)椴捎昧薓erkle 樹的承諾機(jī)制。在區(qū)塊包含證明中,Merkle 樹數(shù)據(jù)結(jié)構(gòu)并不適合區(qū)塊頭的承諾,這是因?yàn)殡S著區(qū)塊鏈系統(tǒng)的運(yùn)行,區(qū)塊的高度不停地呈線性增長(zhǎng),而在Merkle 樹中追加數(shù)據(jù)需要重構(gòu)Merkle 樹。若在區(qū)塊包含證明中引入Merkle 證明,就需要引入支持動(dòng)態(tài)追加的Merkle 山脈承諾機(jī)制對(duì)區(qū)塊頭進(jìn)行承諾。每當(dāng)有新的區(qū)塊加入?yún)^(qū)塊鏈,只要在Merkle 山脈中動(dòng)態(tài)追加新區(qū)塊即可,而不必重構(gòu)Merkle 山脈。
引入Merkle 山脈對(duì)區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)的改動(dòng)很小,只要在區(qū)塊頭中增加一個(gè)Merkle 山脈的根Hash 即可。如圖5所示,將從創(chuàng)世區(qū)塊block1開始到block(n?1)為止的全部區(qū)塊頭一起組成Merkle 山脈,并將Merkle 山脈根Hash 寫入blockn的MMR root 字段。只要blockn之前任意區(qū)塊頭的內(nèi)容發(fā)生改變都會(huì)引起blockn中MMR root 值的改變。利用Merkle 山脈承諾機(jī)制對(duì)區(qū)塊頭承諾后,就可以根據(jù)Merkle 山脈證明完成區(qū)塊包含證明。
圖5 在區(qū)塊鏈中添加Merkle 山脈Figure 5 Add MMR to blockchain
下面的例子可以說(shuō)明如何利用Merkle 山脈證明來(lái)完成區(qū)塊包含證明的過程。如圖6所示,若證明區(qū)塊頭B9存在于區(qū)塊鏈中,就需要提供圖6中圈出節(jié)點(diǎn)的Hash 值。這些圈出的節(jié)點(diǎn)集合稱為Merkle 山脈證明集合。
圖6 Merkle 山脈證明Figure 6 MMR proof
下面給出尋找Merkle 山脈證明集合的步驟。
步驟1從待驗(yàn)證的節(jié)點(diǎn)出發(fā),自下而上地向其所在山峰的峰頂上溯,則經(jīng)過的路徑稱為Merkle 山脈路徑(MMR path)。
步驟2將Merkle 山脈路徑上所有節(jié)點(diǎn)的兄弟節(jié)點(diǎn)按照自下而上的順序添加到Merkle山脈證明集合中。
步驟3將待驗(yàn)證節(jié)點(diǎn)所在的右側(cè)山峰的峰頂加入Merkle 山脈證明集合。
步驟4將待驗(yàn)證節(jié)點(diǎn)所在的左側(cè)山峰的峰頂加入Merkle 山脈證明集合。
對(duì)于尋找圖6中B9的Merkle 山脈證明集合來(lái)說(shuō),步驟1 可以得到Merkle 山脈路徑為B9→H8,步驟2 得到Merkle 山脈證明集合為{B10,H9},步驟3 得到Merkle 山脈證明集合為{B10,H9,H11,B15},步驟4 可以獲得最終的Merkle 山脈證明集合為{B10,H9,H11,B15,H7}。將Merkle 山脈證明集合與待驗(yàn)證的區(qū)塊頭B9一起進(jìn)行如下運(yùn)算:
式中,H() 表示Hash 函數(shù)。最終可以根據(jù)Merkle 山脈證明集合生成Merkle 山脈的根Hash為MMR root′,將它與真實(shí)的MMR root 進(jìn)行比較,如果相等則證明B9存在于區(qū)塊鏈中且沒有被篡改。
本文借鑒了FlyClient[13]中的輕節(jié)點(diǎn)認(rèn)證方法,將SPV 中的區(qū)塊存在證明所需要的區(qū)塊頭數(shù)量N降低到lbN。輕節(jié)點(diǎn)只需在區(qū)塊鏈網(wǎng)絡(luò)中同步一個(gè)最新的區(qū)塊頭,再根據(jù)區(qū)塊頭中MMR root 的值并結(jié)合區(qū)塊包含證明和交易包含證明就可以有效地驗(yàn)證區(qū)塊鏈上是否包含一筆交易。
在第2 節(jié)的Merkle 樹和Merkle 山脈承諾機(jī)制的基礎(chǔ)上設(shè)計(jì)一個(gè)基于區(qū)塊鏈的通用數(shù)據(jù)溯源系統(tǒng),系統(tǒng)架構(gòu)如圖7所示,自底向上依次分為區(qū)塊鏈層、溯源模型層、通用溯源業(yè)務(wù)層和應(yīng)用層。
圖7 數(shù)據(jù)溯源系統(tǒng)架構(gòu)Figure 7 Data provenance system framework
1)區(qū)塊鏈層
將區(qū)塊鏈的相關(guān)業(yè)務(wù)封裝在該層,包括用于加解密算法和Hash 算法的密碼算法模塊、用于保持網(wǎng)絡(luò)中各個(gè)節(jié)點(diǎn)賬本一致性的共識(shí)機(jī)制模塊、用于區(qū)塊鏈網(wǎng)絡(luò)中各節(jié)點(diǎn)間通信的P2P網(wǎng)絡(luò)模塊以及用于賬本持久化到本地存儲(chǔ)(區(qū)塊鏈文件系統(tǒng)或數(shù)據(jù)庫(kù)系統(tǒng))的數(shù)據(jù)持久化模塊等區(qū)塊鏈相關(guān)模塊。
2)溯源模型層
將ProVOC 溯源模型融入?yún)^(qū)塊鏈溯源,借助ProVOC 模型中各種構(gòu)件來(lái)描述數(shù)據(jù)溯源記錄,并將溯源信息序列化成JSON 格式存儲(chǔ)在區(qū)塊鏈中。
3)通用溯源業(yè)務(wù)層
為區(qū)塊鏈溯源系統(tǒng)提供通用的業(yè)務(wù)服務(wù),如對(duì)執(zhí)行實(shí)體和查詢用戶進(jìn)行權(quán)限認(rèn)證的身份管理模塊、將溯源數(shù)據(jù)提交到區(qū)塊鏈中的溯源數(shù)據(jù)提交模塊、查詢區(qū)塊鏈中溯源數(shù)據(jù)的查詢模塊以及驗(yàn)證溯源數(shù)據(jù)真實(shí)性和可靠性的驗(yàn)證模塊等。在通用溯源業(yè)務(wù)層將這些模塊封裝起來(lái),并以API 接口的形式開放給溯源應(yīng)用調(diào)用。
4)應(yīng)用層
本層與具體的溯源領(lǐng)域?qū)?,根?jù)溯源領(lǐng)域具體的需求和業(yè)務(wù)場(chǎng)景編寫應(yīng)用程序。在應(yīng)用中調(diào)用通用溯源業(yè)務(wù)層提供的API 接口以實(shí)現(xiàn)溯源數(shù)據(jù)上鏈、查詢、驗(yàn)證等操作。
數(shù)據(jù)溯源的描述模型旨在建立一套溯源信息的通用描述標(biāo)準(zhǔn)和規(guī)范。第1 個(gè)通用溯源模型是首屆國(guó)際溯源和標(biāo)注會(huì)議(international provenance and annotation workshop,IPAW)發(fā)布的OPM[14]。萬(wàn)維網(wǎng)聯(lián)盟(world wide Web consortium,W3C)對(duì)OPM 進(jìn)行重大修改后發(fā)布了PROV 溯源標(biāo)準(zhǔn)[15]。中國(guó)于2017年11月1日正式發(fā)布《數(shù)據(jù)溯源描述模型》[16]標(biāo)準(zhǔn),并于2018年5月1日起正式實(shí)施該標(biāo)準(zhǔn)。國(guó)家標(biāo)準(zhǔn)中的數(shù)據(jù)溯源描述(provenance vocabulary,ProVOC)模型相對(duì)于其他溯源模型來(lái)說(shuō),是一個(gè)較為輕量的模型,可以根據(jù)具體的溯源領(lǐng)域靈活擴(kuò)展。
選取較為輕量的ProVOC 模型作為本文系統(tǒng)的溯源模型。ProVOC 模型由數(shù)據(jù)、活動(dòng)和執(zhí)行實(shí)體3 個(gè)一級(jí)類構(gòu)件組成。數(shù)據(jù)構(gòu)件是對(duì)需要溯源的事物的描述,包括參數(shù)和數(shù)據(jù)集2個(gè)二級(jí)類構(gòu)件,其中數(shù)據(jù)集可以根據(jù)具體的溯源領(lǐng)域進(jìn)行定制?;顒?dòng)構(gòu)件是由執(zhí)行實(shí)體發(fā)起或控制的一個(gè)或多個(gè)連續(xù)的動(dòng)作,主要用來(lái)描述數(shù)據(jù)是如何從上一個(gè)狀態(tài)轉(zhuǎn)換到下一個(gè)狀態(tài)的。執(zhí)行實(shí)體則是指活動(dòng)的發(fā)起者,包括人類執(zhí)行實(shí)體和非人類執(zhí)行實(shí)體。各個(gè)一級(jí)類構(gòu)件之間的關(guān)系如圖8所示。
圖8 ProVOC 模型結(jié)構(gòu)Figure 8 ProVOC model structure
為了更好地保存并追蹤數(shù)據(jù)的溯源記錄,溯源信息需要依照ProVOC 溯源模型中的定義轉(zhuǎn)化為JSON 格式的格式化溯源數(shù)據(jù),然后保存到區(qū)塊鏈中。下列JSON 文件記錄了一條數(shù)據(jù)溯源信息,其內(nèi)容為人類執(zhí)行體“group1.user1”使用非人類執(zhí)行體“group1.computer1”,在時(shí)間為“2020-09-10T20:39:51”、坐標(biāo)為“29.532326,106.607960”的地點(diǎn),執(zhí)行了“合并”活動(dòng),操作“Hello”和“World”兩條數(shù)據(jù),最終將“Hello”和“World”合并為“Hello world”。
JSON 溯源信息文件示例
每個(gè)執(zhí)行實(shí)體都需要在溯源系統(tǒng)中注冊(cè)并使用非對(duì)稱加密算法生成一個(gè)公私鑰對(duì),其中私鑰用于數(shù)字簽名,公鑰用于驗(yàn)證數(shù)字簽名和標(biāo)識(shí)執(zhí)行實(shí)體的身份。執(zhí)行實(shí)體需要使用自己的私鑰對(duì)其操作數(shù)據(jù)的Hash 值進(jìn)行加密后生成數(shù)字簽名。數(shù)字簽名可用于驗(yàn)證該溯源信息是否為合法的執(zhí)行實(shí)體發(fā)起的操作,同時(shí)還可以驗(yàn)證溯源信息有沒有被篡改。該驗(yàn)證成立的前提是這條溯源數(shù)據(jù)必須存在于區(qū)塊鏈中;若這條溯源數(shù)據(jù)沒有通過可信性和真實(shí)性驗(yàn)證,其包含的證明信息是沒有用的。
要實(shí)現(xiàn)第2 節(jié)中描述的可信查詢驗(yàn)證方法,就要在區(qū)塊頭中增加一個(gè)用于存儲(chǔ)Merkle 山脈根Hash 值的字段,同時(shí)在上鏈驗(yàn)證的過程中增加對(duì)Merkle 山脈根Hash 字段合法性的驗(yàn)證過程。
圖9描述了溯源數(shù)據(jù)查詢流程。當(dāng)一個(gè)輕節(jié)點(diǎn)需要查詢溯源數(shù)據(jù)的真實(shí)性和可信性時(shí),只需向區(qū)塊鏈網(wǎng)絡(luò)中發(fā)起查詢請(qǐng)求即可;區(qū)塊鏈網(wǎng)絡(luò)中的全節(jié)點(diǎn)收到查詢請(qǐng)求后在本地維護(hù)的區(qū)塊鏈中查詢指定數(shù)據(jù)的溯源信息,并生成交易包含證明和區(qū)塊包含證明。將溯源信息、區(qū)塊包含證明和交易包含證明打包成溯源數(shù)據(jù)包,然后返回給發(fā)起查詢的輕節(jié)點(diǎn)用戶。輕節(jié)點(diǎn)在發(fā)起查詢的同時(shí)需要在區(qū)塊鏈網(wǎng)絡(luò)同步最新的區(qū)塊頭,以獲得最新的Merkle 山脈的根Hash 進(jìn)行MMR 驗(yàn)證。輕節(jié)點(diǎn)收到溯源數(shù)據(jù)包后,利用溯源數(shù)據(jù)包中的Merkle 證明集合和Merkle 山脈證明集合就可以在本地完成溯源信息的可信性和真實(shí)性的驗(yàn)證。
圖9 溯源數(shù)據(jù)查詢流程Figure 9 Data provenance query process
本文針對(duì)區(qū)塊鏈數(shù)據(jù)溯源系統(tǒng)中輕節(jié)點(diǎn)查詢驗(yàn)證溯源信息占用設(shè)備資源過多的問題,引入可動(dòng)態(tài)追加數(shù)據(jù)的變體Merkel 樹數(shù)據(jù)結(jié)構(gòu)MMR。然后,基于MMR 提出一種高效的溯源數(shù)據(jù)可信驗(yàn)證查詢方法,將SPV 中需要的N個(gè)區(qū)塊頭信息減少到lbN,大大降低了查詢驗(yàn)證溯源信息所需要的設(shè)備資源。根據(jù)高效的溯源數(shù)據(jù)可信查詢方法設(shè)計(jì)了一種基于區(qū)塊鏈的數(shù)據(jù)溯源通用系統(tǒng),該系統(tǒng)基于ProVOC 溯源模型將溯源信息封裝成JSON 文件,利用非對(duì)稱加密和Hash 算法對(duì)執(zhí)行實(shí)體的身份進(jìn)行認(rèn)證,保證了溯源數(shù)據(jù)的可信存儲(chǔ)。通過API 接口將溯源服務(wù)提供給不同領(lǐng)域的數(shù)據(jù)溯源應(yīng)用。