在链上证明以太坊创始区块
首先,我们需要理解以太坊区块头和区块哈希值的工作原理。
什么是区块头和区块哈希值?
区块头是区块的一部分,概括了该区块中包含的所有信息,包括父区块的哈希值、区块时间戳、状态根等。
以太坊区块头和状态默克尔树(内容来源)
区块头包含许多信息。在本文中,我们重点关注状态根。让我们来看看原因。
通过上图可以看到,区块头下方是以太坊账户状态。每个以太坊账户都有一个关联的存储空间,用于存储该账户的变量(本质上是智能合约的状态)。账户存储的加密承诺通过哈希处理后,连同账户余额、随机数和代码哈希一起,存储为存储根。这些合起来,基本上构成了该账户状态的概要。
一棵包含所有以太坊账户状态的默克尔帕特里夏树(Merkle Patricia Trie)被构建起来,其哈希值作为状态根储存在区块头(在上图中标记为 stateRoot)。这个状态根包含了证明任意特定时间点整个以太坊网络状态所需的所有信息。
最后,由于以太坊(及 EVM 链)上的每个区块都包含这个状态根,且每个区块还有一个被称为区块哈希值的关联字符串(这是对包含状态根在内的区块头内的所有内容进行哈希处理的结果),区块哈希值就是整个以太坊状态在特定时间点的加密承诺。
EVM 上的历史区块哈希值
鉴于区块哈希值中保存了大量的关键信息,我们经常需要访问它们的历史记录。
在 Solidity 中,如果我们想要检索两个区块前开采的区块哈希值(回溯计数从包含交易的区块开始),可以使用以下语法:
方法非常简单。但有一个问题 — 这种区块哈希方法只能检索最近的 256 个区块的哈希值。以以太坊平均 12 秒一个区块来计算,相当于链上 51.2 分钟的历史记录。
对于希望使用历史区块哈希值作为熵(随机性)来源的人来说,256 个区块的限制通常是足够的。然而,就以太坊八年的历史来说,如果你想使用区块哈希值来获取其在特定区块的历史状态,51 分钟的历史记录远远不够。
这个链上 256 个区块哈希值检索限制主要是为了提高状态存储效率和减少潜在的状态增长问题。
Herodotus 使获取完整的区块哈希值历史记录成为可能
Herodotus 是如何解决这一限制,并让我们实现:
- 访问以太坊区块哈希值的完整历史记录
- 证明自创始区块以来的所有以太坊状态
- 并且全部以无需信任的方式完成
关键在于加密证明的力量。
让我们深入探讨一下 Herodotus 历史块哈希值累加器的程序步骤:
第一步:注册一个最近的区块哈希值
在以太坊主网上,一个最近的区块哈希值会在名为 SharpFactsAggregator 的智能合约中注册。可以使用区块哈希操作码(操作码值 0x40)检索这个区块哈希值,并将其作为一个简单的字符串变量保存在上述智能合约中。还可以登记相应的区块编号,以方便以后访问。
假设注册的区块号是 18,000,000,通过 Etherscan 我们可以看到,这个区块的哈希值是 0x95b1…4baf3。
第二步:证明最新区块的哈希值
下一步是从一个存档节点检索区块 18,000,000 的区块头信息,通过链下计算得出它的区块哈希值,并与已注册的区块哈希值 0x95b1…4baf3 进行对比。这个计算过程同样会通过一个证明器来创建这一计算的证明。
这个区块的哈希值加入到默克尔山脉范围(Merkle Mountain Range)中。这是默克尔树的一种变体,向树中添加新元素不需要大量计算。
第三步:证明 X-1 区块的哈希值
一旦我们证明了从存档节点检索的区块头是有效的,我们接着获取 X-1 区块的区块头,计算其哈希值,并将其与 X 区块的父哈希值进行对比(这个值可以在我们之前检索到的 X 区块的区块头中找到)。
如果哈希值匹配,我们就可以确定 X-1 区块的区块头也是有效。由于整个计算可以建模为一个函数,因此可以同时创建该计算的 STARK 证明。由此产生了对 X-1 区块头有效性的证明(见下图)。
第四步:递归证明前序区块的哈希值
对所有前序区块的区块哈希值进行类似的计算处理,直到追溯至以太坊主网的创世区块。这些哈希值都会附加到 MMR 树中,从而创建一个最终的 MMR 根。
需要注意的是,这些计算都是在链下完成的,并且 Herodotus 同时生成了计算证明。
第五步:在链上发布证明及其后续使用
一旦生成了最终的 MMR 根,这个根就可以连同数百万区块的计算证明一起发布在链上(在一个证明聚合智能合约上)。由于生成的 STARK 证明验证成本极低,使得在链上验证这些证明的成本变得合理。
我们就此实现了一种方法,可以追溯并访问以太坊自创世区块起的所有状态。
Herodotus 团队将这些 MMR 称作「历史区块哈希值累加器」,实现了 Vitalik Buterin 与 Tomasz Stanczak 于 2020 年提出的 EIP-2935 目标 — 访问超过 256 个区块历史数据的方法。这是一个三年多来一直悬而未决的问题!然而,Herodotus 和 Starknet 在不更改任何协议层面的前提下实现了这一目标。
关于上述过程的一些关键点:
Herodotus 按每批约 1350 个区块处理,并且每批的证明都会发布在链上。一旦完成了以太坊前 1800 万个区块的整个处理流程,随着新区块不断加入链历史,区块历史的 MMR 根可以定期更新。
一旦在链上找到 MMR 根,就可以证明 MMR 中包含每个区块哈希值(这是默克尔树的基本属性)。
在将证明发送到以太坊主网之前,Herodotus 团队的证明者使用 StarkWare 团队创建的 SHARP 系统。SHARP 系统的主要优势在于它能够降低成本并提高生成证明的效率。
上述工作流程正在被复制到两个独立的 MMR 中,一个使用 Keccak256 哈希函数,另一个则使用 Poseidon。以太坊将使用 Keccak256 变体,而 Starknet 将使用 Poseidon 变体。
以太坊主网的 MMR 根通过原生的 Starknet L1 到 L2 消息传递协议发送到 Starknet,以便在 Starknet 上使用。Herodotus 区块哈希值累加器还实现了在 Starknet 上访问以太坊历史数据的功能。Starknet L1 到 L2 的消息系统可用于以安全的方式将 L1 区块哈希值和经过验证的 MMR 根转发到 Starknet。一旦发送到 Starknet,就可以根据这些承诺来验证以太坊历史数据的存储证明。
Herodotus 区块哈希值累加器带来的新机遇
Herodotus 和 StarkWare 将区块哈希值累加器作为公共产品带到以太坊。一旦最终的 MMR 根和计算证明发布在以太坊主网上,任何开发者都可以利用它们来访问自链创始以来任何时间点的可证明状态。
由于以太坊的 MMR 根也将通过原生的跨链消息协议发送到 Starknet,因此可以以简单且无需信任的方式访问跨链状态信息。DeFi 协议可以通过利用特定时间点上某个账户的余额信息或账户的杠杆持仓信息,从历史状态证明中获益。使用更大历史区块哈希值记录来生成更加稳健的随机数成为可能。跨链投票也变得简单,用户在 L2 投票前,无需先将资产进行跨链转移。除此之外,还会带来更多其他的可能性。
结语
在区块链的可扩展性、去中心化和可验证性不断发展的世界中,Starknet 的团队正在成为创新的灯塔。在 Starknet 上创建的项目正在成为扩展以太坊的关键元素。当我们深入这个新未来时,熟悉 Starknet 生态系统将为你未来的发展奠定基础。