深入解析故障证明:第一部分 - MIPS.sol

  • optimism
  • 发布于 2024-02-02 22:10
  • 阅读 11

本文深入探讨了在OP Stack L2区块链的Fault Dispute Game中使用的Fault Proof Virtual Machine (FPVM) 的核心组件——MIPS.sol智能合约。

故障证明深入研究系列是 Coinbase 的区块链安全(BlockSec)团队和 OP Labs 之间的合作,旨在提供关于故障证明所有主要组件的深入信息。通过分享这些信息,我们希望鼓励其他人更多地了解故障证明的架构和技术方面。 共同努力,我们可以朝着 OP Stack L2 区块链的去中心化未来迈进。

在这篇博文中,我们将介绍故障证明虚拟机(FPVM)智能合约 MIPS.sol。

什么是 MIPS.sol?

MIPS.sol 智能合约是虚拟机(VM)的一个链上实现,该虚拟机包含了 32 位、大端序的 MIPS III 指令集架构(ISA)。 此智能合约是同一 ISA 的链下 MIPSEVM golang 实现的对应物。 链上和链下 VM 实现共同构成了 Cannon,OP 的第一个 FPVM。

Cannon 是 FPVM 的一个实例,它被用作乐观 Rollup L2 区块链的故障争议游戏的一部分,这些区块链使用 OP Stack。 争议游戏本身是模块化的,允许使用任何 FPVM; 但是,Cannon 目前是唯一实现的 FPVM,因此将在所有争议中使用。

故障证明控制流

退一步,让我们简要地关注 MIPS.sol 合约在故障证明过程中的位置。

在上面从 Clabby 的 故障证明演练视频 中重新创建的图中,我们可以看到 MIPS.sol 合约与另外两个合约交互:FaultDisputeGame.sol 和 PreimageOracle.sol。 FaultDisputeGame.sol 是用于活跃争议的故障争议游戏的已部署实例。 PreimageOracle.sol 是一个预图像 Oracle 的已部署实例,它将为所有使用相同 FPVM 的争议游戏存储预图像。 因此,在我们的例子中,对于所有使用 MIPS.sol 作为 FPVM 的游戏,都只有一个 PreimageOracle.sol 合约。

MIPS.sol 合约由争议游戏的运行实例调用,并且仅在争议游戏到达当前正在争议的状态转换树中的叶节点时才被调用。 叶节点表示单个 MIPS 指令(在我们使用 Cannon 作为 FPVM 的情况下),该指令可以在链上运行。 给定先前状态(即先前约定的 L2 状态,直到此指令)和要在 MIPS.sol 合约中运行的指令状态,故障争议游戏可以确定真实的后续状态。 然后,将使用此真实的后续状态来解决故障争议游戏,方法是将叶节点处有争议的后续状态与争议游戏实例中对手提出的后续状态进行比较。

智能合约控制流

MIPS.sol 智能合约只有一个入口点:step() 函数。 这是由正在运行的争议游戏调用的函数,它将在链上执行单个 MIPS 指令。 从高层次上讲,将执行以下操作:

  1. VM 执行状态数据输入被解析并加载到内存中。 此数据由 Cannon golang 对应物生成,游戏参与者通过 OP-Challenger 在链下运行它。

  2. 读取并验证内存证明输入。 此内存证明指向内存中的一个位置,应该从该位置加载并运行下一个 MIPS 指令。

  3. 执行下一个 MIPS 指令。 MIPS.sol 合约中的大部分逻辑处理根据 MIPS III 规范执行 MIPS 指令。 在处理 MIPS 指令时,唯一不遵循严格规范的指令是 SYSCALL(系统调用)指令。 系统调用的行为对于操作系统来说是唯一的,并且在 MIPS.sol 的情况下,可以执行的系统调用只是系统调用总数的一小部分。 系统调用的主要目的是处理从 PreimageOracle.sol 合约的读取并模拟对合约的写入。

  4. 指令的结果可能会写回寄存器或内存。 在写入内存的情况下,第二个内存证明将已作为输入由争议游戏提供。 第二个内存证明应与期望写入的内存位置一致,并且 MIPS.sol 智能合约将使用新值和内存证明来计算新的内存 Merkle 根。

完成 MIPS 指令后,状态哈希将返回到争议游戏实例。 状态哈希是 VM 执行状态的 keccak256 哈希,其中第一个字节不对应于哈希,而是被一个值覆盖以指示 VM 的状态。 争议游戏将使用状态哈希和 VM 状态来解决争议。

MIPS.sol 合约状态

如前所述,MIPS.sol 合约与另外两个智能合约交互:FaultDisputeGame.sol 和 PreimageOracle.sol。 FaultDisputeGame.sol 合约提供当前的 VM 执行状态,以及最多两个内存证明。 PreimageOracle.sol 合约提供预图像,MIPS.sol 可以使用它们来帮助确定真实的 L2 状态。 在预图像中派生的内容可能包括来自 L1 和 L2 的数据,其中包括区块头、交易、收据、合约状态等等。

这两个合约共同提供了执行单个 MIPS 指令所需的所有相关信息。 MIPS.sol 合约不在存储中存储任何关于指令执行的信息。 这样,该合约可以被任何故障争议游戏使用,而无需重置任何值。 因此,MIPS.sol 合约仅确保从提供的内存证明计算的 Merkle 根等于 VM 执行状态中的 Merkle 根。 否则,FaultDisputeGame.sol 合约负责确保所提供信息的正确性以及争议游戏中参与者采取的行动。

MIPS.sol 的文档

这结束了我们对 MIPS.sol 智能合约的深入研究。 除了这篇博文之外,Coinbase 还创建了深入的文档,其中提供了关于智能合约中每个函数的详细信息,列出了 FPVM 支持的 MIPS 指令等等。 请在 故障证明 - MIPS.sol | Optimism 文档 中查看。

  • 原文链接: optimism.io/blog/fault-p...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
optimism
optimism
江湖只有他的大名,没有他的介绍。