# 希罗多德：使用 Starknet 上的存储证明证明以太坊的状态

By [0xBai_](https://paragraph.com/@alpies) · 2023-11-02

---

长话短说：
-----

*   StarkWare 和希罗多德创造了一种方法来证明以太坊区块的起源
    
*   这是使用加密证明和块哈希的力量来完成的
    
*   [它实现了EIP-2935](https://eips.ethereum.org/EIPS/eip-2935)的目标——一种以链原生方式访问早于 256 个区块的历史区块哈希的方法，并解锁了 Defi 等的新用例
    
*   希罗多德和 StarkWare 将这项技术作为公共产品引入以太坊
    

**介绍**
------

能够以可证明的方式访问以太坊上的历史状态很重要，但到目前为止，您可以以无需信任的方式访问的只是过去一小时的历史记录。

但 Starknet 是一个充满活力、创新的生态系统，不断突破可能的界限。现在，多亏了希罗多德和 StarkWare，您可以以链本机且可证明的方式检索_所有_以太坊区块哈希\*\*，一直追溯到创世区块\*\*。

让我们详细看看希罗多德和斯塔克韦尔如何实现这一目标以及这一切意味着什么。我们将从存储证明的背景开始。

**什么是存储证明？**
------------

存储证明使我们能够证明过去某个时刻存在某种状态，而无需信任任何第三方。通过存储证明，信任被构建到数学中。存储证明也可用于跨不同链访问此状态。

在[最近一篇](https://www.starknet.io/en/posts/developers/what-are-storage-proofs-and-how-can-they-improve-oracles#)关于存储证明的文章中，我们介绍了[希罗多德](https://www.herodotus.dev/)这个领导存储证明研究和创新的团队。希罗多德团队现在创建了一种方法，通过提供以太坊的无信任证明，一直追溯到创世区块，使存储证明变得更好。

让我们看看希罗多德是如何实现这一目标以及为什么它很重要。

在链上证明以太坊的创世区块
-------------

首先，我们需要了解以太坊区块头和区块哈希是如何工作的。

### 那么，什么是区块头和区块哈希？

块头是**块**的一部分，总结了该块中保存的所有信息。它包括父块的哈希值、块时间戳、状态根等等。

以太坊区块头和状态默克尔树（[来源](https://www.researchgate.net/publication/330752524_A_Platform_Architecture_for_Multi-Tenant_Blockchain-Based_Systems)）

块头中保存了很多信息。对于本文，我们对**状态根特别感兴趣**。让我们看看为什么。

在上图中，您可以在块头下方看到**以太坊帐户状态**。每个以太坊帐户都有一个关联的存储空间，用于存储该帐户的变量（本质上是智能合约的状态）。帐户存储的加密承诺被散列并与帐户余额、随机数和代码散列一起存储为\*\*存储根。\*\*所有这些共同构成了该帐户状态的基本摘要。

_构建了所有_以太坊帐户状态的Merkle [Patricia Trie](https://ethereum.org/en/developers/docs/data-structures-and-encoding/patricia-merkle-trie/)，并将其哈希值存储在块头中作为**状态根**（在上图中标记为\*stateRoot ）。\*该状态根包含证明整个以太坊网络在任何特定时间点的状态所需的所有信息。

最后，由于以太坊（和 EVM 链）上的每个块都包含这个状态根，并且由于每个块还有一个称为块哈希的关联字符串\*\*（**这是对包括状态根在内的块头内的所有内容进行哈希处理的结果），因此**该块哈希充当整个以太坊状态在特定时间的加密承诺\*\*。

**EVM 上的历史区块哈希**
----------------

由于如此多的关键信息保存在块哈希中，我们经常需要历史地访问它们。

在 Solidity 中，如果我们想要检索两个区块前开采的区块的区块哈希值（向后计数从包含交易的区块开始），我们使用以下语法：

bytes32 lastBlockHash = blockhash ( block.number - 2 ) ;

很简单。但有一个问题——这种区块哈希方法_只能检索最后 256 个区块的区块哈希_。以太坊上平均有 12 秒的区块，链上的历史记录为 51.2 分钟。

对于希望使用历史区块哈希值作为熵源（随机性）的人来说，256 的限制通常就足够了。但是，如果您想使用块哈希来获取特定块的链的历史状态，则 51 分钟的历史记录还不够（与以太坊区块链的 8 年历史相比）。

链上区块哈希检索的 256 个限制主要是为了状态存储效率和减轻潜在的状态增长问题而做出的设计选择。

希罗多德提供了区块哈希的完整历史
----------------

那么，希罗多德如何解决这个限制并允许我们：

*   访问以太坊上区块哈希的完整历史记录
    
*   证明以太坊的状态一直回到创世区块
    
*   一切都以一种不信任的方式进行？
    

关键是密码学证明的力量。

让我们通过将希罗多德历史区块哈希累加器过程分为几个步骤来更深入地研究：

### 步骤1 。注册最近的块哈希

在以太坊主网上，最近的块哈希被注册在名为\*[SharpFactsAggregator](https://etherscan.io/address/0xa5f95f9a5bcde5673610e4f223da21d5b14a0013)\* 智能合约的智能合约中。可以使用块哈希操作码（操作码值 0x40）检索块哈希，并将其作为简单的字符串变量保存在上述智能合约中。也可以注册相应的块号以供以后访问。

假设注册的区块号是区块[18,000,000](https://etherscan.io/block/18000000)。从Etherscan中，我们可以看到该区块的区块哈希为0x95b1…4baf3。

### 步骤2 。证明最新区块的区块哈希

下一步是检索区块[18,000,000](https://etherscan.io/block/18000000)的区块头（从存档节点） ，在链外计算中计算其区块哈希，并将其与注册的区块哈希 0x95b1…4baf3 进行比较。该计算还通过证明者运行以创建该计算的证明。

该区块的区块哈希值被添加到 Merkle Mountain Range (MMR) 中。这是 Merkle 树的一种变体，因此向树添加新元素不需要大量计算。

### 步骤3 。证明区块X-1的区块哈希

一旦我们证明从存档节点检索到的块头是有效的，我们就检索块 X-1 的块头，计算其块哈希，并将其与块 X 的parentHash 值进行比较。（它在 X 的中可用）我们之前检索到的块头）。

如果哈希值匹配，我们就知道 X-1 的块头也是有效的。由于整个计算可以建模为一个函数，因此可以同时创建该计算的 STARK 证明。因此，创建了区块 X-1 区块头的有效性证明（见下图）。

### 步骤4 。递归证明先前区块的区块哈希值

之前所有区块的区块哈希值的计算方式都是类似的，直到我们一直回到创世区块——以太坊主网上的第一个区块。这些都被附加到 MMR 树中，从而创建最终的 MMR 根。

应该指出的是，所有这些计算都是在链下完成的，同时由希罗多德生成计算证明。

### 步骤5 。证明上链发布及后续使用

一旦生成最终的 MMR 根，该根就可以与数百万个区块的计算证明一起在链上发布（在证明聚合智能合约上）。由于生成的 STARK 证明的验证成本呈指数级下降，因此在链上验证这些证明的成本是合理的。

我们终于得到它了！我们创建了一种方法来访问以太坊的状态，一直回到创世块。

这些 MMR（希罗多德团队称为“历史区块哈希累加器”）实现了Vitalik Buterin 和Tomasz Stanczak在 2020 年提出的[EIP-2935](https://eips.ethereum.org/EIPS/eip-2935)的目标——一种访问早于 2 56 个区块的历史区块哈希的方法。这是三年多来一直没有解决的问题！然而，希罗多德和 Starknet 无需进行任何协议级别的更改就实现了这一目标。

上述过程中需要注意的一些要点：

*   希罗多德以大约 1350 个区块为一批处理这些区块，并且每个批次的证明都会在链上发布。一旦以太坊上前 18,000,000 个区块的整个过程完成，该区块历史记录的 MMR 根就可以随着新区块添加到链的历史记录中而定期更新。
    
*   一旦 MMR 根在链上可用，就可以证明 MMR 中包含每个区块哈希（这是 Merkle 树的基本属性）。
    
*   在将证明发送到以太坊主网上之前，希罗多德团队的证明者使用StarkWare 团队创建的[SHARP 。](https://starkware.co/resource/joining-forces-sharp/)SHARP 系统的主要优点是能够降低成本并提高生成证明的效率。
    
*   上述工作流程针对两个独立的 MMR 进行复制，一个使用 Keccak256 哈希函数，另一个使用 Poseidon。在以太坊上，将使用 Keccak256 变体，而 Starknet 将使用 Poseidon 变体。
    
*   以太坊主网的 MMR 根也使用原生 Starknet L1 到 L2 消息协议发送到 Starknet，以便在 Starknet 上使用。希罗多德区块哈希累加器还支持在 Starknet 上访问以太坊历史数据。Starknet L1 到 L2 消息传递系统可用于以安全的方式将 L1 块哈希和经过验证的 MMR 根中继到 Starknet。一旦进入 Starknet，历史以太坊数据的存储证明就可以根据这些承诺进行验证。
    

**希罗多德区块哈希累加器的新机遇**
-------------------

这些区块哈希累加器被希罗多德和 StarkWare 作为公共产品引入以太坊。一旦最终的 MMR 根连同计算证明一起发布在以太坊主网上，任何开发人员都可以利用它们来访问自链开始以来任何时间的可证明状态。

由于以太坊的 MMR 根也将通过本机消息传递协议跨链发送到 Starknet，因此可以以简单但无需信任的方式访问跨链状态信息。DeFi 协议可以通过利用有关特定账户余额或账户在任何时间点的杠杆头寸的信息，从历史状态证明中受益。使用更大的块哈希历史生成更强大的随机数变得可能。跨链投票变得简单，用户无需在 L2 上投票之前桥接资产。以及更多。

**结论**
------

在区块链可扩展性、去中心化和可验证性不断发展的世界中，Starknet 上的团队正在成为创新的灯塔。在 Starknet 中创建的项目正在成为扩展以太坊的关键要素。当我们深入探索这个新的未来时，熟悉生态系统将为您做好应对未来的准备。

在此处阅读有关 Starknet 生态系统中项目的更多信息。

---

*Originally published on [0xBai_](https://paragraph.com/@alpies/starknet-2)*
