區(qū)塊鏈的從技術(shù)角度講,本質(zhì)上是一個分布式的數(shù)據(jù)庫。區(qū)塊鏈技術(shù)單純理解起來較為復(fù)雜,因此我們從分布式的數(shù)據(jù)庫角度來探討區(qū)塊鏈技術(shù)。分布式數(shù)據(jù)庫包括數(shù)據(jù)存儲、點對點可靠傳輸、存儲過程與觸發(fā)器(智能合約)、數(shù)據(jù)安全四個部分,接下來詳細(xì)展開討論:
1、分布式數(shù)據(jù)存儲
區(qū)塊鏈技術(shù)的數(shù)據(jù)共享是一個分布式的記賬簿,交易記錄具備多個副本,因此首先要解決分布式數(shù)據(jù)存儲的問題。
1)區(qū)塊鏈存儲的基本單元是區(qū)塊,區(qū)塊采用鏈?zhǔn)浇Y(jié)構(gòu),即新增的區(qū)塊(類似數(shù)據(jù)庫一行記錄)都知道自己前一個區(qū)塊(前一行記錄)是什么,可以一直追溯到根,區(qū)塊的標(biāo)識是區(qū)塊的哈希值,同時鏈?zhǔn)浇Y(jié)構(gòu)保留了業(yè)務(wù)產(chǎn)生的軌跡,可以在新增交易的時候根據(jù)前面的記錄做校驗,保證了區(qū)塊的內(nèi)容不容易篡改。
這種模式,我們在傳統(tǒng)的數(shù)據(jù)庫設(shè)計也會采用,例如拉鏈表的形式,每次對數(shù)據(jù)的更新都采用追加(Insert而不是Update)模式,有起始時間、失效時間和是否生效標(biāo)識,保持全部交易歷史。區(qū)塊鏈把這一點變成了一種底層固有模式,加入了哈希、時間戳等機(jī)制在技術(shù)上保證鏈條的正確性,因此非常有價值。
2)既然是分布式、多中心的存儲方式,就必須解決存儲時的分布式一致性問題。在區(qū)塊鏈的前身比特幣應(yīng)用中,解決這一問題的方式是工作量證明(POW Proof-Of-Work)方式,即通過工作以獲得指定成果,用成果來證明曾經(jīng)付出的努力。這一問題歸結(jié)為共識問題,工作量證明是達(dá)成共識的一種方式。
于是就產(chǎn)生了權(quán)益證明(POS Proof of Stake)方式,是一種通過業(yè)務(wù)規(guī)則達(dá)成共識的方式;實用拜占庭容錯(PBFT Practical Byzantine Fault Tolerance)方式,是一種通過技術(shù)規(guī)則達(dá)成共識的機(jī)制;定向工作量證明機(jī)制(DPOW)是一種隨機(jī)驗證機(jī)制,由UENC實驗室首創(chuàng),同時也應(yīng)用在UENC公鏈中。
2、點對點可靠傳輸
區(qū)塊鏈技術(shù)是一組技術(shù)的組合,既然是一個分布式的記賬簿,就要解決數(shù)據(jù)可靠傳輸問題。包括記賬節(jié)點(信任節(jié)點)之間、非記賬節(jié)點(非信任節(jié)點)、客戶端與記賬節(jié)點(信任節(jié)點)之間的數(shù)據(jù)傳輸。在以前我們的方案中,往往通過可靠消息或者P2P方式解決數(shù)據(jù)傳輸問題,這些技術(shù)也被用于區(qū)塊鏈技術(shù)中。
但必須說明的是,在真實業(yè)務(wù)場景下,不可能把所有的數(shù)據(jù)都記錄在記賬簿中,部分業(yè)務(wù)數(shù)據(jù)還是要保存在自己的系統(tǒng)中,這就還需要在技術(shù)框架上做到本地業(yè)務(wù)數(shù)據(jù)與區(qū)塊鏈的記賬簿保持一致,后面微服務(wù)架構(gòu)與區(qū)塊鏈技術(shù)整合時會具體闡述,總之,區(qū)塊鏈平臺只能保證自身數(shù)據(jù)之間的一致,業(yè)務(wù)不能完全依賴區(qū)塊鏈平臺保證數(shù)據(jù)一致性。
3、智能合約:觸發(fā)器與存儲過程
智能合約是指當(dāng)一定條件滿足的情況下,可以被自動執(zhí)行的數(shù)字化合約。實現(xiàn)這一特性,在數(shù)據(jù)庫中就是由觸發(fā)器和存儲過程完成的。雖然在目前流行的應(yīng)用架構(gòu)中,都不建議把邏輯寫在存儲過程中,但觸發(fā)器和存儲過程還是常用的工具,尤其在數(shù)據(jù)遷移相關(guān)的運(yùn)維活動中。區(qū)塊鏈技術(shù)中智能合約就是觸發(fā)器和存儲過程,他是一個在沙箱中運(yùn)行的腳本,用于執(zhí)行區(qū)塊鏈業(yè)務(wù)中的業(yè)務(wù)邏輯,也可以用于各種檢查。
舉個例子,A產(chǎn)生一筆支付時,可以通過智能合約在數(shù)據(jù)鏈上進(jìn)行檢查,如果發(fā)現(xiàn)A的余額無法支付這筆交易,就可以中止這筆交易。和存儲過程相比,智能合約運(yùn)行在沙箱之中,不能對外部API做調(diào)用。這也比較好理解,如果允許外部調(diào)用,就可能無法保證自身的數(shù)據(jù)一致性,后面我們會講到這種缺陷如何彌補(bǔ)。美中不足的是目前的智能合約并不支持SQL語法。
4、數(shù)據(jù)安全
交易數(shù)據(jù)是透明的,但不是全部透明,而是相對透明,這是區(qū)塊鏈技術(shù)的一個難點,關(guān)鍵有二:(1)如何保護(hù)隱私,僅僅能看到自己可見的數(shù)據(jù);(2)密鑰分配問題,例如新加入鏈中的一個節(jié)點會被分配一個新的密鑰,如何用這個密鑰解讀以前鏈中存儲的信息。可見與不可見,這是一個矛盾,理論上沒有一個完美的方案。
舉個例子,在一個小企業(yè)支付的聯(lián)盟鏈中,核心企業(yè)包括某銀行、企業(yè)A,為A的上下游企業(yè)提供信貸業(yè)務(wù),對于所有交易的數(shù)據(jù),銀行和核心企業(yè)A都是可見的,他們擁有記賬節(jié)點,對于其他加盟企業(yè),只擁有非記賬節(jié)點,他們雖然也有全部的數(shù)據(jù),但是只能看到自己相關(guān)的數(shù)據(jù)。
很明顯,加盟企業(yè)放棄了自己的部分隱私權(quán),但也得到了生意的機(jī)會,這種方式加盟企業(yè)是可以接受的,就好比貸款企業(yè)要向銀行提供經(jīng)營數(shù)據(jù)一樣。數(shù)據(jù)安全問題,在技術(shù)上很難解決,但通過業(yè)務(wù)手段是可以規(guī)避的,這也是很多人看好聯(lián)盟鏈的重要原因。