4月22日,在掘金技術社群主辦的沙龍上,王濤以《區塊鏈技術VS資料庫技術:顛覆還是融合》為題做了分享。以下是JTalk演講實錄:編者按:本文系區塊鏈專家王濤講師,在掘金技術社群主辦的《給開發者的區塊鏈技術指南 | JTalk 掘金線下活動第五期》 活動上的分享整理。掘金 JTalk 目前已舉辦5期,每期 JTalk 會邀請垂直行業的優秀工程師來分享優秀的實踐經驗,技巧方法。旨在為開發者提供線下技術交流互動機會,幫助開發者成長。
現在區塊鏈所說的“3.0階段”,實際上更多的是偏向於業務,從資料庫角度來看,現在區塊鏈底層技術有很多可以提升的餘地。剛開始大家只是做一個數字貨幣,隨著合規的加入,大家可以在上面跑一些業務。 但區塊鏈底層鏈,包括效能、處理能力、通用功能,離商業化還有很大的距離。如果把區塊鏈技術未來暢想成一個10分的東西,我們認為現在區塊鏈功能只是在1分到2分的級別,還有非常長的路要走。 從技術角度理解,其實區塊鏈技術就是一個特殊的分散式多活資料庫。
區塊鏈技術具體有什麼樣的演進方向?
方向1:從專業化向通用化演進。 現在玩以太坊和比特幣,都是為了專門目的設計的一套軟體,比特幣是專門為轉賬設計的,以太坊是轉賬+智慧合約,通用方面,可以使用JAVA、C+ +程式,寫任何邏輯。現在區塊鏈基本是為專有系統定製的一套軟體,而不是一個通用的軟體。
方向2:各自為政向標準化演進。 搞區塊鏈最重要的是協議,而不是軟體,大家只要知道比特幣之間互動協議,可以使用專為比特幣設計的礦機,也可以自己寫一套東西,只要有協議就行。現在很多人做公鏈,每個公鏈都是獨立的通訊協議,這就會造成鏈與鏈中間通訊受到影響,可以用跨鏈機制、側鏈機制打破這些壁壘。相信未來在整個協議層可能會有更多通用化、標準化東西。
方向3:產品化與模組化不斷加強。 現在基本上大部分資料庫模組化做的非常好,比如希望用一種特殊的加密演算法,就把這個加密的庫替換原來庫就可以,這是未來區塊鏈需要提升的地方,就是框架能夠做到更好的模組化。
方向4,效能與可擴充套件性。 針對分片、記憶體計算、磁碟結構等進行優化,從單點磁碟結構到多分片對等多活架構,從而使得效能發揮到極致。這一塊需要技術上繼續突破才能實現效能的提升。
區塊鏈技術行業現狀:
- 區塊鏈體系結構沒有被統一。
- 區塊鏈開發語言極其混亂。
- 需求多種多樣,無標準使用正規化。 大家在學習區塊鏈技術時,成本很高,搞一個鏈要學一套新的開發語言,這個東西可能不流行了就要換新的語言,這會有很大的問題。做傳統大資料庫的,大家用的都是SQL,比較標準化。 另外,現在區塊鏈基本還沒有一個真正的殺手專案,沒有出現哪一個業務必須用區塊鏈來完成,這樣大家都想嘗試,用區塊鏈在這塊玩一玩,在那塊玩一玩,試試醫療、試試物流、試試IoT,哪個行業真正能用區塊鏈顛覆,核心價值在哪,怎麼用區塊鏈做這個事情,這些問題是未來一段時間行業裡需要去回答的,這幾點暫時是薄弱環節。
一、區塊鏈與資料庫相同點
特性:共識機制、儲存機制、智慧合約、分片、應用開發介面、安全。這些實際上都是區塊鏈底層老生常談的一些模組,對應到資料庫,有沒有一些對應的點? 共識機制。在過去資料庫架構裡,所謂一致性控制都是有一個主節點,所有寫操作會被複制到另外一個存節點做高可用配置。區塊鏈上,可以把這個體系擴充套件,假設主節點並不是固定的,而是每10分鐘換一次,在主節點MySQL,10分鐘換一次主節點,某種程度上是相通的。不管是POW、POS所謂共識機制,真正本質是到底在一段時間之內以誰的資訊為準,這個資料庫裡是以主節點為主,當它掛了以後,怎麼選出一個新的節點,這些都不重要,只是實現問題。
儲存機制。在區塊鏈裡,儲存說的都是鏈本身這個事,大家有興趣看一下比特幣、以太坊,除了鏈本身,還有類似於狀態儲存,比如鏈很長,可能有100GB,涉及到某個賬戶多次修改,鏈本身實際上是交易日誌,記錄每一條記錄修改方式,展現形式要歸到一個資料庫裡,都是要內嵌一個小型資料庫,把最終結果放到裡面。這一套體系對應到資料庫裡,無外乎就是資料庫的儲存+事務日誌。
智慧合約。是使用者自定義的託管程式,在資料庫裡託管程式叫儲存過程,在區塊鏈裡,本質是一樣的,最大不同點在於安全性方面。在資料庫裡調儲存過程,記錄最終結果,但是在區塊鏈裡,因為不可信任,記錄呼叫。 分片。大部分割槽塊鏈專案裡做得還不太成熟、不穩定,資料庫分片是非常成熟的東西,區塊鏈行業,由於分片之間交易很難保障,大部分割槽塊鏈公鏈專案很難做好的分片。
應用開發介面。在MySQL或Oracle用SQL,無外乎寫一段應用程式,扔到系統裡,別人呼叫。而區塊鏈技術也需要一個統一的訪問方式,才能更好實現通用化應用。
安全機制。在資料庫裡,一個表單,到底誰能讀、誰能寫,有一套定義,但在區塊鏈裡,安全是行級的安全,比如在比特幣裡,相當於全域性可讀,只有輸入可寫的安全配置。 從這幾塊來看,區塊鏈和資料庫的世界有很多相通之處。
資料庫共識方式。所有讀寫操作都是主節點,主節點會把資訊傳給兩個從節點。在區塊鏈裡,它的主節點是隨時會變化的,比如比特幣每10分鐘做一次出塊,這是POW自我驗證,誰先算出那個數,大家廣播一把,我算出數,大家跟我看齊。這是大家競爭主節點的過程。在區塊鏈的世界,主節點是隨時跳躍的,當每一個節點自己認為自己變成主節點以後,會把一段時間之內接收到新的資訊,通過區塊方式傳送給其他節點,這個傳輸過程和我們之前從主節點傳送到從節點的方式基本也是很類似的,涉及到P2P的東西,核心本質都是一樣的。事務日誌。資料庫裡事務日誌和區塊鏈的鏈本身就是一個事情,在區塊鏈裡,每一個區塊對應到資料庫,可以認為對應的就是一個日誌檔案。最本質的區別是在於區塊鏈同步標準以區塊為單位,每一次主節點要把交易資訊打包成區塊,這個區塊作為交易日誌。當有任何資訊以後,立刻就可以把資料同步給其他節點。
共識機制。
POW本質是一種自我證明的方法,就是每一個節點大家都想讓別人跟自己同步,自己想成為主節點,怎麼成為主節點?POW方式是給大家很難的題自己去算,算完了以後,告訴大家算出來了,讓大家來驗證,如果驗證是對的,跟我看齊。好處是大家會把大部分時間花在計算過程當中,而對於網路沒什麼太大壓力。
POS正好相反,POS沒有過多自我計算的過程,相當於一大屋子人都想成為主節點,大家通過某種方式進行投票,這種機制不需要自己去搞,但對網路壓力很大,因為每一次投票都要設計上萬個節點競選,網路壓力很大,所以為什麼POS也不能夠完全真正解決高效能問題,因為當節點數太多,POS效率非常低。 DPOS,就是一屋子人選幾個代表,大家跟幾個代表看齊,從某種程度上是減少了網路壓力。但怎麼信這個代表,這個代表是不是代表廣大人民的利益,是不是靠譜,這又是一個問題。
DAG,這跟我們一直說了POW、POS是本質的區別,不管是POS還是POW,做得都是跟我看齊的事,本質是當某一個人在一段時間之內成為一個基準,大家跟基準點看齊。但DAG的思路是一幫菜市場大媽去傳播謠言,沒有一個基準點,當在DAG網路裡,所有傳輸都是非同步的,好處是不需要任何人成為這個基準出塊的節點,壞處是沒有辦法做時序控制,因為每個人討論東西順序不一樣。DAG唯一能做的事情就是轉賬,後面涉及到操作無外乎是加和減,如果菜市場大媽互相傳播方式,做一些高階操作,A和B兩個人先做加法再做乘法,C和D兩個人先做乘法再做加法,兩個結果不一樣。DAG演算法裡暫時很難突破排序的問題。傳統區塊鏈鏈式結構沒有這個問題,這個節點先做加做做乘,沒關係,只要說好了,他說先加就是先加,他說先乘就是先乘,這塊是DAG網路和傳統區塊鏈方式最大的區別。
區塊鏈鏈式結構和資料庫日誌結構是什麼樣的?
資料庫日誌結構。在一個事務裡先做一個加法操作,再做乘法操作,兩個操作之間同樣有一套指標或連結,在資料庫的日誌結構和區塊鏈結構有很多共同之處。 區塊鏈用UTXO的形式,這個並不是最關鍵的點,UTXO只是一種協議的表示,在底層完全可以使用資料庫把它表示出來。對於一個資料庫裡面的結構體和區塊鏈的結構體,兩者之間有很多相通的地方,完全可以有互換的關係。 典型區塊鏈賬本結構。區塊鏈涉及到交易活動日誌、資料狀態庫,在狀態庫基礎上增加索引。對應到資料庫裡也是一模一樣的,包括資料庫Ctransaction、資料管理部分、索引,從結構來看,看待區塊鏈底層結構和上層資料庫結構都是非常相通的。 區塊鏈與資料庫功能模組對應關係。 區塊鏈是資料庫交易日誌,區塊鏈State Store對應資料庫的資料儲存,區塊鏈共識演算法對應的是資料庫一致性演算法,區塊鏈智慧合約對應的是資料庫儲存過程等等。二、區塊鏈與資料庫的不同
最大的不同是一致性。 對於資料庫來講,一般都是強一致,比如Oracle,寫入一條記錄以後,確保資料一定是存在的,並且這條資料在資料庫日誌裡確保不能被更改。在分散式資料庫裡則是最終一致性,當寫一條記錄以後,不一定能夠立刻看到這個東西,但是能夠確保在未來一段時間之內這個記錄一定存在。不管強一致還是最終一致,本身要求是寫入成功的資料一定會存在在資料庫裡某一時刻。 但區塊鏈不一定,區塊鏈可能會出現分叉,分叉完了還要做合併。比如某一個人賬戶裡有10個比特幣,在同一個時刻,在中國和美國兩個不同賬戶裡做交易,因為在中國和美國伺服器不一樣,一個伺服器接收我給A做交易是成功的,在第二個美國伺服器接收同樣訊息,轉給B的也是成功的,但這兩個人不能同時成功。在區塊鏈一定有交易成功確認過程,這在資料庫裡是沒有交易確認,只要在資料庫裡寫的東西一定可以成功。如果在中國向A轉10個比特幣,在美國向B轉10個比特幣,假設由於中美開戰了,中美之間網路突然斷掉了,可能斷了三天,三天之內,中國大陸所有比特幣交易沒有辦法通暢,這樣就會超過比特幣6塊的問題,當兩個網路合並時就會產生分叉,如果未來去做合併時,在中國做交易,給10個比特幣,把一堆東西賣給我,在美國也一樣,這樣線上下收到20個比特幣,最後當做比特幣合併時,其中一方肯定會被損失。在極端情況下,在比特幣體系裡沒有辦法真正保證強一致,去中心化儲存裡和中心化儲存最大的區別,就是在於一致性。 為了確保一致性,在資料庫裡用鎖,因為所有操作在主節點執行,幾個並行操作裡,結構沒有提交時會鎖住,其他操作過來以後,一定要保證這套交易成功才能釋放這個鎖,保證繼續。 區塊鏈沒有鎖的機制,比如在中國做一筆交易以後,不可能在毫秒級或微秒級之內就把交易資訊傳到美國去,如果美國對同樣記錄做操作時,就會面臨這樣問題,兩者有衝突,在去中心化或多活、多主節點寫入裡,無法保證全域性鎖,這個時候怎麼確保這個東西,Oracle最終確認時,誰先提交誰成功,後面發現記錄變了,重新做一個。相對於區塊鏈,以太坊使用NAS,確保每一個賬戶更有順序化,這時候從某種策略選出其中一個正確的。如果順序錯了,會把錯誤繼續。從安全級別來講,區塊鏈有很多機制確保安全性。對於資料庫大家的想法是這個東西是跑在資料中心裡的,區塊鏈基本上有一個筆記本就可以了,所以除了確保本地安全以外,更重要的是協議層面確保其他對等節點、相鄰節點有沒有作惡的壞人。在三個層面上確保安全,對於記錄級安全,屬於交易數字簽名、智慧合約數字簽名,就是當做一筆交易時,一定要通過數字簽名來驗證帳號是否有權利修改這套記錄,通過加密,從記錄級確保修改這條記錄的人一定是本人。區塊級的安全機制,當收到塊以後怎麼確保這個塊是正確的,這個塊包括默克爾樹、挖礦校驗,這是對於區塊安全的保障。對於鏈級安全機制,怎麼確保這個鏈是靠譜的,利用前一個區塊生成校驗碼、分叉解決方案。
分片機制。傳統資料庫分片很容易,都在一個資料中心之內,如果做兩個分片之間的操作,先問所有參與交易的人是不是都準備好了,可以提交了,確保大家都在同一個狀態下。但有一個問題,沒有辦法在多個分片之間做控制。在區塊鏈裡除非有某種機制確保不會分叉,不可能確保其中某個操作在在另一個鏈裡未來會不會被退掉,沒有技術確保,因為鏈不具備這個功能。不是技術上操作不了,是理論上行不通。如果這麼做也會有一些方法,找到第三方中介做這個事,他來背鍋是有可能的,或者用側鏈機制、跨鏈機制。三、區塊鏈技術和資料庫技術融合的形式
而在底層技術上,我認為通過兩者的技術融合,可能會出現“去中心化資料庫”這麼一種產品形態。 對於去中心化資料庫,其主要的技術點有一下幾個:
- 百分之百去中心化,是一個區塊鏈的資料庫。
- 沒有全域性鎖。
- 非固定節點生成日誌,每個節點都有可能成為出塊的節點。
- 非同步事務確認。
- 一次性策略調整。
- 行級安全性與觸發器。 應用場景,包括電商、金融、信用、物聯網,這些都有可能,這個形式非常好。現在的商業模式是中間商把所有人資源整合,利用整個資源提供便利性,賺中間差價,如果是區塊鏈機制,或者叫做去中心化的資料庫的機制,被普遍應用的話,從整個商業模式上來講,不太需要資源密集型中間商,可能會把這些行業現有的商業模式解耦。 對於未來區塊鏈商業模式來說,區塊鏈未來絕不僅僅被侷限於交易這麼一個簡單的操作,我們認為未來會是一個去中心化的協作組織。 例如,攜程是中心化的旅遊網站,有各種各樣的資源,包括酒店、機票、旅遊景點資源,會把這些資源打包賣給要出行的各位。未來會不會有一個區塊鏈攜程或攜程區塊鏈,它的做法是統一一套體系,可以讓希爾頓和長城飯店直接連到鏈裡,另外可以找某一個人或某一個組織,專門是做網站的,專門把這個鏈裡所有資源整合起來,做成網站掛出去,相當於去中介化,不需要用攜程這樣的組織把所有的資源統一起來賣差價,而是讓所有的人都自發參與到去中心化組織裡,來達到商業目的。 我們認為區塊鏈未來是去中心化協作,而不僅僅只是交易這麼一套東西。 基本就是這些,謝謝!
以上是《給開發者的區塊鏈技術指南 | JTalk 掘金線下活動第五期》 講師王濤的分享,如果你對掘金的 JTalk 線下活動感興趣,可以關注掘金活動頁面的 JTalk 活動報名。掘金 JTalk 目前已舉辦5期,每月一期的 JTalk 會邀請垂直行業的優秀工程師來分享優秀的實踐經驗,技巧方法。旨在為開發者提供線下技術交流互動機會,幫助開發者成長。
JTalk 預告
JTalk 第六期即將在杭州舉辦。
- 主題:從前端到“後端”
- 時間:5.20