姚浩男,盧清華,張衛(wèi)山,劉越
(中國石油大學(華東)計算機科學與技術學院,青島 266580)
比特幣(Bitcoin)[1]是一種基于對等網絡和加密技術的數字貨幣.區(qū)塊鏈是比特幣背后的技術,提供不可變的和共享的數據存儲,并且事務數據是防篡改的,與傳統(tǒng)的數據庫系統(tǒng)[2]相比,它允許插入和查詢事務,阻止更新或刪除事務操作.區(qū)塊鏈網絡中的所有節(jié)點都可以在交易數據的狀態(tài)上達成協(xié)議,而無需依賴于一個集中化的系統(tǒng).
數據管理是有效地收集,存儲,處理和應用數據的過程.隨著數據存儲冗余的不斷減少,數據獨立性的不斷增強以及數據操作的更加方便和簡單,數據管理得到了長足的發(fā)展.區(qū)塊鏈技術的出現為數據管理提供了一種新的方式,在安全,數據隱私和身份認證等方面都得到了廣泛的研究.
然而,由于區(qū)塊鏈研究還處于早期階段,仍然存在許多限制.例如,大數據集很難用塊存儲;區(qū)塊鏈數據分布共享,可能導致信息泄漏;而且,如果沒有良好的數據管理模式設計,處理大量需要共識的事務通常會很慢.
因此,本文提出了改進區(qū)塊鏈數據管理的幾種設計模式,包括哈希完整性模式,數據隱私保護模式和狀態(tài)通道模式.設計模式在很大程度上簡化了開發(fā)過程,提高了區(qū)塊鏈應用程序開發(fā)人員的效率.我們實現了一個真實的基于區(qū)塊鏈[3]的可跟蹤系統(tǒng)originChain[4],作為一個案例研究來展示如何在實踐中應用設計模式.本文討論了鏈上組件和鏈外組件之間的交互限制,并就如何使用這些設計模式分享了一些經驗.
本文的其余部分組織如下,第1節(jié)介紹了基于區(qū)塊鏈的應用背景和相關工作以及設計模式.第2節(jié)討論設計模式.第3節(jié)討論設計模式的應用.第4節(jié)總結了本文的工作和未來的工作.
區(qū)塊鏈作為比特幣[1]的底層技術,是一種用于存儲交易記錄的去中心化,公開透明的分布式數據庫[5].它是一種融合了分布式數據存儲,點對點傳輸,共識機制和密碼學[6-9]的新技術.區(qū)塊鏈最初只提供一個公共分類賬來記錄與特定數字加密貨幣相關的交易,其工作領域僅限于金融業(yè).由于引入了名為智能合約[10]的可編程基礎設施,區(qū)塊鏈能夠處理復雜的事務處理,比如觸發(fā)器、條件和支持應用程序的業(yè)務邏輯[11],使其可以應用到更多的領域行業(yè),比如醫(yī)療[12,13]、物聯網(IoT)[14,15]以及司法事務等.
區(qū)塊鏈將數據存儲在有序的塊列表中.區(qū)塊鏈上的每個塊都包含一個事務列表[16],區(qū)塊之間鏈接通過后一個區(qū)塊中記錄前一個區(qū)塊哈希值的方式進行.且在區(qū)塊鏈上已發(fā)布的事務不能被刪除或更改,由于哈希值的唯一性,如果一個塊中的交易被更改,那么該塊的哈希值會相應的發(fā)生變化,導致后續(xù)已生成的所有塊的哈希值都會相應發(fā)生變化,這是一個巨大的工作量,區(qū)塊鏈網絡中的相鄰對等節(jié)點也會檢測此變化,并阻止此變化且更正此修改.區(qū)塊鏈的這種特性使其具有不可篡改性.
區(qū)塊鏈網絡中的節(jié)點是相等的,區(qū)塊鏈通過共識算法[17]解決節(jié)點之間的信任問題,體現了區(qū)塊鏈的去中心化特性.區(qū)塊鏈的去中心化可以在實際應用中解決信任問題,例如通過不可信的第三方支付問題,點對點區(qū)塊鏈基礎結構避免了第三方的信任管理.
智能合約:智能合約最初是由Nick Szabo在1994年提出的.智能合約是可編程的觸發(fā)器、條件和業(yè)務邏輯,以支持復雜的業(yè)務流程[18,19].Solidity[20]是一種實用的智能合約編程語言.從理論上講,智能合約可以對所有的業(yè)務流程進行編程,這使得從區(qū)塊鏈中開發(fā)應用程序成為可能.智能合約是純編程函數,不能直接訪問外部系統(tǒng)的狀態(tài).
以太坊:以太坊[21]是一個開源的公共區(qū)塊鏈平臺,可以部署智能合約,為用戶提供各種模塊構建應用程序.以太坊中的應用程序實際上是一個智能合約[22].用戶通過智能合約編寫的業(yè)務是不可預測的,這為用戶在以太坊上構建各種應用程序提供了靈活性和強大的功能,但同時也帶來了整個系統(tǒng)的不確定性和安全性以及性能問題.因此,設計模式對于區(qū)塊鏈數據管理非常重要.
設計模式[23]是可重用的微架構[19],它們?yōu)樵谔囟ㄉ舷挛闹性O計重復出現的問題提供了可靠的解決方案.第一個也是最著名的一組設計模式是Gamma 等人在書中提出的.設計模式有3種類型,包括創(chuàng)造性模式、結構模式和行為模式.創(chuàng)造性模式涉及對象創(chuàng)建,結構模式捕獲類或對象組合,行為模式處理類和對象分配職責和交互的方式.
設計模式支持代碼的重用,使代碼更容易理解,并確保代碼的可靠性.設計模式是軟件開發(fā)人員在應用程序開發(fā)過程中所面臨的常見問題的解決方案.正確使用設計模式可以避免許多問題.
隨著區(qū)塊鏈的不斷發(fā)展,它對學術界和產業(yè)界都是一個機遇和挑戰(zhàn).如何充分利用區(qū)塊鏈的特點服務于行業(yè)成為各行各業(yè)的難點.數據管理與各個行業(yè)緊密相關,可以作為結合各個行業(yè)和區(qū)塊鏈的路徑.
在學術界,學者們對區(qū)塊鏈的特性以及如何利用這些特性使區(qū)塊鏈[24]適應各行各業(yè)進行了相關的研究工作.Bartoletti和Pompianu[25]討論了智能合約在每個區(qū)塊鏈平臺上的解釋和應用,基于比特幣和以太坊的應用領域,量化了智能合約的使用,并分析了以太坊最常見的編程模式.Xu和Pautasso[26]提出了一種基于區(qū)塊鏈的模式語言.有些模式是基于區(qū)塊鏈實際應用程序專門設計的,而其他模式則是在智能合約上下文中應用的現有設計模式的變體.他們?yōu)閰^(qū)塊鏈服務提出了8種設計模式.Eberhardt和Tai[27]提出了4種模式,包括挑戰(zhàn)響應模式、off-chain 簽名模式、內容尋址存儲模式、委托計算模式和低合同足跡模式,這些模式主要關注于數據和計算的鏈上和鏈下分離.然而,上述相關研究只是通過理論分析來分析區(qū)塊鏈在數據管理中的可行性.在本文中,我們重點介紹了設計模式的實現,并給出了在實際應用程序中的應用.代碼已上傳至開源網站Github[28].
在本節(jié)中,我們?yōu)榛趨^(qū)塊鏈的應用程序的性能,隱私和成本設計并實現了以下3種模式.(1)哈希完整性模式確保任何大數據集的完整性和不可變性,大文件不直接存儲在區(qū)塊鏈中.(2)數據隱私保護模式對區(qū)塊鏈應用程序中的機密數據進行加密,將密文存儲在鏈上,只有具有權限的人才能進行訪問.(3)狀態(tài)通道模式,允許執(zhí)行鏈下事務,將小額支付的高成本支付行為轉移到鏈下,只在鏈上執(zhí)行狀態(tài)更新.數據管理設計模式結構圖如圖1所示.
如圖1所示,哈希完整性模式存儲哈希值可以通過智能合約方式進行存儲,也可以通過小額支付狀態(tài)通道模式的方式,通過將哈希值附屬在轉賬交易的信息中,直接存儲到區(qū)塊鏈賬本中.兩種方式最終的驗證方式不同,智能合約方式可以通過針對性的鍵值獲取哈希值,小額支付狀態(tài)通道模式是通過交易哈希值獲取交易信息,然后在獲取存儲的哈希值.狀態(tài)通道模式致力于小額支付的應用,也適用于獎勵機制的創(chuàng)造,如3.4節(jié)中所描述的場景.隱私保護模式是將數據以密文的形式存儲到區(qū)塊鏈上,密文可以是公鑰加密過后的密文,也可以是數據的哈希值(通過使用哈希完整性模式計算出的哈希值),這兩種方式都可以保證數據的隱私不被泄露,通過鏈上智能合約與鏈下數據庫中的數據表一一對應的方式存儲,方便用戶的存儲以及查詢.下文是對3種設計模式的詳細描述.

圖1 數據管理設計模式結構圖
摘要:不直接將大數據集或文件存儲在區(qū)塊鏈上,而是將數據集或文件的散列放在鏈上,以確保數據的完整性.
場景:區(qū)塊鏈的特點和作為存儲數據庫的能力促使一些應用程序使用區(qū)塊鏈來保證數據集的不變性和完整性.任何數據集都可以存儲在區(qū)塊鏈中.
問題:在區(qū)塊鏈上存儲數據時,存儲的數據越大,所需的gas (以太坊交易指標)值越大,所需的時間也越多,相應的也會增加整個區(qū)塊鏈的負擔,使得整個區(qū)塊鏈的存儲量增加巨大.對于某些大數據集或文件,即使給出了較大的gas值,也可能由于塊大小而無法存儲在區(qū)塊鏈中.區(qū)塊鏈網絡中的所有節(jié)點用戶都將保留完整的數據塊,由于區(qū)塊鏈的存儲能力,這將成為用戶的負擔.區(qū)塊鏈中的塊大小是有限的,并且可能無法在一次交易事務中存儲大型數據集或文件.如何在區(qū)塊鏈上存儲任意大小的數據,以保證數據的不變性和完整性,是區(qū)塊鏈數據管理過程中的一個重要問題.
解決方案:哈希函數有一個特性:由同一哈希函數產生的兩個不同的哈希值,其所指示的原始數據也是不相同的.通過哈希函數的特性和區(qū)塊鏈的特點,可以幫助解決數據存儲在區(qū)塊鏈上時的數據量大的問題,也可以保證數據的不變性和完整性.
在進行大數據集存儲的時候,將原始數據存儲在鏈下的數據庫,然后將數據的哈希值存儲到區(qū)塊鏈上.以存儲文件為例:用戶獲取文件,然后對文件進行哈希運算操作,將文件以及文件的哈希值存入到鏈下數據庫中,然后以文件名作為鍵,文件的哈希值作為鍵值,存儲到區(qū)塊鏈上.
對于存儲到鏈上的哈希值如何使用,在模式中提供了驗證的功能.驗證文件是否被修改過,需要將文件再次哈希,然后根據文件名獲取到鏈上存儲的哈希值,兩者進行比對,使用的是同一哈希函數進行的文件哈希,所以如果文件進行過改動那么兩次的哈希值是不同的,然后將結果反饋給用戶.哈希值的存儲以及哈希值的獲取比較,充分利用了區(qū)塊鏈的不可篡改性和哈希的不變性,解決了大數據無法存儲到鏈上的問題,保證了數據的不變性和完整性.
結構:哈希完整性模式的結構如圖2所示.

圖2 哈希完整性模式結構圖
結論:
(1)優(yōu)點:區(qū)塊鏈保證了原始數據的完整性.通過區(qū)塊鏈上已存儲的哈希值可以檢查原始數據的完整性.相對于將大數據集或文件存儲在區(qū)塊鏈上,例如某些應用開發(fā)者,將整個數據庫的壓縮文件存儲到區(qū)塊鏈上;司法公正相關文件,包括圖片,證物文件等,證據文件完整的存儲到區(qū)塊鏈.以上常見方式會造成的區(qū)塊鏈數據量的增加負擔,用戶需承擔的巨額gas 消耗,而且可能由于單個文件過大,超過單個區(qū)塊的存儲量,導致文件無法存儲的情況發(fā)生.然而只存儲固定長度(256位)的一串字符串(哈希值)到區(qū)塊鏈,很大程度的減輕了區(qū)塊鏈存儲負擔及gas 花費負擔,由于存儲在鏈上的是數據哈希值,所以可以保證任意數據大小的完整性,不在受區(qū)塊鏈塊大小的影響.
(2)缺點:原始數據是鏈下存儲,無法保證原始數據的安全性以及不被修改.只能通過比對哈希值的方式檢測數據是否被修改,如果數據一旦被修改則無法進行恢復.
(3)注意事項:需要專門的一個模塊來計算數據的哈希值.
已知應用:
存在證明(POEX.IO)[29]是一種用于私有區(qū)塊鏈上使用MultiChain和AWS EC2的文件的加密工具.證明存在提供的服務允許在比特幣區(qū)塊鏈中輸入SHA-256加密的文檔散列,作為文檔存在的證明,同時保證數據的完整性.
Chainy[30]是一個運行在Ethereum 區(qū)塊鏈上的智能合約.Chainy 將一個到鏈下文件的短鏈接及其對應的散列值存儲在一個位置.它可以與存在證明相結合.出于安全或隱私原因,可能不希望信任將文件保存在屬于第三方的服務器上.Chainy通過將證明和文件鏈接保存在一個智能合約中解決了這個問題.
摘要:區(qū)塊鏈的一個特性是透明性,因此它不能用于共享一些商業(yè)關鍵數據.對于特定的數據使用密文的形式存儲于區(qū)塊鏈上,對于不同程度或者不同方式的數據可選擇對稱加密或者非對稱加密.
場景:對于基于區(qū)塊鏈的應用程序,可能存在一些關鍵性數據(例如銀行金融方面的數據),只有相關人員才可以有訪問的權限.例如審計部門對于溯源過程的審計結果,只有頒發(fā)證書的相關部門負責人才可以訪問到這個結果,無關人員無法進行訪問.
問題:區(qū)塊鏈的公開透明性是區(qū)塊鏈的特點,但這也使得重要數據的隱私問題受到挑戰(zhàn).數據隱私問題是區(qū)塊鏈的弊端,區(qū)塊鏈上的數據透明性導致存儲在區(qū)塊鏈上的數據信息,對于加入到區(qū)塊鏈中的所有節(jié)點用戶都是可以訪問的.區(qū)塊鏈上的信息是公開透明的,即使是新加入的節(jié)點,也擁有一個區(qū)塊鏈上的完整賬本,以及訪問區(qū)塊鏈上的所有信息數據的能力.區(qū)塊鏈中的節(jié)點都是平等的,沒有擁有特殊職權的節(jié)點.區(qū)塊鏈的數據透明性導致一些關鍵數據存儲在區(qū)塊鏈上時,會發(fā)生數據泄露問題.針對這一問題,設計實現了數據隱私保護模式,解決了用戶數據隱私發(fā)生泄露問題.
解決方法:
為了保護用戶的隱私,在往鏈上存儲數據的時候,對一些關鍵的數據進行加密處理,然后再存儲到鏈上.這里使用非對稱加密的算法進行對數據加解密操作.每個節(jié)點用戶擁有一對公私鑰,將私鑰進行自己保管,公鑰存儲到鏈上公示.如果自己存儲數據,可以用自己的公鑰進行加密操作,然后再將加密后的密文存儲到鏈上;如果是發(fā)送數據給別人,可以從鏈上獲取接收方的公鑰,然后用其公鑰進行數據加密操作,接收方再用自己的私鑰進行解密查看.這樣就解決了關鍵數據在鏈上時,會造成數據泄露問題.雖然其他節(jié)點也會看到,但他們看到的只是加密后的密文,沒有私鑰是無法進行查看原數據的.
在進行數據庫表創(chuàng)建時,用戶需要篩選出哪些屬性是關鍵數據,需要存儲到鏈上,與此同時會在鏈上創(chuàng)建與表相對應的智能合約,用于存儲這些關鍵數據.鏈上的存儲的鍵與鏈下數據庫中的主鍵相對應,由于存儲以密文形式存儲,鏈上數據存儲統(tǒng)一數據類型(string型),對于數據類型之間的轉換,在鏈下進行,會根據其在數據庫中的存儲類型進行對應的轉換.
在進行數據存儲時,鏈下數據庫中存儲完整的表結構數據,鏈上僅存儲那些關鍵數據(被篩選出需要存儲在鏈上的數據).根據用戶存儲數據的用途來選擇是用自己的密鑰加密,還是用他人的密鑰進行加密.如果是自己作為存儲使用,那么獲取自己的公鑰進行數據加密操作,然后將數據分別存儲到鏈上和鏈下;如果是某些數據需要發(fā)送給他人,這時需要獲取他人在區(qū)塊鏈上公示的公鑰進行加密操作,然后進行存儲到鏈上,接收方只需要得到這個數據,然后使用自己的私鑰進行解密查看.
結構:數據隱私保護模式的結構如圖3所示.

圖3 數據隱私保護模式結構圖
結論:
(1)優(yōu)點:保證了數據的隱私性.存放在區(qū)塊鏈上的關鍵性數據是經過加密的,雖然區(qū)塊鏈上的數據都是共享的公開透明的,但其他節(jié)點如果沒有秘鑰是無法進行解密的.
(2)缺點:秘鑰需用戶自己存儲,用戶如果導致秘鑰泄露,就會造成數據的隱私受到威脅.加密過后的密文較長,需要分段存儲.
(3)注意事項:針對不同需要選擇是用對稱密鑰還是非對稱密鑰;密鑰的產生需要另一個模塊;密鑰的管理需謹慎,防止泄露;使用非對稱密鑰,公鑰需存儲到區(qū)塊鏈,私鑰用戶自己存儲,不論使用對稱或非對稱密鑰,節(jié)點間共享加密的數據,需要先共享密鑰.
已知應用:
Oraclize[31]是一個運行在以太坊公網上的智能合約,它提供了從外部世界訪問狀態(tài)的服務.它在數據源中使用數據加密和解密操作.開發(fā)人員可以使用Oraclize公鑰加密整個查詢或它的一些參數,從而實現加密的Oraclize 查詢.唯一能夠解密調用參數的是使用配對的私鑰Oraclize.
MLGBlockchain[32]是一家全球性的風險創(chuàng)造和咨詢公司,擁有區(qū)塊鏈技術開發(fā)和經紀經銷商的能力.由MLGBlockchain 提出的加密數字簽名,用于加密數據,并在通過區(qū)塊鏈交互和傳輸數據的各方之間共享數據.
摘要:區(qū)塊鏈上每一筆交易的發(fā)生都會產生資金資源消耗,小型的交易(包括小額的轉賬交易或者單個數據交換等)不適合在區(qū)塊鏈上進行,將此類型的交易轉移到鏈下,等待一段時間或者一定交易次數達到來定期更新鏈上的狀態(tài).
場景:小型交易包括小到幾美分的資金交易例如WiFi 熱點的收費,每使用1萬字節(jié)的數據,就會收取一小筆錢;或者單個數據的交換發(fā)生,例如一組測試樣品的實驗室之間的測試結果的交換.問題是,是否有必要將這類交易全部存儲到區(qū)塊鏈,占用區(qū)塊鏈的大量存儲空間.
問題:區(qū)塊鏈上存儲數據需要耗資,個人小額支付交易的交易費用可能高于與小額支付交易相關的貨幣價值.區(qū)塊鏈上的交易需要確認,而確認時間并不能確定,但用戶期望的是小額交易支付能夠即時完成.區(qū)塊鏈上的交易時間長,費用高,以致不可能在區(qū)塊鏈上存儲每一筆小額的交易.在這么多交易矛盾的情況下,是否有必要在區(qū)塊鏈上進行小額交易成為一個問題.
解決方法:小額交易的成本太高,在區(qū)塊鏈上存儲小額交易是不可行的.但小額交易的發(fā)生是不可避免的,為了解決小額交易的問題,本文中設計實現了狀態(tài)通道模式.狀態(tài)通道指小額交易的發(fā)生持續(xù)進行,只在鏈上更新最終的交易狀態(tài).交易的終止點會有限定,當達到限定條件后終止交易,更新鏈上狀態(tài).
狀態(tài)通道有兩種限制,一是設定個人的交易限制額度,一旦交易超過限制額度則停止交易關閉通道,更新鏈上狀態(tài);二是設定個人交易次數,次數達到停止交易關閉通道,更新鏈上狀態(tài).狀態(tài)通道初始是無通道的,一旦交易發(fā)生,先會查找是否有可以借用的他人建立的通道,如果存在則借用別人通道進行交易的傳輸;如果查找不到可借用通道,則交易雙方建立直接的一條交易通道.滿足可借用通道的條件是交易額度不受通道限制(每一條通道會有一個“帶寬”),中間節(jié)點的余額滿足交易額度.每一條通道會有一個“通道帶寬”,限制通道允許交易的額度,是由通道兩端節(jié)點在第一次建立通道時隨機產生的一個大于第一次交易額度的值.交易進行前會對交易雙方的賬戶余額進行查詢驗證看是否滿足交易額度,滿足則通過狀態(tài)通道進行交易,否則無法進行交易.
鏈下的交易不受區(qū)塊鏈上塊大小、遠近的限制,也不受確認塊的時間限制,無須等到所有區(qū)塊鏈節(jié)點達成共識才完成交易,只在鏈上更新所有交易完成后的最終狀態(tài).而小額交易的細節(jié)不公開,不記錄在鏈上賬本中,鏈上賬本只記錄最終的交易.極大地節(jié)省了不必要耗資,提高了效率.
結構:狀態(tài)通道模式的結構如圖4所示.

圖4 狀態(tài)通道模式結構圖
結論:
(1)優(yōu)點:避免了過度的資源的消耗,減少了交易所消耗的時間,提高了交易的性能;只在最終交易完成以后更新鏈上的狀態(tài),交易細節(jié)不在公布;由于在鏈下進行交易,交易不在受限于區(qū)塊鏈上塊的大小的限制.
(2)缺點:通道交易額度的限制,需根據具體情況進行調節(jié),每次交易的發(fā)生可能會不斷更新通道限額,影響交易的效率.
(3)注意事項:鏈下需要一個類似于以太坊錢包的控件,用來更新存儲鏈上的狀態(tài).
已知應用:
Lightning Network[33]是一種鏈式服務解決方案,它不發(fā)送任何貨幣,而是在第2級更改分類帳,然后在第1級完成結算,從而避免了數千次實際的資金轉移.閃電網絡通過將資金發(fā)送到由多方托管的多個簽名地址來構建支付渠道.付款通道可以通過播放最終版本的融資交易來關閉,以結算付款.
在本節(jié)中,以溯源系統(tǒng)[4]為應用實例,來驗證在第2節(jié)中提出的3個設計模式,并對其進行詳細的使用描述.
溯源系統(tǒng)[4]指物聯網、移動互聯網以及一物一碼等技術的整合應用.在產品生產過程中采集產品數據信息并形成溯源檔案.在產品生產和分銷中跟蹤產品相關信息(原料產地、生產加工、質量檢測以及物流運輸)是溯源系統(tǒng)的主要目標.由政府部門認證的溯源公司,可以向原料提供方、產品生產商以及零售商提供溯源服務,溯源公司派遣相關人員,到產品的各個環(huán)節(jié)進行考核檢查,并且對于各個環(huán)節(jié)的樣品進行樣品檢測,如果符合政府部門發(fā)布的合格標準,則予以頒發(fā)溯源證書,否則將拒絕頒發(fā).圖5演示了產品可追溯性的業(yè)務流程[19].

圖5 溯源服務過程圖
基于區(qū)塊鏈的產品溯源系統(tǒng)(originChain)[4]是由傳統(tǒng)數據庫與區(qū)塊鏈技術結合形成.供應鏈行業(yè)[34]需要數據的透明性以及不可篡改性,以確保產品信息的真實性和可靠性.正因為區(qū)塊鏈技術的特點,使得區(qū)塊鏈技術適用于溯源系統(tǒng)的各個環(huán)節(jié).
溯源證書是可以被修改或者被惡意替換的,存在鏈下數據庫中總是不安全的,如何保證溯源證書在傳輸過程中的完整性和不變性是個問題.隨著區(qū)塊鏈的問世,區(qū)塊鏈的特點為解決此類問題提供了方案.
溯源公司在確定商品后,給相關部門頒發(fā)溯源證書[15],并對溯源證書進行哈希計算,將哈希值存儲到鏈上.然后供貨商接收到溯源證書,將溯源證書貼于商品上;購貨商購買商品,如果想驗證真?zhèn)?需將溯源證書再次哈希,然后獲取存取在鏈上的哈希值進行比對,如果結果一樣說明溯源證書未被修改過,否則溯源證書被修改過.以此來檢驗溯源證書的真實性.
相關實現類如圖6所示,DB_Test類包含insert和select方法,為用戶鏈下數據和文件的存儲與查詢提供接口;DBConnection類是數據庫的連接類,DB_Test類中的方法通過調用DBConnection 中的連接對象進行數據庫操作;PdfreadServlet類用于用戶頁面交互,對于頁面上用戶相關操作通過該類進行實現;Pdfdpo類用于與數據庫中的數據表相對應的實體類;MyPdfReader類,用戶對數據文件進行Hash操作的實現類;Compare-FileServlet類,用于Hash值的比對實現類,用于頁面交互,返回頁面數據.

圖6 哈希完整性模式類圖
具體實現操作以溯源證書的頒發(fā)為例展示類與類之間的調用.溯源公司將溯源證書通過PdfreaderServlet類進行Hash操作,PdfreaderServlet 調用MyPdfReader類中的getMD5Checksum方法對溯源證書進行Hash計算,然后PdfreaderServlet 將得到的Hash值存儲到數據庫中,再將Hash值傳遞回頁面,然后將Hash值存儲到區(qū)塊鏈上,完成文件數據Hash 存儲操作.購貨商購買商品檢驗真?zhèn)?可以將商品上對應的溯源證書通過CompareFileServlet類進行比較在確定真?zhèn)?購貨商將溯源證書通過CompareFileServlet通過調用MyPdfReader中getMD5Checksum方法進行Hash計算,然后通過獲取相應的鏈上已經存在的商品Hash值,兩者進行比對,如果Hash值一樣,則返回用戶真,否則返回用戶否.這樣就完成了對具體實例的驗證操作.
在溯源過程中,政府的審計部門會對相關產品的一系列類型以及溯源雙方的貨物定價會進行審核.例如進口奶粉,溯源服務公司跟奶粉供應商簽訂合同,合同中包含溯源服務的類型和價格,政府部門需要審計這個合同,然后將結果提交到中國質檢總局驗證.結果是私密的,不能被其他人所看到,鏈上數據存儲對任何人都是透明的,所以解決私密數據泄露是審計過程的難題.數據隱私保護模式解決了這一問題.
審計過程中審計部門對溯源雙方所簽署的合同進行審計,然后將審計結果使用政府部門的公鑰(從鏈上獲得)進行加密,然后將密文存儲到鏈上相關的合約中,政府相關工作人員在驗收的時候使用政府部門的私鑰進行解密查看結果.這樣避免了在鏈上存儲關鍵數據時,數據的泄露問題.數據的加密,根據具體情況自行選擇加密方式.溯源公司的內部數據可以使用自己的公私鑰進行加解密,如果涉及到其他的問題,比如審計部門審計,審計結果只能讓相關部門的工作人員查看到,這種針對性的需要獲取他人的公鑰進行加密,根據不同情境進行不同的變換,充分的保證了數據隱私泄露問題.
相關實現類如圖7所示.SelectDataServlet類用于查詢數據時候的頁面交互;InsertDataServlet類用于用戶存儲數據時候的頁面交互;DBConnByname類用于數據庫連接操作;DecryptedataServlet類用于對數據進行解密操作的交互;EncryptedataServlet類用于對數據進行加密操作的交互;Encryption類用于實現加解密的具體操作,包括生成對稱或者非對稱密鑰,以及數據加密操作和解密的具體實現操作.

圖7 數據隱私保護模式類圖
具體的實現操作以審計部門的審計工作作為實例,描述類之間的交互.審計部門人員將審計結果使用政府部門的密鑰進行加密,首先通過頁面獲取區(qū)塊鏈上已經存在的政府部門的公鑰,將公鑰和審計結果一起傳遞給EncryptedataServlet,然后調用Encryption 中的encryptionData方法返回加密過后的審計結果,然后EncryptedataServlet 再將加密后的結果返回頁面,首先將結果存儲到數據庫中,通過InsertDataServlet類進行存儲,然后再將結果存儲到區(qū)塊鏈上,結束審計部門審計工作.政府查看審計結果,首先從區(qū)塊鏈上獲取審計部門的審計結果,然后使用自己的私鑰進行解密操作.頁面通過SelectDataServlet類從數據庫中獲取存儲的私鑰,然后將私鑰返回頁面,頁面將獲取的鏈上審計結果以及私鑰傳遞給DecryptedataServlet類,DecryptedataServlet類通過調用然后調用Encryption 中的decryptionData方法返回解密過后的審計結果,通過DecryptedataServlet類將明文返回頁面,顯示給用戶查看.這樣從審計到審計結果的驗收工作就實現完成.
在溯源系統(tǒng)中,樣品的測試檢驗是至關重要的一環(huán),溯源商品質量過不過關需要有檢驗,測試檢驗的結果符不符合質量標準是溯源商品值不值得信賴的關鍵保證.在樣品測試過程中,可能涉及多個實驗室進行交叉測試,然后再將最后的結果作為商品的測試結果.每個實驗室在進行測試的時候會有相應的獎勵作為報酬.每個實驗室的測試結果以及報酬的分別的存儲到鏈上,會造成大量的資源浪費,因為每個實驗室不可能只檢驗一個樣品,對于不同的樣品的結果分開存儲,或者每檢驗完一個樣品就通過區(qū)塊鏈獎勵一次,這種情況下造成大量的區(qū)塊鏈資源的浪費.通過狀態(tài)通道,實驗室之間相當于鏈下的不同節(jié)點,不同實驗室之間進行不斷的實驗結果的交換使用,最后將最終的檢驗結果完整地發(fā)布到鏈上.對于每個實驗室的檢驗獎勵作為積累,當檢驗結束,將最終的獎勵進行一次性轉賬交易的記錄.
如圖8所示,MoneyServlet與TimeServlet是獲取鏈上每個實驗室的資金狀態(tài)頁面交互;TransServlet與TimeForTrans是初始化狀態(tài)通道與頁面交互;GoTransServlet是實現狀態(tài)通道操作的交互類,進行的是資金限制操作相關操作類;TimeGoServlet是實現狀態(tài)通道操作的交互類,進行的是次數限制相關操作類;CloseTransaction 用于最終的更新鏈上狀態(tài)交互類;AssistClass 用于找到一條可以使用的通道供交易使用的輔助類;FindPath類用于查找是否有通道可以借用的輔助類;Graph 用于圖網絡的建立,我們將狀態(tài)通道與圖結構進行結合.

圖8 狀態(tài)通道模式類圖
具體實現操作以實驗室的檢測測試獎勵為例來進行描述.實驗室測試樣品,如果完成一次測試,實驗室獲得一次獎勵,那么當多個是現實多次發(fā)生類似情況的時候,積累過多會給區(qū)塊鏈造成沉重的負擔.將每一次的獎勵在鏈下進行,然后將最終測試結束后,實驗室的資金狀態(tài),作為一次總的交易發(fā)生存儲到鏈上.首先進行前先確定是資金方面的交易,通過MoneyServlet進入到相應頁面,然后通過頁面進入TransServlet,調用Graph類buildGraph進行狀態(tài)通道的初始化,初始化完成后就可以進行測試獎勵的交易.一次獎勵的開始調用GoTransServlet進行操作,首先調用查看是否有直接的通道,如果有查看是否處于開啟狀態(tài)(通道有可能處于關閉或者開啟狀態(tài),開啟狀態(tài)可以使用,關閉狀態(tài)則不能使用),則直接進行獎勵交易,否則先開啟通道在進行交易.如果沒有調用FindPath 查找有沒有其他的實驗室節(jié)點通道可以借用,如果有則調用AssistClass類,查找是否有可用的通道,只有處于開啟狀態(tài)的通道才可以進行借用.如果找到則借用該通道進行交易,如果沒有找到則在獎勵人節(jié)點與被獎勵的實驗室節(jié)點直接建立直接的通道并開啟,進行獎勵的交易.實驗室測試獎勵的交易以這種鏈下狀態(tài)通道方式進行,當所有測試完成,則調用CloseTransaction進行狀態(tài)的確定,然后將最終的獎勵交易作為一次總額度的交易進行產生,更新到鏈上,完成此過程.如果是測試結果的交互使用,則如同獎勵實驗室測試過程一樣,調用另一個分支即可完成.
在上述部分中,我們著重描述了將我們的設計模式應用到具體案例中的實現操作,在本節(jié)中,我們將對如何使用提出的設計模式進行應用程序開發(fā),及如何提高開發(fā)效率進行分析.
在使用本文所提出的設計模式進行區(qū)塊鏈應用程序開發(fā)時,開發(fā)人員只需運用本文提出的設計模式,而無需擔心其他區(qū)塊鏈相關操作.在哈希完整性模式中,提供了完整性的哈希計算方法,以及鏈上智能合約完整代碼.應用開發(fā)者只需要使用提供的哈希計算方法進行數據集的哈希計算,然后將智能合約代碼部署到本地區(qū)塊鏈上,即可存取數據.在數據隱私保護模式中,提供了完整的公私鑰創(chuàng)建方法,以及公私鑰與字符串之間轉換方法,以便應用開發(fā)者可以方便地存儲到數據庫以及區(qū)塊鏈上,無需擔心公私鑰與字符串之間轉換問題,相應的我們還提供了存儲公鑰的智能合約,以及存儲方法.我們還提供了鏈下數據表與鏈上智能合約一一對應相關操作,應用開發(fā)者只需要在創(chuàng)建鏈下數據表的時候,將需要存儲到區(qū)塊鏈中的屬性篩選出來,就會相應的生成與鏈下數據表名所對應的智能合約(合約名與表名一致),以及應用開發(fā)者所篩選出來的相關鏈上屬性,以及先關get和set方法.應用開發(fā)者只需要使用相關模塊即可進行應用的快速開發(fā).在狀態(tài)通道模式中,提供了預設條件值,當交易發(fā)生8次或者間隔8秒鐘之后,就會自動的更新鏈上狀態(tài),應用開發(fā)人員只需要設置自己預設的次數或者時間即可,這里建議時間設置小一點,減小被攻擊的可能性.狀態(tài)通道模式一般應用于帶有獎勵機制的應用開發(fā)過程中,具體的擴展性我們將進行進一步的研究.
設計模式中提供所有的方法以及智能合約模板,盡可能簡化區(qū)塊鏈應用開發(fā)者的操作.區(qū)塊鏈應用程序開發(fā)者不再需要專門去學習如何書寫智能合約,只需要在提供的基礎模板(有相應解釋注釋)上面做微小調整即可使用,而且在提供的方法中,大部分都是智能自動化生成的智能合約,應用開發(fā)者只需要調用相應的方法即可,節(jié)省了應用開發(fā)者再學習的時間,提高了應用程序開發(fā)效率.在應用開發(fā)過程中開發(fā)者也不需要專門的研究如何調用區(qū)塊鏈的API,對于連接區(qū)塊鏈操作,發(fā)布區(qū)塊鏈交易操作,智能合約的部署,訪問查詢操作等都已經進行了封裝,開發(fā)者可以通過使用方法的過程中了解,其中代碼都加注了相關接口注釋.我們致力于打造一個方便高效的模式,使得一個不了解區(qū)塊鏈的應用開發(fā)者也可以進行區(qū)塊鏈應用程序開發(fā),通過節(jié)省開發(fā)者再學習的時間,來提高應用程序開發(fā)效率.
在本文中,我們提出并設計實現了幾種基于區(qū)塊鏈應用的數據管理設計模式,并分享了將所提出的設計模式應用于一個名為originChain的基于塊鏈的可追溯系統(tǒng)的經驗.區(qū)塊鏈的獨特屬性,為數據管理提供了新的思路.而設計模式影響基于區(qū)塊鏈的應用程序的某些特定方面,如可更新性、適應性和互操作性.并且設計模式為開發(fā)人員在區(qū)塊鏈上構建應用程序提供了架構指導.我們根據區(qū)塊鏈在數據管理方面的問題,將設計模式分為了3類:哈希完整性模式、數據隱私保護模式和狀態(tài)通道模式.并給出了模式與模式之間的相關性描述.
在未來的工作中,我們將繼續(xù)完善和擴展設計模式,并提供有關設計模式更加詳細的討論.將這些設計模式應用于更多適用區(qū)塊鏈的領域.我們將這些模式封裝成了服務,以供所需用戶使用,提供API 以方便用戶訪問.