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