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

article/2025/10/5 14:14:53

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。

以太坊的全局状态数据,保存在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

了解更多干货内容,请关注FISCO BCOS开源社区公众号,访问FISCO BCOS代码仓库可下载项目所有源代码:https://github.com/FISCO-BCOS/FISCO-BCOS​​​​​​​,欢迎点击页面右上角star收藏,获取最新版本。


http://chatgpt.dhexx.cn/article/1xLmyVES.shtml

相关文章

杉岩PACS影像系统分布式存储架构

该医院创建于1999年&#xff0c;是深圳市政府投资建成的集医疗、教学、科研和预防为一体的现代化三级综合性医院。2017年通过三级甲等医院复审。2018年&#xff0c;医院年门急诊总量约292万人次&#xff0c;年出院病人近7.4万人次&#xff0c;年手术量4.9万台次。 该院在深圳有…

Ceph分布式存储 原理+架构图详解

分布式存储Ceph ceph介绍 ceph是一个统一的、分布式的存储系统&#xff0c;设计初衷式提供较好的性能(io)、可靠性(没有单点故障)和可扩展性(未来可以理论上无限扩展集群规模)&#xff0c;这三点也是集群架构所追求的。 统一性 : 意味着我们可以仅凭ceph这一套存储系统&…

几种分布式存储组网架构参考

作 者&#xff1a; NGDCN 原文链接&#xff1a;几种分布式存储组网架构参考 - NGDCN 版 权&#xff1a; 本文由 NGDCN 于2022-11-12原创发布在 NGDCN&#xff0c;未经许可&#xff0c;禁止转载。 1、名词解释 ◼ VBS&#xff1a;云硬盘备份&#xff08;Volume …

谈谈Java内存模型

谈谈Java内存模型 什么是JMM为什么需要这种规范呢&#xff1f;三大特性在Java中是怎么满足的呢&#xff1f; 什么是JMM Java Memory Model &#xff0c;Java内存模型&#xff0c;是一种共享内存系统中多线程程序读写操作行为的规范&#xff0c;它是一种屏蔽了各种硬件和操作系…

Java内存模型及管理

1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏&#xff0c;使用每秒事务处理数&#xff08;Transactions Per Second&#xff0c;TPS&#xff09;这个指标比较能说明问题&#xff0c;它代表着一秒内服务器平均能响应的请…

什么是Java内存模型

概述&#xff1a;本文向您介绍Java内存模型的概念&#xff0c;在C或C中, 利用不同操作平台下的内存模型来编写并发程序&#xff1b;Java利用了自身虚拟机的优势, 使内存模型不束缚于具体的处理器架构&#xff0c;真正实现了跨平台。 内存模型 (memory model) 内存模型描述的是程…

详说Java内存模型(JMM)

文章目录 什么是Java内存模型为什么提出内存模型Java主内存与工作内存JMM三大特性可见性有序性原子性 并发总结 什么是Java内存模型 Java内存模型就是&#xff08;Java Memory Model&#xff09;&#xff0c;它规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机就是一…

详解Java内存模型

文章目录 一、简介二、处理器、高速缓冲、主内存间的交互关系三、Java线程、工作内存和主内存的交互关系四、8大原子操作五、8大Happens-Before原则 一、简介 Java内存模型&#xff08;JMM&#xff09;是线程间通信的控制机制&#xff0c;JMM定义了主内存和线程工作内存之间的抽…

Java内存模型的一点理解

关于Java内存模型的问题 文章目录 前言一、Java内存模型二、其中一些指向问题1.内存指向问题为什么&#xff1f; 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要…

【Java】Java内存模型

1.什么是Java内存模型 Java内存模型&#xff08;Java Memory Model&#xff0c;JMM&#xff09;是一种抽象的&#xff0c;不存在的概念。是一种屏蔽了各种硬件和操作系统的访问差异的&#xff0c;保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。 Java内…

2.什么是JAVA内存模型?

为什么要设计JAVA内存模型&#xff1f; 小陈&#xff1a;老王&#xff0c;看了上一篇的《CPU多级缓存模型》&#xff0c;有个疑问为什么还要有JAVA内存模型啊&#xff1f; 老王&#xff1a;这么来说吧&#xff0c;CPU多级缓存模型&#xff0c;只是一个规范&#xff0c;但是底层…

Java内存模型是什么

网上有很多关于Java内存模型的文章&#xff0c;在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是&#xff0c;很多人读完之后还是搞不清楚&#xff0c;甚至有的人说自己更懵了。本文&#xff0c;就来整体的介绍一下Java内存模型&#…

Java内存模型是什么,为什么要有Java内存模型,Java内存模型解决了什么问题等。。。

本文中&#xff0c;有很多定义和说法&#xff0c;都是笔者自己理解后定义出来的。希望能够让读者可以对Java内存模型有更加清晰的认识。当然&#xff0c;如有偏颇&#xff0c;欢迎指正。 为什么要有内存模型 在介绍Java内存模型之前&#xff0c;先来看一下到底什么是计算机内存…

Java内存模型相关面试题

一、谈谈你对Java内存模型的理解可以吗&#xff1f; 对于Java内存模型大家千万不能和JVM内存模型弄混了&#xff0c;不一样的&#xff1b; JVM内存模型是指JVM的内存分区&#xff0c;就是JVM分了几个区域&#xff1b;而Java内存模型是一种虚拟机规范。 首先来看下面一段代码&…

什么是Java内存模型?

点击上方“程序员小灰”&#xff0c;选择“置顶公众号” 有趣有内涵的文章第一时间送达&#xff01; 本文转载自公众号 占小狼的博客 说”JVM内存模型“&#xff0c;有人会说是关于JVM内存分布&#xff08;堆栈&#xff0c;方法区等&#xff09;这些介绍&#xff0c;也有地方说…

Java面试--Java内存模型

面试题&#xff1a;你了解Java内存模型吗&#xff1f;(顺丰面试题) 面试题&#xff1a;程序内存的分布&#xff0c;五个部分(360面试题) 一、Java程序的执行过程&#xff1a; Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀)&#xff0c;然后由JVM中…

JAVA内存模型与JVM内存模型

JAVA内存模型(JMM)与JVM内存模型 1、JAVA内存模型保证了在多线程环境下&#xff0c;对共享变量读写的原子性、可见性和有序性的一系列规范。 2、JVM内存模型规定了JAVA虚拟机在运行时使用的内存的各个分区及其作用。JAVA内存模型 原子性: 通过 synchronized、lock实现&#x…

Java内存模型(JMM)详解

目录 一、为什么要有内存模型二、CPU和缓存一致性2.1 为什么需要CPU cache2.2 三级缓存&#xff08;L1、L2、L3&#xff09;2.3 乱序执行优化 三、java内存模型3.1 JVM对Java内存模型的实现3.2 Java内存模型和硬件架构之间的桥接3.3 Java内存模型 - 同步八种操作3.4 Java内存模…

jvm内存模型和java内存模型

初识java虚拟机&#xff0c;就碰到一系列不懂的问题。我们以前常说java把局部变量放在栈里&#xff0c;new出来的变量放在堆里&#xff0c;然后堆里的数据不定时就给回收了。然后&#xff0c;如果是多线程的话&#xff0c;每个线程自己都有会一个私有的虚拟机栈&#xff0c;运行…

JAVA内存模型与JVM内存模型的区别

** JAVA内存模型与JVM内存模型的区别 ** 直接进入正题 **JAVA内存模型&#xff1a; Java内存模型规定所有的变量都是存在主存中&#xff0c;每个线程都有自己的工作内存。线程堆变量的操作都必须在工作内存进行&#xff0c;不能直接堆主存进行操作&#xff0c;并且每个线程…