fault proof(错误证明),又名欺诈证明,或,交互游戏,其包含3大要素:
这3大要素可具有不同的实现,从而组合为不同的proof stacks,并为解决某争议贡献proof多样性。
程序及其单独指令的“无状态执行”是指通过使用Pre-image Oracle的authenticating输入来再现完全相同的计算。
Program(客户端)与 VM(服务端)之间的唯一通讯方式为:
二者通讯使用简单的request-response wire协议。具体见后面的Pre-image communication。
Program使用pre-image oracle来查询用户可以使用的任意输入数据:
pre-images以bytes32
type-prefixed key来表示:
其中requestleix you :
初始输入是确定性的,但不一定是单一的或全局的:可能同时存在多个不同的争议,每个争议都有自己的争议主张和L1上下文。
为了bootstrap,该program使用pre-image key type 1 来从VM请求初始输入。
VM知道外部上下文,并基于它们的类型映射所请求的pre-image keys,即type 1的local lookup或 type 2的global lookup,且可选地支持其他key类型。
客户端与服务端之间还有另一可选通讯方式:
hinting是可选的,为L1 VM实现中的no-op。
hint本身在链上的成本非常低:
hinting允许程序在生成链外证明时,指示VM其所感兴趣的数据。
VM可选择在任何时候执行所请求的hint:
hints不必直接执行:它们可能首先被记录下来以显示program的意图,最新的hint可能会被缓冲以供延迟执行,或者在只读模式下完全删除(如onchain链上)。
当pre-image oracle服务某请求,并且不能从现有的pre-images集合(如,某local pre-image缓存)服务时,VM可以执行该hint以检索丢失的pre-image(s)。该program有责任为每个pre-image请求提供足够的hinting。某些hints可能需要重复:在处理丢失的pre-image时,VM只需要执行最后一个hint。
注意,hint可以产生多个preimage:如,具有交易列表的以太坊区块的hint可为:
准备pre-image。
hinting是通过阻塞双向流上的request-acknowledgement协议实现的:
:=
:=
:= big-endian uint32 # length of
:= byte sequence
:= 1-byte zero value
ack通知客户端该hint已处理。服务端可能会异步回复hints和pre-image请求,因为这是分开的streams。为避免正在请求的pre-images暂未获取,客户端应在观察到该hint acknowledgement之后再请求该pre-image。
pre-images通过通过阻塞双向流上的最小wire-protocol来通信。该协议以阻塞读写系统调用来实现:
:= # the type-prefixed pre-image key
:=
:= big-endian uint64 # length of , note: uint64
其中:
Fault proof program:
op-program
是指该program的实现,基于op-node
和op-geth
来实现的。
该program主要包含:
program以2个主要输入来bootstrap:
bootstrapping,通过对program host的特殊输入请求来启动。
此外,还有隐含输入,这些输入源于上述主要输入,但可出于测试目的被覆盖:
dispute
属性来确定。
隐含输入依赖于L1-introspection,通过争议游戏接口在L1历史(直到指定的L1_head)中加载争议的属性。争议可能是claim本身,也可能是指向L1中特定先前claimed数据的指针,这取决于争议游戏接口。
在实际的核心状态转换函数执行之前,隐含的输入被加载到“prologue”中。在测试期间,可以使用加载重写的简化prologue。
注意:目前只支持test-prologue,因争议游戏接口正在积极更改。
为验证L2 state的某claim,program首先基于之前认可的L2历史,应用L1数据,重新生成L2 state。该流程称为L2派生过程,且匹配 rollup节点 和 L2 execution engine内的处理流程。
不同于通过RPC来获取输入并对disk应用状态变更,输入通过pre-image oracle加载,并在内存中累加状态变化。
以2个数据源来派生该执行:
当main-content生成了disputed L2 state,epilogue会对该disputed claim下结论。
program会生成二进制输出来验证该claim,使用标准的single-byte Unix exit-code:
fault proof VM实现:
fault proof VM依赖于fault proof program,来基于hints提供任意丢失pre-images的接口。
VM仿真该program,为目标架构VM准备,并通过VM CLI生成state-root或指令proof。
Fault proof VM有:
互动纠纷游戏允许参与者通过链上挑战响应游戏解决纠纷,该游戏将不一致的区块 n → n + 1 n\rightarrow n+1 n→n+1状态转换,然后基于为该状态转换建模的VM的executiont race,以证明单个VM trace步骤的基本情况为界。
游戏是多玩家的:不同的不结盟参与者可以在bond时参与。
响应时间是根据树分支中的剩余时间以及与claim的一致性来分配的。分配的响应时间受到争议游戏窗口的限制,当bond不足时,基于L1费用所需的任何额外时间都会发生变化。
注:计时、bond、一分为二争议游戏正在开发中。
[1] Optimism的Fault proof