FISCO BCOS 2.0原理解析: 分佈式存儲架構設計

FISCO BCOS 2.0新增對分佈式數據存儲的支持,克服了本地化數據存儲的諸多限制。git

在FISCO BCOS 1.0中,節點採用MPT數據結構,經過LevelDB將數據存儲於本地,這種模式受限於本地磁盤大小,當業務量增大時數據會急劇膨脹,要進行數據遷移也很是複雜,給數據存儲帶來較大的成本和維護難度。github

爲了突破性能的瓶頸,咱們在FISCO BCOS 2.0中,對底層的存儲進行了從新設計,實現了分佈式存儲,使用不一樣於MPT的方式來實現追溯,帶來了性能上的提高。sql

先誇誇分佈式存儲方案的優勢:數據庫

  • 支持多種存儲引擎,選用高可用的分佈式存儲系統,能夠支持數據簡便快速地擴容;後端

  • 將計算和數據隔離,節點故障不會致使數據異常;數組

  • 數據在遠端存儲,數據能夠在更安全的隔離區存儲,這在不少場景中很是有意義;緩存

  • 分佈式存儲不只支持Key-Value形式,還支持SQL方式,使得業務開發更爲簡便;安全

  • 世界狀態的存儲從原來的MPT存儲結構轉爲分佈式存儲,避免了世界狀態急劇膨脹致使性能降低的問題;微信

  • 優化了數據存儲的結構,更節約存儲空間。數據結構

 

從MPT存儲到分佈式存儲

 

MPT存儲

MPT(Merkle Paricia Trie),來自以太坊,對外接口爲Key-Value,使用前綴樹來存儲數據,是FISCO BCOS 1.0的存儲模式。

MPT是前綴樹結構,樹中的每一個葉子節點容許有最多16個子葉子節點,葉子節點有一個HASH字段,由該葉子的全部子葉子節點HASH運算得出。樹根有惟一的HASH值,標識整棵樹的HASH。

以太坊的全局狀態數據,保存在MPT樹中,狀態數據由帳號組成。帳號在MPT中是一個葉子節點,帳號數據包括Nonce、Balance、CodeHash和StorageRoot。任意一個帳號字段發生變化時,會致使該帳號所在的葉子的HASH發生變化,從該葉子直到頂部的全部葉子的HASH都會變化,最後致使頂部的StateRoot變化。

因而可知,任何帳戶的任意字段變化,都會致使StateRoot的變化,StateRoot能惟一標識以太坊的全局狀態。

MPT能夠實現輕客戶端和數據追溯,經過StateRoot能夠查詢到區塊的狀態。

MPT帶來了大量HASH的計算,打散了底層數據存儲的連續性。在性能方面,MPT State存在着自然的劣勢。

能夠說,MPT State追求極致的可證實性和可追溯性,對性能和可擴展性作了必定的妥協。

 

分佈式存儲

FISCO BCOS 2.0在保持存儲接口兼容性的同時,引入了高擴展性、高吞吐量、高可用、高性能的分佈式存儲。

分佈式存儲(Advanced Mass Database,AMDB):從新抽象了區塊鏈的底層存儲模型,實現了類SQL的抽象存儲接口,支持多種後端數據庫,包括KV數據庫和關係型數據庫。 

引入了分佈式存儲後,數據讀寫請求不通過MPT,直接訪問存儲,結合緩存機制,存儲性能相比基於MPT的存儲有大幅提高。MPT數據結構仍然保留,僅作爲可選方案。

分佈式存儲支持MySQL等關係型數據庫,支持MySQL集羣、分庫分表等平行擴展方式,理論上存儲容量無限。

 

分佈式存儲架構

State層(State)

抽象了智能合約的存儲訪問接口,由EVM調用,分爲StorageState和MPTState。StorageState爲分佈式存儲的適配層,MPTState爲老的MPT適配層,FISCO BCOS默認使用StorageState。

分佈式存儲層(Table)

抽象了分佈式存儲的類SQL接口,由State層和Precompiled調用。分佈式存儲層抽象了存儲的增刪改查接口,把區塊鏈的核心數據分類存儲到不一樣的表中。

驅動層(Storage)

實現具體的數據庫訪問邏輯,包括LevelDB和MySQL。

 

分佈式存儲名詞解釋

Table

存儲表中的全部數據。Table中存儲分佈式存儲主key到對應Entries的映射,能夠基於分佈式存儲主key進行增刪改查,支持條件篩選。

Entries

Entries中存放主Key相同的Entry,數組。分佈式存儲的主Key與Mysql中的主key不一樣,分佈式存儲主key用於標示Entry屬於哪一個key,相同key的Entry會存放在同一個Entries中。

Entry

對應於表中的一行,每行以列名做爲key,對應的值做爲value,構成KV結構。每一個Entry擁有本身的分佈式存儲主key,不一樣Entry容許擁有相同的分佈式存儲主key。

Condition

Table中的「刪改查」接口可傳入條件,支持「等於」「大於」「小於」等過濾邏輯,接口根據條件對數據進行篩選後進行相應操做,返回結果數據。若是條件爲空,則不作任何篩選。

 

舉例

以某公司員工領用物資登記表爲例,解釋上述名詞

  • 表中Name是分佈式存儲主key。

  • 表中的每一行爲一個Entry。一共有4個Entry,每一個Entry有三個字段。

  • Table中以Name爲主key,存有3個Entries對象。第1個Entries中存有Alice的2條記錄,第2個Entries中存有Bob的1條記錄,第3個Entries中存有Chris的一條記錄。

  • 調用Table類的查詢接口時,查接口須要指定分佈式存儲主key和條件,設置查詢的分佈式存儲主key爲Alice,條件爲price > 40,會查詢出Entry1。

 

分佈式存儲表分類

表中的全部entry,都會有_status_,_num_,_hash_內置字段。

 

系統表

系統表默認存在,由存儲驅動保證系統表的建立。

用戶表

用戶CRUD合約所建立的表,以_user_<TableName>爲表名,底層自動添加_user_前綴。

StorageState帳戶表

_contract_data_+Address+_做爲表名。表中存儲外部帳戶相關信息。表結構以下:

 

總結

FISCO BCOS發佈至今,歷經大量真實業務實踐。分佈式存儲在持續改進的過程當中,總結出適合於金融業務、高性能、高可用性和高可擴展的存儲模型,架構愈發穩定成熟,將來分佈式存儲將繼續做爲區塊鏈系統的基石,支持區塊鏈系統的發展。


 

咱們鼓勵機構成員、開發者等社區夥伴參與開源共建事業,有你在一塊兒,會更了不得。多樣參與方式:

1 進入微信社羣,隨時隨地與圈內最活躍、最頂尖的團隊暢聊技術話題(進羣請添加小助手微信,微信ID:fiscobcosfan);

2 訂閱咱們的公衆號:「FISCO BCOS開源社區」,咱們爲你準備了開發資料庫、最新FISCO BCOS動態、活動、大賽等信息;

3 來Meetup與開發團隊面對面交流,FISCO BCOS正在全國舉辦巡迴Meetup,深圳、北京、上海、成都……歡迎您公衆號在菜單欄【找活動】中找到附近的Meetup,前往結識技術大咖,暢聊硬核技術;

4 參與代碼貢獻,您能夠在Github提交Issue進行問題交流,歡迎向FISCO BCOS提交Pull Request,包括但不限於文檔修改、修復發現的bug、提交新的功能特性。

代碼貢獻指引:

https://github.com/FISCO-BCOS/FISCO-BCOS/blob/master/docs/CONTRIBUTING_CN.md

 

PS/

本文首發於公衆號【FISCO BCOS開源社區】,如轉載請註明出處,原創不易,謝謝珍惜

相關文章
相關標籤/搜索