在聯盟鏈技術與應用中如何結合數據庫

10月19日下午,由百度超級鏈學院與金色財經聯合主辦的百度超級鏈學院線下技術沙龍《區塊鏈與數據庫的融合碰撞》在北京科技寺創業空間滾石店順利舉行。衆享比特實驗室主任吳飛鵬進行了主題爲《在聯盟鏈技術與應用中如何結合數據庫》的演講,以下爲演講整理

吳飛鵬,衆享比特實驗室主任。曾任職索貝數碼,專注音視頻編碼、編輯的研發工作。2015年進入衆享比特,致力於分佈技術的研發,主持研發了日誌式數據庫應用平臺–chainsql,衆享比特在區塊鏈與數據庫的融合方向上,已經做了一些探索性實踐。

今天簡單介紹一下我們在開發ChainSQL產品的過程中瞭解到的數據庫有關的知識,以及一些相關技術。另外我也簡單介紹一下我們的產品是怎樣使用數據庫、結合數據庫的。

公司從2016年大約1月份正式開始對區塊鏈展開研發。

我今天就講一下在這個研發過程中遇到的一些問題,以及我們對區塊鏈以及數據庫的一些瞭解。今天來了一些互聯網的同行,希望在這個過程中大家一起來探討和學習,希望我們所做的工作,對以後大家在區塊鏈部分和數據庫方面的工作有一個啓發和幫助。

今天主要從三個方面來講一下今天的主題,第一是簡單介紹一下我們要在區塊鏈上存儲數據是怎麼做的,第二是區塊鏈有沒有用到數據庫,是怎樣使用數據庫的?數據庫在區塊鏈中的應用。第三介紹一下我們公司的產品,簡單介紹一下ChainSQL如何使用數據庫。

剛開始我估計大家瞭解區塊鏈無非就是上來發幣,去玩一玩。大多像我一樣什麼都不懂,先接觸比特幣,比特幣我相信大家都瞭解它:可以轉賬,確實非常方便。但是在比特幣上我們怎麼去記錄數據?其實有兩種方式,在2014年比特幣升級以前,都是記在比特幣第一個交易裏面。它這個記錄方法是在比特幣的交易裏面,在它的輸入端去記錄,因爲這個記錄方法,導致只有區塊鏈的生產者才能在比特幣網絡上留下自己的痕跡。其他人,比如交易的發送者(使用比特幣進行轉賬的人)做不到這一點,是留不下數據的。比如說你給自己的朋友生日記錄什麼東西,想在比特幣上做,在2014年以前是做不到的。

然後接下來到了2014年,我們不僅想利用比特幣金融轉賬的屬性,同時希望區塊鏈網絡有承載數據記錄的功能。因此在2014年的時候比特幣做了節點升級,出現了一種交易,nulldata的交易。對交易做了一些革新,coinbase交易是在輸入端可以記錄一些數據,這時我們在比特幣交易的輸出端同樣也可以做一個記錄。因此,在比特幣上面存儲數據的話,一種是在輸入端,一種是在輸出端,我們普通用戶選擇普通交易就好了。

再說一下Ethereum和Ripple這兩種是怎麼做的?業務數據、想寫的東西是記在交易裏面,交易是透明的,大家都可以查到。

然後區塊鏈到了聯盟鏈的階段,那麼fabric怎麼做?其實在我的理解裏面,這個只是做了一個框架,fabric給我們大衆普通的開發者,或者普通的項目使用上,初始狀態下,是什麼都沒有的。我們要做什麼事情?我們想記錄怎麼做?不好意思,自己來實現。其實fabric給你提供了只是一個接口,所有的核心東西要自己做來實現,你想怎麼樣去存儲數據,其實等於類似於就是一個合約。但是我們fabric沒有智能合約是記錄不了的,數據記錄在什麼地方?它的業務數據主要是記在數據庫裏面,比如說像大家用的level DB和CounchDB,交易的接口是固定的,但是你開放的智能合約,裏面的接口函數是非常自由的,可以隨便定義。業務數據就是按照我們自己所希望的方式傳給Chaincode,Chaincode最終將數據存儲在數據庫裏面,這是業務數據的記錄方式。

現在說一下區塊鏈是不是用到數據庫,數據庫在裏面發揮什麼樣的作用,簡單說一下。鏈上的一些數據應該怎麼去記,第一種是記錄在文件裏面,第二種是記錄在數據庫裏面。

那對於以太坊來說都是記錄在數據庫裏面,這些數據庫我們使用的都是k-v數據庫。節點直接把所記的東西最終轉成一個key和value。這個是鏈本身的數據庫,本身的數據庫裏面是記在這個數據庫裏面的。

還有一種是鏈下數據,有時候你要查詢區塊鏈上的數據,區塊鏈廣義上來講是數據庫,但是數據庫有一個很有用的功能就是快速查找,這個東西其實我們區塊鏈是做不到的,這時就要在這個區塊鏈節點下面加一個邏輯單元,把你想要展現的數據放在數據庫裏面。但是沒有這個東西,沒有下面這兩部分的區塊鏈,但是你無法很快速的讓用戶查到你所用的數據。比如說我們現在你能看到的以太坊瀏覽器,或者比特幣瀏覽器看到的東西,我沒有直接去鏈上查它的數據,我們知道區塊鏈的數據具有不可篡改性,我們一步一步往回查找結構,總要查找這個交易,是能做到的,但是這種實時性,用戶體驗非常差。於是我們加入這個邏輯單元,然後把它輸出到任意的關係型數據庫裏面。

接下來說一下ChainSQL,在2016年的時候,大家在區塊鏈領域,基本上都沒有開始做項目研發,剛剛開始有想把區塊鏈用在B端,用在這個企業上,解決幾個實際問題。現在我們工程架構模式,無非就是CS架構、BS結構,你一個邏輯應用下面加持一個數據庫,這時候如果要用區塊鏈來解決這個問題是怎麼解決呢?無非是把數據庫替換成區塊鏈。但是帶來一個問題?你需要的東西我現在只是好好的,我想利用區塊鏈不可追溯、不可更改的特性,我要把我的數據庫替換掉,其實是很嚇人的事情。

ChainSQL將區塊鏈與傳統數據庫相結合,把對數據庫的每一次操作看作一次交易,構建了一種基於區塊鏈網絡的日誌式數據庫應用平臺。本段有兩部分。第一部分就是上下兩層,上面是我們的區塊鏈網絡。下面一部分是我們的數據庫,數據庫並沒有做任何改變,還是使用的是我們傳統的數據庫,各類數據庫都是可以使用的。

以前在傳統的數據庫裏面,數據庫用來存儲與查詢; 我們Chainsql的數據庫有什麼樣的功能呢?數據庫扮演了兩個功能。第一個是用戶進行查詢,第二個是重構。 Chainsql只是使用數據庫,那數據庫表存在什麼地方?在區塊鏈網絡裏面模擬了一張或者很多張數據庫的表,以及表的一些管理。表在什麼地方?有沒有數據庫表?那我們的數據庫有什麼功能呢?我只是說我想看這個區塊鏈網絡上數據庫表的最終狀態的時候,那怎麼看呢?我得把已經落在區塊鏈網絡上,區塊鏈中的交易讀出來,然後再把這些操作發送到我們傳統的數據庫裏面把狀態呈現出來,因此從這個角度來看其實這上面有表,但是記錄的表的操作過程,然而沒有記錄表的狀態,無法去記錄,一個一個交易,一個一個區塊鏈的交易,只記錄了這個交易,等於說我們把每次對數據庫的操作在區塊鏈網絡上記下來,但是怎樣去展示?你這個上面沒有最終的狀態,你只有一個過程,那你的狀態在什麼地方?你的用戶想查詢的時候咱們就必須在這個節點上面有一個數據庫,你要是不查詢,沒必要掛接數據庫。只有這個節點,用戶直接往上面去發交易,它接受的是區塊鏈的數據庫類型交易,當然也可以接受其它類型交易。

然後咱們說ChainSQL裏面用了哪些數據庫,我其實剛纔那幾點在裏面都用到了,第一個我們就是說鏈的數據,比如鏈上的虛擬貨幣。沒有它不行,沒有動力去挖礦,沒有動力去做共識,所以必然有虛擬貨幣,就是得有一個激勵機制來激勵用戶去參與維護區塊鏈網絡的正常運轉,這些數據在什麼地方。所有鏈上的數據是記錄在k-v數據庫裏。然後我們剛纔所說的它還記錄了賬戶變化,以及各種交易的關係,怎麼實現呢?我們也是有這麼一個大的邏輯單元,在這個邏輯單元裏,我們給大家做了一個整合,這個整合我們會把它放在關係型數據庫裏面,因此用戶可以快速查看數據以及一個用戶下面的金額變化,它是怎麼一個變化曲線。因此說這個數據庫其實是利用最廣泛的,不管對工業來講,你要提供快速查詢,以及提供區塊鏈瀏覽器功能的話,查詢工作是非常重要的。

在這個裏面我剛纔說了,因爲它是數據表上的東西,它最終狀態得呈現出來,但是你就得最終把這個區塊鏈上的交易提取出來,我們原生支持兩種:mysql與sqlLite,然後通過mycat支持了一下其他的數據庫。

我們其實對數據庫並沒有做任何改變,這是支持的一些數據庫,然後這中間是我們的區塊鏈節點,它對外提供鏈接接口是(java與nodejs)這兩種開發。還有一種就是剛纔所說的能不能支持直接用sql語句驅動區塊鏈,我們是通過代理節點來做的支持。

這是ChainSQL的一些基本功能,第一個是數據庫基本功能支持,因爲它在區塊鏈是虛擬的表,有表涉及到傳統數據庫的一些問題。當然在實際應用過程中,比如說用戶想審計,應該怎麼做呢?有很多特色功能,這都是後來根據用戶需求給做出來的一些產品特性,這是基本功能,還有事務支持,共有三種交易類型。另外一個是進行管理有虛擬的管理單元,還有一個就是加密,加密也是非常重要的。你看這是非常矛盾的一件事情,區塊鏈是一個公開透明的,但是我又不想被別人看見表內空,怎麼做呢?這樣可以實現,比如說我們表的某些字段進行加密,每一個交易內容先加密再進行發送。

我們再簡單看一下審計的功能,數據庫上面把某一個記錄怎麼來的,因爲我們在鏈上有這個交易,做這個操作就可以了。然後這是我們這個同步表的邏輯,我剛纔已經講了,把我們這個數據拉下來,然後在這做一個邏輯單元單元,負責區塊鏈到數據庫sql的轉換。

我們智能合約、產品特性、運行環境,這兩個節點是驗證節點,所有聯盟鏈都是共識節點參與共識,維護區塊鏈網絡正常運行的,然後非驗證節點就是做傳遞交易的功能。

到最後首先說一下應用場景,其實區塊鏈不是在所有的場景下都能使用,一個概念,比方說你只要使用數據庫,對數據吞吐率要求不高的場合下,需要追溯數據來源,希望數據不被私自更改,都可以借鑑、使用Chainsql平臺,這是它的一些應用場景。

好了,謝謝大家,我今天的分享就到這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章