任晉宏 肖攸安 黃文禹
摘 ?要: 區(qū)塊鏈是一種鏈式存儲數據結構,它的特點是對于數據修改有固有抵抗力,但在檢索方面有著較大的弊端。傳統(tǒng)SQL數據庫中由于開放數據訪問和復雜的網絡安全破壞機制所提供的易變環(huán)境,數據極易被篡改且無法被直接檢測到。本文通過借鑒區(qū)塊鏈技術思想,設計10區(qū)塊鏈結構數據表為傳統(tǒng)關系型數據庫賦予區(qū)塊鏈的防篡改、防偽特性,在保證數據可信的同時擁有較高的檢索速度。
關鍵詞: 區(qū)塊鏈;數據庫;防篡改;數據可信
中圖分類號: TP311 ? ?文獻標識碼: A ? ?DOI:10.3969/j.issn.1003-6970.2020.06.013
本文著錄格式:任晉宏,肖攸安,黃文禹,等. 具有區(qū)塊鏈結構的數據庫[J]. 軟件,2020,41(06)6367
【Abstract】: Block chain is a kind of chained storage data structure, which has inherent resistance to data modification, but it has great disadvantages in retrieving information. Due to the volatile environment provided by open data access and complex network security failure mechanism in traditional SQL database, data is easily tampered and cannot be directly detected. In this essay, by referring to the block chain technology, the data table with blockchain structure is designed to give the block chain 25tamper-proof and anti-counterfeiting features to the traditional relational database, so as to ensure the data credibility and at the same time have a high retrieval speed.
【Key words】: Blockchain; Database; Tamper proof storage; Reliable data
0 ?引言
隨著Bitcoin、Ethereum、Ripple等加密貨幣的興起,其底層的區(qū)塊鏈技術不斷發(fā)展并受到各領域的密切關注[1]。區(qū)塊鏈技術規(guī)定了區(qū)塊鏈的數據定義,以比特幣為例,每個區(qū)塊由區(qū)塊頭和區(qū)塊體兩部分組成,區(qū)塊體中存放了自前一區(qū)塊之后發(fā)生的多筆交易;區(qū)塊頭中存放了前塊哈希(PreBlockHash)、隨機數(Nonce)、Merkle根(MerkleRoot)等[2]。區(qū)塊鏈是用于數據存儲并保證數據可信的鏈式數據結構。
區(qū)塊鏈的特點和它的缺點一樣突出,由于其較差的數據格式,它在搜索查詢方面不盡如人意。例如,比特幣中一個事物的發(fā)布、驗證和最終的確認可能需要1個小時甚至更久的時間[3]。傳統(tǒng)SQL數據庫不但有數據結構化的特點,還有快速查詢處理的優(yōu)勢,但它不能抵抗數據修改。
為了實現同時具備區(qū)塊鏈對數據的固有抵抗力和高效的查詢速度,本文借鑒區(qū)塊鏈技術設計了區(qū)塊鏈結構的數據庫,通過對數據庫表增設hash、prehash等字段并結合數字簽名技術、哈希算法使其符合區(qū)塊鏈數據結構。數據庫中每條記錄可視作一個區(qū)塊,每個區(qū)塊的哈希值都包含前一區(qū)塊的哈希值,每個區(qū)塊的哈希不僅是為區(qū)塊數據提供篡改阻力的元數據,也是指向前一區(qū)塊的哈希指針;每個區(qū)塊中的數字簽名為數據提供了防偽證明。關系型數據庫中的數據庫表可視為一條區(qū)塊鏈,多張表可視為多條區(qū)塊鏈,可針對單張表進行數據校驗,驗證數據完整性。
1 ?區(qū)塊鏈結構數據庫
1.1 ?區(qū)塊鏈數據結構
區(qū)塊鏈中的每個區(qū)塊都通過散列值連接到前一個區(qū)塊,每個區(qū)塊主要由區(qū)塊頭和包含交易數據的區(qū)塊體組成[2]。區(qū)塊鏈的數據結構如表1所示。
區(qū)塊鏈中的前后區(qū)塊通過哈希值進行連接,哈希值是對交易數據和前一區(qū)塊的哈希值進行Hash運算得到的結果。為了生成區(qū)塊X,區(qū)塊X-1必須先于區(qū)塊X生成,所以區(qū)塊鏈可以在時間上向前遍歷檢測數據是否被篡改[4]。若要對區(qū)塊鏈上的數據進行篡改,則必須從初始寫入數據的區(qū)塊到當前時刻的所有區(qū)塊進行篡改。
1.2 ?面向關系型數據庫的區(qū)塊鏈數據結構
區(qū)塊鏈中的信息在邏輯上可分為兩部分,一部分為是要存儲的數據,另一部分是為存儲數據提供篡改阻力的元數據[4]。本文對Sql數據庫表的字段進行了設計,如表1.2所示,數據庫表的字段分為區(qū)塊頭(Blockhead)和數據(Data)兩部分:區(qū)塊頭中的字段有包含區(qū)塊編號id,前一區(qū)塊哈希(prev_ hash)、時間戳(timestamp)、本次交易哈希(hash)和交易簽名(signature);數據中的字段根據需存儲數據設計。數據庫中的每一張表可以視為一條區(qū)塊鏈,多張表可視為多條鏈,一張表中的每條數據可視為一個區(qū)塊。每個區(qū)塊中的Hash是由對本區(qū)塊的所有數據和前一區(qū)塊的Hash經過哈希運算得到,所以每個區(qū)塊的Hash都指向前一區(qū)塊。由此數據庫表中每條記錄構成一條區(qū)塊鏈,這樣每個新的區(qū)塊就會包含前一區(qū)塊的信息。
1.3 ?數據存儲流程
本文設計了區(qū)塊鏈處理器完成數據的寫入、讀取、修改、刪除和校驗功能。數據存儲過程如圖1所示,在接收到交易數據Data后,后臺連接數據庫獲取當前最新記錄的哈希值并賦值給Prehash字段,對Data、Prehash和當前系統(tǒng)時間Timestamp一起進行哈希運算生成Data的摘要值Hash,然后使用發(fā)送者的私鑰對Hash簽名,最后將Data、Prehash、Timestamp、Hash和Signature一起寫入數據庫中。
為保證區(qū)塊鏈完整性,不允許直接在數據庫中修改或刪除數據。為了符合多應用場景,有修改需求的需重新向后臺提交,在數據庫中生成一條有相同Id的新記錄。用戶查詢數據時,后臺會根據時間戳將最新記錄返回給用戶。若想要刪除數據,將各個字段賦值null,提交給后臺即可。
1.4 ?數據校驗流程
圖2為數據的校驗過程,首先在數據庫中檢索最新記錄的數據,然后對數據進行哈希運算,將運算結果與數據中的哈希值對比,若不匹配,則說明區(qū)塊X中的哈希值被篡改;然后根據數據中的preHash字段在數據庫中檢索上條記錄,若返回空值,則說明上條記錄被刪除或數據中的preHash被篡改;當檢測到preHash為空或檢測到數據被篡改時,結束循壞,將結果返回給用戶。
2 ?區(qū)塊鏈處理器
區(qū)塊鏈處理器對存儲數據進行編碼,以區(qū)塊的形式存入數據庫中,并對數據庫中區(qū)塊鏈結構數據進行校驗,驗證數據是否被篡改。
2.1 ?數據存儲算法
根據區(qū)塊鏈數據結構定義,數據庫表結構定義如下:
CREATE TABLE Blockchain
(
Field0 varchar(32),
Field1 varchar(32),
Field2 varchar(32),
…
prev_hash varchar(256), ? ? ? ? ? ? ?//前一區(qū)塊哈希
hash varchar(256), ? ? ? ? ? ? ? ? //該區(qū)塊哈希
timestamp timestamp, ? ? ? ? ? ? ?//時間戳
signature varchar(256) ? ? ? ? ? //交易簽名
);
接收到交易數據data后,區(qū)塊鏈處理器首先判斷數據庫表最新區(qū)塊是否為空,若為空,則對prehash賦值為null;否則獲取當前最新區(qū)塊的哈希值賦值給prehash,然后對data、時間戳timestamp和prehash一起進行哈希運算,生成新區(qū)塊的哈希值,最后將新區(qū)塊寫入數據庫中。
算法1.數據插入算法
輸入:交易數據data
//客戶端加密
1. String preHash = 當前數據庫中最新記錄的摘要值hash;
2. String hash = hashEncrypt(data,timestamp, preHash);
3. signature = RSAEncrypt(hash,privateKey);
4. sendMessage(data,hash,preHash,timestamp, signature);
//服務器端解密,存入數據庫
//hash1為對signature解密后的結果,hash為客戶端發(fā)送的哈希值
5. data,hash,preHash,timestamp,signature = receive(data,hash,preHash,timestamp,signature);
6. hash1 = RSADecrypt(signature,publicKey);
7. if(compareHash(hash,hash1)){
8. ? ?//將數據寫入數據庫中
9. }else{
10. ? ?//返回錯誤信息
11. }
算法1的第1行~第4行是有客戶端對數據使用哈希算法生成哈希值,使用用戶私鑰對數據的哈希值進行數字簽名,并發(fā)送給服務器端。
第5行是服務器端接收客戶端發(fā)送的數據。
第6行是使用用戶公鑰對簽名signature解密。
第7行~第11行是判斷解密哈希與發(fā)送的哈希值是否匹配。
2.2 ?數據校驗算法
數據校驗算法用于保證數據完整性,數據完整性遭到破壞的可能情況有兩種:部分區(qū)塊被刪除和區(qū)塊內數據被篡改。針對這兩種情況我們提出以下算法判別數據完整性。
算法2 ?校驗算法
輸入:無
輸出:數據未被篡改,返回null;檢測異常返回檢測出的第一條異常數據。
1. Data data = 當前最新區(qū)塊數據;
2. String preHash = data.getPrehash();
3. while (preHash != null){
4. ? ? try{
5. ? ? ? ? dataPre = 前一區(qū)塊哈希值;
6. ? ? ? ? } catch (Exception e){
7. ? ? ? ? return JsonData.buildError(-2,"前一區(qū)塊數據被刪除",data.getId());
8. ? ? ? ? }
9. ? ? String checkHash=HashUtils.genHash(data); ? ? ?//計算當前區(qū)塊的哈希值
10. ? ?String hash=data.getHash();
11. ? ?if(checkHash!=hash){
12. ? ? ? ?return Jsondata.buildError(-3,"數據被篡改");
13. ? ?}
14. ? ?preHash = dataPre.hash();
15. ? ?if(preHash = null){
16. ? ? ? ?return Jsondata.buildSucess();
17. ? ?}
18. }
算法2是在時間順序上向前遍歷,第3行代碼用于判別當前區(qū)塊是否為初始區(qū)塊。
第4行~第8行代碼通過當前區(qū)塊存儲的prehash檢索前一區(qū)塊數據,若檢索失敗,說明前一區(qū)塊數據被刪除。
第9行~第13行代碼通過對當前區(qū)塊存儲信息重新進行哈希運算來判別當前區(qū)塊的數據是否被篡改。
第15行~第17行代碼通過判斷prehash是否為null來確認該鏈是否校驗完成。
3 ?實驗
3.1 ?試驗1 篡改數據測試
將數據庫中訂單號為201910204291的區(qū)塊信息進行修改,使用校驗算法對發(fā)生篡改的區(qū)塊鏈進行校驗,查驗數據完整性,查驗結果如圖3所示。
刪除數據庫中訂單號為201910019023的區(qū)塊的前一區(qū)塊,使用校驗算法對這條區(qū)塊鏈進行校驗,查驗數據完整性,查驗結果如圖4所示。
3.2 ?試驗2 數據校驗性能測試
本文使用被動檢測機制保證數據可信,交易數據按照時間順序寫入數據庫中,交易信息校驗過程中要獲取當前交易數據和上一條數據的哈希值,使用算法重新當前交易的哈希值并與數據庫中存儲的哈希值相比較。我們測試在每條數據大小為322B,10000-50000條數據量情況下的校驗速度,如圖5所示,在10000-50000條數據范圍內,數據校驗速度與數據量大小成線性關系,在可接受的時間內保證數據可信。
3.3 ?試驗3 數據版本對查詢速率的影響
為保證數據以區(qū)塊鏈的鏈式結構存儲,不允許直接對數據庫中的數據進行修改或刪除,為滿足對修改和刪除的需求,我們通過在數據庫寫入有著相同主鍵的新記錄完成修改和刪除功能,在查詢數據時僅顯示時間戳最新的數據。我們設計了實驗測試數據版本數對查詢速率的影響,在10000條數據環(huán)境下,查詢大小為297b大小的數據。實驗結果如圖6所示,在修改24次數據后,單次查詢速度與修改4次數據后的單次查詢速度并未有明顯差距,說明版本數對數據查詢速率影響極低。
4 ?結論
本文借鑒區(qū)塊鏈思想提出了在關系型數據庫中以區(qū)塊鏈的鏈式結構存儲數據的方法和被動檢測機制,以此保證數據可信和數據檢索速率。通過實驗測試,實驗數據表明在保證數據可信的基礎上同時具有較高的數據檢索速率;在一定數據量范圍內,數據量與校驗速度呈線性關系,可只對關鍵字段進行加密處理,減少算法運行時間,提高校驗速度,之后會在此基礎上進一步研究提高校驗速率的方法。
參考文獻
[1] 焦通, 申德榮, 聶鐵錚, 寇月, 李曉華, 于戈. 區(qū)塊鏈數據庫: 一種可查詢且防篡改的數據庫[J]. 軟件學報, 2019, 30(9): 2671-2685.
[2] 邵奇峰, 金澈清, 張召, 錢衛(wèi)寧, 周傲英, 區(qū)塊鏈技術: 架構及進展[OL]. (2017-11-15)[2019-12-03]. http://kns. cnki. net/kcms/detail/11. 1826. TP. 20171115. 2302. 006. html.
[3] Muhammad Muzammal, Qiang Qu, Bulat Nasrulin. Renovating blockchain with distributed databases: An open source system[J]. Future Generation Computer Systems, 2019, 90: 105-117.
[4] MANIFOLD TECHNOLOGY, INC, MENLO PARK, CA (US). BLOCKCHAIN-ENHANCED DATABASE[P]. US 2017/0228371, A1. Aug. 10, 201.
[5] Conaghy T, Marques R, Müller A, Jonghe DD, McConaghy TT, McMullen G, Henderson R, Bellemare S, Granzotto A. ?BigchainDB: A scable blockchain database[OL]. (2016-06-08) [2019-12-03]. https://www.bigchaindb.com/whitepaper.
[6] 騰訊FiT, 騰訊研究院. 騰訊區(qū)塊鏈方案白皮書[Z]. WhitePaper, 2017.
[7] 蔣東東. 寶武集團區(qū)塊鏈可信電子倉單系統(tǒng)的研發(fā)[D]. 西安: 西安工程大學, 2018.
[8] 葛利潔. 基于區(qū)塊鏈技術的交易信息存儲與查詢系統(tǒng)的設計與實現[D]. 北京: 北京郵電大學, 2018.
[9] 北京眾享比特科技有限公司. 基于區(qū)塊鏈的數據庫應用平臺技術白皮書[Z]. WhitePaper, 2017.
[10] 張偲. 區(qū)塊鏈技術原理、應用及建議[J]. 軟件, 2016, 37(11): 51-54.
[11] 尚永強. 計算機網絡信息安全中數據加密技術的探討[J]. 軟件, 2018, 39(12): 198-201.