本文提出了一种机制以将RIP-7560交易的验证与执行分开,从而简化区块构建过程,同时防止针对区块构建器的拒绝服务攻击。新机制通过定义BUNDLE_TRANSACTION_TYPE来组合AA交易包,确保所有验证框架先于执行框架执行,降低了构建区块时的计算复杂性,对现有智能合约的兼容性影响较小。
本提案为区块构建者提供了一种机制,用于在一组RIP-7560交易中将验证与执行隔离。 通过这样做,我们简化了用RIP-7560交易填充区块气体空间的任务,并防止了对区块构建者的潜在拒绝服务攻击。
在没有“交易内存池”(transaction mempool)这一传统意义上存在的“单排序器”第二层链上,本提案对原始RIP-7560没有任何好处。 然而,这对于依赖公共内存池进行区块构建的每个链来说,都是用于缓解拒绝服务攻击的必要措施。
在RIP-7560中定义的AA_TX_TYPE
交易类型,完全将协议层面的交易有效性与ECDSA签名或任何其他协议定义的规则分离,反而允许账户的EVM代码来决定交易的有效性。
然而,这种验证EVM代码可能受到块内任何可观察状态变化的影响。
在尝试包含一组AA_TX_TYPE
交易的区块构建者可能面临的挑战是,找到一种组合,使得这些交易不互相失效。
区块构建者必须在选择下一个交易之前执行一个交易的完整主体。 此外,在交易执行过程中施加任何限制是不可行的,而预期验证代码会受到区块构建者以ERC-7562等规则集的约束。
本文提出了一种机制,允许区块构建者指定一组AA_TX_TYPE
交易,这些交易由于其所有验证框架首先连续执行而保证能够一起适配,然后再执行各自的执行框架。
BUNDLE_TRANSACTION_TYPE = x
这些交易与普通的RIP-7560交易完全相同,唯一的例外是被组合成“AA交易包”。
钱包必须通过接受BUNDLE_TRANSACTION_TYPE
显式选择此功能,因为某些智能合约账户可能以依赖验证与执行阶段之间的原子性为前提而创建。
在AA交易包中,所有验证状态变化在所有执行变化之前应用。
使用AA交易填充区块对区块构建者来说不应是一个挑战。
但是,如果每个交易在其执行过程中可以更改影响其他交易有效性的任何状态,区块构建者将被迫在每次包含后重新验证内存池中的所有交易。
BUNDLE_TRANSACTION_TYPE
类型的交易缓解了构建包含AA_TX_TYPE
交易的区块所固有的计算复杂性。
使用BUNDLE_TRANSACTION_TYPE
交易时,所有的AA交易的验证框架都会首先运行,
而所有的执行框架将在此之后立即运行。
即使在RIP-7711中,BUNDLE_TRANSACTION_TYPE
交易包的验证框架也可能使同一包中的其他交易无效。
我们定义了一种机制,通过对内存池交易应用某些规则来防止交叉验证依赖,这些规则在ERC-7562中进行了详细描述。
这与ERC-4337用户操作内存池使用的机制是等价的。
选择不强制执行ERC-7562规则的构建者必须确保在将每个交易包含进入区块的位置时,对其进行中块状态的重新验证。 否则,所得区块很可能会变得无效。
以下是包含多个账户抽象交易的区块的可视化表示。 AA交易的验证部分作为独立交易执行,但在区块数据中并不作为独立交易表示。
包含多个RIP-7711原生账户抽象交易的区块结构
相比之下,使用RIP-7560交易的类似区块的示意图如下:
包含多个RIP-7560交易的区块结构
请注意,EVM中的某些行为依赖于交易上下文。这些行为为:
这些特性不会受到将交易分为多个框架的影响。 例如,一个框架中通过TSTORE设置的值将在下一个框架中保持可用,而不同的交易将在TSTORE插槽中保持独立的值。
SELFDESTRUCT
操作码的行为在交易执行上下文部分定义的规则的唯一例外是根据EIP-6780定义的SELFDESTRUCT
操作码的可用性。
使用SELFDESTRUCT
仅限于创建合约的同一框架内。
UNUSED_GAS_PENALTY = 10
对于未使用的callGasLimit
和paymasterPostOpGasLimit
的未使用气体,向交易的sender
或paymaster
收取UNUSED_GAS_PENALTY
百分比的罚款。
该罚款分别对执行框架和postPaymasterTransaction
应用。
未使用的气体通过以下方式计算对应的框架:
uint256 unusedGasExecution = executionGasLimit - gasUsedByExecution;
uint256 unusedExecutionGasPenalty = unusedGasExecution * UNUSED_GAS_PENALTY / 10;
请注意,unusedExecutionGasPenalty
在执行框架完成后立即添加到actualGasUsed
中,并在传递给postPaymasterTransaction
框架之前进行。
uint256 unusedGasPostOp = paymasterPostOpGasLimit - gasUsedByPostOp;
uint256 unusedPostOpGasPenalty = unusedGasPostOp * UNUSED_GAS_PENALTY / 10;
unusedPostOpGasPenalty
在postPaymasterTransaction
之后添加到actualGasUsed
。
使用validationGasLimit
、paymasterGasLimit
和callGasLimit
字段预留大量气体但未使用保留气体的BUNDLE_TRANSACTION_TYPE
类型交易,对区块构建者带来了挑战。这在交易的气体使用因其在区块中的位置而可能显著不同的情况下尤其困难,因为这类交易可能导致区块构建者在找到完全利用的区块之前多次迭代其算法。
允许交易指定不受限制的气体限制所产生的影响在下面的图表中显示:
虽然改变交易流程与以往的以太坊交易有所不同,实际上这一变化既非常有用,且并不复杂。
验证框架可以轻松地用气体限制和操作码禁令进行约束。 正确构建的交易包的整个验证部分因此可以保护不包含互斥交易。 构建区块的任务变得高效,并且可以并行处理而无拒绝服务攻击的风险。
对于EVM实现,验证框架几乎与独立交易的行为相同,因此实现此提案不会出现预期的困难。
RIP-7711事务的非原子流程需要智能合约账户开发人员的关注,以确保在验证和执行框架之间,账户不会处于不完整状态。
然而,由于ERC-4337对用户操作具有非常类似的执行流程,因此这已被视为账户抽象的性质,所有现有代码可能与RIP-7711兼容,只需进行一些小的修改。
在RIP-7560中指示账户不应期望验证和执行是原子的。 然而,钱包可能错误地假设在验证与执行阶段之间什么也不会发生。
在验证框架结束时存在的状态可能会在执行框架开始之前被无关的合约观察或修改。 智能合约账户开发人员的合约必须确保他们的代码不作出任何错误的假设。
版权及相关权利根据CC0放弃。
- 原文链接: github.com/ethereum/RIPs...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!