以太坊存储与复杂性问题的解决方案
以太坊或任何区块链技术面临的一个主要问题是其规模随时间不断增长。这意味着其代码复杂性和存储需求也在不断增加。区块链必须保留其历史中的所有数据,这些数据需要由所有客户端存储,并由新的客户端下载。这导致了客户端负载和同步时间的持续增加。
此外,代码复杂性也随时间增加,正如Vitalik Buterin在其博客中所写:“添加新功能比移除旧功能更容易。”因此,Buterin认为,开发人员必须积极努力遏制这些增长趋势,同时保持以太坊的持久性。为此,Buterin提出了“The Purge”计划,该计划分为三个部分,旨在简化区块链并减少其数据负载。
历史数据过期的解决方案
目前,一个完全同步的以太坊节点需要约1.1 TB的存储空间用于执行客户端,还需要几百GB的空间用于共识客户端。Buterin指出,这些数据大部分是历史数据,如历史区块、交易和收据,其中许多数据已有数年之久。为了存储所有这些历史数据,所需的磁盘空间每年增加数百GB。
Buterin认为,可以通过“历史数据过期”来解决这个问题。区块链上的每个区块通过哈希链接指向前一个区块,这意味着对当前区块的共识也暗示对历史的共识。Buterin表示,只要网络对当前区块达成共识,任何相关的历史数据都可以通过Merkle证明由单一参与者提供,任何人都可以验证其完整性。这意味着每个节点不需要存储所有数据,而是可以存储一小部分数据,从而减少存储需求。
Buterin基本上建议采用类似torrent网络的运作模式,在该模式中,每个参与者仅存储和分发网络存储和分发的一小部分数据。以太坊已经采取了减少存储需求的措施——某些信息现在有过期日期。例如,共识区块存储六个月,而blob存储18天。
EIP-4444是朝着这个方向迈出的另一步——它旨在将历史区块和收据的存储期限限制为一年。然而,长期目标是设定一个固定期限,如18天,在此期间每个节点必须存储所有数据,然后旧数据以分布式方式存储在点对点网络上。
状态对象过期的问题与解决方案
根据Buterin的说法,取消客户端存储整个历史的需求并不能完全解决存储需求膨胀的问题。这是因为由于“状态的持续增长:账户余额和nonce、合约代码和合约存储”,客户端每年需要增加约50GB的存储容量。
一个新状态对象可以通过三种方式创建:创建一个新账户、向新账户发送ETH以及设置之前处于休眠状态的存储槽。一旦创建了一个状态对象,它将永远存在于状态中。
Buterin认为,随着时间的推移自动过期状态对象的解决方案需要高效、用户友好且对开发者友好。这意味着解决方案不应需要大量计算,用户不应因多年未使用而失去对其代币的访问权限,并且开发者在过程中不会受到太大不便。
Buterin提出了两种“已知的最不坏的解决方案”:
部分状态过期提案基于将状态划分为“块”的原则。这将要求每个人永远存储哪些块为空或非空的“顶级地图”。只有在最近访问过块中的数据时,才会存储这些数据。“复活”机制允许任何人通过提供数据证明来恢复未存储的块中的数据。
基于地址周期的状态过期提案建议拥有一个不断增长的状态树列表,而不是只存储整个状态的一个状态树。任何被读取或写入的状态都会更新到最新的状态树中。每周期(可能是一年)添加一个新的空状态树。在这种情况下,较旧的状态树被冻结,全节点只需存储最新的两个树。如果状态对象成为过期树的一部分,它可以被读取或写入,但交易需要为其提供Merkle证明。交易完成后,它将被添加回最新的树中。
降低协议复杂性的必要性
随着时间的推移,所有协议都会变得复杂,无论它们最初多么简单。Buterin写道:“如果我们不希望以太坊陷入不断增加的复杂性的黑洞,我们需要做以下两件事之一:(i) 停止更改并固化协议,(ii) 能够实际移除功能并降低复杂性。”
根据Buterin的说法,清理以太坊的复杂性需要几个小的修复,如移除SELFDESTRUCT操作码、移除旧交易类型和信标链委员会、改革LOG等。Buterin还建议简化gas机制,移除gas可观察性,并改进静态分析。