首先,我们来了解实际访问以太坊信息的用户旅程。当我们第一次使用以太坊时,实际接收有关链上发生的情况的信息的方式是通过对存档注释的 JSON-RPC 调用。JSON-RPC API 的目的是实际向用户展示有关链上历史的信息。本质上,我们看到的有关区块链的所有信息都是从这些 API 调用中提取出来的,并以一种条目的形式呈现在网站上供用户读取。
现在,随着用户与区块链交互变得更加熟练,我们开始要求对链的视图越来越复杂。 因此,针对不同的用户权衡,正在开发不同类型的存档节点。 于是就有了 Geth、Erigon、Nethermind,现在又增加了 Reth。我们可根据自身需求选择最适合自己的存档节点。
如果用户对单独的 JSON-RPC API 不满意,可以选择一个索引器来应用后处理,同时跟踪交易。对于不同的应用程序,用户可能对从 The Graph 或 Covalent 返回的数据感兴趣。
最近,还出现了一些钱包和其他产品,提供在存档节点之上进行交易模拟的功能。这意味着我们可以在提交交易之前看到虚拟交易的实际结果。总的来说,作为最终用户,我们与以太坊的交互方式越来越复杂,它在我们读取的数据之上使用了更多的计算。
现在,如果我们不是从用户的角度,而是从以太坊上的智能合约的角度来考虑问题。当然,合约也希望能够访问数据并对数据进行计算,但这更具挑战性。事实上,如果我们去 OpenSea 看看 CryptoPunk 的列表,会发现在页面上的所有信息中,只有很小一部分是在链上的智能合约中可以访问的。
事实上,对于 CryptoPunk 的列表,这些信息只是当前的持有者。当然,页面上还有很多其他信息,但与历史转账信息、历史价格和历史持有者相关的所有信息实际上对智能合约是不可访问的,因为它属于过去的历史。这些历史构成了链上信息,但对于智能合约来说,它们不可用,因为我们需要避免强制要求每个完整的以太坊节点在其随机访问中维护此信息以验证交易。
此外,任何区块链开发人员都可以告诉你,在链上运行计算是非常昂贵的,尽管以太坊具有相对高效的虚拟机(VM)操作,并且通过预编译使某些类型的操作更便宜。例如,在 BN254 曲线上的椭圆曲线运算,以太坊提供了价格较为低廉的支持。然而,对于一些特定的应用程序,以太坊虚拟机仍然是一个非常昂贵的运行环境。当设计一个区块链虚拟机时,必须选择一组固有的操作,这些操作需要仔细计量,以确保每个节点都能以一致的时间验证交易。此外,还必须考虑最坏情况下的安全性和共识稳定性。因此,这里的挑战在于如何实现针对链上应用程序的应用特定扩展。Axiom 旨在为智能合约扩展数据访问和计算能力,满足不同应用的拓展需求。
Axiom 正在构建的是称之为以太坊协处理器(ZK Coprocessor),通过以上操作允许某些智能合约无需信任地委托给我们的离线系统,以便它们可以将数据读取和可验证计算委托给 Axiom。要向 Axiom 发出查询,智能合约可以向我们的链上系统发送一笔交易。我们的离线节点将接收该交易,并根据以太坊的历史查询生成结果,并附上一个零知识证明,以证明结果的正确性。最后,我们再链上验证结果,并可信地将结果交付给下游的智能合约。
这种方式类似于计算机中的 CPU 将计算任务委托给 GPU,并在结果可知后将其取回。这个概念在早期被称为协处理器(Coprocesso)。在幻灯片上,我展示了上世纪 90 年代初的一个高级数学 Coprocesso 的图像与 Axiom 所做的类比。
我们可以深入地了解 Axiom 可以进行哪些类型的操作每个对 Axiom 的查询可以分为三个部分。
首先是读取部分,也是 Axiom 查询的输入方式——我们可以可信地读取历史上链的数据。
第二部分是我们可以在这些数据上运行验证计算。这可能从基本的分析开始,比如对一些数字求和、求最大值或最小值,到更复杂的计算。比如来自密码学的一些签名聚合或验证,甚至可以进行基于零知识的机器学习,比如在链上社交数据上验证某些声誉算法的运行或在金融应用中使用某些机器学习算法。最终,我们将通过虚拟机提供可编程的计算复合功能。
最后一个部分,在读取和计算步骤完成后,我们得到一个结果,并且始终将该结果与零知识证明配对,以证明结果的计算是有效的。因此,我们在以太坊智能合约中验证该证明,然后将结果存储供合约使用。
由于 Axiom 返回的所有结果实际上都经过零知识证明验证,这意味着 Axiom 返回的所有内容的安全性与以太坊本身的安全性在密码学上是等效的。Axiom 的理念是,我们不希望对用户施加任何超出其使用以太坊所已有的密码学假设的额外假设。
接下来我将详细介绍它的实现原理,这涉及到在演讲标题中提到的 Reflection 操作概念。实现这一切的核心原则是,每个区块链上的区块都包含了完整的历史记录。我们可以从当前的以太坊区块开始,向前回溯到我们感兴趣的早期区块。通过获取过去区块和当前区块之间的所有区块头,并通过验证这些区块头的哈希链,我们实际上可以将过去区块的承诺逆向追溯到当前区块。
那 Reflection 有什么好处呢?
我们可以取当前以太坊的一个块,并回溯到我们感兴趣的以前的一个块。如果我们取得过去块和当前块之间的块头,我们可以通过验证这些块头之间的哈希路径,将过去块的承诺反向到当前块中。然后,如果我们对过去块中的某些信息感兴趣,我们可以在该块的承诺中给出一个包含证明。具体来说,这可以是一个 Merkle Patricia Trie 证明,证明该信息存在于该块的状态 trie、交易 trie 或收据 trie 中。至少原则上,在 EVM 中,仅通过对最近块哈希的了解,就可以访问链上的任何过去信息。
遗憾的是,在 EVM 中进行这样操作的代价是昂贵的。正如刚刚提到的,你必须验证所有块头的哈希链和 Merkle 证明,这涉及对大量数据进行许多 Keccak 哈希计算。所以一旦你回溯到过去,就会变得非常困难。因此,我们通过在 EVM 中使用 ZK 封装这个证明来应用 Reflection 操作。因此,我们不需要将所有过去的块头和所有这些 Merkle 证明放在链上,然后进行验证,而是在零知识中检查是否存在一系列过去的块头和一些验证的证明。
这有两个优点。首先,它使我们不必将证明数据放入调用数据中。其次,它让我们能够将证明聚合,而如果没有使用 ZK 的话,这是不可想象的。这里的想法是,在以太坊上验证任意数量的计算时,Gas 成本是固定的,因此我们可以使用单个 ZK 证明来验证大量的历史数据访问。
让我简单谈谈基于 ZK 的 Reflection 操作概念的权衡。
访问数据有两种方式。第一种是你之前所了解的方式——你可以直接从智能合约中访问以太坊上的数据。这有一个非常大的优点,即访问是同步的。因此,你可以直接调用智能合约中的读取函数,获取当前值。例如,当你在 Uniswap 上进行交易时,你就需要这种同步性。然而,它也有很多限制。你的计算能力受到燃料成本的限制,而且无法访问任何历史数据。
第二种,如果你想利用 ZK 的能力来反映到以太坊中,因为你必须生成证明,证明你的访问是正确的,那么就无法以同步方式做到这一点。因此,实际上无法直接访问当前的链上状态,因为你必须针对一个状态进行证明。
另一方面,如果你允许自己以异步方式访问历史数据,那么你可以对其应用几乎无限的计算,并且可以访问大量数据。因此,通过放宽同步的概念,基于 ZK 的 Reflection 操作式数据访问可以大幅扩展。
我们接着了解如何通过 Axiom 实现 Reflection 操作。
首先,我们实际上必须在我们的智能合约中维护所有先前块的缓存。在 EVM 中,最后 256 个块哈希是原生可用的。我们可以证明,在每 1024 个块的批次中,前一个批次的最后一个块的哈希会在下一个块中提交。同样,前一个批次中倒数第二个块的哈希会在最后一个块中提交,以此类推。因此,我们可以反向验证这个哈希链,并通过零知识证明这个哈希链的有效性。
这使我们能够从最近的块开始,一直缓存到创世块的块哈希。实际上,我们在我们的主网智能合约中已经实现了这一点,它包含了从创世块开始的每1024个块哈希的缓存 Merkle 路径。
我们正在添加的另一个功能是 Merkle Mountain Range。它建立在这个块哈希缓存之上,是一种数据结构,使我们能够在有限的 DNA 中引用以太坊中的每个块哈希。
一旦我们建立了缓存,我们可以通过对缓存中的块进行验证来查询 Axiom。为了实现这一点,我们必须证明我们试图访问的以太坊历史数据中的每个数据实际上都承诺在某个块的缓存中。其次,我们必须证明我们在此查询上执行的所有计算都是正确的。为了在链上进行检查,我们会验证零知识证明的有效性。我们还会检查它是否与我们在链上记录的信息相关。我们始终将信任建立在我们的缓存或块缓存中,并将这些块缓存中的信息与零知识证明中的公共信息进行匹配。
现在我们来谈谈 Reflection 操作设想中的可能应用。
水平轴表示数据复杂度,即实际上需要访问多少数据才能实现该应用程序。垂直轴表示计算复杂度,即为完成此任务实际上需要应用多少计算资源。
因此,第一类应用是 Axiom 或任何类型的 Reflection 操作机制可以在以太坊上实现的,但成本稍高的应用。
其中一些例子包括从以太坊共识层的区块头中读取共识级随机数,验证历史账户年龄,或从历史价格信息中读取不同类型的预言机数据。在 EVM 中,可以采用各种解决方案来实现这些应用,但通过将这些解决方案置于零知识中,可以提高效率。
现在,还有另一类应用,大致上需要更多的数据访问,因此需要更多的计算。在我看来,如果不使用 ZK 协处理器,这些应用是无法实现的。
举个例子,一个有趣的应用是允许以太坊上的 Roll-up 以一种可信的方式读取基础层或另一个 Roll-up 的状态,使用零知识进行交互。其中一种应用可能是允许 Roll-up 读取 ERC20 代币的完整余额快照。
如果我们将目光从存储转向账户的交易历史,你可以想象通过记录以太坊地址的完整历史,构建一个可信的声誉、身份或信用评分系统。这可能用于信用评分,或者用于让你访问某种类型的链上 DAO,或者用于让你获得自定义 NFT 的发行权限。
还有一类应用程序是使用链上的历史数据来实际管理协议。一般称为协议记账。
这里的想法是,协议的存在是为了协调参与者的行为,而协调的基本原则是能够对参与者的行为进行奖励或惩罚。如果你观察以太坊上的许多协议,参与者的行动记录实际上完全保存在链上。因此,使用 Axiom,我们可以想象根据协议参与者的完整行动集合,协议可以确定支付结构,甚至对参与者进行某种类型的惩罚,我们认为这可以真正扩展协议应用的设计空间。
最后,如果我们真正提升计算的层次,我们认为使用机器学习模型来调整链上的参数可能会非常有趣。如果你思考传统金融应用,基于大量历史数据进行复杂的未来参数建模是非常常见的,例如价格数据、经济数据等。而当我们看当前的 DeFi,还远远没有达到那个层次。我并不认为 DeFi 应该与传统金融工作方式完全相同,但我们确实认为注入一些历史数据库和基于机器学习的模型和信息可能有助于创建更具动态性的 DeF i协议。
这些只是关于 Reflection 操作可以为区块链带来的一些想法。
领取专属 10元无门槛券
私享最新 技术干货