以太网存储器爆炸问题分析与优化_今日财经_智行理财网

以太网存储器爆炸问题分析与优化

智行网 0

编者按:本文为QuarkChain创始人兼CEO cycle博士撰写的技术文章,并以此为基础在DApp Learning上进行了技术共享讲座。

背景

DeFi、GameFi等去中心化APP的蓬勃发展,大幅增加了对低交易费用高性能区块链的需求。 然而,构建高性能区块链的关键挑战之一是存储爆炸。 下图是从Etherscan上取的图表显示了以太网上所有节点(归档文件)的块链数据大小。

从图中可以看出,节点的链数据规模稳步增加,目前已达到~9TB。 将区块链中心化的一个目标是使普通结构的计算机能够执行节点因此,很难在普通配置的计算机上强制请求9TB的存储。

存储分解开销

进一步分析存储使用情况时可以看出,块数据仅约占300GB的数据(块高度0到13.6M ),这个数字远远小于9TB。 剩下的8.7TB数据来自哪里?

实际上,归档节点执行所有数据块并保留所有历史数据,包括:

状态

交易收据

其中,状态是该8.7TB的主要构成部分。 所以,存储爆炸有时称为“状态爆炸”。 但是为什么状态会变得这么大呢?

什么是以太体状态?

以太体的状态是Merkle Patrica树[mpt]。 这里,

叶节点是地址[0x.]=账户的映射中选择所需的族。 其中,帐户存储与地址相关联的余额、

内部节点(如nonce )以维护树结构,并允许快速计算整个树的哈希根

。 归档节点将保留所有块的所有历史状态中选择所需的族。 这意味着MPT中的更新将创建o(log(n ) )个内部节点,而不删除旧的内部节点。

获取全节点

为了解决归档节点的状态爆炸问题Geth的天才工程师们创建了一种称为“修剪”模式的新模式。 此模式仅定期保存MPT。 这里举一个简化的例子,其中节点只存储了每三个块的MPT。 (请注意获得不包含状态块的状态,节点需要获得该块以前的最近状态,并播放下一个事务。)。 通过定期存储

mpt,状态的存储大小明显减少。 根据以太网数据,目前Geth所有节点的块链数据大小约为1TB。

Geth的完全可快速同步节点

通过从创世块播放所有事务来执行节点的一个问题是播放所有事务需要花费时间一般来说,构建这样的节点需要几周的时间才能从创世模块赶上网络的最新状态。 为了加速节点的启动过程,Geth还提供了高速同步模式,可以下载最新的稳定块的MPT,而无需播放和维护块以前的历史MPT。 下载MPT时,具有定期状态存储的新块将像完整节点一样播放。

履历MPT,根据情况在不存储履历块主体的情况下,可以将单个Geth节点的存储大小进一步减少到447 g (截至2021/12/06 )。 通过减去300GB的块数据,推测状态大小约为150GB。

问题

以目前以太网447GB的存储大小和15 TPS,预计配备1TB固态硬盘的典型配置计算机可以运行相当长的时间,例如几年的以太网节点。 那么,存储爆炸和状态爆炸真的存在吗? 未来几年以太坊可能不会变成这样,但如果以太坊虚拟机(EVM )可以扩展到数百或数千TPS呢? [ xy 002 ] [ xy001 ]让我们来看看另一个基于EVM的链条,货币智能链条(BSC )。 截至2021年12月8日,BSC中已有

约984 GB的链上数据,其中块约占550 GB,状态约占400 GB。

20.6623亿笔交易100 TPS

进而用交易数预测数据大小时,

TPS为100,即~ 3,153 mtpy [ xy 002 ] [ xy001 ]一年后、区块~ 1.375 TB、状态~ 1.085TB

3年后,总tx~11,525 m、区块~3.025TB、状态~2.387 TB

TPS为150 (观察到的峰值TPS (即(4,730 mtpy ) xy002 )

年后,总tx (6,796 m,块)~1.809 TB,状态) 1.427TB

3年后,如总tx~16,256 m、块~4.327 TB、状态~3.414TB

以上那样,对BSC来说,如果维持当前速度,则在此以上,它很快就会变成与以太网存档节点相同的存储大小。 这几乎不能用普通计算机来完成。

具有极高TPS区块链的存储爆炸问题

[ xy001 ]如果对极高的TPS区块链(如quark chain )提出了更大胆的假设,这个数字会是多少? 考虑1000 TPS的区块链,分析一下其区块和状态大小吧假定

大小约为100个字节,则每1000(TPS ) 100 (tx字节)的年块所需存储量为365 * 24 * 3600=2.86 TB (xy 002 )

假设MPT有100亿账户(超过世界人口!状态的大小预计为150G (以太体的状态大小)/0.18B )以太体的唯一地址) ) 10b=8.3TB(xy002 ) ) xy001 )我们可以很容易地得出结论。 这是大多数常见配置计算机无法承受的要求

优化

为了优化存储成本,必须放宽与EVM的兼容性限制,而不是以太体的兼容性。 也就是说必须构建/运行另一个支持EVM的链,而不是高度优化的以太网客户端。

状态存储优化

我们首先提出的优化是使用普通KV而不是MPT。 MPT较大时,MPT中的所有内部节点可能都非常昂贵。 优化将删除MPT中的所有内部节点。 假设每个帐户的数据约为50个字节(20个地址、2个nonce 12个帐户和其他)可以节约100亿账户的数据。

~ 10B * 50 100GB (代码)=600 GB,约为MPT版本的1/10!

使用普通KV可以带来很大的好处但是,一个主要的问题是,无法以如此短的块间隔计算每个块的状态后散列。 这意味着以太坊将失去以下好处。

快速同步:通过下载任意块的状态并播放剩下的块来快速同步网络

分支检测(或拜占庭检测) :从对等方创建的新块是否与本地执行块的状态不同。

具有周期性快照块以启用高速同步。 快照间隔=epoch=例如14周)。 一个快照块包含其他信息:上一个快照块的后状态散列(执行事务后的状态散列)。

非快照块不保留状态散列,而是具有增量散列中选择所需的族。 包含此块中所有事务的原始数据库操作(删除、更新)的散列。 这样可以进行分支检测!

使用事务前状态散列代替以太体区域中块的事务后状态散列。 这是因为,节点虽然不能立即计算出状态交易后的状态杂凑,但是通过使用交易前的状态杂凑,节点可以使用整个epoch间隔来计算杂凑。 例如,假设状态散列计算每秒处理10M状态数据为了计算600 GB的全部状态,计算600 GB/10 M ~ 16.67小时(vs. epoch=14周(

)

计算状态前散列的过程如下) (xy002 ) )。

1.当接收并最终确定快照块时,快照其KV状态,并创建一个后台线程以迭代所有KV项(地址=帐户)来计算散列。

2.创建下一个快照块时中选择所需的族。 计算的状态前哈希值存储在此块中。 同样,节点会创建KV的另一个快照,并在后台计算散列。

3.创建下一个快照区块时,节点除了保存状态前散列外,节点现在可以释放快照区块的KV快照。 这意味着从快照区块删除/更新的所有数据都将自动进行垃圾回收。

结果将保存状态,节点最多只需要两个KV快照。 恐怕增量和KV快照只有一个。

块存储优化

使用快照区块,可以通过仅存储以下数据进一步减少节点所需的块数据:

[

]最新快照块的事务前状态快照,即(最新-1)快照块的事务后状态([

] ) (xy001 )

轻松用数学方法计算存储成本。 假设epoch期间为两周,则块播放大小为

2 * 14 (日(24 )小时) * 3600 (秒) 100*1000 ) TPS )=224 GB!

而且,这里的数字不会随着时间的推移而增长!

总结

分析了以太网当前的存储器使用情况。

对于

TPS1000 (除了

块外,状态存储还消耗很多空间),存储空间使用量非常大

我们提出了优化块和状态。

块大小从每年2.86 TB减少到224 GB [ xy 002 ] [ xy 001 ]状态大小(~10B帐户)从8.3 TB减少到600 GB [ xy 002 ]

2TB的典型配置计算机应该满足长时间运行节点的条件

缺点:写节点无法验证状态中的一个数据

谢谢

以太网存储器爆炸问题分析与优化文档下载: PDF DOC TXT