区块链存储优化——从MPT树到KV存储

news2024/10/6 12:25:54

MPT树存储的优缺点

区块链如果采用MPT树存储,大概会有以下优点:

  1. 可用全局数据的根哈希做共识,数据篡改会被立即发现;
  2. 可以查询任意历史区块对应时刻的所有数据;
  3. 方便从指定区块开始同步数据,因为正如上面所说每个区块包含当时的所有数据;
  4. 方便区块回滚和重演,这在发生分叉和修正最长链时很有帮助。

大概就是因为这些优点,以太坊用一棵账户树记录所有账户的信息,账户下面挂接一棵存储树记录该账户的合约信息,这便是以太坊MPT存储的全部。

以太坊MPT存储

那么这种存储结构就没有什么缺点吗?

当然有。其中一个问题是,随着数据量的增大,查询延时越来越大。这对性能压力较高的区块链服务是个不得不面对的问题,你会看到随着数据量的增长,TPS越来越低,合约执行性能的降低尤其明显。通过分析发现,时间主要花在levelDB的读取上。


性能问题的原因分析

下图就是MPT树在内存中的大致结构,真实的环境因为key-value字符串比较长所以树要深很多。应用层读一个key,会触发底层读取一系列的节点构建MPT树最终找到存储在叶子节点中的value。如果key对应的value被修改,对应叶子节点到根节点路径上所有节点都要更新并写到磁盘。说白了,MPT树存在读写放大的问题。

MPT树


解决方案讨论

为了解决读写放大的问题,我们尝试了直接使用key-value储存(以下简称kv存储),即不再构建MPT树。这样读写放大问题就不复存在,但是又引入了以下几个新问题:

  1. 之前用MPT树的根节点哈希作共识,现在用什么作共识?
  2. 用MPT存储能查到历史数据,直接kv存储没有历史数据怎么办?
  3. 假如kv存储节点执行区块后只写入部分数据就断电了,重启后怎么基于前一块继续运行?
  4. 采用类似POW的概率一致性共识算法的链遇到主链变更时,怎么基于历史块重演最长链?

下面讲一下这几个问题相关的思考,以及我们在实现时留意到的细节。

第一个问题,之前用MPT树的根节点哈希作共识,现在用什么作共识?

MPT是对所有数据作共识,kv用区块执行后修改数据的有序集作共识。这有点类似数据的全量备份和增量备份,kv用每个块执行后的“增量”部分作共识。kv存储的节点可以从创始块开始验证所有区块和数据。实现时需要留意“有序集”,区块链全网节点执行区块修改时要用统一的规则对变动数据求哈希用作共识,我们写测试代码用的统一规则是对共识修改后的key-value按key进行排序。这部分的改动对合约执行性能有大幅提升,TPS大概能提升3倍。

第二个问题,用MPT存储能查到历史数据,直接kv存储没有历史数据怎么办?

可以基于kv存储构建可提供历史数据查询服务的“全量节点”。具体实现就是全量节点提供每个块kv共识哈希到MPT树根哈希的映射,也就是全量节点采用MPT存储但在内存构建kv有序集参与共识。

第三个问题,假如kv存储节点执行区块后只写入部分数据就断电了,重启后怎么基于前一块继续运行?

这个问题讲的其实是,一个块产生的数据修改集是个原子性事务,要么全部执行成功,要么全都不能修改。在批量写一个块产生的修改集时,程序可能崩溃或被杀死,机房可能断电,类似情况不可避免,而kv存储节点又没有历史数据,所以一定要用某种机制保证节点能回到前一块执行成功后的状态。解决方案是在更新数据前,将相关数据的旧状态写入wal文件。这样节点重启发现块执行失败时可以恢复前一状态,然后重新执行一遍该高度的块。当执行成功后,就可以清除相关区块执行失败的标识。

最后一个问题,采用类似POW的概率一致性共识算法的链遇到主链变更时,怎么基于历史块重演最长链?

如果你像我们一样采用类似PBFT的绝对一致性共识算法,那么这个问题就不存在了。当然区块链不能随便改用共识算法,所以我们还是尝试讨论下这个问题。其实这个问题的解决办法类似第三个问题,使用wal可以回到前一个块的状态,使用一系列wal当然可以回到几个块之前的状态。只需要回到两条链第一个共同的祖先块,再依次执行另一条链的块,就可以修正最长链了。当然对采用概率一致性共识算法的链改用kv存储支持重演时还可能遇到其它问题我们没考虑到,如果有小伙伴看到这里,有兴趣做了存在重演时的kv存储修改,可以分享一下。


小结

用kv存储代替MPT存储对性能有很大提升,但也需要考虑会引发的问题,要有合适的解决方案。

原文链接:https://zhuanlan.zhihu.com/p/75953913 

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! ! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/47183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Codeforces Round #790 (Div. 4) G. White-Black Balanced Subtrees 感觉很好的树形dp的板子题

翻译: 您得到一个有根的树,其中包含从1到𝑛编号为𝑛的顶点。根结点是顶点1。还有一个字符串𝑠表示每个顶点的颜色:如果𝑠𝑖𝙱,那么顶点𝑖是黑色的&#xff0…

MongoDB实战:应用场景以及Spring和mongodb的整合

前言 mongodb是非关系型数据库,他的存储数据可以超过上亿条(老版本的mongodb有丢数据的情况,新版本不会有,网上说的),mongodb适合存储 一些量大表关系较简单的数据,例如用户信息,用户…

linux 多台机器修改时间同步

修改东八区 首先第一步,通过命令 :date -R 查看当前系统所在时区。如是0800,则是东八区,也就是我们当下的北京时间,如不是(如下图),做如下调整。 命令行键入命令:tzsele…

认识与了解前端Dom

Dom 文档对象模型 Dom是关于创建,修改,插入,删除页面元素的标准 Dom赋予我们操作操作页面的能力 页面的内容都是字符串,js会把这些字符串转换成DOM树,DOM树会把字符串转换成节点,其实我们操作DOM的根本就…

CSS布局的三种方式

绝对定位 绝对定位&#xff1a; ​ 属性&#xff1a;position 值&#xff1a;absolute <style> p.abs{position: absolute;left: 150px;top: 50px; }</style><p >正常文字1</p> <p >正常文字2</p> <p class"abs" >绝对定…

Postman常用断言功能解析

一、Postman断言模块 二、七种常规业务断言 前4种最常用&#xff1a; 1&#xff09;Status code:Code is 200 检查返回的状态码是否为200 2&#xff09;Response body:Contains string 检查响应中包括指定字符串 3&#xff09;Response body:Json value check 检查响应中其中js…

C++ Reference: Standard C++ Library reference: Containers: list: list: cbegin

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/cbegin/ 公有成员函数 <list> std::list::cbegin const_iterator cbegin() const noexcept; 返回开始的常量迭代器 返回指向容器第一个元素的const_iterator对象。 const_iterator是指向const内容…

不用ps也能在线设计电商详情页的方法

食品类的商品要如何设计排版详情页呢&#xff1f;怎么样排版食品类商品的详情页才好看&#xff1f;想设计一张好看食品的详情页其实是有方法的&#xff0c;下面跟着小编学习如何使用在线工具乔拓云&#xff0c;在线设计一个食品商品的详情页&#xff0c;还有海量的商品详情页模…

mysql索引类别和失效场景

首先&#xff0c;我们为什么要使用索引&#xff0c;索引有什么作用呢&#xff1f; 索引可以用来快速查询数据表中有某一特定值的记录&#xff0c;大大加快数据的查询速度&#xff1b;在列上创建了索引之后&#xff0c;查找数据时可以直接根据该列上的索引找到对应记录行的位置…

经典文献阅读之--PL-SLAM(点线SLAM)

0. 简介 之前作者基本都在围绕着特征点提取的路径在学习&#xff0c;最近看到了最近点云PCL推送的《Structure PLP-SLAM: Efficient Sparse Mapping and Localization using Point, Line and Plane for Monocular, RGB-D and Stereo Cameras》。这个工作是基于OpenVSLAM架构的…

测评 | 基于AM5708开发板——AM5708 SOC使用uboot更新uboot

本次测评板卡是创龙科技旗下的TL570x-EVM,它是一款基于TI Sitara系列AM5708ARM Cortex-A15+浮点DSPC66x处理器设计的异构多核SOC评估板,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。 评估板接口资源丰富,引出…

学苑教育杂志学苑教育杂志社学苑教育编辑部2022年第32期目录

前沿 学苑简讯《学苑教育》投稿&#xff1a;cn7kantougao163.com 4-6 专题研究 把握有效生成 焕发课堂魅力——小学语文课堂有效动态生成策略探析 任云青; 7-811 教育管理 新课程理念下高中契约式班级管理研究 孙磊; 9-11 小学班级管理中文明礼仪教育实施策略的…

Ubuntu 20.04 上学习Open vSwitch :VxLAN

参考 OpenvSwitch完全使用手册 云计算底层技术-使用openvswitch Open vSwitch 概述&#xff1b;OVS支持的功能&#xff1b;ovs的模块介绍&#xff08;ovs-vswitchd、ovsdb-server等等 学习环境 学习 OpenStack 2 个 Hyper-V 虚拟机 Ubuntu 20.04 203.0.113.101 /24 ( 网关&a…

Git——入门介绍

目录1.Git概述1.1.版本控制1.2.版本控制工具1.2.1集中式版本控制工具1.2.2分布式版本控制工具1.3.Git 工作机制1.4.Git 和代码托管中心2.Git下载安装2.1.Git下载2.2.Git安装3.Git常用命令3.1.设置用户签名3.2.初始化本地库3.3.查看本地库状态3.4.添加暂存区3.5.提交本地库3.6.修…

6、python的高级特性(生成式、生成器、闭包、装饰器)

文章目录生成式列表生成式字典生成式集合生成式生成器生成器的实现方式将生成式改写成生成器。将[ ] 改成 ( )使用yield关键字闭包装饰器生成式 列表生成式 在“先有一个空列表&#xff0c;然后通过循环依次将元素添加到列表中”的场景&#xff0c;可以使用列表生成式。 列表…

核心解读 - 2022版智慧城市数字孪生标准化白皮书

核心解读 - 2022版智慧城市数字孪生标准化白皮书前言&#xff1a;城市数字孪生基本概念一、城市数字孪生概述1、城市数字孪生内涵及概念模型2、城市数字孪生典型特征3、城市数字孪生相关方4、城市数字孪生技术参考架构5、城市数字孪生关键技术二、智慧城市数字孪生发展现状1、政…

JMeter下载及安装配置教程

参考&#xff1a;入门部署教程 – Jmeter中文网 本文是在win10环境下安装使用jmeter&#xff0c;jmeter可以运行在多平台上Windows和Linux。 环境准备&#xff1a; java 8 jmeter 5.1.1 jmeter环境 jmeter环境依赖JAVA环境&#xff0c;需安装JDK1.8环境&#xff0c;JDK下载地…

基于若依springboot二次开发WMS带移动端管理系统vue源码

系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。搭建部署的方式也是挺简单的&#xff0c;还带有uniapp开发的多端移动端扫码入库功能 技术架构 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 …

轻薄笔记本能不能带起来高刷的显示器??

先说结论&#xff0c;新款集显也可以&#xff0c;用TYPC或者DP线连&#xff0c;使用时关闭主屏&#xff0c;只显示外屏。 这个问题&#xff0c;已经困扰了很久~~~ 软件上&#xff0c;windows以主屏作为主刷新率&#xff0c;除非笔记本自身是高刷屏&#xff0c;否则请只使用外…

单应性矩阵在标定中的应用

1.单应性矩阵是什么&#xff1f; 言简意赅定义&#xff1a;定义在两个不同视角中对同一平面范围内的特征点的射影变换&#xff08;projective transformation&#xff09;即&#xff1a; x1 H*x2 //x1、x2为匹配点 上图中x&#xff0c;x‘为一对匹配点&#xff0c;通过单应矩…