周迅:智能合約數據存儲的三種解決方案區塊鏈
2018 年 7 月 14 日,標準共識成功舉辦了首期線上技術分享會,主講人周迅就「智能合約的數據存儲」與標準共識技術評審團成員及 20 位嘉...
2018 年 7 月 14 日,標準共識成功舉辦了首期線上技術分享會,主講人周迅就「智能合約的數據存儲」與標準共識技術評審團成員及 20 位嘉賓成員分享了技術經驗。
周迅是一家區塊鏈公司的 CEO,對以太坊有著深刻的理解。目前團隊核心目標是做一個工程師易上手的實用版以太坊。以下整理自周迅的分享內容。
只發 Token 無意義
我之前在一家媒體分享過我認為 DApp 開發平臺的共識機制應該是什么樣子。我說我們核心解決的問題是:如何讓開發者把業務也放到鏈上,而不只是發個 Token,把「積分」上鏈了。
今天我們就先不討論邏輯上鏈的必要性,我們從技術上考慮怎么讓邏輯上鏈。
既然是區塊鏈的數據存儲,默克爾證明就必不可少。默克爾證明保證了數據的可驗證性和永久保存性??沈炞C就是提供一個根,就可以得到一個 key 對應的 value,永久保存性就是每次對默克爾樹進行更新的時候,舊的樹根都是可以讀取所有的數據的。
雖然默克爾的功能非常強大,但是默克爾證明有個很大的問題:只能存儲 Key-Value 類型的數據,雖然可以在數據序列化和反序列化的時候做一些擴展,但是功能非常有限。
數據儲存的三種解決方案
我們團隊就在想:是否可以讓 DApp 的開發者可以使用 SQL、Mongo 這樣的數據庫進行 DApp 的開發呢?
然后調研了三個方案:
1、類似于 EOS 的 MySQL 插件和 Mongo 插件,這種實現起來是最簡單的,所有的工作都是交給開發者去做,自己這邊只需要做一個連接管理就可以了。
2、對默克爾字典樹進行更新,葉子節點可以存儲多列數據(List<Object>)、可以存儲 Map,也可以存儲簡單的 value,這種情況下如果 len(list)特別大的情況下,不會像只存儲一個 byte,然后反序列化為 list 有特別大的內存和 CPU 開銷。
3、默克爾樹只存儲簡單 KV,在上層封裝一層 SQL layer。
三種解決方案的思考路徑
我下面先說第三種方案:不知道大家聽說過 pingcap 沒有,我們主要研究的方案就是他們的 tikv 和 tidb,我們使用默克爾字典樹替代 tikv,tidb 就可以直接使用了,只需要修改底層數據讀取的相關邏輯即可,因為 tidb 讀取 tikv 的時候其實也是有多個 tikv 服務器的,所以默克爾樹的讀取效率可以說不受太大的影響。
但是,第三種方案有一個特別大問題,對于開發者來說,我們封裝的 SQL layer 只是個 SDK,對于輕客戶端來說,無法驗證數據的有效性。
因為輕節點還是要把對應的默克爾樹讀一遍才知道數據是否是正確。
第三種方案是我們研究的時間最長的一種方案,但最后發現,對于輕客戶端來說這個基本上沒有太大的意義的,所以選擇了放棄。
第二種方案對默克爾樹的修改比較簡單,也比較能實現復雜邏輯的方案。
這種方案對于開發者來說也是非常友好的,它可以很方便的讓開發者把一個可能有很多條數據的 list 拆分開去存儲。
當然,它的問題在于在根據非主鍵查找/更新 list 的時候效率會比較低。對于這一方案,我們團隊目前一直在研究。
接下來講第一種方案。它就是直接使用 MySQL、Mongo 這種數據庫的方案,我們考慮過使用網絡數據庫,但是可能是有很大問題的。
比如某一個節點對數據庫服務器的網絡中斷了,可能就會出現一些問題。所以,我們在前期考慮的是使用嵌入式的 SQL 數據庫,比如 sqlite。
對于第一種方案,我們也在考慮的原因是,我們是把 sql 這種類型的數據庫當成了一個節點的「私有空間」,在一些數據不方便公開的時候(比如斗地主的隨機數),是不方便寫到默克爾樹里去的,這個時候就可以放在SQL 里面,當適合更新到默克爾樹里面的時候(一局斗地主結束),再把數據從 SQL 中讀出來,寫到第二種方案的默克爾字典樹里面。
總結
1、更新后的默克爾字典樹用于存儲可校驗的公開透明的數據;
2、嵌入式的 sql 數據庫用于作為私有的存儲空間,讓開發者存儲一些不適合公開的數據或者帶有條件查找的數據,帶有條件查找的數據可以指向默克爾根,方便輕節點對數據進行校驗;
這些其實是業務邏輯的數據存儲。當然,除了業務邏輯的數據存儲,可能還會有一些文件的存儲需求;這個時候可能就需要一些第三方的存儲了,比如 IPFS。
需要說明的是,IPFS 雖然做了很多工作,但是無法實現文件的分區高可用,我認為可能適合存儲一些不是那么重要的數據,電子合同之類的肯定是不能存儲在 IPFS 里面的(雖然文件丟失的可能性基本為 0,但是某一個時間內不可用的可能性還是有的)。
預告:標準共識技術分享會②
本周六(7 月 21 日)21 時-22 時,標準共識將進行第二期技術分享會,分享人為梁培利。
梁培利目前是一家區塊鏈公司的核心工程師、知乎專欄「全棧區塊鏈」作者。所在公司為國內最早實現跨鏈技術的區塊鏈公司。本期分享的主題為「基于 JavaScript 開發 DApp」。
愿意在區塊鏈行業扎根的技術人員,請掃描下方二維碼,經我們運營人員審核后入群。
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。