姚浩男,盧清華,張衛(wèi)山,劉越
(中國石油大學(xué)(華東)計算機科學(xué)與技術(shù)學(xué)院,青島 266580)
比特幣(Bitcoin)[1]是一種基于對等網(wǎng)絡(luò)和加密技術(shù)的數(shù)字貨幣.區(qū)塊鏈?zhǔn)潜忍貛疟澈蟮募夹g(shù),提供不可變的和共享的數(shù)據(jù)存儲,并且事務(wù)數(shù)據(jù)是防篡改的,與傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)[2]相比,它允許插入和查詢事務(wù),阻止更新或刪除事務(wù)操作.區(qū)塊鏈網(wǎng)絡(luò)中的所有節(jié)點都可以在交易數(shù)據(jù)的狀態(tài)上達(dá)成協(xié)議,而無需依賴于一個集中化的系統(tǒng).
數(shù)據(jù)管理是有效地收集,存儲,處理和應(yīng)用數(shù)據(jù)的過程.隨著數(shù)據(jù)存儲冗余的不斷減少,數(shù)據(jù)獨立性的不斷增強以及數(shù)據(jù)操作的更加方便和簡單,數(shù)據(jù)管理得到了長足的發(fā)展.區(qū)塊鏈技術(shù)的出現(xiàn)為數(shù)據(jù)管理提供了一種新的方式,在安全,數(shù)據(jù)隱私和身份認(rèn)證等方面都得到了廣泛的研究.
然而,由于區(qū)塊鏈研究還處于早期階段,仍然存在許多限制.例如,大數(shù)據(jù)集很難用塊存儲;區(qū)塊鏈數(shù)據(jù)分布共享,可能導(dǎo)致信息泄漏;而且,如果沒有良好的數(shù)據(jù)管理模式設(shè)計,處理大量需要共識的事務(wù)通常會很慢.
因此,本文提出了改進(jìn)區(qū)塊鏈數(shù)據(jù)管理的幾種設(shè)計模式,包括哈希完整性模式,數(shù)據(jù)隱私保護(hù)模式和狀態(tài)通道模式.設(shè)計模式在很大程度上簡化了開發(fā)過程,提高了區(qū)塊鏈應(yīng)用程序開發(fā)人員的效率.我們實現(xiàn)了一個真實的基于區(qū)塊鏈[3]的可跟蹤系統(tǒng)originChain[4],作為一個案例研究來展示如何在實踐中應(yīng)用設(shè)計模式.本文討論了鏈上組件和鏈外組件之間的交互限制,并就如何使用這些設(shè)計模式分享了一些經(jīng)驗.
本文的其余部分組織如下,第1節(jié)介紹了基于區(qū)塊鏈的應(yīng)用背景和相關(guān)工作以及設(shè)計模式.第2節(jié)討論設(shè)計模式.第3節(jié)討論設(shè)計模式的應(yīng)用.第4節(jié)總結(jié)了本文的工作和未來的工作.
區(qū)塊鏈作為比特幣[1]的底層技術(shù),是一種用于存儲交易記錄的去中心化,公開透明的分布式數(shù)據(jù)庫[5].它是一種融合了分布式數(shù)據(jù)存儲,點對點傳輸,共識機制和密碼學(xué)[6-9]的新技術(shù).區(qū)塊鏈最初只提供一個公共分類賬來記錄與特定數(shù)字加密貨幣相關(guān)的交易,其工作領(lǐng)域僅限于金融業(yè).由于引入了名為智能合約[10]的可編程基礎(chǔ)設(shè)施,區(qū)塊鏈能夠處理復(fù)雜的事務(wù)處理,比如觸發(fā)器、條件和支持應(yīng)用程序的業(yè)務(wù)邏輯[11],使其可以應(yīng)用到更多的領(lǐng)域行業(yè),比如醫(yī)療[12,13]、物聯(lián)網(wǎng)(IoT)[14,15]以及司法事務(wù)等.
區(qū)塊鏈將數(shù)據(jù)存儲在有序的塊列表中.區(qū)塊鏈上的每個塊都包含一個事務(wù)列表[16],區(qū)塊之間鏈接通過后一個區(qū)塊中記錄前一個區(qū)塊哈希值的方式進(jìn)行.且在區(qū)塊鏈上已發(fā)布的事務(wù)不能被刪除或更改,由于哈希值的唯一性,如果一個塊中的交易被更改,那么該塊的哈希值會相應(yīng)的發(fā)生變化,導(dǎo)致后續(xù)已生成的所有塊的哈希值都會相應(yīng)發(fā)生變化,這是一個巨大的工作量,區(qū)塊鏈網(wǎng)絡(luò)中的相鄰對等節(jié)點也會檢測此變化,并阻止此變化且更正此修改.區(qū)塊鏈的這種特性使其具有不可篡改性.
區(qū)塊鏈網(wǎng)絡(luò)中的節(jié)點是相等的,區(qū)塊鏈通過共識算法[17]解決節(jié)點之間的信任問題,體現(xiàn)了區(qū)塊鏈的去中心化特性.區(qū)塊鏈的去中心化可以在實際應(yīng)用中解決信任問題,例如通過不可信的第三方支付問題,點對點區(qū)塊鏈基礎(chǔ)結(jié)構(gòu)避免了第三方的信任管理.
智能合約:智能合約最初是由Nick Szabo在1994年提出的.智能合約是可編程的觸發(fā)器、條件和業(yè)務(wù)邏輯,以支持復(fù)雜的業(yè)務(wù)流程[18,19].Solidity[20]是一種實用的智能合約編程語言.從理論上講,智能合約可以對所有的業(yè)務(wù)流程進(jìn)行編程,這使得從區(qū)塊鏈中開發(fā)應(yīng)用程序成為可能.智能合約是純編程函數(shù),不能直接訪問外部系統(tǒng)的狀態(tài).
以太坊:以太坊[21]是一個開源的公共區(qū)塊鏈平臺,可以部署智能合約,為用戶提供各種模塊構(gòu)建應(yīng)用程序.以太坊中的應(yīng)用程序?qū)嶋H上是一個智能合約[22].用戶通過智能合約編寫的業(yè)務(wù)是不可預(yù)測的,這為用戶在以太坊上構(gòu)建各種應(yīng)用程序提供了靈活性和強大的功能,但同時也帶來了整個系統(tǒng)的不確定性和安全性以及性能問題.因此,設(shè)計模式對于區(qū)塊鏈數(shù)據(jù)管理非常重要.
設(shè)計模式[23]是可重用的微架構(gòu)[19],它們?yōu)樵谔囟ㄉ舷挛闹性O(shè)計重復(fù)出現(xiàn)的問題提供了可靠的解決方案.第一個也是最著名的一組設(shè)計模式是Gamma 等人在書中提出的.設(shè)計模式有3種類型,包括創(chuàng)造性模式、結(jié)構(gòu)模式和行為模式.創(chuàng)造性模式涉及對象創(chuàng)建,結(jié)構(gòu)模式捕獲類或?qū)ο蠼M合,行為模式處理類和對象分配職責(zé)和交互的方式.
設(shè)計模式支持代碼的重用,使代碼更容易理解,并確保代碼的可靠性.設(shè)計模式是軟件開發(fā)人員在應(yīng)用程序開發(fā)過程中所面臨的常見問題的解決方案.正確使用設(shè)計模式可以避免許多問題.
隨著區(qū)塊鏈的不斷發(fā)展,它對學(xué)術(shù)界和產(chǎn)業(yè)界都是一個機遇和挑戰(zhàn).如何充分利用區(qū)塊鏈的特點服務(wù)于行業(yè)成為各行各業(yè)的難點.數(shù)據(jù)管理與各個行業(yè)緊密相關(guān),可以作為結(jié)合各個行業(yè)和區(qū)塊鏈的路徑.
在學(xué)術(shù)界,學(xué)者們對區(qū)塊鏈的特性以及如何利用這些特性使區(qū)塊鏈[24]適應(yīng)各行各業(yè)進(jìn)行了相關(guān)的研究工作.Bartoletti和Pompianu[25]討論了智能合約在每個區(qū)塊鏈平臺上的解釋和應(yīng)用,基于比特幣和以太坊的應(yīng)用領(lǐng)域,量化了智能合約的使用,并分析了以太坊最常見的編程模式.Xu和Pautasso[26]提出了一種基于區(qū)塊鏈的模式語言.有些模式是基于區(qū)塊鏈實際應(yīng)用程序?qū)iT設(shè)計的,而其他模式則是在智能合約上下文中應(yīng)用的現(xiàn)有設(shè)計模式的變體.他們?yōu)閰^(qū)塊鏈服務(wù)提出了8種設(shè)計模式.Eberhardt和Tai[27]提出了4種模式,包括挑戰(zhàn)響應(yīng)模式、off-chain 簽名模式、內(nèi)容尋址存儲模式、委托計算模式和低合同足跡模式,這些模式主要關(guān)注于數(shù)據(jù)和計算的鏈上和鏈下分離.然而,上述相關(guān)研究只是通過理論分析來分析區(qū)塊鏈在數(shù)據(jù)管理中的可行性.在本文中,我們重點介紹了設(shè)計模式的實現(xiàn),并給出了在實際應(yīng)用程序中的應(yīng)用.代碼已上傳至開源網(wǎng)站Github[28].
在本節(jié)中,我們?yōu)榛趨^(qū)塊鏈的應(yīng)用程序的性能,隱私和成本設(shè)計并實現(xiàn)了以下3種模式.(1)哈希完整性模式確保任何大數(shù)據(jù)集的完整性和不可變性,大文件不直接存儲在區(qū)塊鏈中.(2)數(shù)據(jù)隱私保護(hù)模式對區(qū)塊鏈應(yīng)用程序中的機密數(shù)據(jù)進(jìn)行加密,將密文存儲在鏈上,只有具有權(quán)限的人才能進(jìn)行訪問.(3)狀態(tài)通道模式,允許執(zhí)行鏈下事務(wù),將小額支付的高成本支付行為轉(zhuǎn)移到鏈下,只在鏈上執(zhí)行狀態(tài)更新.數(shù)據(jù)管理設(shè)計模式結(jié)構(gòu)圖如圖1所示.
如圖1所示,哈希完整性模式存儲哈希值可以通過智能合約方式進(jìn)行存儲,也可以通過小額支付狀態(tài)通道模式的方式,通過將哈希值附屬在轉(zhuǎn)賬交易的信息中,直接存儲到區(qū)塊鏈賬本中.兩種方式最終的驗證方式不同,智能合約方式可以通過針對性的鍵值獲取哈希值,小額支付狀態(tài)通道模式是通過交易哈希值獲取交易信息,然后在獲取存儲的哈希值.狀態(tài)通道模式致力于小額支付的應(yīng)用,也適用于獎勵機制的創(chuàng)造,如3.4節(jié)中所描述的場景.隱私保護(hù)模式是將數(shù)據(jù)以密文的形式存儲到區(qū)塊鏈上,密文可以是公鑰加密過后的密文,也可以是數(shù)據(jù)的哈希值(通過使用哈希完整性模式計算出的哈希值),這兩種方式都可以保證數(shù)據(jù)的隱私不被泄露,通過鏈上智能合約與鏈下數(shù)據(jù)庫中的數(shù)據(jù)表一一對應(yīng)的方式存儲,方便用戶的存儲以及查詢.下文是對3種設(shè)計模式的詳細(xì)描述.
圖1 數(shù)據(jù)管理設(shè)計模式結(jié)構(gòu)圖
摘要:不直接將大數(shù)據(jù)集或文件存儲在區(qū)塊鏈上,而是將數(shù)據(jù)集或文件的散列放在鏈上,以確保數(shù)據(jù)的完整性.
場景:區(qū)塊鏈的特點和作為存儲數(shù)據(jù)庫的能力促使一些應(yīng)用程序使用區(qū)塊鏈來保證數(shù)據(jù)集的不變性和完整性.任何數(shù)據(jù)集都可以存儲在區(qū)塊鏈中.
問題:在區(qū)塊鏈上存儲數(shù)據(jù)時,存儲的數(shù)據(jù)越大,所需的gas (以太坊交易指標(biāo))值越大,所需的時間也越多,相應(yīng)的也會增加整個區(qū)塊鏈的負(fù)擔(dān),使得整個區(qū)塊鏈的存儲量增加巨大.對于某些大數(shù)據(jù)集或文件,即使給出了較大的gas值,也可能由于塊大小而無法存儲在區(qū)塊鏈中.區(qū)塊鏈網(wǎng)絡(luò)中的所有節(jié)點用戶都將保留完整的數(shù)據(jù)塊,由于區(qū)塊鏈的存儲能力,這將成為用戶的負(fù)擔(dān).區(qū)塊鏈中的塊大小是有限的,并且可能無法在一次交易事務(wù)中存儲大型數(shù)據(jù)集或文件.如何在區(qū)塊鏈上存儲任意大小的數(shù)據(jù),以保證數(shù)據(jù)的不變性和完整性,是區(qū)塊鏈數(shù)據(jù)管理過程中的一個重要問題.
解決方案:哈希函數(shù)有一個特性:由同一哈希函數(shù)產(chǎn)生的兩個不同的哈希值,其所指示的原始數(shù)據(jù)也是不相同的.通過哈希函數(shù)的特性和區(qū)塊鏈的特點,可以幫助解決數(shù)據(jù)存儲在區(qū)塊鏈上時的數(shù)據(jù)量大的問題,也可以保證數(shù)據(jù)的不變性和完整性.
在進(jìn)行大數(shù)據(jù)集存儲的時候,將原始數(shù)據(jù)存儲在鏈下的數(shù)據(jù)庫,然后將數(shù)據(jù)的哈希值存儲到區(qū)塊鏈上.以存儲文件為例:用戶獲取文件,然后對文件進(jìn)行哈希運算操作,將文件以及文件的哈希值存入到鏈下數(shù)據(jù)庫中,然后以文件名作為鍵,文件的哈希值作為鍵值,存儲到區(qū)塊鏈上.
對于存儲到鏈上的哈希值如何使用,在模式中提供了驗證的功能.驗證文件是否被修改過,需要將文件再次哈希,然后根據(jù)文件名獲取到鏈上存儲的哈希值,兩者進(jìn)行比對,使用的是同一哈希函數(shù)進(jìn)行的文件哈希,所以如果文件進(jìn)行過改動那么兩次的哈希值是不同的,然后將結(jié)果反饋給用戶.哈希值的存儲以及哈希值的獲取比較,充分利用了區(qū)塊鏈的不可篡改性和哈希的不變性,解決了大數(shù)據(jù)無法存儲到鏈上的問題,保證了數(shù)據(jù)的不變性和完整性.
結(jié)構(gòu):哈希完整性模式的結(jié)構(gòu)如圖2所示.
圖2 哈希完整性模式結(jié)構(gòu)圖
結(jié)論:
(1)優(yōu)點:區(qū)塊鏈保證了原始數(shù)據(jù)的完整性.通過區(qū)塊鏈上已存儲的哈希值可以檢查原始數(shù)據(jù)的完整性.相對于將大數(shù)據(jù)集或文件存儲在區(qū)塊鏈上,例如某些應(yīng)用開發(fā)者,將整個數(shù)據(jù)庫的壓縮文件存儲到區(qū)塊鏈上;司法公正相關(guān)文件,包括圖片,證物文件等,證據(jù)文件完整的存儲到區(qū)塊鏈.以上常見方式會造成的區(qū)塊鏈數(shù)據(jù)量的增加負(fù)擔(dān),用戶需承擔(dān)的巨額gas 消耗,而且可能由于單個文件過大,超過單個區(qū)塊的存儲量,導(dǎo)致文件無法存儲的情況發(fā)生.然而只存儲固定長度(256位)的一串字符串(哈希值)到區(qū)塊鏈,很大程度的減輕了區(qū)塊鏈存儲負(fù)擔(dān)及gas 花費負(fù)擔(dān),由于存儲在鏈上的是數(shù)據(jù)哈希值,所以可以保證任意數(shù)據(jù)大小的完整性,不在受區(qū)塊鏈塊大小的影響.
(2)缺點:原始數(shù)據(jù)是鏈下存儲,無法保證原始數(shù)據(jù)的安全性以及不被修改.只能通過比對哈希值的方式檢測數(shù)據(jù)是否被修改,如果數(shù)據(jù)一旦被修改則無法進(jìn)行恢復(fù).
(3)注意事項:需要專門的一個模塊來計算數(shù)據(jù)的哈希值.
已知應(yīng)用:
存在證明(POEX.IO)[29]是一種用于私有區(qū)塊鏈上使用MultiChain和AWS EC2的文件的加密工具.證明存在提供的服務(wù)允許在比特幣區(qū)塊鏈中輸入SHA-256加密的文檔散列,作為文檔存在的證明,同時保證數(shù)據(jù)的完整性.
Chainy[30]是一個運行在Ethereum 區(qū)塊鏈上的智能合約.Chainy 將一個到鏈下文件的短鏈接及其對應(yīng)的散列值存儲在一個位置.它可以與存在證明相結(jié)合.出于安全或隱私原因,可能不希望信任將文件保存在屬于第三方的服務(wù)器上.Chainy通過將證明和文件鏈接保存在一個智能合約中解決了這個問題.
摘要:區(qū)塊鏈的一個特性是透明性,因此它不能用于共享一些商業(yè)關(guān)鍵數(shù)據(jù).對于特定的數(shù)據(jù)使用密文的形式存儲于區(qū)塊鏈上,對于不同程度或者不同方式的數(shù)據(jù)可選擇對稱加密或者非對稱加密.
場景:對于基于區(qū)塊鏈的應(yīng)用程序,可能存在一些關(guān)鍵性數(shù)據(jù)(例如銀行金融方面的數(shù)據(jù)),只有相關(guān)人員才可以有訪問的權(quán)限.例如審計部門對于溯源過程的審計結(jié)果,只有頒發(fā)證書的相關(guān)部門負(fù)責(zé)人才可以訪問到這個結(jié)果,無關(guān)人員無法進(jìn)行訪問.
問題:區(qū)塊鏈的公開透明性是區(qū)塊鏈的特點,但這也使得重要數(shù)據(jù)的隱私問題受到挑戰(zhàn).數(shù)據(jù)隱私問題是區(qū)塊鏈的弊端,區(qū)塊鏈上的數(shù)據(jù)透明性導(dǎo)致存儲在區(qū)塊鏈上的數(shù)據(jù)信息,對于加入到區(qū)塊鏈中的所有節(jié)點用戶都是可以訪問的.區(qū)塊鏈上的信息是公開透明的,即使是新加入的節(jié)點,也擁有一個區(qū)塊鏈上的完整賬本,以及訪問區(qū)塊鏈上的所有信息數(shù)據(jù)的能力.區(qū)塊鏈中的節(jié)點都是平等的,沒有擁有特殊職權(quán)的節(jié)點.區(qū)塊鏈的數(shù)據(jù)透明性導(dǎo)致一些關(guān)鍵數(shù)據(jù)存儲在區(qū)塊鏈上時,會發(fā)生數(shù)據(jù)泄露問題.針對這一問題,設(shè)計實現(xiàn)了數(shù)據(jù)隱私保護(hù)模式,解決了用戶數(shù)據(jù)隱私發(fā)生泄露問題.
解決方法:
為了保護(hù)用戶的隱私,在往鏈上存儲數(shù)據(jù)的時候,對一些關(guān)鍵的數(shù)據(jù)進(jìn)行加密處理,然后再存儲到鏈上.這里使用非對稱加密的算法進(jìn)行對數(shù)據(jù)加解密操作.每個節(jié)點用戶擁有一對公私鑰,將私鑰進(jìn)行自己保管,公鑰存儲到鏈上公示.如果自己存儲數(shù)據(jù),可以用自己的公鑰進(jìn)行加密操作,然后再將加密后的密文存儲到鏈上;如果是發(fā)送數(shù)據(jù)給別人,可以從鏈上獲取接收方的公鑰,然后用其公鑰進(jìn)行數(shù)據(jù)加密操作,接收方再用自己的私鑰進(jìn)行解密查看.這樣就解決了關(guān)鍵數(shù)據(jù)在鏈上時,會造成數(shù)據(jù)泄露問題.雖然其他節(jié)點也會看到,但他們看到的只是加密后的密文,沒有私鑰是無法進(jìn)行查看原數(shù)據(jù)的.
在進(jìn)行數(shù)據(jù)庫表創(chuàng)建時,用戶需要篩選出哪些屬性是關(guān)鍵數(shù)據(jù),需要存儲到鏈上,與此同時會在鏈上創(chuàng)建與表相對應(yīng)的智能合約,用于存儲這些關(guān)鍵數(shù)據(jù).鏈上的存儲的鍵與鏈下數(shù)據(jù)庫中的主鍵相對應(yīng),由于存儲以密文形式存儲,鏈上數(shù)據(jù)存儲統(tǒng)一數(shù)據(jù)類型(string型),對于數(shù)據(jù)類型之間的轉(zhuǎn)換,在鏈下進(jìn)行,會根據(jù)其在數(shù)據(jù)庫中的存儲類型進(jìn)行對應(yīng)的轉(zhuǎn)換.
在進(jìn)行數(shù)據(jù)存儲時,鏈下數(shù)據(jù)庫中存儲完整的表結(jié)構(gòu)數(shù)據(jù),鏈上僅存儲那些關(guān)鍵數(shù)據(jù)(被篩選出需要存儲在鏈上的數(shù)據(jù)).根據(jù)用戶存儲數(shù)據(jù)的用途來選擇是用自己的密鑰加密,還是用他人的密鑰進(jìn)行加密.如果是自己作為存儲使用,那么獲取自己的公鑰進(jìn)行數(shù)據(jù)加密操作,然后將數(shù)據(jù)分別存儲到鏈上和鏈下;如果是某些數(shù)據(jù)需要發(fā)送給他人,這時需要獲取他人在區(qū)塊鏈上公示的公鑰進(jìn)行加密操作,然后進(jìn)行存儲到鏈上,接收方只需要得到這個數(shù)據(jù),然后使用自己的私鑰進(jìn)行解密查看.
結(jié)構(gòu):數(shù)據(jù)隱私保護(hù)模式的結(jié)構(gòu)如圖3所示.
圖3 數(shù)據(jù)隱私保護(hù)模式結(jié)構(gòu)圖
結(jié)論:
(1)優(yōu)點:保證了數(shù)據(jù)的隱私性.存放在區(qū)塊鏈上的關(guān)鍵性數(shù)據(jù)是經(jīng)過加密的,雖然區(qū)塊鏈上的數(shù)據(jù)都是共享的公開透明的,但其他節(jié)點如果沒有秘鑰是無法進(jìn)行解密的.
(2)缺點:秘鑰需用戶自己存儲,用戶如果導(dǎo)致秘鑰泄露,就會造成數(shù)據(jù)的隱私受到威脅.加密過后的密文較長,需要分段存儲.
(3)注意事項:針對不同需要選擇是用對稱密鑰還是非對稱密鑰;密鑰的產(chǎn)生需要另一個模塊;密鑰的管理需謹(jǐn)慎,防止泄露;使用非對稱密鑰,公鑰需存儲到區(qū)塊鏈,私鑰用戶自己存儲,不論使用對稱或非對稱密鑰,節(jié)點間共享加密的數(shù)據(jù),需要先共享密鑰.
已知應(yīng)用:
Oraclize[31]是一個運行在以太坊公網(wǎng)上的智能合約,它提供了從外部世界訪問狀態(tài)的服務(wù).它在數(shù)據(jù)源中使用數(shù)據(jù)加密和解密操作.開發(fā)人員可以使用Oraclize公鑰加密整個查詢或它的一些參數(shù),從而實現(xiàn)加密的Oraclize 查詢.唯一能夠解密調(diào)用參數(shù)的是使用配對的私鑰Oraclize.
MLGBlockchain[32]是一家全球性的風(fēng)險創(chuàng)造和咨詢公司,擁有區(qū)塊鏈技術(shù)開發(fā)和經(jīng)紀(jì)經(jīng)銷商的能力.由MLGBlockchain 提出的加密數(shù)字簽名,用于加密數(shù)據(jù),并在通過區(qū)塊鏈交互和傳輸數(shù)據(jù)的各方之間共享數(shù)據(jù).
摘要:區(qū)塊鏈上每一筆交易的發(fā)生都會產(chǎn)生資金資源消耗,小型的交易(包括小額的轉(zhuǎn)賬交易或者單個數(shù)據(jù)交換等)不適合在區(qū)塊鏈上進(jìn)行,將此類型的交易轉(zhuǎn)移到鏈下,等待一段時間或者一定交易次數(shù)達(dá)到來定期更新鏈上的狀態(tài).
場景:小型交易包括小到幾美分的資金交易例如WiFi 熱點的收費,每使用1萬字節(jié)的數(shù)據(jù),就會收取一小筆錢;或者單個數(shù)據(jù)的交換發(fā)生,例如一組測試樣品的實驗室之間的測試結(jié)果的交換.問題是,是否有必要將這類交易全部存儲到區(qū)塊鏈,占用區(qū)塊鏈的大量存儲空間.
問題:區(qū)塊鏈上存儲數(shù)據(jù)需要耗資,個人小額支付交易的交易費用可能高于與小額支付交易相關(guān)的貨幣價值.區(qū)塊鏈上的交易需要確認(rèn),而確認(rèn)時間并不能確定,但用戶期望的是小額交易支付能夠即時完成.區(qū)塊鏈上的交易時間長,費用高,以致不可能在區(qū)塊鏈上存儲每一筆小額的交易.在這么多交易矛盾的情況下,是否有必要在區(qū)塊鏈上進(jìn)行小額交易成為一個問題.
解決方法:小額交易的成本太高,在區(qū)塊鏈上存儲小額交易是不可行的.但小額交易的發(fā)生是不可避免的,為了解決小額交易的問題,本文中設(shè)計實現(xiàn)了狀態(tài)通道模式.狀態(tài)通道指小額交易的發(fā)生持續(xù)進(jìn)行,只在鏈上更新最終的交易狀態(tài).交易的終止點會有限定,當(dāng)達(dá)到限定條件后終止交易,更新鏈上狀態(tài).
狀態(tài)通道有兩種限制,一是設(shè)定個人的交易限制額度,一旦交易超過限制額度則停止交易關(guān)閉通道,更新鏈上狀態(tài);二是設(shè)定個人交易次數(shù),次數(shù)達(dá)到停止交易關(guān)閉通道,更新鏈上狀態(tài).狀態(tài)通道初始是無通道的,一旦交易發(fā)生,先會查找是否有可以借用的他人建立的通道,如果存在則借用別人通道進(jìn)行交易的傳輸;如果查找不到可借用通道,則交易雙方建立直接的一條交易通道.滿足可借用通道的條件是交易額度不受通道限制(每一條通道會有一個“帶寬”),中間節(jié)點的余額滿足交易額度.每一條通道會有一個“通道帶寬”,限制通道允許交易的額度,是由通道兩端節(jié)點在第一次建立通道時隨機產(chǎn)生的一個大于第一次交易額度的值.交易進(jìn)行前會對交易雙方的賬戶余額進(jìn)行查詢驗證看是否滿足交易額度,滿足則通過狀態(tài)通道進(jìn)行交易,否則無法進(jìn)行交易.
鏈下的交易不受區(qū)塊鏈上塊大小、遠(yuǎn)近的限制,也不受確認(rèn)塊的時間限制,無須等到所有區(qū)塊鏈節(jié)點達(dá)成共識才完成交易,只在鏈上更新所有交易完成后的最終狀態(tài).而小額交易的細(xì)節(jié)不公開,不記錄在鏈上賬本中,鏈上賬本只記錄最終的交易.極大地節(jié)省了不必要耗資,提高了效率.
結(jié)構(gòu):狀態(tài)通道模式的結(jié)構(gòu)如圖4所示.
圖4 狀態(tài)通道模式結(jié)構(gòu)圖
結(jié)論:
(1)優(yōu)點:避免了過度的資源的消耗,減少了交易所消耗的時間,提高了交易的性能;只在最終交易完成以后更新鏈上的狀態(tài),交易細(xì)節(jié)不在公布;由于在鏈下進(jìn)行交易,交易不在受限于區(qū)塊鏈上塊的大小的限制.
(2)缺點:通道交易額度的限制,需根據(jù)具體情況進(jìn)行調(diào)節(jié),每次交易的發(fā)生可能會不斷更新通道限額,影響交易的效率.
(3)注意事項:鏈下需要一個類似于以太坊錢包的控件,用來更新存儲鏈上的狀態(tài).
已知應(yīng)用:
Lightning Network[33]是一種鏈?zhǔn)椒?wù)解決方案,它不發(fā)送任何貨幣,而是在第2級更改分類帳,然后在第1級完成結(jié)算,從而避免了數(shù)千次實際的資金轉(zhuǎn)移.閃電網(wǎng)絡(luò)通過將資金發(fā)送到由多方托管的多個簽名地址來構(gòu)建支付渠道.付款通道可以通過播放最終版本的融資交易來關(guān)閉,以結(jié)算付款.
在本節(jié)中,以溯源系統(tǒng)[4]為應(yīng)用實例,來驗證在第2節(jié)中提出的3個設(shè)計模式,并對其進(jìn)行詳細(xì)的使用描述.
溯源系統(tǒng)[4]指物聯(lián)網(wǎng)、移動互聯(lián)網(wǎng)以及一物一碼等技術(shù)的整合應(yīng)用.在產(chǎn)品生產(chǎn)過程中采集產(chǎn)品數(shù)據(jù)信息并形成溯源檔案.在產(chǎn)品生產(chǎn)和分銷中跟蹤產(chǎn)品相關(guān)信息(原料產(chǎn)地、生產(chǎn)加工、質(zhì)量檢測以及物流運輸)是溯源系統(tǒng)的主要目標(biāo).由政府部門認(rèn)證的溯源公司,可以向原料提供方、產(chǎn)品生產(chǎn)商以及零售商提供溯源服務(wù),溯源公司派遣相關(guān)人員,到產(chǎn)品的各個環(huán)節(jié)進(jìn)行考核檢查,并且對于各個環(huán)節(jié)的樣品進(jìn)行樣品檢測,如果符合政府部門發(fā)布的合格標(biāo)準(zhǔn),則予以頒發(fā)溯源證書,否則將拒絕頒發(fā).圖5演示了產(chǎn)品可追溯性的業(yè)務(wù)流程[19].
圖5 溯源服務(wù)過程圖
基于區(qū)塊鏈的產(chǎn)品溯源系統(tǒng)(originChain)[4]是由傳統(tǒng)數(shù)據(jù)庫與區(qū)塊鏈技術(shù)結(jié)合形成.供應(yīng)鏈行業(yè)[34]需要數(shù)據(jù)的透明性以及不可篡改性,以確保產(chǎn)品信息的真實性和可靠性.正因為區(qū)塊鏈技術(shù)的特點,使得區(qū)塊鏈技術(shù)適用于溯源系統(tǒng)的各個環(huán)節(jié).
溯源證書是可以被修改或者被惡意替換的,存在鏈下數(shù)據(jù)庫中總是不安全的,如何保證溯源證書在傳輸過程中的完整性和不變性是個問題.隨著區(qū)塊鏈的問世,區(qū)塊鏈的特點為解決此類問題提供了方案.
溯源公司在確定商品后,給相關(guān)部門頒發(fā)溯源證書[15],并對溯源證書進(jìn)行哈希計算,將哈希值存儲到鏈上.然后供貨商接收到溯源證書,將溯源證書貼于商品上;購貨商購買商品,如果想驗證真?zhèn)?需將溯源證書再次哈希,然后獲取存取在鏈上的哈希值進(jìn)行比對,如果結(jié)果一樣說明溯源證書未被修改過,否則溯源證書被修改過.以此來檢驗溯源證書的真實性.
相關(guān)實現(xiàn)類如圖6所示,DB_Test類包含insert和select方法,為用戶鏈下數(shù)據(jù)和文件的存儲與查詢提供接口;DBConnection類是數(shù)據(jù)庫的連接類,DB_Test類中的方法通過調(diào)用DBConnection 中的連接對象進(jìn)行數(shù)據(jù)庫操作;PdfreadServlet類用于用戶頁面交互,對于頁面上用戶相關(guān)操作通過該類進(jìn)行實現(xiàn);Pdfdpo類用于與數(shù)據(jù)庫中的數(shù)據(jù)表相對應(yīng)的實體類;MyPdfReader類,用戶對數(shù)據(jù)文件進(jìn)行Hash操作的實現(xiàn)類;Compare-FileServlet類,用于Hash值的比對實現(xiàn)類,用于頁面交互,返回頁面數(shù)據(jù).
圖6 哈希完整性模式類圖
具體實現(xiàn)操作以溯源證書的頒發(fā)為例展示類與類之間的調(diào)用.溯源公司將溯源證書通過PdfreaderServlet類進(jìn)行Hash操作,PdfreaderServlet 調(diào)用MyPdfReader類中的getMD5Checksum方法對溯源證書進(jìn)行Hash計算,然后PdfreaderServlet 將得到的Hash值存儲到數(shù)據(jù)庫中,再將Hash值傳遞回頁面,然后將Hash值存儲到區(qū)塊鏈上,完成文件數(shù)據(jù)Hash 存儲操作.購貨商購買商品檢驗真?zhèn)?可以將商品上對應(yīng)的溯源證書通過CompareFileServlet類進(jìn)行比較在確定真?zhèn)?購貨商將溯源證書通過CompareFileServlet通過調(diào)用MyPdfReader中g(shù)etMD5Checksum方法進(jìn)行Hash計算,然后通過獲取相應(yīng)的鏈上已經(jīng)存在的商品Hash值,兩者進(jìn)行比對,如果Hash值一樣,則返回用戶真,否則返回用戶否.這樣就完成了對具體實例的驗證操作.
在溯源過程中,政府的審計部門會對相關(guān)產(chǎn)品的一系列類型以及溯源雙方的貨物定價會進(jìn)行審核.例如進(jìn)口奶粉,溯源服務(wù)公司跟奶粉供應(yīng)商簽訂合同,合同中包含溯源服務(wù)的類型和價格,政府部門需要審計這個合同,然后將結(jié)果提交到中國質(zhì)檢總局驗證.結(jié)果是私密的,不能被其他人所看到,鏈上數(shù)據(jù)存儲對任何人都是透明的,所以解決私密數(shù)據(jù)泄露是審計過程的難題.數(shù)據(jù)隱私保護(hù)模式解決了這一問題.
審計過程中審計部門對溯源雙方所簽署的合同進(jìn)行審計,然后將審計結(jié)果使用政府部門的公鑰(從鏈上獲得)進(jìn)行加密,然后將密文存儲到鏈上相關(guān)的合約中,政府相關(guān)工作人員在驗收的時候使用政府部門的私鑰進(jìn)行解密查看結(jié)果.這樣避免了在鏈上存儲關(guān)鍵數(shù)據(jù)時,數(shù)據(jù)的泄露問題.數(shù)據(jù)的加密,根據(jù)具體情況自行選擇加密方式.溯源公司的內(nèi)部數(shù)據(jù)可以使用自己的公私鑰進(jìn)行加解密,如果涉及到其他的問題,比如審計部門審計,審計結(jié)果只能讓相關(guān)部門的工作人員查看到,這種針對性的需要獲取他人的公鑰進(jìn)行加密,根據(jù)不同情境進(jìn)行不同的變換,充分的保證了數(shù)據(jù)隱私泄露問題.
相關(guān)實現(xiàn)類如圖7所示.SelectDataServlet類用于查詢數(shù)據(jù)時候的頁面交互;InsertDataServlet類用于用戶存儲數(shù)據(jù)時候的頁面交互;DBConnByname類用于數(shù)據(jù)庫連接操作;DecryptedataServlet類用于對數(shù)據(jù)進(jìn)行解密操作的交互;EncryptedataServlet類用于對數(shù)據(jù)進(jìn)行加密操作的交互;Encryption類用于實現(xiàn)加解密的具體操作,包括生成對稱或者非對稱密鑰,以及數(shù)據(jù)加密操作和解密的具體實現(xiàn)操作.
圖7 數(shù)據(jù)隱私保護(hù)模式類圖
具體的實現(xiàn)操作以審計部門的審計工作作為實例,描述類之間的交互.審計部門人員將審計結(jié)果使用政府部門的密鑰進(jìn)行加密,首先通過頁面獲取區(qū)塊鏈上已經(jīng)存在的政府部門的公鑰,將公鑰和審計結(jié)果一起傳遞給EncryptedataServlet,然后調(diào)用Encryption 中的encryptionData方法返回加密過后的審計結(jié)果,然后EncryptedataServlet 再將加密后的結(jié)果返回頁面,首先將結(jié)果存儲到數(shù)據(jù)庫中,通過InsertDataServlet類進(jìn)行存儲,然后再將結(jié)果存儲到區(qū)塊鏈上,結(jié)束審計部門審計工作.政府查看審計結(jié)果,首先從區(qū)塊鏈上獲取審計部門的審計結(jié)果,然后使用自己的私鑰進(jìn)行解密操作.頁面通過SelectDataServlet類從數(shù)據(jù)庫中獲取存儲的私鑰,然后將私鑰返回頁面,頁面將獲取的鏈上審計結(jié)果以及私鑰傳遞給DecryptedataServlet類,DecryptedataServlet類通過調(diào)用然后調(diào)用Encryption 中的decryptionData方法返回解密過后的審計結(jié)果,通過DecryptedataServlet類將明文返回頁面,顯示給用戶查看.這樣從審計到審計結(jié)果的驗收工作就實現(xiàn)完成.
在溯源系統(tǒng)中,樣品的測試檢驗是至關(guān)重要的一環(huán),溯源商品質(zhì)量過不過關(guān)需要有檢驗,測試檢驗的結(jié)果符不符合質(zhì)量標(biāo)準(zhǔn)是溯源商品值不值得信賴的關(guān)鍵保證.在樣品測試過程中,可能涉及多個實驗室進(jìn)行交叉測試,然后再將最后的結(jié)果作為商品的測試結(jié)果.每個實驗室在進(jìn)行測試的時候會有相應(yīng)的獎勵作為報酬.每個實驗室的測試結(jié)果以及報酬的分別的存儲到鏈上,會造成大量的資源浪費,因為每個實驗室不可能只檢驗一個樣品,對于不同的樣品的結(jié)果分開存儲,或者每檢驗完一個樣品就通過區(qū)塊鏈獎勵一次,這種情況下造成大量的區(qū)塊鏈資源的浪費.通過狀態(tài)通道,實驗室之間相當(dāng)于鏈下的不同節(jié)點,不同實驗室之間進(jìn)行不斷的實驗結(jié)果的交換使用,最后將最終的檢驗結(jié)果完整地發(fā)布到鏈上.對于每個實驗室的檢驗獎勵作為積累,當(dāng)檢驗結(jié)束,將最終的獎勵進(jìn)行一次性轉(zhuǎn)賬交易的記錄.
如圖8所示,MoneyServlet與TimeServlet是獲取鏈上每個實驗室的資金狀態(tài)頁面交互;TransServlet與TimeForTrans是初始化狀態(tài)通道與頁面交互;GoTransServlet是實現(xiàn)狀態(tài)通道操作的交互類,進(jìn)行的是資金限制操作相關(guān)操作類;TimeGoServlet是實現(xiàn)狀態(tài)通道操作的交互類,進(jìn)行的是次數(shù)限制相關(guān)操作類;CloseTransaction 用于最終的更新鏈上狀態(tài)交互類;AssistClass 用于找到一條可以使用的通道供交易使用的輔助類;FindPath類用于查找是否有通道可以借用的輔助類;Graph 用于圖網(wǎng)絡(luò)的建立,我們將狀態(tài)通道與圖結(jié)構(gòu)進(jìn)行結(jié)合.
圖8 狀態(tài)通道模式類圖
具體實現(xiàn)操作以實驗室的檢測測試獎勵為例來進(jìn)行描述.實驗室測試樣品,如果完成一次測試,實驗室獲得一次獎勵,那么當(dāng)多個是現(xiàn)實多次發(fā)生類似情況的時候,積累過多會給區(qū)塊鏈造成沉重的負(fù)擔(dān).將每一次的獎勵在鏈下進(jìn)行,然后將最終測試結(jié)束后,實驗室的資金狀態(tài),作為一次總的交易發(fā)生存儲到鏈上.首先進(jìn)行前先確定是資金方面的交易,通過MoneyServlet進(jìn)入到相應(yīng)頁面,然后通過頁面進(jìn)入TransServlet,調(diào)用Graph類buildGraph進(jìn)行狀態(tài)通道的初始化,初始化完成后就可以進(jìn)行測試獎勵的交易.一次獎勵的開始調(diào)用GoTransServlet進(jìn)行操作,首先調(diào)用查看是否有直接的通道,如果有查看是否處于開啟狀態(tài)(通道有可能處于關(guān)閉或者開啟狀態(tài),開啟狀態(tài)可以使用,關(guān)閉狀態(tài)則不能使用),則直接進(jìn)行獎勵交易,否則先開啟通道在進(jìn)行交易.如果沒有調(diào)用FindPath 查找有沒有其他的實驗室節(jié)點通道可以借用,如果有則調(diào)用AssistClass類,查找是否有可用的通道,只有處于開啟狀態(tài)的通道才可以進(jìn)行借用.如果找到則借用該通道進(jìn)行交易,如果沒有找到則在獎勵人節(jié)點與被獎勵的實驗室節(jié)點直接建立直接的通道并開啟,進(jìn)行獎勵的交易.實驗室測試獎勵的交易以這種鏈下狀態(tài)通道方式進(jìn)行,當(dāng)所有測試完成,則調(diào)用CloseTransaction進(jìn)行狀態(tài)的確定,然后將最終的獎勵交易作為一次總額度的交易進(jìn)行產(chǎn)生,更新到鏈上,完成此過程.如果是測試結(jié)果的交互使用,則如同獎勵實驗室測試過程一樣,調(diào)用另一個分支即可完成.
在上述部分中,我們著重描述了將我們的設(shè)計模式應(yīng)用到具體案例中的實現(xiàn)操作,在本節(jié)中,我們將對如何使用提出的設(shè)計模式進(jìn)行應(yīng)用程序開發(fā),及如何提高開發(fā)效率進(jìn)行分析.
在使用本文所提出的設(shè)計模式進(jìn)行區(qū)塊鏈應(yīng)用程序開發(fā)時,開發(fā)人員只需運用本文提出的設(shè)計模式,而無需擔(dān)心其他區(qū)塊鏈相關(guān)操作.在哈希完整性模式中,提供了完整性的哈希計算方法,以及鏈上智能合約完整代碼.應(yīng)用開發(fā)者只需要使用提供的哈希計算方法進(jìn)行數(shù)據(jù)集的哈希計算,然后將智能合約代碼部署到本地區(qū)塊鏈上,即可存取數(shù)據(jù).在數(shù)據(jù)隱私保護(hù)模式中,提供了完整的公私鑰創(chuàng)建方法,以及公私鑰與字符串之間轉(zhuǎn)換方法,以便應(yīng)用開發(fā)者可以方便地存儲到數(shù)據(jù)庫以及區(qū)塊鏈上,無需擔(dān)心公私鑰與字符串之間轉(zhuǎn)換問題,相應(yīng)的我們還提供了存儲公鑰的智能合約,以及存儲方法.我們還提供了鏈下數(shù)據(jù)表與鏈上智能合約一一對應(yīng)相關(guān)操作,應(yīng)用開發(fā)者只需要在創(chuàng)建鏈下數(shù)據(jù)表的時候,將需要存儲到區(qū)塊鏈中的屬性篩選出來,就會相應(yīng)的生成與鏈下數(shù)據(jù)表名所對應(yīng)的智能合約(合約名與表名一致),以及應(yīng)用開發(fā)者所篩選出來的相關(guān)鏈上屬性,以及先關(guān)get和set方法.應(yīng)用開發(fā)者只需要使用相關(guān)模塊即可進(jìn)行應(yīng)用的快速開發(fā).在狀態(tài)通道模式中,提供了預(yù)設(shè)條件值,當(dāng)交易發(fā)生8次或者間隔8秒鐘之后,就會自動的更新鏈上狀態(tài),應(yīng)用開發(fā)人員只需要設(shè)置自己預(yù)設(shè)的次數(shù)或者時間即可,這里建議時間設(shè)置小一點,減小被攻擊的可能性.狀態(tài)通道模式一般應(yīng)用于帶有獎勵機制的應(yīng)用開發(fā)過程中,具體的擴展性我們將進(jìn)行進(jìn)一步的研究.
設(shè)計模式中提供所有的方法以及智能合約模板,盡可能簡化區(qū)塊鏈應(yīng)用開發(fā)者的操作.區(qū)塊鏈應(yīng)用程序開發(fā)者不再需要專門去學(xué)習(xí)如何書寫智能合約,只需要在提供的基礎(chǔ)模板(有相應(yīng)解釋注釋)上面做微小調(diào)整即可使用,而且在提供的方法中,大部分都是智能自動化生成的智能合約,應(yīng)用開發(fā)者只需要調(diào)用相應(yīng)的方法即可,節(jié)省了應(yīng)用開發(fā)者再學(xué)習(xí)的時間,提高了應(yīng)用程序開發(fā)效率.在應(yīng)用開發(fā)過程中開發(fā)者也不需要專門的研究如何調(diào)用區(qū)塊鏈的API,對于連接區(qū)塊鏈操作,發(fā)布區(qū)塊鏈交易操作,智能合約的部署,訪問查詢操作等都已經(jīng)進(jìn)行了封裝,開發(fā)者可以通過使用方法的過程中了解,其中代碼都加注了相關(guān)接口注釋.我們致力于打造一個方便高效的模式,使得一個不了解區(qū)塊鏈的應(yīng)用開發(fā)者也可以進(jìn)行區(qū)塊鏈應(yīng)用程序開發(fā),通過節(jié)省開發(fā)者再學(xué)習(xí)的時間,來提高應(yīng)用程序開發(fā)效率.
在本文中,我們提出并設(shè)計實現(xiàn)了幾種基于區(qū)塊鏈應(yīng)用的數(shù)據(jù)管理設(shè)計模式,并分享了將所提出的設(shè)計模式應(yīng)用于一個名為originChain的基于塊鏈的可追溯系統(tǒng)的經(jīng)驗.區(qū)塊鏈的獨特屬性,為數(shù)據(jù)管理提供了新的思路.而設(shè)計模式影響基于區(qū)塊鏈的應(yīng)用程序的某些特定方面,如可更新性、適應(yīng)性和互操作性.并且設(shè)計模式為開發(fā)人員在區(qū)塊鏈上構(gòu)建應(yīng)用程序提供了架構(gòu)指導(dǎo).我們根據(jù)區(qū)塊鏈在數(shù)據(jù)管理方面的問題,將設(shè)計模式分為了3類:哈希完整性模式、數(shù)據(jù)隱私保護(hù)模式和狀態(tài)通道模式.并給出了模式與模式之間的相關(guān)性描述.
在未來的工作中,我們將繼續(xù)完善和擴展設(shè)計模式,并提供有關(guān)設(shè)計模式更加詳細(xì)的討論.將這些設(shè)計模式應(yīng)用于更多適用區(qū)塊鏈的領(lǐng)域.我們將這些模式封裝成了服務(wù),以供所需用戶使用,提供API 以方便用戶訪問.