比特元MVCCKVDB與傳統區塊鏈Merkle Tree數據存儲方式對比

最早的區塊鏈項目比特幣,爲解決分佈式數據庫的一致性驗證問題,在“簡化區塊鏈支付驗證”的過程中,引入了默克爾樹(Merkle Tree)數據存儲技術。

1240

默克爾樹架構圖

默克爾樹特點

1)默克爾樹可以實現數據驗證和同步的數據結構。一般由SHA-2和MD5等hash算法來實現。默克爾樹環環相扣,hash算法幾乎無法反向推導,從通過實現只驗證默克爾樹根哈希的方式,有效的簡化區塊鏈數據驗證。

2)主網應用於分佈式系統中,如比特幣、以太坊等區塊鏈網絡

3)Merkle Tree的葉子節點的在區塊鏈網絡中主要是交易生成的哈希值。

4)非葉子節點的value是根據它下面所有的葉子節點值,然後按照Hash算法計算而得出的。


默克爾樹在區塊鏈應用中的缺點

區塊鏈在實際應用中往往需要面對數據的更新和插入,而默克爾樹在執行更新操作時,效率往往比較低下。

圖1和圖2是默克爾樹實現數據更新的一種形式:

1240

圖1

首先插入數據塊0後(考慮數據塊的位置),Merkle Tree的結構是這樣的:

1240

圖2

因爲默克爾樹中的所有的葉子節點都是相互關聯的,我們在對數據更新的過程中往往是牽一髮而動全身。由於默克爾樹數據架構的特性,在區塊鏈實際應用過程中,發送數據更新就面臨數據結構的重構,使得公鏈執行效率十分地下,做很多無用功。

除了數據更改,在數據查詢方面也效率底下:舉個例子,一個20 層的默克爾樹,查詢一個葉子節點的數據需要進行 20 次讀操作來完成,導致數據查詢的效率僅爲普通數據庫的查詢效率的 1/20,對於每秒能完成 10 萬次讀操作的系統,每秒僅能讀取 5000 筆交易的數據,大幅限制了系統的讀取性能。寫數據時,同樣要加載樹型分支上的多個節點數據,並最終要在更新以後寫入到磁盤,這裏面的操作消耗也是比較大的。

比特元MVCCKVDB 的存儲方式的優化解決方案

對於傳統區塊鏈默克爾樹的數據架構存儲數據的方式,在區塊鏈領域發展中存在諸多限制。針對以上默克爾樹在應用中存在的問題,比特元區塊鏈率先創新實現了 MVCCKVDB(多版本 KV 數據存儲),進行問題優化和解決。

比特元借鑑了數據庫設計中的 MVCC 理念(Multi-Version Concurrency Control 多版本併發控制),設計了獨創的 KVMVCC 的數據存儲格式,用於改善 MAVL 或者默克爾樹結構中存在的低效的問題,更好的滿足區塊鏈數據增長到一定規模後的保持較高的數據讀寫性能。

 KVMVCC 的數據存儲格式的思路如下:

1240

Hash 計算: statehash=hash(prevstatehash,KVSet,height),包含了前一區塊的狀態 Hash 信息,本區塊的狀態數據 KVSet 信息,本區塊的高度信息(也就是版本信息)。

有以下對應關係會被存儲到每個節點的數據庫中:

hash->height(version) 

height(version)->hash

key:height(version)->value 

lastest:key->value 

在區塊鏈數據驗證方面:對於特定高度 height 的KVSet ,可以根據前一區塊的hash值 prevstatehash、KVSet、height 進行 Hash 運算,如果 hash 值相符,則數據未被篡改,否則,數據被改動或者數據有誤(高度有誤,或者 KVSet 數據有誤)。

對於最新版本數據的維護方面:特別的,當對於最新區塊的 key、value 值進行存儲時,同時保留(新增 key)或者更新(已經有歷史版本的 key)key:latest->value 的映射關係到本地 key-value 數據庫中存儲。當需要獲得最新的批量數據時,可以根據 latest 前綴(可以自定義)來批量查詢最新數據,實現和傳統數據庫一樣的執行效率。

在數據查詢方面:根據 statehash 可以查找到對應的 height(version),根據 height 可以查找到對應高度時,具體 key 值對應的 value 值。由於通常的 key-value 數據庫可以很好的支持前綴匹配查詢,查詢效率會比較高,遠高於默克爾樹存儲結構的查詢。


比特元官網:www.bityuan.com

比特元開源地址:https://github.com/33cn/chain33

文章參考:https://blog.csdn.net/wo541075754/article/details/54632929


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