Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-6968: 基于 EVM 的 L2 上的合约保障收入

基于 EVM 的 L2 上的合约保障收入

Authors Zak Cole <zak@numbergroup.xyz>, Zak Cole (@zscole), Kevin Owocki <kevin@supermodular.xyz>, lightclient (@lightclient)
Created 2023-05-01
Discussion Link https://ethereum-magicians.org/t/eip-6968-generalized-csr-protocol/14178

摘要

合约保障收入 (CSR) 允许智能合约开发者在用户与他们的智能合约交互时,声明一部分用户支付的所有交易费用。

此 EIP 提议在基于 EVM 的 L2 上引入 CSR,这将为部署在 L2 上的智能合约开发者提供收入来源和/或公共物品。

动机

使用 L1 的协议奖励来资助智能合约开发将是对当前市场运作方式的重大改变。此 EIP 主张对现有的以太坊 L1 进行任何更改。

此 EIP 确实主张 L2 可以开始试验合约保障收入,作为以下手段:

  1. 为智能合约开发者创造新的收入来源
  2. 创建一种新的公共物品资助方式
  3. 激励开发者在你的网络上部署他们的 dapps

规范

参数

常量
REVENUE_SHARE_QUOTIENT 5

费用机制

当前的 EIP-1559 费用行为被修改,使得每个 gas 的 header.base_fee_per_gas * REVENUE_SHARE_QUOTIENT 按照 gas 使用量比例重新分配给交易期间执行的每个合约。

隐含地,这意味着没有费用重新分配给外部拥有账户 (EOA)。

Gas 追踪

为了公平地分配费用收入,定义了一个新的交易范围内的 gas 追踪器。

在执行区块时,维护一个从 addressuint64 的映射 gas_used_by_address。这将追踪每个地址使用的 gas 量。对于每个不实例化新执行帧的 EVM 指令(例如 CALLCALLCODEDELEGATECALLSTATICCALLCREATECREATE2),将指令的成本添加到映射中地址的当前总和中。

对于确实实例化新帧的 EVM 指令,必须更加小心地确定指令对调用帧的成本。为简单起见,此成本定义为操作的总成本减去传递给子帧的 gas 量。传递给子帧的 gas 量通过 EIP-150 确定。计算出的成本将添加到映射中地址的当前总和中。

此外:

  • 如果地址在映射中不存在,则其总 gas 使用量为 0
  • 如果指令抛出 out-of-gas (OOG) 错误,则分配给执行帧的所有剩余 gas 都会添加到地址当前的总 gas 使用量中。
  • 没有其他异常停止会将剩余 gas 添加到发生停止的地址的计数器中。

设置收入接收者

收入接收者通过一个新的交易范围内的映射 revenue_recipient 来跟踪,该映射从 addressaddress。每个键的默认值是键本身。例如,除非另行设置,否则键 0xdead...beef 映射到值 0xdead...beef

要设置不同的收入接收者,引入了一个新的指令 SETREVENUERECIPIENT,其操作码为 0x49。该操作接受 1 个堆栈元素作为输入,并输出 0 个堆栈元素。

输入堆栈元素的最低有效 20 个字节是指令调用者的新收入接收者的地址。该 revenue_recipient 条目将更新以反映这一点。

该指令花费 3 gas。

分散收入

在交易完成后,对于 gas_used_by_address 中的每个元素(addrgas_used),将 revenue_recipient[addr] 的余额增加 gas_used * (header.base_fee_per_gas // REVENUE_SHARE_QUOTIENT)

理由

按比例追踪 Gas

一种更简单的机制是将全部交易收入发送到交易的 to 值。然而,这并不能准确地奖励许多不同智能合约和应用程序的组合。此外,它与智能合约钱包不兼容,根据定义,智能合约钱包通常是交易的第一个目的地。

维护交易范围内的 gas 使用量追踪器可以使收入分配给真正被最广泛使用的合约。

短暂的收入接收者映射

在每次交易期间临时构建收入接收者映射表面上看起来效率低下。预计此值相对静态,即使它确实需要更改,更改也可以由接收者合约促成。

不幸的是,这样的改变对于 EVM 来说更具侵入性。接收者值需要存储在某个地方。这将需要修改状态 trie 中的帐户结构。此外,需要设置接收者值。这将需要修改 CREATE* 操作码或新的操作码,类似于 SETREVENUERECIPIENT,它将由 initcode 调用以“初始化”接收者值。

安全考虑

增加最大区块大小/复杂性

与 EIP-1559 类似,我们必须考虑这将对区块大小产生的影响。根据实现此目的的方法,如果大量合约选择加入 CSR,则可能会增加最大区块大小。

版权

通过 CC0 放弃版权和相关权利。

Citation

Please cite this document as:

Zak Cole <zak@numbergroup.xyz>, Zak Cole (@zscole), Kevin Owocki <kevin@supermodular.xyz>, lightclient (@lightclient), "EIP-6968: 基于 EVM 的 L2 上的合约保障收入 [DRAFT]," Ethereum Improvement Proposals, no. 6968, May 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6968.