本文是Tokamak Network关于OP Stack故障证明系列的第三篇文章,主要介绍了Optimism的Fault Dispute Game (FDG),探讨了如何使用链上(MIPS.sol)和链下(MIPSEVM)组件解决Layer 2状态纠纷。文章还详细阐述了FDG中的提议者、挑战者的角色,PreimageOracle的数据管理,以及确保完整性和安全性的激励结构,并对二分博弈进行了说明。
Tokamak Network 旨在为当前对 Optimism 和 Ethereum 生态系统演进感兴趣的开发者提供有价值的信息。
来源: Oplabs 链接
这篇文章是 'OP Stack 完整版欺诈证明系列' 的第三篇,该系列由 Tokamak Network 计划发布的 3 篇文章组成。在本文中,我们探讨 Optimism 的欺诈证明系统如何使用链上 (MIPS.sol
) 和链下 (MIPSEVM
) 组件解决 Layer 2 状态争议。我们涵盖了提议者和挑战者的角色,PreimageOracle
的数据管理,以及确保完整性和安全性的激励结构。此外,我们还将解释将争议分解为单个指令以进行精确验证的二分游戏。
💡 鉴于该系列的互连性,我们建议按顺序阅读文章,以获得连贯的理解。
系列 1. Cannon 的欺诈证明系统: 在本文中,我们将介绍 Optimism 的欺诈证明程序,并解释其多重证明架构如何增强 Layer 2 的安全性和可靠性。该程序集成了强大的欺诈证明机制,以确保准确的状态转换和高效的争议解决。[ LINK ]
系列 2. Cannon 的欺诈证明系统: 在本文中,我们概述了
Cannon
(Optimism 的 FPVM),它通过链下执行和链上验证来确保 Layer 2 状态转换的完整性。MIPS.sol
、_MIPSEVM
和PreimageOracle
等关键组件协同工作,以实现高效的争议解决。[ LINK ]
图:‘争议游戏’可视化。
争议游戏是争议协议的核心原语,它对一个简单的状态机进行建模。它从对任何可以被质疑有效性的信息的 32 字节承诺开始。由实施者定义的解决函数确定此承诺是真还是假。OP Stack 的第一个实现 FaultDisputeGame
是无需许可的,其解决函数由在模拟 VM 上执行的欺诈证明程序的结果确定。
争议游戏依赖于两个基本属性:
💡 可以通过 DisputeGameFactory
创建、管理和升级不同类型的争议游戏,从而实现创新功能,例如聚合证明系统以及争议 L2 状态之外的各种事项(例如链上二进制验证)的能力。
图:LibUDT.sol (来源: github 链接)
[0, 32]: 游戏类型
[32, 96]: 时间戳
[96, 256]: 地址
图:Types.sol (来源: github 链接)
Cannon
VM 的争议游戏类型。Cannon
VM 的许可争议游戏类型。ASTERISC
VM 的争议游戏类型。图:service.ts (来源: github 链接)
表示游戏的当前状态:
rootClaim
。rootClaim
未受到质疑。图:IDisputeGameFactory.sol (来源: github 链接)
setInitBond
函数来完成的,以设置用于初始化游戏类型的保证金(以 wei 为单位)。InitBondUpdated
事件,其中包含游戏类型和新保证金金额的详细信息。💡 setInitBond
和 InitBondUpdated
是管理设置的一部分
图:IDisputeGameFactory.sol (来源: github 链接)
DisputeGameFactory
初始化,该工厂创建一个新的 DisputeGame
合约。这涉及在工厂上调用 create
函数,传入 _gameType
、_rootClaim
和任何 _extraData
。DisputeGameCreated
事件,其中包含有关争议游戏的详细信息。图:IDisputeGame.sol (来源: github 链接)
图:DisputeGame.sol (来源: github 链接)
DisputeGame
合约通过调用其 initialize
函数来初始化。这设置了游戏参数,包括根声明、游戏创建者、L1 区块父哈希和提供的任何额外数据。DisputeGameCreated
事件以识别新的争议并相应地参与。💡 挑战者有两个选择:他们可以使用 DisputeGameCreated
事件来启动一个新游戏,或者他们可以通过监控现有的 DisputeGame
合约并以挑战者的身份加入争议来参与已创建的争议。
争议游戏发生……
图:IDisputeGameFactory.sol (来源: github 链接)
_rootClaim
是 DisputeGame 的根声明。_rootClaim
可能被创建者同意或不同意。图:IDisputeGame.sol (来源: github 链接)
IDisputeGame
的 resolve 函数处理。条件: 只有在游戏状态为 IN_PROGRESS
时才能调用。
目的: 将游戏状态标记为 CHALLENGER_WINS
或 DEFENDER_WINS
,并返回已解决的游戏状态。
返回: 解决后的游戏状态。
💡 争议游戏工厂维护所有已创建的争议游戏的记录。这包括跟踪游戏数量、游戏类型、时间戳和实施细节。
clones-with-immutable-args
模式在争议游戏初始化阶段使用。这种方法用于创建轻量级代理合约(称为克隆),这些合约使用特定的不可变参数进行定制。
图:LibClone.sol (来源: github 链接)
GameType
(例如,CANNON
、ASTERISC
)都有一个对应的实现合约,该合约已部署在工厂中。GameType
的实现合约的克隆。GameType
都有其自己的实现合约。GameType
的争议游戏时,工厂会创建一个对应的实现合约的克隆,并将争议特定的参数嵌入为不可变参数。clone(address implementation, bytes memory data)
:部署具有编码在 data 中的不可变参数的实现的克隆。clone(uint256 value, address implementation, bytes memory data)
:与上述类似,但在部署期间也会存入 value ETH。💡 总之,clones-with-immutable-args 模式允许通过克隆现有实现合约和嵌入特定参数来高效且有针对性地部署争议游戏实例。这确保了每个游戏都根据其指定的 GameType
运行,而无需每次都重新部署核心逻辑。
定义:虚拟机 (VM) 是一种计算模型,它使用状态转换函数 (STF) 来处理状态转换,以从给定的预状态计算后状态。
定义:PreimageOracle
是虚拟机 (VM) 用于在状态转换函数 (STF) 期间访问外部数据的预图像数据存储,需要预先加载相关数据并利用特定于每个 VM 的基于密钥的检索方法。
PreimageOracle
。定义:这是一个 VM 状态序列,显示了从初始状态到最终状态的转换,表示 VM 从一个状态移动到下一个状态的过程。
图:‘争议游戏’可视化。
定义:断言给定指令处的输出根或 FPVM 的状态。
SPLIT_DEPTH
+ 1 处的执行轨迹子游戏从一个承诺两个连续输出根(块 n -> 块 n+1)之间的整个执行轨迹的声明开始。定义:锚定状态(或锚定输出根)是假定为有效的先前的输出根。
Initialization (初始化):
图:‘子游戏’可视化。
定义:子游戏是深度为 1 的有向无环图 (DAG),其中 DAG 的根是 Claim,子节点是反驳根的 Claim。这种结构代表了双方对单个信息的根本争议。
图:‘游戏树’可视化。
定义:一个位置的二叉树,DAG 中的每个声明都引用游戏树中的一个位置。
深度:
MAX_GAME_DEPTH
)(最大深度):预设为 FDG 实现,定义了游戏树的总深度。结构体:
MAX_GAME_DEPTH
(除非 d=0,在这种情况下只有 1 个位置)。定义:声明在游戏树中的位置由“广义索引”(gindex) 表示。
Generalized Index (gindex) (广义索引):
Calculation (计算):
定义:跟踪每个团队进行移动的总时间,类似于通过确保及时移动来防止延迟的国际象棋时钟。(FDG 实现的不可变预设。)
Functionality (功能):
CLOCK_EXTENSION
秒,则会给予其正好 CLOCK_EXTENSION
秒的时间。这有助于确保有足够的时间进行诚实的移动。MAX_GAME_DEPTH
💡 声明时钟是与欺诈争议游戏中每个声明关联的计时器,用于跟踪团队对该特定声明进行移动的时间。此时钟机制确保团队及时移动并防止游戏中的延迟。
CLOCK_EXTENSION
秒,则将获得正好 CLOCK_EXTENSION
\* 2 秒的时间。这段额外的时间允许完成必要的链下计算。Expiration (到期):
MAX_CLOCK_DURATION
秒,就无法再对声明进行移动,从而导致声明的时钟到期。💡 在最近对区块链安全机制的评估中,Offchain Labs 和 Optimism 之间的合作中发现了一些特定漏洞,尤其是在其欺诈证明系统中对计时器的管理。这些漏洞突出了在设计需要多方参与的系统时所面临的挑战,这可能会使计时器等关键要素的管理变得复杂。 更多详情。
Players (玩家):主要有两种类型的玩家:挑战者和防御者。
Moves (移动):玩家通过移动与游戏互动,这些移动是对现有声明的攻击或防御。每次移动都会以严格递增的深度向游戏树添加新的声明。一旦一项声明达到了 MAX_GAME_DEPTH
,质疑它的唯一方法是通过步骤。
图:‘攻击’可视化
Attack (攻击):当你不同意某一项声明时,为了质疑该声明而采取的行动。
- 攻击这一项声明会移动到节点 10 的新位置。
- 节点 10 中的这一项新声明会质疑节点 5 中的声明。
图:‘防御’可视化
Defense (防御):当你同意一项声明及其父项时,为了支持一项声明而采取的行动。
- 防御位置在节点 11 (5 + 1) 处。
- 承诺节点 11 轨迹范围的前半部分。
Bisection Process (二分过程):游戏通过迭代地二分有争议的状态范围来推进,直到争议缩小到单个 VM 指令步骤。
Step (步骤):与移动类似,有两种方法可以对声明进行步进:攻击或防御。这些步骤确定了 VM STF 的预状态输入和预期输出。
Attack Step (攻击步骤):通过提供预状态来挑战一项声明,证明一种无效的状态转换。
Defense Step (防御步骤):通过证明它是一项无效的攻击来挑战一项声明,从而防御有争议的父项的声明。
FDG Step Mechanics (FDG 步进机制)
在争议游戏的背景下,VM 状态转换依赖于 PreimageOracle
提供的外部数据。玩家必须事先提供此数据,以确保在争议解决过程中成功进行状态转换。
图:IFaultDisputeGame.sol (来源: github 链接)
Function (函数):addLocalData
PreimageOracle
中。Parameters (参数):
_ident
:要发布的本地数据的本地标识符。_execLeafIdx
:执行子游戏中需要本地数据进行步进的叶子声明的索引。_partOffset
:要发布的数据的偏移量。Data Identifiers (数据标识符):验证和处理争议期间的 VM 状态转换需要特定的数据。
1. 提案时父 L1 头哈希。
2. 启动输出根哈希(承诺块 # n)。
3. 有争议的输出根哈希(承诺块 # n + 1)。
4. 有争议的 L2 块号(块 # n + 1)。
5. L2 链 ID。
Submitting Preimages (提交预图像)
Steps for Large Preimage Proposals (大型预图像提案的步骤)
图:PreimageOracle.sol (来源: github 链接)
Function (函数):hashLeaf
Parameters (参数):
input
:输入的 136 字节块。blockIndex
:input
对应的块的索引。stateCommitment
:吸收和置换 input
后完整 5x5 状态矩阵的哈希。Anchor State Registry (锚定状态注册表):一旦游戏得到解决,最终状态就会报告给 Anchor State Registry。如果游戏解决结果有利于防御者,并且新状态比当前锚定状态更新,则注册表会更新锚定状态。
一旦发布完整的预图像和所有中间状态承诺,挑战期就开始了。在此期间,挑战者可以验证链上构建的 Merkle 树的完整性。以下是所涉及的步骤和过程的详细分解:
Steps (步骤):
1. 为商定的预状态叶子创建 Merkle 证明。
2. 为有争议的后状态叶子创建 Merkle 证明。
3. 计算商定的预状态下的状态矩阵。
Submission (提交):将所有生成的数据(包括 Merkle 证明和计算的状态矩阵)提交给 PreimageOracle
。此提交提供了链上验证所需的必要信息。
Validation (验证):
1. SHA3 排列执行:
2. Hash Comparison (哈希比较):
3. Finalization (最终确定):
💡 挑战者可以通过将指令标记为不正确来攻击该指令,也可以在不采取任何行动的情况下移动到下一条指令。
当挑战者在争议中到达底部叶子节点(低于 SPLIT_DEPTH)时,确定哈希状态是否正确或涉及特定过程:
争议游戏是 OP Stack 欺诈证明系统的一个至关重要且令人兴奋的组成部分,它为去中心化欺诈检测提供了创新的解决方案。它们的模块化设计和激励结构确保了公平和高效的争议解决,为 Superchain 生态系统中强大且可扩展的欺诈检测铺平了道路。
- 原文链接: medium.com/tokamak-netwo...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!