本文系我在Nethermind 公司博士实习期间的成果。在此特别感谢Nethermind 研究团队,尤其是Conor McMenamin和Lin Oshitani ,感谢他们对多稿提供的宝贵意见。
I. 状态锁:简介。
当提议者发出状态锁时,他们承诺用户的交易将能够访问一个或多个存储槽,并获取用户指定的精确值。通常,这些值是前一个区块末尾存储槽的值。提议者随后会安排交易顺序,以确保用户的交易能够看到承诺的存储槽值。直观地说,状态锁可以类比于区块顶部交易(Top-of-Block,简称 ToB)。第一个交易可以看到区块中其他任何交易都未触及的状态。状态锁赋予用户类似的权限,允许用户请求其交易查看前一个区块末尾某些存储槽的值,从而有效地确保对未触及状态的优先访问权。然而,与 ToB 交易不同的是,状态锁允许多个交易对同一区块中不相交的状态部分拥有优先访问权。
二、状态锁的预期逻辑演进。
步骤 1)用户向提议者发送状态锁定请求,指定状态快照 S。
- S 被指定为一组存储位置 L1…LN 及其对应的值 V1…VN。
- 请求中将同时指定预付小费和后付小费。
步骤 2)提议者对请求进行签名并将其返回给用户,从而承诺用户未来的交易将针对 S 执行。
- 提议者现在至少会收到预付小费。
步骤 3)用户收到 S 已锁定的确认信息。
步骤 4)用户在截止日期(到期日)之前的某个时间点发送后续交易 T。
步骤 5)提案人收到 T,并对交易列表进行排序,使 T 成为第一个接触 S 的交易。
- 在发布区块之前,提议者会模拟用户的交易,以确保它只触及 S。如果交易通过写入 S 之外的存储位置而“越界”,提议者会向用户提交证明和无效化合约(参见附录 A),并且不再因未包含 T 而受到惩罚。
步骤 6)提案人收到执行 T 对 S 的后付款。
- 即使 T 撤销,T 仍然会收到 postPayment。成功执行并非承诺的一部分。
三、可视化。

四、澄清说明。
1. 该提案启发式地假设当前 L1 区块提议者是状态锁定请求/授权的唯一处理者,但允许提议者将其权限委托给复杂的第三方,例如网关或中继。
2. 由于提议者可以为同一个区块授予多个状态锁,因此存在后续交易可能意外“越界”并发生重叠的风险。附录 A 讨论了意外重叠的问题以及一些缓解策略。
3. 预计对状态锁定的执行将包括对不当行为进行惩罚(例如,提议者收到后续交易但未能将其包含在内)。
4. 状态锁不包含执行后保证。
5. 提议者仅收取预付款(如果未收到后续付款)或后付款,而非两者兼收。例如,可以通过使用相同的随机数对预付款和后付款进行签名来实现互斥。
6. 用户无需发送后续交易。
五、应用案例。
1. 核心用例:普及区块顶部访问。
状态锁的核心应用场景是允许多个用户保证访问同一区块内未被修改的状态。目前,获取未修改状态的途径是竞标区块顶部(ToB)的包含权。由于排在第一位,ToB 交易实际上拥有对整个状态树的锁定。这种赢家通吃的机制存在诸多不足,其中一点我们已经提到:每个区块中只有一笔交易能够保证访问未修改的状态。
另一个问题是,无论谁赢得 ToB 收录权,都可能支付了超出实际需求的费用。一笔交易可能只需要访问特定的资金池,但用户却要付费才能有效地锁定状态根。而且,即便支付了如此高昂的费用,他们仍然无法获得 ToB 收录的保证。中标者和其他人一样,付费后只能等待,看看他们的交易最终会被收录到哪里。
状态锁定从根本上改变了这些动态:用户除了 ToB 包含之外还有更多选择,任意数量的用户都可以拥有优先访问权限,每个用户都可以只竞标他们感兴趣的状态部分,并且用户会收到一个可削减的承诺,表明相关的状态部分已被锁定。
2. 从核心用例中得出的两个具体例子。
由于状态锁的作用是确保对未修改状态的访问安全,因此其应用场景与用户希望将交易置于区块顶部的理由在很大程度上重合。虽然此类理由或应用场景有很多,但其中有两个尤其值得关注。
2.1 新的套利策略。
想要在区块顶部进行交易的主要原因之一是确保套利机会。虽然状态锁定的核心用途是让更多人有机会进行套利,但它也催生了新的交易策略。原因之一是后续交易赋予用户最大的选择权。在标准的中心交易所 (CEX) 和去中心化交易所 (DEX) 套利中,用户可以锁定 DEX 价格,并在到期前发送后续交易,根据需要调整交易以从价格偏差中获取最大收益。或者,如果价格意外收敛,用户可以选择不发送后续交易(但仍需支付预付款),从而避免潜在损失。
2.2 为低频用户保障重要交易。
虽然状态锁定主要面向专业交易员等高级用户,例如设计交易机器人的专业人士,但对于发送他们认为特别重要的交易的普通低频用户来说,它也有独特的用途。对于在去中心化交易所 (DEX) 上进行大额交易(对他们而言)或寻求优先获得 NFT 铸造权的用户来说,状态锁定可以提供至关重要的保障,确保他们的交易不会失败或被抢先交易抢先。
3. 预确认用例。
状态锁授权可以被视为对后续交易的一种预确认。一般来说,预确认的主要用途是提升用户体验,尤其是在 基于汇总的场景下。状态锁作为一种预确认方式,符合这一用途:状态锁能够确保用户的交易在快照中指定的条件下执行。此外,状态锁相较于其他类型的预确认方式也具有一些优势,使其拥有其他应用场景。
3.1. 比纳入预确认具有更严格保证的预确认。
通过预确认机制,用户只知道自己的交易最终会被打包进区块。而通过状态锁定机制,用户不仅知道交易会被打包,还能确切地知道交易将进入哪些状态。
3.2. 对于提议者/预协商者而言,状态锁定的风险比执行预确认的风险要小。
严格意义上的执行预确认涉及对特定执行后状态根的承诺。较为宽松的变体则涉及对状态差异或用户意图的较弱承诺。由于预确认方需要对执行后的结果负责,因此必然会承担因建模/仿真预测不完善而产生的事前风险(例如,错误的冷热假设、遗漏的预言机更新、遗漏的代码路径),尤其是在预确认方不拥有独占的块构建权限的情况下。相比之下,状态锁通过仅承诺执行前的条件来避免此类风险,从而有效地将所有事前风险转化为越界风险。
乍看之下,降低提议者风险似乎会增加用户风险。但实际情况更为微妙:提议者承诺预先状态条件,并通过越界筛选来强制执行这些条件,而用户则根据快照中指定的值模拟后续操作。借助足够强大的工具,用户可以像提议者/预协商程序一样精确地模拟针对快照的执行结果。然而,与预协商程序不同的是,用户无需为未模拟的结果支付惩罚,只需承担风险和 gas 费用。因此,通过将责任从状态后的结果转移到状态前的条件,状态锁可以在不显著增加用户风险的情况下降低提议者风险。
3.3. 为用户提供强有力的抢先交易保护的预先确认。
通过将状态锁定在上一个区块结束时的值,用户可以确保他们的交易是当前区块中第一个触及锁定状态的交易。这使得抢先交易几乎不可能,因为任何其他交易都无法在不违反状态锁定的情况下抢占后续交易。
4. 提高交易的燃气效率。
直观地说,锁定执行前的确切状态可以使事务行为更可预测。因此,事务更容易进行优化。一项关于 EIP-2930 访问列表事务的研究提供了一个具体的例子,说明了这种机制是如何运作的。
EIP-2930事务包含一个地址和存储密钥的访问列表,该列表在执行开始时会被“预热”,以便按照EIP-2929中规定的预热访问成本收取访问费用。根据该研究的作者所述,事务访问列表 (TAL) 的 gas 节省潜力主要受到区块内状态不确定性的制约:
“我们的分析表明,约有 71% 的交易可以通过包含理想的 TAL 而获益,但基于最后一个区块的状态,无法正确计算理想的 TAL。相反,它需要了解交易执行时所在的区块内状态,而这事先是未知的——这使得在这些情况下正确计算 TAL 几乎不可能。”(第 2 页)
通过锁定精确的执行前状态,状态锁使得计算理想的交易锁定列表 (TAL) 成为可能,该列表仅包含交易将要访问的所有存储键。尽管由于其他类型的错误(例如不必要地包含默认热地址(例如,收款人地址)),TAL 仍然可能存在缺陷,但要获得能够最大限度优化 gas 使用的完美 TAL,就需要知道精确的执行前状态。
5. 其他好处:减少内存池争用,降低返还率。
虽然 MEV-Boost 已经大幅减少了与优先 gas 拍卖相关的许多负面外部性,例如竞价战、垃圾信息充斥内存池以及被失败交易堵塞的区块,但状态锁定仍然可以通过减少内存池争用和降低回滚率来帮助使区块生产更加有序和高效。
5.1 减少内存池争用。
Flashbots 目前允许区块构建者公开诸如 mev_simBundle 之类的 API 端点,从而允许搜索者根据其最新的区块模板模拟区块包。通过公开一个新的 proposalr_getLockedStates 端点,提议者可以共享一个实时锁定状态列表,使理性用户有机会进行自我审查,从而减少公共内存池中的争用。然而,这种设计选择可能会带来隐私问题,因为它需要公开与未发布交易相关的信息(例如,潜在的套利目标)。
5.2 降低逆转率。
通过了解确切的执行前状态,钱包、dApp 和高级用户将能够以更高的准确度模拟交易,从而有助于防止因 gas 限制不足、储备值过期和外部调用失败等原因导致的交易回滚。
六、关键术语。
意外重叠:当事务未经授权访问状态锁定授权保留的某些状态时,就会发生意外重叠。
- 详见附录A。
域:EVM 持久状态中的可寻址存储位置,指定为集合 {A, K},其中 A 是合约地址,K 是 32 字节存储槽(密钥)。
域-值对:域 {A, K} 和值 V 的对,表示为 {{A, K}, V}}。
- 以 Uniswap V2 上的 WETH/USDC 资金池为例进行说明:
- 方块高度:22385280
- 域:{0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc, 0x…03}
- 值:{0x66304740000000000000000008d9350c2aac000000000124394c1432cced5400}
- 域值对:{{0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc,0x…03}, 0x66304740000000000000000008d9350c2aac000000000124394c1432cced5400}
到期日:强制纳入后续交易的最后期限。
- 过期时间设定了一个截止日期,在此之前,后续交易必须被接收,否则提议者将因未包含后续交易而被扣分。如果后续交易在过期时间之后到达,则提议者不会因未包含后续交易而被扣分。
后续交易:根据状态锁定授权发送的交易。
- 如果用户发送多个交易以包含在同一个区块中,并且其中一个是状态锁的后续交易,则后续交易将通过交易的 nonce 与状态锁请求中指定的 nonce 之间的匹配来确定。
越界访问:当后续事务写入状态锁定请求中未指定的域时。
权限集:后续交易需要访问的域的集合,取自快照。
例如,A 为合约地址,K 为存储槽位,V 为 K 的预留值:
- 快照:{{{A1,K1},V1}},{{A2,K2},V2}}}
- 权限集:{{A1, K1}, {A2, K2}}
直观地说,权限中的元素数量可以用来计算或衡量“多少”状态被锁定。
postPayment :用于完成状态锁定的优先费用。
postPayment 的金额计算中包含了 preTip。postPayment 实际上就是“全额”优先服务费:
postPayment = preTip + 包含后续交易的补偿
后续交易授权提案人收取后续付款。
preTip :向提案人支付的备用款项,包含在状态锁定请求中。
如果出现以下情况,preTip 将补偿提议者:(a)用户未能发送后续交易,或(b)后续交易因写入快照之外的域而越界(参见附录 A)。
状态锁定请求授权提案人收取预付款。
必须使 preTip 和 postPayment 互斥,例如,通过对两者使用相同的 nonce 进行签名。
快照:状态锁定请求指定的所有域值对的集合。
- 示意图示例:
- 单地址,单存储槽:{{A, K}, V}
- 单地址多存储槽:{{{A1, K1}, V1}, {{A1, K2}, V2}}}
- 多个地址,每个地址一个存储槽:{{{A1, K1}, V1}, {{A2, K2}, V2}}}
状态锁:一种可删除的承诺,用于确保事务针对快照指定的一组状态执行。
- 注意:锁定状态的概念本身并不包含对锁定状态执行交易的概念。用户可能出于恶意目的请求状态锁定,例如阻止他人进行交易。尽管如此,我们的用法是限定性的:根据我们的含义,“状态锁定”意味着承诺对锁定状态执行交易。
状态锁请求:请求状态锁的签名消息。
- 状态锁定请求将指定以下内容:(i) 快照,(ii) preTip,(iii) postPayment,(iv) 后续交易的 nonce,(v) 后续交易所在的区块,以及 (vi) 到期时间。用户将使用 EIP-712 等标准进行签名。
{
blockNumber:…,
snapShot:[(A1, K), (V1)…],
preTip:…,
postPayment:…,
expiry:…,
nonce:…,
}
状态锁定授权:一条签名消息,用于颁发状态锁定。
第七条 公平交换。
后续问题。
后续问题的核心在于,提议者可能批准了用户的状态锁定请求,却忽略了用户的后续交易,从而未能履行其承诺。需要澄清的是,后续问题与预确认及时公平交换的问题并不相同。预确认通过让预确认方向用户发送具有约束力的及时预确认来改善用户体验。因此,如果预确认未能及时发出,则违反了公平交换原则。其核心逻辑问题在于,考虑到延迟发送预确认的经济动机,如何确保预确认的及时发出。相比之下,后续问题并非在于确保及时性。相反,其核心逻辑挑战在于,如何确保提议者履行其承诺,将用户的后续交易包含在内(假设提议者及时收到了该交易)。
问:为什么提案人会忽略后续交易并放弃后续付款?
(A1)他们可能收到了更高的碰撞交易报价。
(A2)他们可能会不加区分地批准状态锁定请求,以便尽可能多地收集预提示。
该策略自然而然地只包含那些能带来最大后续收益的后续行动。
(A3)提案者可能只是在审查用户。
缓解策略。
(S-1)将小费分成预付和后付两部分已经为用户提供了一定的保障。(这种两部分小费的思路借鉴了卢班在其提议者承诺体系中解决公平交换问题的方法。)
预付金额越小,用户的风险就越低。但与此同时,提议者的风险也会相应增加。用户可能承诺支付大额的后续款项,但却未能履行承诺,这可能会导致提议者的机会成本损失。公平交易始终是双向的。
(S-2) 提议者每个域(即每个{A, S}对)仅允许授予一个状态锁。提议者仍然可以自由地包含针对已锁定域执行的非状态锁交易(包括预确认),只要这些交易是在该域不再被锁定之后(即在后续交易之后)执行的。
强制执行可以采取智能合约的形式,对向同一域发出多个状态锁的提议者处以罚款。
优点:由于提议者不能授予域上额外的锁,因此没有动机随意发出出价或接受小费更高的竞争状态锁请求。
缺点:提议者仍有可能忽略用户的后续交易,以便(a)审查用户或(b)接受更高的非状态锁定交易出价。
(S-3)将状态锁视为独占访问权限:只有用户的后续事务才有权修改其权限集 P 中的域。区块中的任何其他事务都不能写入 P 中的任何域(作为地址和存储键 {A, K} 的对)。
优点:保护用户免受 (i) 出价过高和 (ii) 为最大化预付小费而随意发放的影响。
缺点 1:这种保护的代价是限制了提议者添加针对 P 执行的其他交易的能力。
缺点 2:独家访问权限可能会使请求成本大幅增加。
缺点 3:提案人仍然可以通过忽略后续交易来进行审查。
这是一个始终如一的主题:防止纯粹的审查制度非常困难。
(S-4)交易证明委员会。
另一种方法是将后续交易发送给提案人和认证委员会。委员会的每位成员记录收到后续交易的时间,并将其告知其他成员。如果足够比例的委员会成员在到期前确认收到了后续交易,则提案人可能因未包含该交易而被扣分。
(S-5)通过可信中介进行路由。
使用可信中介机构而非委员会的主要优势在于无需在网络中传播认证信息。这能让用户有更多时间延迟发送后续交易。主要缺点是中心化以及引入了额外的信任机制。
(S-6)链上注册表中记录的提议者的信誉评分(信誉“惩罚”)。
最简单的情况下,注册表可用于记录提议方性能的原始数据,例如未完成后续交易的数量/百分比,但这并不一定意味着恶意行为。尽管存在这种局限性,注册表至少可以为风险评估提供一些依据。用户可能希望避免选择那些后续交易未完成率较高的提议方(或网关),无论其是否存在过错。注册表还可以用于设定最低可靠性要求。
及时性。
状态锁定机制通过将优先费用拆分为预付款(preTip)和后付款(postPayment),并以后续交易包含在内为条件,来激励及时公平的交易。在其他条件不变的情况下,用户越早收到已签署的状态锁定授权,后续交易的潜在价值就越大。因此,延迟发放状态锁定授权可能会导致用户价值损失。如果后续交易的价值损失过大,用户可能决定不发送该交易,而提议者则可能损失后付款。相反,用户越早收到状态锁定授权,就越有可能发送后续交易,因为其潜在价值更大。因此,及时发放状态锁定授权可以最大化用户和提议者的价值。
幽灵赠款。
如果出现以下两种情况之一:(a) 用户未能发送后续交易,或 (b) 后续交易超出范围(参见附录 A),则状态锁定请求会授权提议者收取预付金(尽管预期设计是预付金应由后付金替代/支付)。虽然这降低了提议者的风险,但也引入了一种新的途径,可能导致用户无法获得公平的交易。由于状态锁定请求授权支付预付金,恶意提议者无需发出承诺包含用户后续交易的状态锁定授权即可收取预付金。如果用户为从未发送的“幽灵”授权支付费用,则公平交易原则遭到破坏,因此,核心的逻辑挑战在于确保提议者不会为“幽灵”授权收取预付金。
用户可以选择冒险在未获得授权的情况下发送后续交易,但这既冒险又不公平,因为即使在最好的情况下,他们也需要为从未授予的状态锁定支付后续费用。更合理的选择是拒绝发送后续交易或提交常规交易。因此,尽管在技术上可以不获得状态锁定授权就发送后续交易,但这并不能确保交易的公平性。
更好的方案是利用第三方认证,让提案人将状态锁定授权同时发送给用户和认证委员会或可信中介机构。用户随后可以通过提交由第三方签署的“缺失授权见证”(missingGrantWitness)来证明公平交易遭到破坏,从而向退款合同(fundingContract)追回预付款并向提案人收取费用。另一种方案是要求提案人证明已及时发送状态锁定授权才能收取预付款。收取预付款需要同时包含授权书和第三方签署的“已发送授权见证”(sentGrantWitness),以证明授权书已及时发出。由于状态锁定请求不再授权收取预付款,因此必须以其他方式支付。一种方法是让用户向预付款支付合同(preTipPayment contract)存入资金。提案人随后可以通过向预付款支付合同提交授权书和“已发送授权见证”来收取预付款。
附录。
以下附录继续假设:(i) 当前 L1 提议者(或其代理人,例如网关)是状态锁请求/授权的唯一处理者;(ii) 状态锁授权涉及当前块 L1 状态树中基于地址/存储槽对定义的一组域。此范围假设旨在优先考虑简洁性和清晰度,但不可否认地牺牲了广度。因此,尽管状态锁可以被视为一种预确认机制,但许多细节可能无法直接应用于 L2 变体(例如,我们对“意外重叠”的定义依赖于 EVM 操作码语义)。
附录A:意外重叠问题
状态锁允许多个交易优先访问互不重叠的状态部分。但这项新功能也给提议者带来了额外的风险。由于用户在状态锁请求中不包含后续交易,提议者无法筛选掉漫游交易。他们必须“盲目”授予状态锁。如果某个后续交易意外触及了为其他交易保留的状态部分(即意外重叠),提议者可能会面临严厉的惩罚。
澄清“出界”和“意外重叠”的定义。
越界访问的最佳定义是:对事务权限集之外的域进行的任何写入操作(SSTORE)。重叠读取(SLOAD、BALANCE、外部调用视图函数)不会改变状态,因此可以视为无害重叠。通过这种方式定义“越界”访问,诸如重叠的 Oracle 查询之类的操作将不被视为越界访问。
越界访问:当状态锁事务 T 写入其权限集 P 中不存在的域 {A, K} 时,就会发生越界访问。
意外重叠:事务 T1 与事务 T2 意外重叠,当 T1 在 T2 之前执行,并且 T1 写入 T2 的权限集中的某个域 {A, K} 时,事务 T1 就会发生意外重叠。
防止意外重叠。
常规事务可能会与状态锁事务意外重叠。防止这种情况发生的最直接方法是优先处理状态锁事务。但状态锁之间的意外重叠问题却难以解决。本附录的其余部分将讨论一些缓解策略。
最小化策略 1:基于 EVM 的权限保护。
一种缓解意外重叠的方法是使用 EVM 内部的权限保护机制,通过回滚越界写入尝试来“强制”后续操作保持在各自的权限范围内。虽然可以使用类似原生预编译的机制直接在 EVM 中强制执行权限集,但这在目前的主网上并不实际。引入新的预编译地址需要正式的 EIP(以太坊集成提案)、协议级硬分叉、协调的以太坊客户端实现、审计以及生态系统工具。总的来说,开发、测试和社交协调方面的开销使得基于 EVM 的方法在短期内不可行。
最小化策略 2:链下模拟。
另一种方案是让提议者在链下模拟后续交易。如果提议者检测到意外重叠,他们可以生成一个越界证明并发送给用户,理想情况下,应留出足够的时间供用户修改后续交易。提议者也需要时间重新模拟。为了适应这种来回操作,应提前设置槽位的过期时间,并且需要设置第二个过期时间。如果用户在第二个过期时间之前未能返回“已修复”的后续交易,则可以将越界证明发送到无效合约。
链下模拟存在的问题。
虽然这种方法比原生预编译更可行,但也并非没有挑战。首先,提议者必须能够在不向用户公开交易列表的情况下,提供令人满意的越界证明。虽然在某些情况下可以做到这一点,例如包含不必要交易环节的交换,但这更像是例外而非普遍情况。其次,由于时间有限,很难确保后续修改交易的公平交换。第三,无效化合约需要处理提议者和用户之间关于越界证明的争议。
一些潜在/部分解决方案。
链下模拟策略面临的挑战不容小觑,但通过采取以下措施可以减轻这些挑战的难度:
1. 确认后续交易的最终结果。
考虑到后续交易是最终且不可修改的,消除了与修改和重新模拟相关的时序问题。由于无需修改/重新模拟,可以在区块发布后提交越界证明,这既无需设置第二个过期时间,也避免了因暴露未发布交易而产生的隐私问题。主要的缺点是降低了用户的选择余地。
2. 定义最佳实践。
一套针对用户和提案者的“最佳实践”指南有助于减少意外重叠。一种方法是为常见交易类型提供权限集中推荐的域数量。举个简单的例子,假设绝大多数简单的交换操作需要包含 2-4 个域的权限集。用户由此可以推断,简单的交换操作如果使用超过四个域,就会增加意外重叠的风险(或者更可能的是,工具会根据最佳实践建议进行设计)。
附录 B:前期模型。
后续交易最大限度地提高了用户的选择权,但代价是引入了与后续问题和防止意外重叠相关的设计挑战。然而,通过让用户将交易包含在状态锁定请求中,并将交易视为最终且不可修改,这些挑战可以很大程度上得到规避。这种设计的主要缺点包括选择权降低和更容易受到最大有效值(MEV)提取的影响。总的来说,这是一个对提案者更友好的模型。但其在设计简洁性方面的优势使其值得简要探讨。
前期模型中预期的逻辑发展。
步骤 1)用户发送状态锁定请求,其中包括(i)快照,(ii)交易,以及(iii)优先费用。
步骤 2)提案人收到请求,如果优先费定价合适,则模拟交易。
步骤 3)提案者返回确认消息,对用户的请求进行签名。
步骤 4)提案人将交易锁定到其区块模板中/将更新后的状态广播到网络。
步骤 5)用户收到确认消息,如果例如用户的交易针对错误的快照执行,则可以使用该消息来惩罚提议者。
将事务添加到状态锁定请求中。
状态锁定授权现在只使用单个Tip字段,没有过期时间,并且必须包含一个额外的txPayload字段:
{
blockNumber:…,
snapShot:[(address, storage slot), (value)…],
Tip:…,
nonce:…,
txPayload:…,
}
预付费模式的总体优势。
1. 设计更简单,活动部件更少。
与后续交易相关的公平交换问题以及解决这些问题所需的机制(例如认证委员会和到期日)均被消除。
2. 提案者可以在授予状态锁之前检查是否存在越界访问。
提案方的优势。
1. 通过明确用户的意图,提案者可以更好地绘制 MEV 机会空间。
2. 提议者可以更容易地在同一块内对同一域提供顺序状态锁。
3. 一次小费意味着用户不能通过不进行后续操作来避免支付后续付款/全额优先费用。
4. 只有一个小费可能意味着更简单的定价模式。
对提案人不利。
1. 减少选择权可能会降低状态锁定对用户的价值,并导致提案者的优先费用降低。
用户优势。
1. 更合理的定价:假设选择权减少和对 MEV 的敞口增加会降低状态锁定的价值,那么预期的结果就是优先级费用降低。
2. 消除了与后续交易相关的复杂情况:时间安排、纠纷等。
3. 如果顺序状态锁能够正常工作,用户将有更多选择。
对用户的不利影响。
1. 没有后续交易意味着选择较少。
2. 用户更容易受到 MEV 漏洞攻击。
3. 第 4 步涉及披露未公开的交易信息,这可能会引起隐私问题。
附录C:州锁欺诈和L1 ZK研究
状态锁与其他类型的提议者承诺的主要区别之一在于,状态锁关注的是执行前的条件,而非执行后的结果。这意味着,尽管有些反直觉,状态锁欺诈完全取决于后续交易执行之前发生的事情。因此,本附录的前半部分尝试通过介绍一些初步定义来阐明状态锁欺诈的本质。后半部分则进一步探讨了如何通过对状态锁欺诈证明的深入研究来服务于当前的 L1 zkEVM 研究。
国家封锁欺诈的两种定义。
基本上,看待状态锁定欺诈有两种不同的方式。第一种是“快照式欺诈”,第二种是“首次访问欺诈”。这两种欺诈方式反映了对状态锁定授权的两种不同理解。
根据第二种更严格的解释,状态锁定授权承诺用户的后续事务 T 将优先写入 T 的权限集 P 中指定的任何域。为清晰起见,我们称 T 为“优先”或拥有“优先访问权”。如果 T 回滚,并且后续事务优先写入 P 中的某个域,只要没有更早的事务写入 T 的任何域,“优先”承诺仍然有效。简而言之,我们的初步定义是:
首次访问欺诈。如果任何交易抢先写入由状态锁定交易保留的域,则会发生首次访问欺诈。
根据状态锁授权的第一种解释(这种解释略微宽松一些),不存在首次访问承诺。承诺是 T 将针对 T 的快照 S 中指定的一组域-值对执行操作。如果 T 针对 T 之前的状态根 Rpre 执行操作,而 Rpre 不包含 S(即,未能包含 S 指定的某些域-值对),则会发生快照欺诈。
首次访问欺诈和快照欺诈之间的区别不仅仅是概念上的,它在欺诈行为的举证方面具有实际意义。初步定义如下:
快照欺诈。如果对于某个状态锁定事务 T、域 D 和 32 字节值 V,T 的快照指定 D 在 T 之前的状态根 Rpre 中映射到 V,而 Rpre 使得 D 映射到某个值 V*,其中 V* ≠ V,则会发生快照欺诈。
为了证明快照欺诈,我们首先必须推导出 T 执行操作所针对的预 T 根 Rpre。然后可以使用 Merkle 包含证明来证明 D 在 Rpre 下映射到 V*(例如,通过使用账户级 MPT 路径到 storageRoot,然后再使用 MPT 路径到 storageRoot 下的 D(V*))。证明 D 在 Rpre 下映射到 V* 即可确定 T 实际上看到了 D(V*)。最后一步是证明 V* ≠ V,其中 V 取自签名状态锁授权。
为了证明首访问欺诈,必须证明存在另一笔交易 T*,它在交易 T 之前执行,并写入了 T 的某个域。这可以通过证明 T* 和 T 在区块的交易根 trie 树中的相对位置,并重新执行到执行轨迹中 T* 写入 T 的某个域的步骤来实现。与快照欺诈不同,无需推导出 T 执行所针对的 Rpre。如果 T 是第 10 笔交易,T* 是第 2 笔交易,那么证明首访问欺诈所需的步骤将比证明快照欺诈所需的步骤更少——后者必须推导出 T 之前每笔交易的结果。
我们对状态锁定欺诈的简要讨论必然会省略许多细节。例如,如果 T* 向 T 的某个域写入相同的值(空操作 SSTORE),则会发生首次访问欺诈,但不会发生快照欺诈。这或许可以解释为什么在评估处罚之前,需要同时发生这两种欺诈形式(或者将首次访问欺诈定义为“修改”而非“写入”保留域)。无论如何,我们的目的仅仅是阐明状态锁定欺诈的基本概念模型。
州级锁定欺诈证据如何为 L1 ZK 研究提供服务。
以太坊基金会认为,以太坊的最佳发展路径最终是在“技术栈的各个层面”实现零知识证明(ZK)。在此背景下,值得注意的是状态锁研究如何能够支持这些目标的实现。接下来,我们将探讨如何通过基于零知识证明的设计来解决状态锁纠纷:在链下重新执行执行轨迹,并在链上验证简洁的证明,从而避免协议内重新执行带来的高昂成本(尽管BAL机制有可能显著降低链上纠纷处理的成本效益)。
状态锁定欺诈证明具有创造独特研究机会的潜力。假设状态锁定欺诈证明永远不需要重新执行最后一个状态锁定交易之后的任何内容。基于提议者优先考虑状态锁定交易的顺序(即,提议者将其放在区块顶部)这一合理假设,欺诈证明只需处理完整区块的一小部分。相比之下,像Succinct Labs 的 SP1 Hypercube这样的系统则针对完整的 L1 区块,通常通过生成子区块证明然后聚合这些证明来实现。如果提议者将状态锁定交易放在区块顶部,争议只需证明一个早期切片或“前缀”,而不是整个区块,这使得欺诈证明电路比完整的 L1 zkEVM 证明电路小得多。
为了说明这一点,考虑前面提到的首次访问欺诈示例。如果越界交易 T* 是区块中的第二个交易,那么电路只会重新执行两个交易,并在见证中重建 T* 之前的中间根。更一般地,如果 T* 是第 i-* 个交易,那么首次访问欺诈证明电路会重新执行i 个交易,并重建i-1 个中间根。用完整区块 zkEVM 的术语来说,首次访问欺诈证明相当于证明一个较小的单个前缀,而不是整个区块,因为不需要对多个前缀进行递归聚合/组合。类似地,虽然快照欺诈证明通常比首次访问欺诈证明需要更多约束,但电路的大小仍然与单前缀证明相当。
由于状态锁欺诈证明电路规模小且目标明确,因此它可能为研究新型设备级优化方案提供实际机会。一种思路是构建一个原型电路,该电路将同一轮 Keccak 运算分批应用于多个独立的哈希运算(例如,RLP 编码的 MPT 节点、存储密钥派生),从而使证明者只需执行一个“更宽”的步骤即可代替多个“更窄”的步骤。状态锁天然适合这种轮次“融合”或轮次分批处理:由于越界筛选消除了依赖关系,状态锁本身就强制执行了并行运行多个哈希运算所需的独立性,而不会违反 EVM 顺序。这样做的好处是减少了电路的行数/步骤数,从而可以缩短证明时间,并可能减小证明文件的大小。虽然目前仍处于推测阶段,但哈希轮次“融合”是状态锁电路可以测试/验证的一个具体优化示例,其结果可以推广到 L1 哈希热点区域。
状态锁欺诈证明还可以作为一种“测试实验室”,用于衡量证明效率并生成有用的经验数据。由于“前缀”较短且涉及的槽位数量相对较少,该电路足够简单,可以暴露组件成本,例如每个打开槽位的时间、每个 MPT 路径的见证字节数等。在全块证明中,这些信号往往会与其他数据(例如,EC/KZG 数学运算、见证 I/O 和聚合)混合在一起,使得难以恢复每个组件的清晰数值。此外,状态锁欺诈证明可能足够小,可以在“自带”证明器硬件上运行,并允许收集有价值的经验数据,例如“自带”证明器的能耗/内存/GPU 配置。这样,状态锁欺诈证明研究可以通过提供细粒度的组件级测量来补充全块基准测试,这些测量可以使用小型证明进行估算,并外推到相关的全块工作负载分布(例如,SSTORE/SLOAD 打开)。
这里需要注意的是,惩罚机制应该会使状态锁欺诈极其罕见。即便如此,这并不意味着欺诈证明的请求也会很少。从用户的角度来看,意外的交易行为是触发欺诈证明请求的主要因素。鉴于状态锁只承诺执行前的条件,而非结果,意外行为可能并不罕见。假设实际欺诈远少于疑似欺诈,那么大多数欺诈证明的作用将与其名义上的目的相反:它们将作为“诚信”证明,确认没有发生欺诈行为。事实上,提案者有动力在收到请求时提供此类“诚信”证明,尤其是在第三方可以在链下进行非官方验证的情况下。及时有效地提供“诚信”证明的需求自然会激励相关研究和优化。
最后值得注意的是,本文提出的L1零知识证明研究的潜在益处并非状态锁所独有。任何需要欺诈证明来验证执行上下文/结果的执行预确认协议都将能够从中受益,并有可能推动L1零知识证明研究的发展。




