深入存储证明:区块链世界的记忆杀

深入存储论证:实现跨时间、跨链的区块链状态感知能力

深入存储证明:实现跨时间、跨链的状态感知

大家有没有遇到这样的情况:每小时都无法记住刚刚发生的事情,只能不停地询问别人?嗯,目前智能合约就处于这种尴尬的状态。在以太坊这样的区块链上,智能合约无法直接访问超过256个区块之外的数据。这个问题在多链生态系统中更加严重,跨不同执行层获取和验证数据甚至更加困难。

2020年,Vitalik Buterin和Tomasz Stanczak提出了一种跨时间访问数据的方法。然而,这个方案现在停滞不前,但在以Roll-up为中心的多链世界中,对这个方法的需求再次出现。如今,存储证明已经成为了一项前沿技术,它为智能合约赋予了意识和记忆能力。

访问链上数据有哪些方式?

Dapp(分布式应用程序)可以通过多种方式访问数据和状态。但是,所有这些方法都需要Dapp对人类/实体、加密经济安全性或代码进行一定程度的信任,并且都存在一些权衡取舍。

首先是信任人类/实体。存档节点是Dapp操作者自己运行的,或者依赖于Alchemy、Infura等存档节点服务提供商,它们可以访问从创世块开始的所有数据。这些存档节点提供与全节点相同的数据,包括整个区块链的历史状态数据。但是,底层数据的完整性无法被验证。这种方法需要Dapp信任存档节点服务提供商以正确运行基础设施,并且没有恶意意图。

其次是信任加密经济安全性。索引器是一种将区块链上的所有数据组织起来的协议,允许开发者构建和发布开放API供应用程序查询。索引器是质押代币以提供索引和查询处理服务的节点操作者。但是,当提供的数据不正确时,可能会发生争议,需要一定的仲裁时间。另一种方式是使用预言机服务提供商,它们使用从许多独立节点操作者那里汇总的数据。然而,从预言机获得的数据可能无法频繁更新,并且范围有限。这种方法也依赖于对节点运营商的信任。

最后是信任代码。像以太坊这样的区块链具有一些特殊变量和函数,用于提供关于区块链的信息或者通用实用函数。智能合约只能访问最近256个区块的区块哈希。然而,并非所有区块的区块哈希都是可用的。能够访问历史区块哈希将非常有用,因为它可以允许针对它们进行证明的验证。不过,节点可以安全地忘记旧区块的内容,并仍然能够处理新区块。需要注意的是,这种方法仅限于单个区块链。

鉴于这些解决方案的挑战和局限性,可以预见链上存储和提供区块哈希的需求格外迫切。这就是存储证明可以发挥作用的地方。为了更好地理解存储证明,我们先来快速了解一下区块链中的数据存储。

区块链中的数据存储

区块链可以看作是一种公共数据库,由网络中的许多计算机进行更新和共享。数据和状态以连续的区块组进行存储,每个区块通过存储前一个区块头的哈希来加密引用其父区块。

以以太坊为例,它使用一种特殊的Merkle树,称为“Merkle LianGuaitricia Tree”(MPT)。以太坊的区块头包含四个不同的Merkle-Patricia树的根,分别为状态树、存储树、收据树和交易树。这四棵树编码了包含所有以太坊数据的映射关系。使用Merkle树的原因是它在数据存储中的高效性。通过递归哈希,最终只需要存储根哈希,大大节省了空间。它们允许任何人通过证明递归哈希节点导致相同的根哈希,来证明树中元素的存在。以太坊上的轻客户端可以通过使用Merkle证明来验证信息,而无需下载每个交易和区块的全部数据,整个过程非常高效。

存储证明允许我们使用加密证明来证明某个事件被记录在数据库中且有效。如果我们能够提供这样的证明,那么就可以得出一个可验证的声明:某件事在区块链上发生了。

存储证明可以实现两个主要功能:

  1. 访问超过最后256个区块的历史链上数据,一直追溯到创世块。
  2. 在一个区块链上访问另一个区块链的链上数据(历史和当前),可以通过共识验证或L2桥接(针对L2)来实现。

那么存储证明是如何工作的呢?

简单来说,存储证明会检查特定区块是否是区块链规范历史的一部分,然后验证所请求的特定数据是否是该区块的一部分。它可以通过以下方式实现:

  1. 链上处理:Dapp可以获取初始可信区块,并将区块作为Calldata传递,以便访问前一个区块,一直遍历回创世块。然而,这种方法需要大量链上计算和大量的Calldata,因此完全不切实际。Aragon在2018年尝试了链上处理的方法,但由于高昂的链上成本而不可行。
  2. 使用零知识证明:类似于链上处理,但使用零知识证明将复杂计算转移到链下。

对于访问同一链的数据,我们可以使用零知识证明断言任意历史区块头是执行环境中可访问的最近256个区块头的祖先之一。另一种方法是索引源链的全部历史并生成零知识证明以证明索引正确完成。这个证明会随源链的新区块添加而定期更新。

而对于访问跨链数据,提供者在目标链上收集源链的区块头,并使用零知识证明证明这些区块头的有效性。也可以使用现有的跨链消息传递解决方案如Axelar、Celer或LayerZero来查询区块头。

然后Dapp可以根据请求从链下索引数据或链上缓存(取决于请求的复杂性)访问历史数据/区块。通过Merkle包含证明,可以检查指定区块中是否存在数据,并为此生成零知识证明。该证明与正确索引的零知识证明或零知识共识证明相结合,并在链上提供以进行无需信任的验证。除了验证零知识证明,还需要检查公共参数(如区块号和区块哈希)与在链上维护的区块头缓存是否相符。

目前有许多采用这种方法的项目,例如Herodotus、Lagrange、Axiom、HyperOracle、Brevis Network和nil基金会。虽然这些项目都致力于实现应用程序跨多个区块链的状态意识,但作为一种卓越的互操作性标准,链间通信(IBC)在其中扮演着重要角色。IBC支持应用程序通过跨链查询和跨链账户实现跨链通信。例如,Chain A上的应用程序可以通过在简单的IBC数据包中包含查询来查询Chain B上的状态,而ICA允许一个区块链对另一个区块链上的账户进行安全控制。通过将它们结合起来,可以支持各种有趣的跨链用例。RaaS(Relay-as-a-Service)提供商如Saga默认为所有应用链提供这些功能。

存储证明可以通过多种方式进行优化,以在内存消耗、证明时间、验证时间、计算效率和开发者体验之间找到最佳平衡。整个过程主要可以分为三个主要子过程:数据访问、数据处理和数据访问与处理的零知识证明生成。

在数据访问过程中,服务提供商以原生方式在执行层访问源链的区块头,或者通过维护链上缓存实现。为了优化效率和计算成本,可以使用不同的优化策略,如利用以太坊的现有结构、使用Merkle Mountain Range缓存或链下缓存等。

数据处理是指对数据进行计算操作。一些服务提供商支持以零知识证明的形式对数据进行计算,并在链上提供该证明以验证其有效性。

证明生成主要涉及到可更新证明和Verkle树。可更新证明可以高效更新现有证明,而无需从头计算新的证明,用于维护合约变量的移动平均证明。而Verkle树相比Merkle树更小巧,只需要根路径而不是所有的共享父节点。

存储证明的应用可以涉及多个层面,包括应用层、中间件和基础设施层的智能合约。在应用层,存储证明可以为治理、身份和声誉以及DeFi等方面提供支持。在中间件方面,存储证明可以为意图、账户抽象和链上自动化等功能提供增强。而在基础设施层,存储证明可以用于无需信任的链上预言机和跨链消息传递协议。

存储证明带来的一系列创新将使得多链之间的状态意识成为一个越来越重要的问题。以太坊不再只是一个结算层,它将扮演身份和资产所有权层的角色。用户可以在以太坊上维护自己的身份和关键资产,在多个区块链中使用,而无需始终桥接资产。我们对未来将解锁的新可能性和用例保持兴奋。

那么,你对存储证明有什么想法呢?你认为它将如何改变区块链世界?欢迎在评论中和我们分享你的想法!

【原文链接】 【图片链接】