# 如何利用Starknet存储证明来证明以太坊状态？

By [bixue](https://paragraph.com/@bixue) · 2023-11-06

---

在以太坊上以可证明的方式访问历史状态非常重要。但到目前为止，我们能够无需信任地访问的历史记录只限于过去一小时。

但 Starknet 是一个充满活力、不断创新、突破可能性边界的生态系统。如今，得益于 Herodotus 和 StarkWare，我们能够以链原生且可证明的方式，追溯并获取自创世区块以来的所有以太坊区块哈希值。

让我们详细了解 Herodotus 和 StarkWare 是如何实现这一目标的，以及这一切意味着什么。我们将从存储证明的背景知识开始讲起。

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

存储证明允许我们在无需任何信任第三方的情况下，证明某个状态在过去的某个时间点确实存在。通过存储证明，信任就内置于数学之中的。存储证明还可用于跨链访问这些状态。

在最近一篇关于存储证明的文章中，我们介绍了引领存储证明研究和创新的团队——Herodotus。目前，Herodotus 团队实现了一种新技术，能够自创始区块以来无需信任地证明以太坊状态，从而大幅提升存储证明性能。

让我们探究 Herodotus 如何实现这一点，以及其重要性。

### **在链上证明以太坊创始区块**

首先，我们需要理解以太坊区块头和区块哈希值的工作原理。

#### **什么是区块头和区块哈希值？**

区块头是区块的一部分，概括了该区块中包含的所有信息，包括父区块的哈希值、区块时间戳、状态根等。

以太坊区块头和状态默克尔树（内容来源）

区块头包含许多信息。在本文中，我们重点关注状态根。让我们来看看原因。

通过上图可以看到，区块头下方是以太坊账户状态。每个以太坊账户都有一个关联的存储空间，用于存储该账户的变量（本质上是智能合约的状态）。账户存储的加密承诺通过哈希处理后，连同账户余额、随机数和代码哈希一起，存储为存储根。这些合起来，基本上构成了该账户状态的概要。

一棵包含所有以太坊账户状态的默克尔帕特里夏树（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生态系统将为你未来的发展奠定基础。

---

*Originally published on [bixue](https://paragraph.com/@bixue/starknet-4)*
