數(shù)據(jù)庫(kù)中的區(qū)塊鏈功能有什么用
掃描二維碼
隨時(shí)隨地手機(jī)看文章
對(duì)于傳統(tǒng)數(shù)據(jù)庫(kù),區(qū)塊鏈支持完全不同的范例。在計(jì)算歷史中,我們第一次擁有了一個(gè)數(shù)據(jù)存儲(chǔ),在這個(gè)數(shù)據(jù)存儲(chǔ)中,我們可以絕對(duì)確定數(shù)據(jù)項(xiàng)的創(chuàng)建日期,并且可以絕對(duì)肯定該項(xiàng)沒(méi)有被修改。我們?nèi)绾螌^(qū)塊鏈的強(qiáng)大功能集成到數(shù)據(jù)庫(kù)中?
數(shù)據(jù)庫(kù)已經(jīng)存在了很長(zhǎng)時(shí)間,盡管已經(jīng)發(fā)生了一些重大變革——例如關(guān)系數(shù)據(jù)庫(kù)的出現(xiàn)和隨后的NoSQL反革命——但是從開(kāi)發(fā)人員的角度來(lái)看,數(shù)據(jù)庫(kù)操作幾乎沒(méi)有什么變化。
通常,應(yīng)用程序創(chuàng)建一個(gè)數(shù)據(jù)記錄,然后讀取它,可能更新它并最終將其刪除。這個(gè)創(chuàng)建-讀取-更新-刪除周期被稱為方便的縮寫(xiě)“CRUD”。CRUD說(shuō)明了數(shù)據(jù)庫(kù)存儲(chǔ)的短暫性——數(shù)據(jù)被創(chuàng)建、修改和刪除。更新會(huì)銷毀舊版本的數(shù)據(jù),一旦刪除,數(shù)據(jù)庫(kù)記錄將永遠(yuǎn)消失(除非我們完全恢復(fù)數(shù)據(jù)庫(kù)的舊版本)。
此外,我們已經(jīng)非常習(xí)慣于這樣一個(gè)事實(shí):數(shù)據(jù)庫(kù)對(duì)交易的完整性提供了有限的保證。有特權(quán)的開(kāi)發(fā)人員幾乎總是可以復(fù)蓋數(shù)據(jù)記錄,甚至可以將時(shí)間戳設(shè)置為他們選擇的任何記錄。在數(shù)據(jù)庫(kù)技術(shù)中沒(méi)有內(nèi)在的方法來(lái)保證數(shù)據(jù)元素沒(méi)有被復(fù)蓋。
區(qū)塊鏈數(shù)據(jù)存儲(chǔ)區(qū)塊鏈支持完全不同的范例。在最初的比特幣區(qū)塊鏈中,防止重復(fù)使用比特幣的必要性是至關(guān)重要的,絕對(duì)有必要永遠(yuǎn)保存每筆交易的記錄。
因此,區(qū)塊鏈提供了一個(gè)僅限追加的不可變分類賬,一個(gè)相對(duì)簡(jiǎn)單的數(shù)據(jù)庫(kù),其中可以添加數(shù)據(jù)元素,但不能刪除或修改。比特幣的工作證明算法和連續(xù)的區(qū)塊鏈之間的加密鏈接使得篡改成為不可能。
因此,在計(jì)算歷史上,我們第一次有了一個(gè)數(shù)據(jù)存儲(chǔ),我們可以絕對(duì)肯定一個(gè)數(shù)據(jù)項(xiàng)的創(chuàng)建日期,并且可以絕對(duì)地肯定該項(xiàng)沒(méi)有被修改。這是一場(chǎng)真正的革命!
不幸的是,我們不能把區(qū)塊鏈作為通用的數(shù)據(jù)存儲(chǔ)區(qū)來(lái)使用。與傳統(tǒng)的數(shù)據(jù)庫(kù)相比,它簡(jiǎn)單、太慢、昂貴且笨拙。例如,比特幣區(qū)塊鏈每十分鐘就會(huì)產(chǎn)生一個(gè)新的區(qū)塊,每秒只能處理27個(gè)交易,如果將其用作傳統(tǒng)的數(shù)據(jù)存儲(chǔ),每千兆字節(jié)將耗費(fèi)數(shù)百萬(wàn)美元。
如何集成區(qū)塊鏈功能如果我們確實(shí)想將區(qū)塊鏈功能集成到現(xiàn)有的數(shù)據(jù)庫(kù)應(yīng)用程序中,我們有兩條路可走:
1.構(gòu)建新的數(shù)據(jù)庫(kù)技術(shù),集成區(qū)塊鏈的概念,但仍然可以提供經(jīng)濟(jì)性能。
2.在數(shù)據(jù)庫(kù)和現(xiàn)有的區(qū)塊鏈之間創(chuàng)建集成層。
一些早期的嘗試是建立在區(qū)塊鏈基礎(chǔ)上的新數(shù)據(jù)庫(kù)系統(tǒng)。不幸的是,它們不是“兩全之優(yōu)”,而是冒著“兩全之劣”的風(fēng)險(xiǎn):與現(xiàn)有數(shù)據(jù)庫(kù)相比,它們更難以使用,功能也更差,而且沒(méi)有以太坊和比特幣等公共區(qū)塊鏈提供的強(qiáng)大完整性保證。
目前,我們只能通過(guò)集成層獲得兩個(gè)世界的最佳解決方案。
幸運(yùn)的是,有一些技術(shù)模式允許我們維護(hù)數(shù)據(jù)庫(kù)記錄的不可變副本,并將它們錨定到區(qū)塊鏈上。
記錄結(jié)構(gòu)的Merge樹(shù)和Merkle樹(shù)首先,我們可以將數(shù)據(jù)構(gòu)造為日志結(jié)構(gòu)的Merge 樹(shù)(LSM)。在日志結(jié)構(gòu)化Merge 樹(shù)中,所有數(shù)據(jù)(包括刪除和更新)都作為插入樹(shù)中的插入處理。刪除插入一條“tombstone”記錄,該記錄指出數(shù)據(jù)項(xiàng)已被刪除。更新會(huì)原封不動(dòng)地保留舊記錄,只需插入一個(gè)新版本。
我們可以使用的第二個(gè)數(shù)據(jù)結(jié)構(gòu)是Merkle樹(shù)。Merkle樹(shù)是一個(gè)哈希樹(shù),連續(xù)的哈希對(duì)本身進(jìn)行哈希運(yùn)算,直到獲得單個(gè)根哈希。這個(gè)哈??梢杂脕?lái)驗(yàn)證數(shù)千個(gè)任意大小的數(shù)據(jù)元素的完整性。如果我們將這個(gè)根哈希存儲(chǔ)在區(qū)塊鏈上,那么這個(gè)根哈希就可以用來(lái)證明單個(gè)區(qū)塊鏈交易中任意數(shù)量的數(shù)據(jù)庫(kù)元素的完整性。
因此,如果我們將數(shù)據(jù)庫(kù)模式實(shí)現(xiàn)為日志結(jié)構(gòu)化Merge樹(shù),則可以使用Merkle樹(shù)將數(shù)據(jù)庫(kù)狀態(tài)錨定到區(qū)塊鏈。這樣我們就擁有區(qū)塊鏈不變性的所有優(yōu)點(diǎn),以及我們選擇的任何數(shù)據(jù)庫(kù)的強(qiáng)大功能。
如果這聽(tīng)起來(lái)工作量很大,那你就對(duì)的。但是,不要絕望。在ProvenDB中,我們已經(jīng)將這個(gè)集成層構(gòu)建到MongoDB中。使用ProvenDB,您可以照常使用MongoDB,但是在幕后,我們維護(hù)了LSM結(jié)構(gòu),并允許您訪問(wèn)區(qū)塊鏈的完整性和時(shí)間戳證明。