• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      具有區(qū)塊鏈結(jié)構(gòu)的數(shù)據(jù)庫

      2020-08-13 07:17:51任晉宏肖攸安黃文禹
      軟件 2020年6期
      關(guān)鍵詞:區(qū)塊鏈數(shù)據(jù)庫

      任晉宏 肖攸安 黃文禹

      摘 ?要: 區(qū)塊鏈?zhǔn)且环N鏈?zhǔn)酱鎯?chǔ)數(shù)據(jù)結(jié)構(gòu),它的特點(diǎn)是對(duì)于數(shù)據(jù)修改有固有抵抗力,但在檢索方面有著較大的弊端。傳統(tǒng)SQL數(shù)據(jù)庫中由于開放數(shù)據(jù)訪問和復(fù)雜的網(wǎng)絡(luò)安全破壞機(jī)制所提供的易變環(huán)境,數(shù)據(jù)極易被篡改且無法被直接檢測(cè)到。本文通過借鑒區(qū)塊鏈技術(shù)思想,設(shè)計(jì)10區(qū)塊鏈結(jié)構(gòu)數(shù)據(jù)表為傳統(tǒng)關(guān)系型數(shù)據(jù)庫賦予區(qū)塊鏈的防篡改、防偽特性,在保證數(shù)據(jù)可信的同時(shí)擁有較高的檢索速度。

      關(guān)鍵詞: 區(qū)塊鏈;數(shù)據(jù)庫;防篡改;數(shù)據(jù)可信

      中圖分類號(hào): TP311 ? ?文獻(xiàn)標(biāo)識(shí)碼: A ? ?DOI:10.3969/j.issn.1003-6970.2020.06.013

      本文著錄格式:任晉宏,肖攸安,黃文禹,等. 具有區(qū)塊鏈結(jié)構(gòu)的數(shù)據(jù)庫[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ū)塊鏈技術(shù)不斷發(fā)展并受到各領(lǐng)域的密切關(guān)注[1]。區(qū)塊鏈技術(shù)規(guī)定了區(qū)塊鏈的數(shù)據(jù)定義,以比特幣為例,每個(gè)區(qū)塊由區(qū)塊頭和區(qū)塊體兩部分組成,區(qū)塊體中存放了自前一區(qū)塊之后發(fā)生的多筆交易;區(qū)塊頭中存放了前塊哈希(PreBlockHash)、隨機(jī)數(shù)(Nonce)、Merkle根(MerkleRoot)等[2]。區(qū)塊鏈?zhǔn)怯糜跀?shù)據(jù)存儲(chǔ)并保證數(shù)據(jù)可信的鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)。

      區(qū)塊鏈的特點(diǎn)和它的缺點(diǎn)一樣突出,由于其較差的數(shù)據(jù)格式,它在搜索查詢方面不盡如人意。例如,比特幣中一個(gè)事物的發(fā)布、驗(yàn)證和最終的確認(rèn)可能需要1個(gè)小時(shí)甚至更久的時(shí)間[3]。傳統(tǒng)SQL數(shù)據(jù)庫不但有數(shù)據(jù)結(jié)構(gòu)化的特點(diǎn),還有快速查詢處理的優(yōu)勢(shì),但它不能抵抗數(shù)據(jù)修改。

      為了實(shí)現(xiàn)同時(shí)具備區(qū)塊鏈對(duì)數(shù)據(jù)的固有抵抗力和高效的查詢速度,本文借鑒區(qū)塊鏈技術(shù)設(shè)計(jì)了區(qū)塊鏈結(jié)構(gòu)的數(shù)據(jù)庫,通過對(duì)數(shù)據(jù)庫表增設(shè)hash、prehash等字段并結(jié)合數(shù)字簽名技術(shù)、哈希算法使其符合區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)庫中每條記錄可視作一個(gè)區(qū)塊,每個(gè)區(qū)塊的哈希值都包含前一區(qū)塊的哈希值,每個(gè)區(qū)塊的哈希不僅是為區(qū)塊數(shù)據(jù)提供篡改阻力的元數(shù)據(jù),也是指向前一區(qū)塊的哈希指針;每個(gè)區(qū)塊中的數(shù)字簽名為數(shù)據(jù)提供了防偽證明。關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)庫表可視為一條區(qū)塊鏈,多張表可視為多條區(qū)塊鏈,可針對(duì)單張表進(jìn)行數(shù)據(jù)校驗(yàn),驗(yàn)證數(shù)據(jù)完整性。

      1 ?區(qū)塊鏈結(jié)構(gòu)數(shù)據(jù)庫

      1.1 ?區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)

      區(qū)塊鏈中的每個(gè)區(qū)塊都通過散列值連接到前一個(gè)區(qū)塊,每個(gè)區(qū)塊主要由區(qū)塊頭和包含交易數(shù)據(jù)的區(qū)塊體組成[2]。區(qū)塊鏈的數(shù)據(jù)結(jié)構(gòu)如表1所示。

      區(qū)塊鏈中的前后區(qū)塊通過哈希值進(jìn)行連接,哈希值是對(duì)交易數(shù)據(jù)和前一區(qū)塊的哈希值進(jìn)行Hash運(yùn)算得到的結(jié)果。為了生成區(qū)塊X,區(qū)塊X-1必須先于區(qū)塊X生成,所以區(qū)塊鏈可以在時(shí)間上向前遍歷檢測(cè)數(shù)據(jù)是否被篡改[4]。若要對(duì)區(qū)塊鏈上的數(shù)據(jù)進(jìn)行篡改,則必須從初始寫入數(shù)據(jù)的區(qū)塊到當(dāng)前時(shí)刻的所有區(qū)塊進(jìn)行篡改。

      1.2 ?面向關(guān)系型數(shù)據(jù)庫的區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)

      區(qū)塊鏈中的信息在邏輯上可分為兩部分,一部分為是要存儲(chǔ)的數(shù)據(jù),另一部分是為存儲(chǔ)數(shù)據(jù)提供篡改阻力的元數(shù)據(jù)[4]。本文對(duì)Sql數(shù)據(jù)庫表的字段進(jìn)行了設(shè)計(jì),如表1.2所示,數(shù)據(jù)庫表的字段分為區(qū)塊頭(Blockhead)和數(shù)據(jù)(Data)兩部分:區(qū)塊頭中的字段有包含區(qū)塊編號(hào)id,前一區(qū)塊哈希(prev_ hash)、時(shí)間戳(timestamp)、本次交易哈希(hash)和交易簽名(signature);數(shù)據(jù)中的字段根據(jù)需存儲(chǔ)數(shù)據(jù)設(shè)計(jì)。數(shù)據(jù)庫中的每一張表可以視為一條區(qū)塊鏈,多張表可視為多條鏈,一張表中的每條數(shù)據(jù)可視為一個(gè)區(qū)塊。每個(gè)區(qū)塊中的Hash是由對(duì)本區(qū)塊的所有數(shù)據(jù)和前一區(qū)塊的Hash經(jīng)過哈希運(yùn)算得到,所以每個(gè)區(qū)塊的Hash都指向前一區(qū)塊。由此數(shù)據(jù)庫表中每條記錄構(gòu)成一條區(qū)塊鏈,這樣每個(gè)新的區(qū)塊就會(huì)包含前一區(qū)塊的信息。

      1.3 ?數(shù)據(jù)存儲(chǔ)流程

      本文設(shè)計(jì)了區(qū)塊鏈處理器完成數(shù)據(jù)的寫入、讀取、修改、刪除和校驗(yàn)功能。數(shù)據(jù)存儲(chǔ)過程如圖1所示,在接收到交易數(shù)據(jù)Data后,后臺(tái)連接數(shù)據(jù)庫獲取當(dāng)前最新記錄的哈希值并賦值給Prehash字段,對(duì)Data、Prehash和當(dāng)前系統(tǒng)時(shí)間Timestamp一起進(jìn)行哈希運(yùn)算生成Data的摘要值Hash,然后使用發(fā)送者的私鑰對(duì)Hash簽名,最后將Data、Prehash、Timestamp、Hash和Signature一起寫入數(shù)據(jù)庫中。

      為保證區(qū)塊鏈完整性,不允許直接在數(shù)據(jù)庫中修改或刪除數(shù)據(jù)。為了符合多應(yīng)用場(chǎng)景,有修改需求的需重新向后臺(tái)提交,在數(shù)據(jù)庫中生成一條有相同Id的新記錄。用戶查詢數(shù)據(jù)時(shí),后臺(tái)會(huì)根據(jù)時(shí)間戳將最新記錄返回給用戶。若想要?jiǎng)h除數(shù)據(jù),將各個(gè)字段賦值null,提交給后臺(tái)即可。

      1.4 ?數(shù)據(jù)校驗(yàn)流程

      圖2為數(shù)據(jù)的校驗(yàn)過程,首先在數(shù)據(jù)庫中檢索最新記錄的數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行哈希運(yùn)算,將運(yùn)算結(jié)果與數(shù)據(jù)中的哈希值對(duì)比,若不匹配,則說明區(qū)塊X中的哈希值被篡改;然后根據(jù)數(shù)據(jù)中的preHash字段在數(shù)據(jù)庫中檢索上條記錄,若返回空值,則說明上條記錄被刪除或數(shù)據(jù)中的preHash被篡改;當(dāng)檢測(cè)到preHash為空或檢測(cè)到數(shù)據(jù)被篡改時(shí),結(jié)束循壞,將結(jié)果返回給用戶。

      2 ?區(qū)塊鏈處理器

      區(qū)塊鏈處理器對(duì)存儲(chǔ)數(shù)據(jù)進(jìn)行編碼,以區(qū)塊的形式存入數(shù)據(jù)庫中,并對(duì)數(shù)據(jù)庫中區(qū)塊鏈結(jié)構(gòu)數(shù)據(jù)進(jìn)行校驗(yàn),驗(yàn)證數(shù)據(jù)是否被篡改。

      2.1 ?數(shù)據(jù)存儲(chǔ)算法

      根據(jù)區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)定義,數(shù)據(jù)庫表結(jié)構(gòu)定義如下:

      CREATE TABLE Blockchain

      Field0 varchar(32),

      Field1 varchar(32),

      Field2 varchar(32),

      prev_hash varchar(256), ? ? ? ? ? ? ?//前一區(qū)塊哈希

      hash varchar(256), ? ? ? ? ? ? ? ? //該區(qū)塊哈希

      timestamp timestamp, ? ? ? ? ? ? ?//時(shí)間戳

      signature varchar(256) ? ? ? ? ? //交易簽名

      );

      接收到交易數(shù)據(jù)data后,區(qū)塊鏈處理器首先判斷數(shù)據(jù)庫表最新區(qū)塊是否為空,若為空,則對(duì)prehash賦值為null;否則獲取當(dāng)前最新區(qū)塊的哈希值賦值給prehash,然后對(duì)data、時(shí)間戳timestamp和prehash一起進(jìn)行哈希運(yùn)算,生成新區(qū)塊的哈希值,最后將新區(qū)塊寫入數(shù)據(jù)庫中。

      算法1.數(shù)據(jù)插入算法

      輸入:交易數(shù)據(jù)data

      //客戶端加密

      1. String preHash = 當(dāng)前數(shù)據(jù)庫中最新記錄的摘要值hash;

      2. String hash = hashEncrypt(data,timestamp, preHash);

      3. signature = RSAEncrypt(hash,privateKey);

      4. sendMessage(data,hash,preHash,timestamp, signature);

      //服務(wù)器端解密,存入數(shù)據(jù)庫

      //hash1為對(duì)signature解密后的結(jié)果,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. ? ?//將數(shù)據(jù)寫入數(shù)據(jù)庫中

      9. }else{

      10. ? ?//返回錯(cuò)誤信息

      11. }

      算法1的第1行~第4行是有客戶端對(duì)數(shù)據(jù)使用哈希算法生成哈希值,使用用戶私鑰對(duì)數(shù)據(jù)的哈希值進(jìn)行數(shù)字簽名,并發(fā)送給服務(wù)器端。

      第5行是服務(wù)器端接收客戶端發(fā)送的數(shù)據(jù)。

      第6行是使用用戶公鑰對(duì)簽名signature解密。

      第7行~第11行是判斷解密哈希與發(fā)送的哈希值是否匹配。

      2.2 ?數(shù)據(jù)校驗(yàn)算法

      數(shù)據(jù)校驗(yàn)算法用于保證數(shù)據(jù)完整性,數(shù)據(jù)完整性遭到破壞的可能情況有兩種:部分區(qū)塊被刪除和區(qū)塊內(nèi)數(shù)據(jù)被篡改。針對(duì)這兩種情況我們提出以下算法判別數(shù)據(jù)完整性。

      算法2 ?校驗(yàn)算法

      輸入:無

      輸出:數(shù)據(jù)未被篡改,返回null;檢測(cè)異常返回檢測(cè)出的第一條異常數(shù)據(jù)。

      1. Data data = 當(dāng)前最新區(qū)塊數(shù)據(jù);

      2. String preHash = data.getPrehash();

      3. while (preHash != null){

      4. ? ? try{

      5. ? ? ? ? dataPre = 前一區(qū)塊哈希值;

      6. ? ? ? ? } catch (Exception e){

      7. ? ? ? ? return JsonData.buildError(-2,"前一區(qū)塊數(shù)據(jù)被刪除",data.getId());

      8. ? ? ? ? }

      9. ? ? String checkHash=HashUtils.genHash(data); ? ? ?//計(jì)算當(dāng)前區(qū)塊的哈希值

      10. ? ?String hash=data.getHash();

      11. ? ?if(checkHash!=hash){

      12. ? ? ? ?return Jsondata.buildError(-3,"數(shù)據(jù)被篡改");

      13. ? ?}

      14. ? ?preHash = dataPre.hash();

      15. ? ?if(preHash = null){

      16. ? ? ? ?return Jsondata.buildSucess();

      17. ? ?}

      18. }

      算法2是在時(shí)間順序上向前遍歷,第3行代碼用于判別當(dāng)前區(qū)塊是否為初始區(qū)塊。

      第4行~第8行代碼通過當(dāng)前區(qū)塊存儲(chǔ)的prehash檢索前一區(qū)塊數(shù)據(jù),若檢索失敗,說明前一區(qū)塊數(shù)據(jù)被刪除。

      第9行~第13行代碼通過對(duì)當(dāng)前區(qū)塊存儲(chǔ)信息重新進(jìn)行哈希運(yùn)算來判別當(dāng)前區(qū)塊的數(shù)據(jù)是否被篡改。

      第15行~第17行代碼通過判斷prehash是否為null來確認(rèn)該鏈?zhǔn)欠裥r?yàn)完成。

      3 ?實(shí)驗(yàn)

      3.1 ?試驗(yàn)1 篡改數(shù)據(jù)測(cè)試

      將數(shù)據(jù)庫中訂單號(hào)為201910204291的區(qū)塊信息進(jìn)行修改,使用校驗(yàn)算法對(duì)發(fā)生篡改的區(qū)塊鏈進(jìn)行校驗(yàn),查驗(yàn)數(shù)據(jù)完整性,查驗(yàn)結(jié)果如圖3所示。

      刪除數(shù)據(jù)庫中訂單號(hào)為201910019023的區(qū)塊的前一區(qū)塊,使用校驗(yàn)算法對(duì)這條區(qū)塊鏈進(jìn)行校驗(yàn),查驗(yàn)數(shù)據(jù)完整性,查驗(yàn)結(jié)果如圖4所示。

      3.2 ?試驗(yàn)2 數(shù)據(jù)校驗(yàn)性能測(cè)試

      本文使用被動(dòng)檢測(cè)機(jī)制保證數(shù)據(jù)可信,交易數(shù)據(jù)按照時(shí)間順序?qū)懭霐?shù)據(jù)庫中,交易信息校驗(yàn)過程中要獲取當(dāng)前交易數(shù)據(jù)和上一條數(shù)據(jù)的哈希值,使用算法重新當(dāng)前交易的哈希值并與數(shù)據(jù)庫中存儲(chǔ)的哈希值相比較。我們測(cè)試在每條數(shù)據(jù)大小為322B,10000-50000條數(shù)據(jù)量情況下的校驗(yàn)速度,如圖5所示,在10000-50000條數(shù)據(jù)范圍內(nèi),數(shù)據(jù)校驗(yàn)速度與數(shù)據(jù)量大小成線性關(guān)系,在可接受的時(shí)間內(nèi)保證數(shù)據(jù)可信。

      3.3 ?試驗(yàn)3 數(shù)據(jù)版本對(duì)查詢速率的影響

      為保證數(shù)據(jù)以區(qū)塊鏈的鏈?zhǔn)浇Y(jié)構(gòu)存儲(chǔ),不允許直接對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行修改或刪除,為滿足對(duì)修改和刪除的需求,我們通過在數(shù)據(jù)庫寫入有著相同主鍵的新記錄完成修改和刪除功能,在查詢數(shù)據(jù)時(shí)僅顯示時(shí)間戳最新的數(shù)據(jù)。我們?cè)O(shè)計(jì)了實(shí)驗(yàn)測(cè)試數(shù)據(jù)版本數(shù)對(duì)查詢速率的影響,在10000條數(shù)據(jù)環(huán)境下,查詢大小為297b大小的數(shù)據(jù)。實(shí)驗(yàn)結(jié)果如圖6所示,在修改24次數(shù)據(jù)后,單次查詢速度與修改4次數(shù)據(jù)后的單次查詢速度并未有明顯差距,說明版本數(shù)對(duì)數(shù)據(jù)查詢速率影響極低。

      4 ?結(jié)論

      本文借鑒區(qū)塊鏈思想提出了在關(guān)系型數(shù)據(jù)庫中以區(qū)塊鏈的鏈?zhǔn)浇Y(jié)構(gòu)存儲(chǔ)數(shù)據(jù)的方法和被動(dòng)檢測(cè)機(jī)制,以此保證數(shù)據(jù)可信和數(shù)據(jù)檢索速率。通過實(shí)驗(yàn)測(cè)試,實(shí)驗(yàn)數(shù)據(jù)表明在保證數(shù)據(jù)可信的基礎(chǔ)上同時(shí)具有較高的數(shù)據(jù)檢索速率;在一定數(shù)據(jù)量范圍內(nèi),數(shù)據(jù)量與校驗(yàn)速度呈線性關(guān)系,可只對(duì)關(guān)鍵字段進(jìn)行加密處理,減少算法運(yùn)行時(shí)間,提高校驗(yàn)速度,之后會(huì)在此基礎(chǔ)上進(jìn)一步研究提高校驗(yàn)速率的方法。

      參考文獻(xiàn)

      [1] 焦通, 申德榮, 聶鐵錚, 寇月, 李曉華, 于戈. 區(qū)塊鏈數(shù)據(jù)庫: 一種可查詢且防篡改的數(shù)據(jù)庫[J]. 軟件學(xué)報(bào), 2019, 30(9): 2671-2685.

      [2] 邵奇峰, 金澈清, 張召, 錢衛(wèi)寧, 周傲英, 區(qū)塊鏈技術(shù): 架構(gòu)及進(jìn)展[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] 蔣東東. 寶武集團(tuán)區(qū)塊鏈可信電子倉單系統(tǒng)的研發(fā)[D]. 西安: 西安工程大學(xué), 2018.

      [8] 葛利潔. 基于區(qū)塊鏈技術(shù)的交易信息存儲(chǔ)與查詢系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 北京: 北京郵電大學(xué), 2018.

      [9] 北京眾享比特科技有限公司. 基于區(qū)塊鏈的數(shù)據(jù)庫應(yīng)用平臺(tái)技術(shù)白皮書[Z]. WhitePaper, 2017.

      [10] 張偲. 區(qū)塊鏈技術(shù)原理、應(yīng)用及建議[J]. 軟件, 2016, 37(11): 51-54.

      [11] 尚永強(qiáng). 計(jì)算機(jī)網(wǎng)絡(luò)信息安全中數(shù)據(jù)加密技術(shù)的探討[J]. 軟件, 2018, 39(12): 198-201.

      猜你喜歡
      區(qū)塊鏈數(shù)據(jù)庫
      數(shù)據(jù)庫
      數(shù)據(jù)庫
      保險(xiǎn)企業(yè)的區(qū)塊鏈技術(shù)應(yīng)用方向選擇研究
      區(qū)塊鏈技術(shù)在金融領(lǐng)域的應(yīng)用與前景研究
      區(qū)塊鏈技術(shù)的應(yīng)用價(jià)值分析
      商情(2016年40期)2016-11-28 11:24:12
      “區(qū)塊鏈”的茍且、詩和遠(yuǎn)方
      基于區(qū)塊鏈技術(shù)的數(shù)字貨幣與傳統(tǒng)貨幣辨析
      數(shù)據(jù)庫
      數(shù)據(jù)庫
      數(shù)據(jù)庫
      天门市| 大同县| 宜阳县| 肇州县| 克什克腾旗| 上杭县| 乌苏市| 德江县| 宣城市| 长寿区| 砚山县| 纳雍县| 德安县| 福州市| 清镇市| 萨嘎县| 三穗县| 磐石市| 嘉义市| 思南县| 武陟县| 北宁市| 安达市| 泸西县| 凉城县| 察雅县| 扶风县| 且末县| 墨竹工卡县| 若尔盖县| 台安县| 亚东县| 夏邑县| 阿坝| 周至县| 依兰县| 新宾| 宁阳县| 阿图什市| 双桥区| 嘉荫县|