FISCO BCOS 2.0新增對分佈式數據存儲的支持,克服了本地化數據存儲的諸多限制。git
在FISCO BCOS 1.0中,節點採用MPT數據結構,經過LevelDB將數據存儲於本地,這種模式受限於本地磁盤大小,當業務量增大時數據會急劇膨脹,要進行數據遷移也很是複雜,給數據存儲帶來較大的成本和維護難度。github
爲了突破性能的瓶頸,咱們在FISCO BCOS 2.0中,對底層的存儲進行了從新設計,實現了分佈式存儲,使用不一樣於MPT的方式來實現追溯,帶來了性能上的提高。sql
先誇誇分佈式存儲方案的優勢:數據庫
支持多種存儲引擎,選用高可用的分佈式存儲系統,能夠支持數據簡便快速地擴容;後端
將計算和數據隔離,節點故障不會致使數據異常;數組
數據在遠端存儲,數據能夠在更安全的隔離區存儲,這在不少場景中很是有意義;緩存
分佈式存儲不只支持Key-Value形式,還支持SQL方式,使得業務開發更爲簡便;安全
世界狀態的存儲從原來的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開源社區】,如轉載請註明出處,原創不易,謝謝珍惜