唐 飛,王金洋,陽祥貴,甘 寧
(1.重慶郵電大學(xué) 網(wǎng)絡(luò)空間安全與信息法學(xué)院,重慶 400065;2.江西昌河航空工業(yè)有限公司 工程技術(shù)部,江西 景德鎮(zhèn) 333002)
假冒和盜版產(chǎn)品數(shù)量在全球范圍內(nèi)呈指數(shù)級增長,引發(fā)的假冒和盜版產(chǎn)品交易問題是各企業(yè)在創(chuàng)新驅(qū)動的全球經(jīng)濟(jì)中面臨的主要挑戰(zhàn)之一。2019年,經(jīng)濟(jì)合作與發(fā)展組織和歐盟知識產(chǎn)權(quán)局發(fā)布的分析研究[1]稱,假冒和盜版產(chǎn)品的國際貿(mào)易額從2007年的2 500億美元增加到2013年的4 610億美元,約占世界進(jìn)口額的2.5%。歐盟進(jìn)口假冒和盜版產(chǎn)品近1 160億美元,約占?xì)W盟進(jìn)口額的5%。根據(jù)2016年公布的統(tǒng)計數(shù)據(jù),假冒和盜版產(chǎn)品的交易量已高達(dá)5 090億美元,占世界貿(mào)易的3.3%,占非歐盟國家進(jìn)口額的6.8%。文獻(xiàn)[2]顯示,市場和無數(shù)品牌產(chǎn)品公司對假冒產(chǎn)品的關(guān)注度越來越大。據(jù)文獻(xiàn)[3]所述,假冒產(chǎn)品的貿(mào)易活動在全球化經(jīng)濟(jì)中不斷蔓延,不僅侵犯了企業(yè)的商標(biāo)和版權(quán),而且對企業(yè)的銷售和利潤產(chǎn)生負(fù)面影響,還對經(jīng)濟(jì)和安全造成更廣泛的不利影響。
為了應(yīng)對假冒產(chǎn)品日益猖獗的問題,人們需要可信、可追溯且低成本的產(chǎn)品防偽解決方案。傳統(tǒng)中心化的防偽溯源方案存在內(nèi)外部風(fēng)險。內(nèi)部風(fēng)險指的是中心化存儲導(dǎo)致的內(nèi)部人員對溯源數(shù)據(jù)可進(jìn)行任意篡改刪除,溯源數(shù)據(jù)的可信度無法保證;外部風(fēng)險指的是防偽碼可能被濫用。文獻(xiàn)[4]使用偽造成本高的RFID芯片技術(shù)作為防偽協(xié)議的認(rèn)證方式;文獻(xiàn)[5]使用衍生于RFID的NFC技術(shù),支持手機(jī)掃描,具有更廣泛的應(yīng)用性。這些技術(shù)的防偽成本都遠(yuǎn)遠(yuǎn)高于條形碼,并且防偽標(biāo)識同樣存在被盜用的風(fēng)險,因此使用這些技術(shù)并不能解決假冒產(chǎn)品猖獗的問題。企業(yè)和消費者都迫切期盼公信力高、防篡改、成本低的防偽解決方案。
區(qū)塊鏈采用分布式存儲方式,可以防止數(shù)據(jù)被惡意篡改。文獻(xiàn)[6]使用區(qū)塊鏈對供應(yīng)鏈全流程數(shù)據(jù)進(jìn)行存證,但這樣的存儲方式會導(dǎo)致數(shù)據(jù)冗余。星際文件系統(tǒng)(interplanetary file system,IPFS)最初由Benet[7]設(shè)計,它是一種基于內(nèi)容可尋址的對等超媒體分發(fā)協(xié)議。文獻(xiàn)[8]引入了微交易的概念,在區(qū)塊鏈共識階段減少了節(jié)點之間的通信開銷。布隆過濾器常用于過濾非法請求來提高系統(tǒng)效率,文獻(xiàn)[9]在基于有向無環(huán)圖的區(qū)塊鏈系統(tǒng)中使用布隆過濾器查詢地址的唯一性,節(jié)省訪問時間。但這些方案仍存在以下缺陷:1)若防偽碼泄露或者可復(fù)制,防偽系統(tǒng)認(rèn)證可信度將大打折扣;2)在區(qū)塊鏈節(jié)點數(shù)量眾多的時候,區(qū)塊鏈共識效率低下、通信量大、通信時間長、未使用高效的共識算法;3)IPFS與區(qū)塊鏈結(jié)合不夠緊密,沒有利用好數(shù)據(jù)IPFS地址也是數(shù)據(jù)哈希值這一性質(zhì)。
本文結(jié)合IPFS提出的基于記錄查詢布隆過濾器的區(qū)塊鏈防偽溯源方案,安全高效且具有良好的可擴(kuò)展性,立足于消除消費者對市場的信任危機(jī),建立良好的市場信任體系,具有實際應(yīng)用價值。
區(qū)塊鏈?zhǔn)前磿r間戳將數(shù)據(jù)鏈接而成的特定數(shù)據(jù)結(jié)構(gòu),以密碼學(xué)保證其不可篡改、不可偽造、去中心化、去信任、匿名性、透明化的性質(zhì)。區(qū)塊鏈的結(jié)構(gòu)如圖1所示,其起源于文獻(xiàn)[10]提出的比特幣電子貨幣系統(tǒng)。
圖1 區(qū)塊鏈結(jié)構(gòu)Fig.1 Blockchain structure
區(qū)塊鏈由單個區(qū)塊擴(kuò)展,記錄了完整交易歷史。區(qū)塊由區(qū)塊頭和區(qū)塊體構(gòu)成,其中區(qū)塊頭存儲了前一個區(qū)塊的哈希值,因此區(qū)塊數(shù)據(jù)的更改會導(dǎo)致相應(yīng)的哈希值的改變,與區(qū)塊鏈中存儲的歷史哈希值就會產(chǎn)生矛盾,這個結(jié)構(gòu)保證了區(qū)塊的不可篡改性;區(qū)塊體中存儲了一段時間內(nèi)產(chǎn)生的所有交易,這些交易構(gòu)成一個Merkle Tree。Merkle Tree的樹根值Merkle Root也被保存到區(qū)塊頭中,保證了該區(qū)塊中所有交易都是不可篡改的;此外,區(qū)塊頭還存有創(chuàng)建區(qū)塊的時間戳Timestamp。文獻(xiàn)[11]提到區(qū)塊鏈技術(shù)具有防篡改、不可抵賴、分布式一致等特性,特別是它的P2P網(wǎng)絡(luò)去中心化性質(zhì),得到了工業(yè)界和學(xué)術(shù)界的廣泛關(guān)注;文獻(xiàn)[12]利用區(qū)塊鏈結(jié)合環(huán)簽密構(gòu)建了電子證據(jù)加密方案;文獻(xiàn)[13]使用區(qū)塊鏈技術(shù)保證醫(yī)療資源互聯(lián)互通。區(qū)塊鏈在防偽領(lǐng)域的應(yīng)用中有著天然的優(yōu)勢。
區(qū)塊鏈網(wǎng)絡(luò)中的節(jié)點通過協(xié)商一致機(jī)制確保交易的有效性和區(qū)塊本身的有效性。這種協(xié)商的過程被稱為共識算法,它是大多數(shù)(或在某些情況下全部)網(wǎng)絡(luò)驗證者就賬本狀態(tài)達(dá)成一致意見的過程,是一組規(guī)則和過程,允許在多個參與節(jié)點之間維護(hù)區(qū)塊鏈數(shù)據(jù)。文獻(xiàn)[14]構(gòu)造了基于有向無環(huán)圖的區(qū)塊鏈共識算法,節(jié)省了系統(tǒng)的資源。分布式系統(tǒng)不依賴于中心化服務(wù)器,即使特定節(jié)點發(fā)生故障,區(qū)塊鏈網(wǎng)絡(luò)依舊可以運行。
IPFS基于文件內(nèi)容進(jìn)行存儲和查詢文件,利用網(wǎng)絡(luò)中的閑置存儲資源,建立起一個分布式數(shù)據(jù)存儲系統(tǒng),將數(shù)據(jù)分片存儲到不同的網(wǎng)絡(luò)位置,提供快速檢索與共享數(shù)據(jù)的功能,具有防宕機(jī)的性質(zhì)。IPFS利用文件的哈希值作為存儲地址,這個特性與區(qū)塊鏈存儲文件哈希值防篡改的特性天然契合,因此用IPFS存儲文件、用區(qū)塊鏈存儲文件哈希的組合已被廣泛接受。
向IPFS上傳大于256 KB的文件時,IPFS會自動將文件進(jìn)行分片處理,每個分片大小為256 K,并將這些分片存儲到網(wǎng)絡(luò)的不同節(jié)點上。對于每個分片,都會生成唯一的哈希值。此后,IPFS將所有分片的哈希值串聯(lián)起來,并計算得到該文件的哈希值。
為了表示文件的哈希,IPFS使用了多哈希格式和Base58編碼。存儲地址ACID表示為
ACID=Base58(FCode‖Hlength‖Hv)
(1)
(1)式中:多哈希由3部分組成,Hash算法編碼FCode、Hash值的長度Hlength、Hash值Hv。
多哈希以固定字節(jié)開頭,指定使用的哈希算法。IPFS使用SHA-256哈希函數(shù),哈希值長度為32個字節(jié)。加上哈希值后,字符串過長,因此,使用Base58編碼技術(shù)壓縮字符串長度,方便存儲傳播。
布隆過濾器(bloom filter,BF)由文獻(xiàn)[15]在1970年提出。它可以提供成員性證明,具有查詢效率高且內(nèi)存占用小的優(yōu)點,本文改進(jìn)了布隆過濾器使其具有記憶功能,并將改進(jìn)后的布隆過濾器用于過濾非法查詢請求以節(jié)省服務(wù)器資源。
布隆過濾器由m比特的位數(shù)組S={x0x1…xm-1}以及k個相互獨立的哈希函數(shù){H0H1…Hk-1}構(gòu)成,初始布隆過濾器的位數(shù)組中存儲的數(shù)值均為0。插入元素ci時,首先,將元素ci輸入k個不同的哈希函數(shù)中進(jìn)行計算得到k個哈希值;然后,對哈希值做模運算;最后,將模運算的結(jié)果作為位數(shù)組中的下標(biāo),將k個對應(yīng)的下標(biāo)的值設(shè)置為1。
判斷集合S中是否存在元素x,需要將x通過k個哈希函數(shù)計算后,檢查對應(yīng)的k個位置,若k個位置中存在0,則元素x一定不在集合S中;反之,x在集合S中。當(dāng)x?S被判定為x∈S時,認(rèn)為布隆過濾器發(fā)生了誤判。插入n個元素時,誤判率fp表示為
(2)
(2)式中:n為插入元素個數(shù),k為哈希函數(shù)個數(shù),m為布隆過濾器長度,fp為布隆過濾器誤判率。
計數(shù)布隆過濾器[16](counting bloom filter,CBF)是一種在BF的基礎(chǔ)上進(jìn)行改進(jìn)的數(shù)據(jù)結(jié)構(gòu),它將BF中的每一位擴(kuò)展成一個計數(shù)器,插入元素時,如果哈希函數(shù)映射到同一位置,將對應(yīng)位置計數(shù)器的值加1;刪除元素時,將對應(yīng)位置計數(shù)器的值減1。
光譜布隆過濾器[17](spectral bloom filters,SBF)對CBF進(jìn)行進(jìn)一步改造。CBF的設(shè)計初衷也不在于能實現(xiàn)計數(shù)功能,而是可以實現(xiàn)元素的刪除。對于CBF而言,由于每個下標(biāo)對應(yīng)的值不一致,但每一個計數(shù)器的存儲位數(shù)一致,因此,若要使用CBF來進(jìn)行記錄插入次數(shù),則要以最大插入次數(shù)來設(shè)置計數(shù)器的大小,這樣會造成內(nèi)存的浪費。SBF使用偏移數(shù)組來記錄不同長度的計數(shù)器在內(nèi)存中存儲的內(nèi)存起始地址,實現(xiàn)了計數(shù)器位數(shù)的動態(tài)調(diào)整。
本方案采用聯(lián)盟鏈和IPFS結(jié)合的方式構(gòu)造方案。聯(lián)盟鏈中各節(jié)點部署智能合約并共同參與維護(hù)區(qū)塊鏈賬本,為消費者提供查詢服務(wù)并且保障商家發(fā)送數(shù)據(jù)的真實性。IPFS通過計算上傳數(shù)據(jù)哈希值得到溯源數(shù)據(jù)地址,可以高效地將數(shù)據(jù)哈希值上鏈,并將溯源數(shù)據(jù)上傳到IPFS中。防偽溯源系統(tǒng)結(jié)構(gòu)如圖2所示。
圖2 防偽溯源系統(tǒng)結(jié)構(gòu)Fig.2 Structure diagram of anti-counterfeiting traceability system
本方案主體由產(chǎn)生產(chǎn)品溯源數(shù)據(jù)的生產(chǎn)商、經(jīng)銷商、物流商、監(jiān)管部門4個節(jié)點以及消費者構(gòu)成。生產(chǎn)商負(fù)責(zé)產(chǎn)品的生產(chǎn)以及產(chǎn)品防偽碼的生成,記錄和上傳產(chǎn)品的生產(chǎn)溯源數(shù)據(jù)到IPFS中,并將生產(chǎn)溯源數(shù)據(jù)在IPFS中的存儲地址發(fā)起共識上鏈;經(jīng)銷商對產(chǎn)品的出入庫狀態(tài)信息進(jìn)行記錄和上鏈;物流商對產(chǎn)品的物流以及出入庫信息進(jìn)行記錄和上鏈;監(jiān)管部門參與區(qū)塊鏈的共識過程,保證上鏈數(shù)據(jù)的真實性和不可篡改性;消費者通過防偽標(biāo)識查詢產(chǎn)品溯源數(shù)據(jù)。
方案的符號以及參數(shù)定義如表1所示。
表1 系統(tǒng)主要符號和參數(shù)Tab.1 Main symbols and parameters of the system
本方案由以下3個階段構(gòu)造完成。
1)系統(tǒng)初始化。各方建立區(qū)塊鏈網(wǎng)絡(luò),部署鏈碼。
2)溯源數(shù)據(jù)存儲及上鏈。供應(yīng)鏈節(jié)點將產(chǎn)生數(shù)據(jù)上傳至IPFS,并將數(shù)據(jù)在IPFS中的存儲地址經(jīng)過共識過程后完成上鏈。
3)防偽查詢階段。消費者登錄防偽查詢平臺后,通過掃描產(chǎn)品的條形碼進(jìn)行防偽溯源查詢,生產(chǎn)商節(jié)點調(diào)用布隆過濾器算法,過濾無效的AUID,然后調(diào)用智能合約,以條形碼中存儲的AUID為索引找到溯源數(shù)據(jù)的ACID集合,然后將ACID集合發(fā)送給消費者,消費者利用ACID下載溯源數(shù)據(jù)即可完成查詢。
1)網(wǎng)絡(luò)初始化。生產(chǎn)商、經(jīng)銷商、物流商、監(jiān)管部門組建一個區(qū)塊鏈網(wǎng)絡(luò)。
2)鏈碼部署。方案設(shè)計了一個溯源數(shù)據(jù)查詢合約為消費者提供產(chǎn)品的防偽溯源服務(wù),返回給消費者該產(chǎn)品的防偽查詢結(jié)果以及產(chǎn)品的溯源數(shù)據(jù)。消費者掃描二維碼后得到AUID并發(fā)送給服務(wù)器進(jìn)行查詢。服務(wù)器先將AUID輸入具有記錄查詢功能的布隆過濾器進(jìn)行計算,若結(jié)果是非法AUID則返回查詢結(jié)果“Fake”;反之,調(diào)用溯源數(shù)據(jù)查詢合約查找該AUID對應(yīng)的溯源數(shù)據(jù)在IPFS中的存儲地址ACID,返回查詢結(jié)果“Real”以及ACID。
溯源過程通過AUID作為檢索關(guān)鍵字對區(qū)塊鏈中的溯源數(shù)據(jù)進(jìn)行搜索,輸出ACID。本方案以Fabric[18]為例,在鏈碼中使用ChaincodeStubInterface接口的GetHistoryForKey方法在StateDB中對指定AUID查詢其歷史數(shù)據(jù)。返回的數(shù)據(jù)是byte數(shù)組,需要轉(zhuǎn)換為String,然后再JSON反序列化。溯源數(shù)據(jù)查詢合約設(shè)計如下所示。
合約1溯源數(shù)據(jù)查詢
輸入為AUID,輸出為溯源數(shù)據(jù)下載地址ACID=ACID1‖ACID2‖…‖ACIDn,具體流程如下。
1.ACID←GetHistoryForKey(AUID)//檢索AUID得到ACID集合
2.ACID=String(ACID)//將byte數(shù)組轉(zhuǎn)換為String
3.ACID=Deserialize(ACID)//JSON反序列化
4. returnACID
數(shù)據(jù)存儲及上鏈過程見圖3,共識過程使用SBFT算法[19]。
圖3 數(shù)據(jù)存儲與上鏈Fig.3 Data storage and upchain
首先,生產(chǎn)商為產(chǎn)品生成AUID和二維碼,并將此AUID廣播給其他節(jié)點,AUID為檢索溯源數(shù)據(jù)的索引值,以便其他節(jié)點在上傳關(guān)于此產(chǎn)品的數(shù)據(jù)時也能關(guān)聯(lián)AUID;其次,生產(chǎn)商節(jié)點將溯源數(shù)據(jù)上傳至IPFS,得到IPFS返回的ACID;最后,將上傳數(shù)據(jù)的記錄進(jìn)行SBFT共識后上鏈,后續(xù)可以通過檢索AUID得到對應(yīng)產(chǎn)品的ACID。
交易數(shù)據(jù)生成后,數(shù)據(jù)擁有者將交易數(shù)據(jù)、驗證數(shù)據(jù)、參數(shù)等打包成交易一起發(fā)送至區(qū)塊鏈進(jìn)行廣播,所有節(jié)點接收并驗證交易,經(jīng)過SBFT共識算法驗證后將交易寫入?yún)^(qū)塊鏈網(wǎng)絡(luò)中。
消費者溯源查詢業(yè)務(wù)邏輯見圖4。
圖4 業(yè)務(wù)邏輯Fig.4 Business logic
產(chǎn)品防偽查詢步驟如下。
1)消費者登錄溯源平臺,掃描產(chǎn)品二維碼讀取AUID并發(fā)送查詢請求Request。
2)溯源平臺在收到查詢請求后,將AUID放入布隆過濾器中進(jìn)行驗證,返回驗證結(jié)果。
3)若消費者查詢的AUID為假冒產(chǎn)品,則直接向消費者返回查詢結(jié)果。若消費者查詢結(jié)果為正品,則需要調(diào)用溯源數(shù)據(jù)查詢合約,根據(jù)產(chǎn)品AUID對溯源數(shù)據(jù)進(jìn)行檢索,找到產(chǎn)品在IPFS中的存儲地址ACID,返回查詢結(jié)果和ACID。消費者可以通過ACID自行下載溯源數(shù)據(jù),節(jié)省企業(yè)的存儲成本和管理成本。
在不使用布隆過濾器并且AUID非法的情況下進(jìn)行溯源查詢,即便檢索整個區(qū)塊鏈賬本都無法找到符合要求的溯源數(shù)據(jù),將極大浪費服務(wù)器資源,故使用布隆過濾器對方案中發(fā)起的溯源查詢請求進(jìn)行過濾是必要的。
傳統(tǒng)的布隆過濾器沒有記憶功能,對同一個元素的多次查詢無法進(jìn)行區(qū)分。例如,對存在于集合的某個成員進(jìn)行多次查詢都會顯示該成員在集合中且會返回相同的結(jié)果。在防偽溯源應(yīng)用場景下,多次查詢同一個正品防偽碼都會被判斷為正品,無法防止防偽碼被泄露而造成的防偽碼濫用問題,因此,傳統(tǒng)的布隆過濾器不適用于防偽方案。CBF和SBF可以記錄查詢次數(shù),但計數(shù)器需要占用較大內(nèi)存,尤其是某一個元素查詢次數(shù)較多時所需要消耗的存儲空間更大。而對于產(chǎn)品防偽而言,只有第一次的查詢具有可信度,當(dāng)防偽碼被泄露則可能出現(xiàn)某個元素被多次查詢的情況。因此,只需要記錄是否為首次查詢即可。
為了讓布隆過濾器對查找過的元素有記憶功能,本文將布隆過濾器進(jìn)行改進(jìn)設(shè)計出一種具有查詢記錄功能的布隆過濾器(query-recorded bloom filter,QRBF)。本質(zhì)上是將原本的位組1位對應(yīng)一個布隆過濾器的下標(biāo)進(jìn)行更改,使得位組2位對應(yīng)QRBF的一個下標(biāo),使得QRBF的狀態(tài)值從2種變?yōu)?種。但由于實際的防偽方案中,實際的狀態(tài)值只需要“0”、“1”、“2”三種狀態(tài)。QRBF不同狀態(tài)值以及對應(yīng)的含義如表2所示。
表2 QRBF狀態(tài)值定義Tab.2 QRBF status value definition
布隆過濾器一般使用Bitmap進(jìn)行底層實現(xiàn),Bitmap是一個以位為單位的數(shù)組,數(shù)組下標(biāo)對應(yīng)布隆過濾器計算出的哈希值,數(shù)組元素記錄布隆過濾器的狀態(tài)變化。
在傳統(tǒng)的布隆過濾器實現(xiàn)中,用1位代表布隆過濾器的狀態(tài),32位的Bitmap代表一個m為32的布隆過濾器,初始狀態(tài)每一位都為0。圖5展示的是一個長度為32位的Bitmap。
圖5 傳統(tǒng)布隆過濾器的存儲結(jié)構(gòu)Fig.5 Storage structure of traditional bloom filter
QRBF的存儲結(jié)構(gòu)設(shè)計如圖6所示,32位的Bitmap對應(yīng)了一個m為16的QRBF。第一行為位組的底層結(jié)構(gòu),第二行為實際QRBF的底層結(jié)構(gòu)。
圖6 QRBF的存儲結(jié)構(gòu)Fig.6 Storage structure for QRBF
QRBF的初始化合約如下所示。
合約2QBRF初始化
輸入為布隆過濾器的字節(jié)長度M。輸出為初始化后的布隆過濾器Bf。
1. ifM<=0 then
2. return null//檢查輸入的有效性
3.Bf=allocate(byte[·],M)//使用內(nèi)存分配函數(shù)為Bf分配內(nèi)存
4. returnBf//返回Bf
1)插入。原始布隆過濾器更改位數(shù)組的操作只有插入元素,而QRBF中的更改位數(shù)組的操作有2個,分別是插入元素和防偽查詢。QRBF初始狀態(tài)為0,產(chǎn)品出廠時,將AUID加入到QRBF中,對應(yīng)下標(biāo)的0變?yōu)?,若為0之外的狀態(tài)則保持不變。QRBF的插入合約如下所示。
合約3QBRF插入合約
插入合約的輸入為AUID、Bf,輸出為插入操作后的Bf。
1. for 0≤i≤k-1//計算k個哈希值,并找到Bf對應(yīng)位置的值
2. ifBf[hashi(AUID)]==0 then//判斷BF中被hashi(AUID)映射的位置是否已被更改過
3.Bf[hashi(AUID)]=1//若未被更改,將對應(yīng)的位組改為1
4. end for
5. returnBf
圖7為對QRBF進(jìn)行插入的幾種情況的演示。
圖7 QRBF插入流程Fig.7 Insertion process of QRBF
其中元素x、y、z進(jìn)行哈希運算后映射到對應(yīng)下標(biāo)的值都為0,因此將各自位的值都改為1。w在進(jìn)行插入時,其中一位下標(biāo)值更改為1,故不再對該下標(biāo)對應(yīng)的值進(jìn)行修改。
2)查詢。消費者進(jìn)行查詢時,將對應(yīng)下標(biāo)的1改為2,若對應(yīng)下標(biāo)都為2,則說明該AUID已被查詢過。注意,消費者查詢的AUID對應(yīng)值為0,說明此AUID為非法AUID,則返回該產(chǎn)品為假冒產(chǎn)品,不對QRBF進(jìn)行任何修改,此規(guī)則可以防止惡意者發(fā)起大量非法查詢使得QRBF失效。QRBF查詢?nèi)绾霞s4所示。
合約4QBRF查詢合約
輸入為產(chǎn)品AUID、Bf,輸出查詢結(jié)果。
1. for 0≤i≤k-1//計算k個哈希值,并找到Bf對應(yīng)位置的值
2. ifBf[hashi(AUID)]==0 then
3. return "Fake"
4. else ifBf[hashi(AUID)]==1 then
5.Aflag=1//Aflag用于標(biāo)記哈希對應(yīng)的位置是否存在等于1的值
6. else ifBf[hashi(AUID)]==2 then
7.Acount++//Acount用于記錄等于2的值的個數(shù),若全為2,則證明該AUID已被查詢過
8. end for
9. ifAcount==kthen
10. return "Have been queried"
11. ifAflag==1 then//當(dāng)Aflag=1時,不可能存在等于0的位,因為在插入操作時已經(jīng)全部置為1;也不可能是被查詢過的,因為被查詢過的AUID的位全被置為了2;只有在所有位都為1時才會進(jìn)行變換,即非法查詢不能使得布隆過濾器的狀態(tài)產(chǎn)生變化
12. for 0≤i≤k-1//返回查詢結(jié)果為正品前需要將這個AUID對應(yīng)位置的值改為2,以便下次查詢時能得到正確的結(jié)果
13.Bf[hashi(AUID)]=2
14. end for
15. return "Real"
16. ifAflag==0 then//說明所有位都為0,為非法AUID
17. return "Fake"
圖8為對QRBF進(jìn)行查詢的幾種情況的演示。其中x、y、z、w已經(jīng)進(jìn)行了插入,首先對x進(jìn)行查詢,再對w進(jìn)行查詢,其中對x查詢時,每一個映射的下標(biāo)值都為1,則將每一位對應(yīng)在BitMap中的值都更新為2。對w進(jìn)行查詢時,第7位上的值已經(jīng)為2,但其余兩位為1,則只更改值為1的其他下標(biāo)對應(yīng)位組的元素為2。若查詢的結(jié)果中k個哈希對應(yīng)位組的值都為0,說明該AUID為商家沒有在布隆過濾器中進(jìn)行注冊的AUID。若查詢的k個哈希對應(yīng)位組的值都為2,則說明該AUID至少進(jìn)行了2次防偽驗證查詢。
圖8 QRBF查詢流程Fig.8 Query process of QRBF
對于想證明自己是首次查詢的用戶,服務(wù)器會發(fā)送以自己私鑰簽名的證書,證書定義為Ct=Sign(Qlog,Isk)=(S,H(Qlog)),其中Qlog=T‖Did,Did為唯一設(shè)備號,Qlog中包含的信息可以唯一表示用戶以及查詢行為。
由于QRBF的結(jié)構(gòu)以及更新的方式相比于傳統(tǒng)的布隆過濾器都有所不同,所以需要對誤判率重新進(jìn)行分析與計算。使QRBF的值產(chǎn)生變化的布隆過濾器操作有2個,一是出廠登記時將新元素插入到QRBF中,二是查詢成功時將記錄存儲到QRBF中。文獻(xiàn)[20]提出了基于門限功能的計數(shù)布隆過濾器的概率分析,其結(jié)構(gòu)與QRBF相似,因此使用相同的思路對QRBF進(jìn)行誤判率分析。
在有m個元素的QRBF中,使用哈希函數(shù)將n個元素插入到QRBF中,每個元素都被輸入到k個哈希函數(shù)中,然后根據(jù)算出的哈希值遞增該位置的值,QRBF中下標(biāo)值l具有的二項式分布的概率質(zhì)量函數(shù)定義表示為
(3)
對于元素映射對應(yīng)值為l的誤判率表示為
(4)
(4)式中:θ代表布隆過濾器的狀態(tài)值。
pfp(θ,k,n,m)
(5)
泊松分布的累計質(zhì)量函數(shù)是正則化的不完全gamma函數(shù)[21],繼續(xù)將上式轉(zhuǎn)換成
(6)
QRBF誤判率計算如下。根據(jù)前述布隆過濾器的設(shè)計,狀態(tài)值θ有0、1、2三種情況。由于布隆過濾器中不會把存在于集合中的元素誤判為非集合元素,因此,當(dāng)θ=0時,fp(θ=0)=0。θ=1和θ=2時的誤判率計算式為
(7)
(8)
于是QRBF誤判率為
(9)
表3 QRBF誤判率分析Tab.3 False positive rate analysis of QRBF
QRBF誤判率分析如表3所示。由表3可見,當(dāng)擁擠指數(shù)較低時,誤判率幾乎可忽略不計;當(dāng)擁擠指數(shù)較高時,誤判率依舊在可接受的范圍內(nèi)。因此,只要使用者對QRBF具體使用場景中插入元素個數(shù)以及元素被查詢次數(shù)進(jìn)行提前調(diào)研與預(yù)估,合理地初始化QRBF的大小,就幾乎不會出現(xiàn)誤判的情況。
本實驗采用物理機(jī)來進(jìn)行測試。測試平臺為HUAWEI MateBook14,操作系統(tǒng)為Ubuntu18.04,處理器為Intel i7-8565U,主頻為1.8 GHz,內(nèi)存為8 GB。
1)通信量。使用SBFT可以根據(jù)惡意節(jié)點數(shù)量動態(tài)切換共識機(jī)制,在惡意節(jié)點滿足快速模式的數(shù)量要求時,使用的兩階段共識比三階段共識的PBFT更高效。
在任何情況下,單輪通信次數(shù)都可以由n(n-1)次減小為2n次,大大降低了共識的通信開銷,提高了共識效率。
2)簽名性能。在共識機(jī)制中,任何節(jié)點對于自己廣播的數(shù)據(jù)都需要進(jìn)行簽名操作,其他節(jié)點通過驗簽判斷數(shù)據(jù)的真實性,并且SBFT通過門限簽名的結(jié)果進(jìn)入不同模式的共識機(jī)制,因此簽名算法性能的提高對于SBFT性能的提高是有直接影響的。以螞蟻鏈為例,系統(tǒng)共有近10億賬戶,每天“上鏈量”超過1億次,使用的共識機(jī)制是PBFT,簽名算法使用BLS[22],若使用SM2算法[23],則系統(tǒng)整體的性能將會得到提高,文獻(xiàn)[24]也提到了簽名算法性能對系統(tǒng)的重要性。本文對簽名以及驗簽進(jìn)行了實驗。BLS以及SM2測試代碼基于C語言進(jìn)行實現(xiàn),基于雙線性對的密碼庫PBC[25]中所提供。實驗結(jié)果如表4所示。
表4 P256曲線下的簽名效率對比Tab.4 Comparison of signature efficiency P256 curve /ms
QRBF插入效率和查詢效率的時間開銷實驗結(jié)果如圖9—圖10所示,插入元素以及查詢元素的時間開銷都為納秒級。若使用數(shù)據(jù)庫存儲方式,所占用的時間開銷將為毫秒級,在億萬級數(shù)據(jù)量的情形下時間開銷將更大。
圖9 QRBF插入時間開銷Fig.9 Insertiontime cost of QRBF
圖10 QRBF查詢操作的時間開銷Fig.10 Insertiontime cost of QRBF
本文將QRBF與CBF、SBF進(jìn)行內(nèi)存開銷的對比。CBF每一個元素都占用相同位數(shù),位數(shù)取決于被查詢次數(shù)最多的元素所對應(yīng)的計數(shù)器占用位數(shù)。SBF使用動態(tài)調(diào)整的位數(shù)來存儲不同元素的查詢次數(shù),使用偏移數(shù)組來存儲各計數(shù)器對應(yīng)的存儲位置。
假設(shè)某一產(chǎn)品的防偽碼被盜用1萬次,則QRBF所使用的內(nèi)存將是CBF的1/7,也遠(yuǎn)遠(yuǎn)少于使用額外偏移數(shù)組的SBF。
文獻(xiàn)[26]實現(xiàn)了一種基于區(qū)塊鏈的電商平臺產(chǎn)品信息追溯和防偽模型,將區(qū)塊鏈的去中心化、可溯源、防篡改、防單點故障的特性應(yīng)用到防偽系統(tǒng)中,不依賴商家提供查詢結(jié)果。文獻(xiàn)[27]將區(qū)塊鏈技術(shù)和NFC芯片相結(jié)合,設(shè)計了一種應(yīng)用于供應(yīng)鏈的安全防偽系統(tǒng),該防偽碼不可偽造,但因成本過高不便于推廣。文獻(xiàn)[28]使用了IPFS存儲實際數(shù)據(jù),減少了數(shù)據(jù)在區(qū)塊鏈中的冗余存儲。表5對上述方案的系統(tǒng)功能進(jìn)行了對比。
表5 系統(tǒng)功能對比Tab.5 Comparison of system functions
本文研究了基于記錄查詢布隆過濾器的區(qū)塊鏈溯源方案,使用IPFS減小上鏈數(shù)據(jù)的負(fù)擔(dān)和運行服務(wù)器方的負(fù)擔(dān);使用SBFT以及SM2算法提高系統(tǒng)效率;還使用自定義的QRBF過濾無效的AUID查詢,避免了系統(tǒng)資源的浪費。QRBF可以記錄此AUID的查詢次數(shù),若不是首次查詢,則對消費者進(jìn)行提醒,一定程度上防止了產(chǎn)品防偽標(biāo)識的濫用。該方案為商家提供高效率的溯源方案,為消費者提供可信的產(chǎn)品溯源數(shù)據(jù),為防偽技術(shù)提供解決思路。