作為一個(gè)數(shù)據(jù)庫(kù)行業(yè)的老兵,我看到在區(qū)塊鏈技術(shù)的熱潮下,傳統(tǒng)的IT技術(shù)同學(xué)們保持了十分理性,甚至是排斥的態(tài)度。其實(shí)不管是熱捧還是排斥,兩極觀點(diǎn)之下,我認(rèn)為我們應(yīng)該從IT人比較能夠理解的角度探討一下區(qū)塊鏈技術(shù)。因?yàn)閰^(qū)塊鏈這個(gè)東西的本質(zhì)和數(shù)據(jù)庫(kù)技術(shù)非常相像,很多機(jī)制使用數(shù)據(jù)庫(kù)的理念去理解會(huì)非常直觀準(zhǔn)確。
對(duì)于區(qū)塊鏈和傳統(tǒng)數(shù)據(jù)技術(shù),我認(rèn)為區(qū)塊鏈技術(shù)的未來(lái)發(fā)展,主題是“融合”。我們就從數(shù)據(jù)庫(kù)這個(gè)角度來(lái)解讀區(qū)塊鏈技術(shù)體系中各個(gè)技術(shù)點(diǎn),以及通過(guò)“去中心化數(shù)據(jù)庫(kù)”這個(gè)概念,把區(qū)塊鏈與數(shù)據(jù)庫(kù)技術(shù)做一個(gè)比較好的整合。
一、區(qū)塊鏈技術(shù)現(xiàn)狀
當(dāng)前的區(qū)塊鏈?zhǔn)澜缬腥颂?hào)稱1.0、2.0、甚至已經(jīng)到了3.0時(shí)代,但是從一個(gè)產(chǎn)品或技術(shù)打磨的角度來(lái)看,我認(rèn)為當(dāng)前的區(qū)塊鏈也就相當(dāng)于數(shù)據(jù)庫(kù)的80年代,處于百花爭(zhēng)鳴各種思想層出不窮的時(shí)代。
對(duì)技術(shù)人來(lái)說(shuō),這是最好的時(shí)代,各種新鮮的想法和思路大量爆發(fā),在沉悶的技術(shù)領(lǐng)域帶來(lái)新鮮的突破;同時(shí)這也是最壞的時(shí)代,沒(méi)有任何產(chǎn)品或方向肯定是未來(lái)的主流,任何新鮮的思路也許在幾個(gè)月以后就被證明不可行。
所以,我們要正確認(rèn)知當(dāng)前區(qū)塊鏈技術(shù)的變革和發(fā)展,那我們來(lái)對(duì)比當(dāng)年數(shù)據(jù)庫(kù)所走過(guò)的道路,看看未來(lái)區(qū)塊鏈?zhǔn)澜鐣?huì)怎樣發(fā)展。
1、技術(shù)演進(jìn)路程
首先我認(rèn)為,區(qū)塊鏈一定會(huì)從當(dāng)前的專有化向通用化演進(jìn)?,F(xiàn)在基本所有做公鏈的產(chǎn)品都是針對(duì)某一個(gè)特定的場(chǎng)景來(lái)實(shí)現(xiàn)與優(yōu)化,但是我認(rèn)為未來(lái)一定不會(huì)是一個(gè)應(yīng)用一條鏈,而是有一種通用的開(kāi)發(fā)范式。就好像傳統(tǒng)數(shù)據(jù)庫(kù)一樣,不管大家開(kāi)發(fā)什么樣的應(yīng)用程序,都可以使用這么若干有限的幾個(gè)通用性產(chǎn)品就能夠滿足大部分業(yè)務(wù)場(chǎng)景了。
第二,向標(biāo)準(zhǔn)化演進(jìn)。對(duì)于區(qū)塊鏈技術(shù),現(xiàn)在每個(gè)鏈基本都有自己的開(kāi)發(fā)范式,甚至很多公鏈還模仿以太坊嘗試自己做一個(gè)編程語(yǔ)言出來(lái),這實(shí)際上是一種行業(yè)處于原始時(shí)期的標(biāo)志。怎樣判斷一個(gè)行業(yè)開(kāi)始走向成熟?就是業(yè)務(wù)模式基本固定、開(kāi)發(fā)方式基本固定,這樣就能夠?qū)Υ罅康某绦蛉藛T進(jìn)行推廣了。
第三,產(chǎn)品化和模塊化不斷加強(qiáng)。當(dāng)前不管是以太坊、比特幣還是很多其它新的公鏈,大部分的體系結(jié)構(gòu)都是非常緊耦合的。對(duì)比起我們?cè)诖髷?shù)據(jù)領(lǐng)域的Hadoop,基本每個(gè)模塊都可以作為獨(dú)立插件進(jìn)行可配置可定制的插拔。所以我認(rèn)為,隨著區(qū)塊鏈技術(shù)的不斷成熟和穩(wěn)定,未來(lái)一定會(huì)出現(xiàn)一款成熟產(chǎn)品,能夠通過(guò)可插拔配置與插件的方式滿足多種共識(shí)算法、安全機(jī)制等。
最后,性能與可擴(kuò)展性的提升。實(shí)際上這也是數(shù)據(jù)庫(kù)所走過(guò)的路,當(dāng)前區(qū)塊鏈?zhǔn)澜缦朐诙潭痰臅r(shí)間之內(nèi)通過(guò)側(cè)鏈、分片等機(jī)制跨過(guò)當(dāng)年數(shù)據(jù)庫(kù)幾十年來(lái)的變革。
接下來(lái)我會(huì)介紹,從數(shù)據(jù)庫(kù)的角度看待區(qū)塊鏈其最大的性能與擴(kuò)展能力制約瓶頸在什么地方,以及應(yīng)當(dāng)如何優(yōu)化。
2、發(fā)展現(xiàn)狀
那我們回過(guò)頭看看當(dāng)前區(qū)塊鏈行業(yè)的現(xiàn)狀。
拋開(kāi)區(qū)塊鏈上層的一些應(yīng)用與金融領(lǐng)域的創(chuàng)新,單獨(dú)從技術(shù)角度來(lái)看,我一直認(rèn)為其最大的革新在于對(duì)等數(shù)據(jù)存儲(chǔ)機(jī)制的建立。
在數(shù)據(jù)庫(kù)這個(gè)行業(yè)里,大家一直遵從著主-從架構(gòu),而完全“多活”的系統(tǒng)從幾十年前的提出一直以來(lái)都是傳說(shuō)中的事情,從來(lái)沒(méi)有任何產(chǎn)品真正做到多活。
而當(dāng)我們以創(chuàng)新的多活數(shù)據(jù)庫(kù)來(lái)看待當(dāng)前區(qū)塊鏈技術(shù)時(shí),就會(huì)發(fā)現(xiàn)三個(gè)急需改進(jìn)的問(wèn)題:
首先,區(qū)塊鏈的體系結(jié)構(gòu)現(xiàn)在非?;靵y,大家還沒(méi)有向傳統(tǒng)數(shù)據(jù)庫(kù)一樣將其分類為事務(wù)、存儲(chǔ)過(guò)程、鑒權(quán)、主從同步等模塊,大部分人對(duì)區(qū)塊鏈的認(rèn)知還是停留在神秘的黑盒子階段。
第二,區(qū)塊鏈的開(kāi)發(fā)語(yǔ)言完全不成體系。數(shù)據(jù)庫(kù)在經(jīng)過(guò)開(kāi)始的“戰(zhàn)國(guó)時(shí)代”后,漸漸使用SQL做到了業(yè)界的大一統(tǒng)。而區(qū)塊鏈當(dāng)前明顯還處于“戰(zhàn)國(guó)時(shí)代”,還沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)開(kāi)發(fā)和使用標(biāo)準(zhǔn)。
第三,需求的多種多樣,有些需求或白皮書的業(yè)務(wù)介紹是靠譜的,有些則是完全異想天開(kāi)不知所云。實(shí)際上這個(gè)和區(qū)塊鏈所帶來(lái)全新的業(yè)務(wù)模式相關(guān),很多人還在探索新的業(yè)務(wù)模型,從而導(dǎo)致需求沒(méi)有形成標(biāo)準(zhǔn)范式。
二、區(qū)塊鏈vs數(shù)據(jù)庫(kù)技術(shù):相同點(diǎn)
從數(shù)據(jù)庫(kù)的角度對(duì)比,區(qū)塊鏈技術(shù)即去中心化多活數(shù)據(jù)庫(kù)技術(shù),兩者之間沒(méi)有本質(zhì)區(qū)別。
這里我列舉了一些區(qū)塊鏈里面比較重要的技術(shù)點(diǎn),以及這些技術(shù)點(diǎn)在數(shù)據(jù)庫(kù)領(lǐng)域中是以什么形式存在的。這些概念和數(shù)據(jù)庫(kù)中的技術(shù)概念一一對(duì)應(yīng)關(guān)系如下:
共識(shí)機(jī)制
一致性控制——共識(shí)機(jī)制
分布式數(shù)據(jù)庫(kù)中叫做一致性控制,包括傳統(tǒng)的主從復(fù)制、新一代的Raft、Paxos等算法。在區(qū)塊鏈中為了解決額外的拜占庭問(wèn)題,將算法改進(jìn)為PBFT、PoW、PoS等協(xié)議。
存儲(chǔ)機(jī)制
數(shù)據(jù)庫(kù)日志——賬本
區(qū)塊鏈結(jié)構(gòu)基本等價(jià)于數(shù)據(jù)庫(kù)的事務(wù)日志,其主要新增的內(nèi)容包括Merkle Tree結(jié)構(gòu)用于快速驗(yàn)證數(shù)據(jù)的正確性,但是其本質(zhì)與數(shù)據(jù)庫(kù)的交易日志等價(jià)。同時(shí)數(shù)據(jù)庫(kù)在日志中更會(huì)包括事務(wù)控制等企業(yè)級(jí)能力,是區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)所不具備的。
智能合約
智能合約——存儲(chǔ)過(guò)程
智能合約與數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程一樣,都是一段托管代碼。本質(zhì)上智能合約與數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程沒(méi)有什么區(qū)別,都是通過(guò)外部調(diào)用或虛擬機(jī)執(zhí)行一段代碼,并可以將托管代碼共享給其他用戶進(jìn)行調(diào)用。
分片
數(shù)據(jù)庫(kù)分片機(jī)制早在MPP數(shù)據(jù)庫(kù)時(shí)代就已經(jīng)存在。通過(guò)將大量數(shù)據(jù)切分在不同分片中,達(dá)到限制每個(gè)分片數(shù)據(jù)總量,并提升總吞吐量和存儲(chǔ)空間的目的。
應(yīng)用開(kāi)發(fā)接口
當(dāng)前區(qū)塊鏈還處于類似數(shù)據(jù)庫(kù)當(dāng)時(shí)的早期時(shí)代,接口沒(méi)有統(tǒng)一標(biāo)準(zhǔn)化。根據(jù)區(qū)塊鏈項(xiàng)目不同,其接口可以按照數(shù)據(jù)庫(kù)、對(duì)象存儲(chǔ)、API調(diào)用、甚至PaaS平臺(tái)標(biāo)準(zhǔn)進(jìn)行定義。
安全
區(qū)塊鏈的安全機(jī)制與數(shù)據(jù)庫(kù)安全機(jī)制具有相似之處。數(shù)據(jù)庫(kù)安全一般分為鑒權(quán)與授權(quán)兩個(gè)模塊,分別代表用戶登錄以及訪問(wèn)權(quán)限。而區(qū)塊鏈當(dāng)前僅支持記錄級(jí)寫授權(quán),但是對(duì)于讀操作時(shí)完全共享的。因此,從安全策略上數(shù)據(jù)庫(kù)比當(dāng)前的區(qū)塊鏈完善很多。
三、區(qū)塊鏈vs數(shù)據(jù)庫(kù)技術(shù):不同點(diǎn)
數(shù)據(jù)庫(kù)與區(qū)塊鏈功能架構(gòu)圖
1、功能架構(gòu)
黃色部分是區(qū)塊鏈和數(shù)據(jù)庫(kù)架構(gòu)都擁有的功能。白色的部分是目前數(shù)據(jù)庫(kù)獨(dú)有的功能。
我們?cè)谏衔囊灿刑峒皵?shù)據(jù)庫(kù)的SQL能力是實(shí)現(xiàn)其通用性的重要部分,SQL對(duì)于之后區(qū)塊鏈的開(kāi)發(fā)模式固定下來(lái)很重要。
索引管理這塊,在數(shù)據(jù)庫(kù)中主要是提升數(shù)據(jù)管理和數(shù)據(jù)查詢的性能效率的,當(dāng)具體的應(yīng)用場(chǎng)景出現(xiàn),性能將成為下一階段需要提升的重要部分。因此,存儲(chǔ)的數(shù)據(jù)的索引就成為很重要的組成了。
2、機(jī)制
在機(jī)制上,區(qū)塊鏈和數(shù)據(jù)庫(kù)的主要區(qū)別有如以下幾點(diǎn):
一致性
區(qū)塊鏈的設(shè)計(jì)思想,與傳統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)思想最大的不同就在于多活,也就是去中心化這個(gè)體系下所帶來(lái)的一致性模型的區(qū)別。
傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)遵循ACID強(qiáng)一致模型,寫入的記錄立刻可以讀到。而一些新型分布式數(shù)據(jù)庫(kù)采用最終一致性,也就是BASE模型,寫入的數(shù)據(jù)暫時(shí)不一定讀到,但是最終一定會(huì)存在。
但是,區(qū)塊鏈或者說(shuō)去中心化數(shù)據(jù)庫(kù)的設(shè)計(jì)思路就存在明顯區(qū)別,也就是說(shuō)任何操作不存在“永久確認(rèn)”這個(gè)概念。即使類似比特幣,從核心原理上來(lái)看6個(gè)塊之前的內(nèi)容也只是“基本不會(huì)被回退”。
舉個(gè)極端的例子,如果中美之間廣域網(wǎng)出于什么原因突然斷了三天,之后恢復(fù)的話比特幣一定會(huì)出現(xiàn)大規(guī)模分叉,這個(gè)期間如果有賬號(hào)同時(shí)在中美進(jìn)行大額消費(fèi)的話,想要恢復(fù)一個(gè)主鏈則一定需要犧牲很大一部分人的交易才能實(shí)現(xiàn)回退。
那么,既然在對(duì)等架構(gòu)中沒(méi)有辦法保障強(qiáng)一致,那么區(qū)塊鏈體系中的一致性則和傳統(tǒng)數(shù)據(jù)庫(kù)存在本質(zhì)上的區(qū)別,從而引發(fā)后續(xù)一系列設(shè)計(jì)上的不同。
歸根結(jié)底,在任何傳統(tǒng)主從架構(gòu)的數(shù)據(jù)庫(kù)模型中,人們會(huì)想盡一切方法防止集群內(nèi)出現(xiàn)“腦裂”,也就是同一個(gè)集群里面兩個(gè)節(jié)點(diǎn)都認(rèn)為自己是主節(jié)點(diǎn)。
但是這個(gè)問(wèn)題在對(duì)等數(shù)據(jù)庫(kù)體系下時(shí)時(shí)刻刻都可能發(fā)生,而這種現(xiàn)象在區(qū)塊鏈里面叫做分叉,這是和我們傳統(tǒng)數(shù)據(jù)庫(kù)一致性模型非常不同的地方。
鎖機(jī)制
其中,鎖機(jī)制可以說(shuō)是區(qū)塊鏈與數(shù)據(jù)庫(kù)在保障數(shù)據(jù)一致性方面最大的區(qū)別。
所有研究過(guò)數(shù)據(jù)庫(kù)的同學(xué)不可能沒(méi)聽(tīng)說(shuō)過(guò)鎖。當(dāng)我們做一個(gè)事務(wù)的時(shí)候,提交之前所有該會(huì)話變更的記錄都要被鎖住,不能被其他會(huì)話所修改。
而去中心化數(shù)據(jù)庫(kù),由于每個(gè)賬本節(jié)點(diǎn)操作本地?cái)?shù)據(jù),變更信息會(huì)異步地傳輸出去,因此根本不存在一個(gè)全局鎖能夠在記錄變更的時(shí)候通知其他人。因此,在無(wú)鎖的前提下,去中心化數(shù)據(jù)庫(kù),也就是區(qū)塊鏈該怎樣保障數(shù)據(jù)一致呢?
比特幣使用的是UTXO結(jié)構(gòu),有點(diǎn)類似于數(shù)據(jù)庫(kù)的“樂(lè)觀鎖”的思路,也就是操作的時(shí)候不進(jìn)行鎖定,只有在最后提交的過(guò)程中判斷記錄有沒(méi)有變化。
比特幣則是通過(guò)coin是否被花費(fèi)的狀態(tài)來(lái)判斷是否存在交易沖突。而以太坊則是使用nonce作為每條記錄的遞增計(jì)數(shù)器來(lái)判斷是否存在針對(duì)某一賬戶的重復(fù)交易,實(shí)際上也是一種變相實(shí)現(xiàn)的行級(jí)鎖的機(jī)制。
安全機(jī)制
另一個(gè)區(qū)塊鏈業(yè)界大家談?wù)摫容^多的就是安全機(jī)制。
首先,我不是加密算法專家,因此我在這里不去討論具體使用的加密算法,而是從整個(gè)存儲(chǔ)體系的安全模型設(shè)計(jì)上,來(lái)討論一下區(qū)塊鏈技術(shù)中如何在全對(duì)等架構(gòu)的體系下保障數(shù)據(jù)安全。
在我看來(lái),區(qū)塊鏈的安全體系分為三個(gè)級(jí)別,記錄級(jí)、區(qū)塊級(jí)以及鏈級(jí)。
記錄級(jí)安全主要是判斷某一條操作記錄是否合法,在一些實(shí)現(xiàn)中還包括是否對(duì)不同用戶有讀可見(jiàn)和寫可見(jiàn)。
而區(qū)塊級(jí)則是當(dāng)節(jié)點(diǎn)接收到另一個(gè)節(jié)點(diǎn)發(fā)送的區(qū)塊時(shí),如何判斷這個(gè)區(qū)塊本身沒(méi)有被篡改過(guò),那么通過(guò)默克爾樹(shù)、挖礦的結(jié)果等機(jī)制都可以做到。
最后,怎樣保證鏈的完整呢?比如每個(gè)數(shù)據(jù)塊需要包含鏈中上一個(gè)數(shù)據(jù)塊的校驗(yàn),以及當(dāng)分叉發(fā)生時(shí)如何進(jìn)行回退等,都是保障整個(gè)鏈條結(jié)構(gòu)的完整。
四、去中心化數(shù)據(jù)庫(kù)架構(gòu)
區(qū)塊鏈技術(shù)和數(shù)據(jù)庫(kù)技術(shù)的融合會(huì)形成怎么樣的結(jié)果呢?
我們是否能夠?qū)F(xiàn)有的區(qū)塊鏈以數(shù)據(jù)庫(kù)的架構(gòu)進(jìn)行組織,分為內(nèi)核、運(yùn)行庫(kù)、插件,以及SQL解析優(yōu)化等不同模塊呢?
既然數(shù)據(jù)庫(kù)的核心本質(zhì)依然是不可變更的事務(wù)日志,這一部分等同于區(qū)塊鏈的鏈結(jié)構(gòu),那么如果我們通過(guò)將SQL引擎架設(shè)在state store,甚至讓SQL引擎直接對(duì)鏈內(nèi)的數(shù)據(jù)進(jìn)行訪問(wèn),是不是意味著我們就擁有了一個(gè)通用的編程和訪問(wèn)接口?
又例如:對(duì)于安全組件,我們是否可以做到列級(jí)行級(jí)表級(jí)以及節(jié)點(diǎn)級(jí)別的安全認(rèn)證,同時(shí)可以通過(guò)配置指定哪些表需要進(jìn)行數(shù)字簽名,哪些表的一些字段是共享的,但其他字段是需要經(jīng)過(guò)多重簽名做加密的等。
另外,對(duì)于一致性來(lái)說(shuō),我們是否可以指定某些表是全局共享表,某些表則是本地表,這樣就可以取代現(xiàn)在區(qū)塊鏈與數(shù)據(jù)庫(kù)混用的部署方式。
我認(rèn)為,未來(lái)會(huì)出現(xiàn)兩者融合而成的 “去中心化數(shù)據(jù)庫(kù)”。
去中心化數(shù)據(jù)庫(kù)基本功能
去中心化數(shù)據(jù)庫(kù)的基本特性:
去中心化:架構(gòu)是完全的去中心化的,不存在中心的控制節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都具備讀寫的功能,每個(gè)節(jié)點(diǎn)的數(shù)據(jù)都是一致的;
無(wú)全局鎖:由于采用廣域網(wǎng)上的對(duì)等架構(gòu),去中心化數(shù)據(jù)庫(kù)不可能實(shí)現(xiàn)全局鎖,因此系統(tǒng)只能使用在某種程度上弱化鎖與一致性,來(lái)滿足高可用的需求;
非固定節(jié)點(diǎn)生成日志:非固定節(jié)點(diǎn)生成日志,日志是整個(gè)數(shù)據(jù)庫(kù)的日志,在去中心化的體系結(jié)構(gòu)中任何節(jié)點(diǎn)都有權(quán)記錄日志,這樣就形成了去中心化沒(méi)有主節(jié)點(diǎn)的架構(gòu),任何節(jié)點(diǎn)都有機(jī)會(huì)臨時(shí)成為記賬節(jié)點(diǎn)出塊;
異步事務(wù)確認(rèn):由于不存在全局鎖,與傳統(tǒng)數(shù)據(jù)庫(kù)相比一些事務(wù)機(jī)制必須得到調(diào)整。將事務(wù)的提交回滾做到異步可能是一種比較可行的思路;
一致性策略調(diào)整:在多活的區(qū)塊鏈狀態(tài)下,數(shù)據(jù)的一致性策略會(huì)與傳統(tǒng)的數(shù)據(jù)庫(kù)一致性機(jī)制有所不同;
行級(jí)別安全性和觸發(fā)器:對(duì)于數(shù)據(jù)安全,去中心化數(shù)據(jù)庫(kù)將會(huì)保證到行級(jí)甚至列級(jí)的數(shù)據(jù)安全性。
五、區(qū)塊鏈和數(shù)據(jù)庫(kù)技術(shù)融合:中心化數(shù)據(jù)庫(kù)
對(duì)于區(qū)塊鏈和傳統(tǒng)數(shù)據(jù)技術(shù),我認(rèn)為區(qū)塊鏈技術(shù)的未來(lái)發(fā)展,主題是“融合”!
現(xiàn)在區(qū)塊鏈的業(yè)務(wù)理念飛速發(fā)展,但是從技術(shù)本身來(lái)看,我認(rèn)為當(dāng)前區(qū)塊鏈的技術(shù)仍然和上世紀(jì)“80年代”的數(shù)據(jù)庫(kù)技術(shù)階段類似,在技術(shù)的成長(zhǎng)期。如我們上文所提到,區(qū)塊鏈技術(shù)在通用性、標(biāo)準(zhǔn)化上還有很長(zhǎng)的路要走。
而基于技術(shù)路線和架構(gòu)設(shè)計(jì)的類似,數(shù)據(jù)庫(kù)技術(shù)與區(qū)塊鏈技術(shù)的融合其實(shí)是大勢(shì)所趨。 而通過(guò)區(qū)塊鏈技術(shù)和機(jī)制的引入,去中心化數(shù)據(jù)庫(kù),將可能是未來(lái)技術(shù)發(fā)展的一個(gè)重要方向。