FISCO BCOS 2.0原理解析: 分布式存储架构设计

FISCO BCOS 2.0新增对分布式数据存储的支持,克服了本地化数据存储的诸多限制。

在FISCO BCOS 1.0中,节点采用MPT数据结构,通过LevelDB将数据存储于本地,这种模式受限于本地磁盘大小,当业务量增大时数据会急剧膨胀,要进行数据迁移也非常复杂,给数据存储带来较大的成本和维护难度。

为了突破性能的瓶颈,我们在FISCO BCOS 2.0中,对底层的存储进行了重新设计,实现了分布式存储,使用不同于MPT的方式来实现追溯,带来了性能上的提升。

 

先夸夸分布式存储方案的优点:

  • 支持多种存储引擎,选用高可用的分布式存储系统,可以支持数据简便快速地扩容;

  • 将计算和数据隔离,节点故障不会导致数据异常;

  • 数据在远端存储,数据可以在更安全的隔离区存储,这在很多场景中非常有意义;

  • 分布式存储不仅支持Key-Value形式,还支持SQL方式,使得业务开发更为简便;

  • 世界状态的存储从原来的MPT存储结构转为分布式存储,避免了世界状态急剧膨胀导致性能下降的问题;

  • 优化了数据存储的结构,更节约存储空间。

 

从MPT存储到分布式存储

 

MPT存储

MPT(Merkle Paricia Trie),来自以太坊,对外接口为Key-Value,使用前缀树来存储数据,是FISCO BCOS 1.0的存储模式。

MPT是前缀树结构,树中的每个叶子节点允许有最多16个子叶子节点,叶子节点有一个HASH字段,由该叶子的所有子叶子节点HASH运算得出。树根有唯一的HASH值,标识整棵树的HASH。

FISCO BCOS 2.0原理解析: 分布式存储架构设计_第1张图片

以太坊的全局状态数据,保存在MPT树中,状态数据由账号组成。账号在MPT中是一个叶子节点,账号数据包括Nonce、Balance、CodeHash和StorageRoot。任意一个账号字段发生变化时,会导致该账号所在的叶子的HASH发生变化,从该叶子直到顶部的所有叶子的HASH都会变化,最后导致顶部的StateRoot变化。

由此可见,任何账户的任意字段变化,都会导致StateRoot的变化,StateRoot能唯一标识以太坊的全局状态。

FISCO BCOS 2.0原理解析: 分布式存储架构设计_第2张图片

MPT可以实现轻客户端和数据追溯,通过StateRoot可以查询到区块的状态。

MPT带来了大量HASH的计算,打散了底层数据存储的连续性。在性能方面,MPT State存在着天然的劣势。

可以说,MPT State追求极致的可证明性和可追溯性,对性能和可扩展性做了一定的妥协。

 

分布式存储

FISCO BCOS 2.0在保持存储接口兼容性的同时,引入了高扩展性、高吞吐量、高可用、高性能的分布式存储。

分布式存储(Advanced Mass Database,AMDB):重新抽象了区块链的底层存储模型,实现了类SQL的抽象存储接口,支持多种后端数据库,包括KV数据库和关系型数据库。 

引入了分布式存储后,数据读写请求不经过MPT,直接访问存储,结合缓存机制,存储性能相比基于MPT的存储有大幅提升。MPT数据结构仍然保留,仅做为可选方案。

FISCO BCOS 2.0原理解析: 分布式存储架构设计_第3张图片

分布式存储支持MySQL等关系型数据库,支持MySQL集群、分库分表等平行扩展方式,理论上存储容量无限。

 

分布式存储架构

FISCO BCOS 2.0原理解析: 分布式存储架构设计_第4张图片

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中的“删改查”接口可传入条件,支持“等于”“大于”“小于”等过滤逻辑,接口根据条件对数据进行筛选后进行相应操作,返回结果数据。如果条件为空,则不做任何筛选。

 

举例

以某公司员工领用物资登记表为例,解释上述名词

FISCO BCOS 2.0原理解析: 分布式存储架构设计_第5张图片

  • 表中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_内置字段。

系统表

系统表默认存在,由存储驱动保证系统表的创建。

FISCO BCOS 2.0原理解析: 分布式存储架构设计_第6张图片

用户表

用户CRUD合约所创建的表,以_user_为表名,底层自动添加_user_前缀。

StorageState账户表

_contract_data_+Address+_作为表名。表中存储外部账户相关信息。表结构如下:

FISCO BCOS 2.0原理解析: 分布式存储架构设计_第7张图片

 

总结

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开源社区】,如转载请注明出处,原创不易,谢谢珍惜

FISCO BCOS 2.0原理解析: 分布式存储架构设计_第8张图片

你可能感兴趣的:(开发教程,FISCO,BCOS开源社区)