Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-7775: BURN 操作码

一个用于在给定地址燃烧原生以太币的操作码

Authors Dev Bear (@itsdevbear)
Created 2024-09-30
Discussion Link https://ethereum-magicians.org/t/eip-7775-burn-opcode/21287

摘要

本提案引入了一个 BURN 操作码到 EVM。当调用时,该操作码将在当前 evm 上下文的地址处燃烧原生以太币。

动机

本提案的动机是提供一种标准化且高效的方式,在 EVM 中直接燃烧原生以太币。历史上,诸如 BeaconDepositContract 这样的合约通过使其无法从给定地址恢复来“燃烧”以太币。这种方法可能会导致混淆和潜在的误用。通过引入专用的 BURN 操作码,我们可以确保一种清晰且一致的燃烧原生以太币的方法。当以太坊 L2 将以太币转回 L1 时,这可能会变得有用,其他 EVM L1 链也可以利用它来实现其密码经济学。

规范

本文档中使用的关键词“必须 (MUST)”,“禁止 (MUST NOT)”,“需要 (REQUIRED)”,“应该 (SHALL)”,“不应该 (SHALL NOT)”,“推荐 (SHOULD)”,“不推荐 (SHOULD NOT)”,“可以 (MAY)”和“可选 (OPTIONAL)”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。

行为

引入 BURN 操作码 (0xFC),其行为如下:

  1. 从堆栈顶部弹出 1 个 32 字节的字,将这些字节视为要燃烧的原生以太币的 uint256 数量。
  2. 从 EVM 执行上下文中检索当前地址。
  3. 检查当前地址的余额。
  4. 如果要燃烧的数量大于当前地址的余额,则该操作码必须 (MUST) 回滚。
  5. 如果要燃烧的数量为 0,则执行不得 (MUST NOT) 回滚。
  6. 从当前地址的原生以太币余额中减去该数量。

BURN 在 DELEGATECALL 或 CALLCODE 的上下文中使用时,要操作其余额的合约是发出 DELEGATECALL 或 CALLCODE 指令的合约。

BURN 在 STATICCALL 的上下文中使用时,调用必须 (MUST) 回滚。

Gas 消耗

BURN 操作码的基本 gas 消耗为 100 gas。动态 gas 消耗确定如下:

  1. 如果要燃烧的值为 0,则动态 gas 消耗为 0。
  2. 如果帐户不存在,或者帐户的余额为 0,则动态 gas 消耗为 0。
  3. 否则,动态 gas 消耗为 2800。

BURN 操作码的总 gas 消耗是基本 gas 消耗和动态 gas 消耗的总和。

伪代码

BURN 操作码的伪代码示例:

def op_burn(pc, interpreter, scope):
    # 消耗基本 gas 费用
    interpreter.consume_gas(100)

    # 从堆栈中弹出要燃烧的值
    value_to_burn = scope.stack.pop()

    # 如果要燃烧的值为 0,则不回滚
    if value_to_burn == 0:
        return None

    # 从 EVM 执行上下文中检索当前地址
    current_address = scope.contract.address()

    # 检查当前地址的余额
    balance = interpreter.evm.state_db.get_balance(current_address)

    # 如果要燃烧的值大于余额,则回滚
    if value_to_burn > balance:
        return "ErrInsufficientBalance"
    
    # 如果帐户余额为 0,则返回。
    if balance == 0:
        return None

    # 从当前地址的余额中减去该值
    interpreter.evm.state_db.sub_balance(current_address, value_to_burn)
    
    # 此时已知该帐户存在,因此我们消耗“warm”gas。
    interpreter.consume_gas(2800)
    return None

理由

BURN 操作码的引入有助于清理以太坊中一些奇怪的语义。历史上,燃烧原生以太币涉及将它们发送到无法恢复的地址,例如零地址或没有提款功能的合约。这种方法不仅效率低下,而且还会使索引器和其他跟踪 Token 移动的工具感到困惑。通过提供专用的 BURN 操作码,我们消除了这种歧义,并确保燃烧 Token 的行为是明确和标准化的。

潜在的优点:

  • 提供了一种清晰且标准化的方法,用于在智能合约中燃烧原生以太币。
  • 允许在智能合约中更好地进行原生 Token 的会计核算。
  • 降低了被标记为“已烧毁”的原生 Token 被无意中恢复而导致的智能合约漏洞利用的可能性。

潜在的缺点:

  • 无法帮助移除存在于现有合约中无法恢复的以太币。
  • 客户端中的新代码
  • 需要向黄皮书中添加新概念。

向后兼容性

此 EIP 引入了一个新的操作码,因此必须通过计划的硬分叉激活。

测试用例

参考实现

安全考虑

  • 使用 DELEGATECALL 时,可能会导致滥用。

需要讨论。

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

Dev Bear (@itsdevbear), "EIP-7775: BURN 操作码 [DRAFT]," Ethereum Improvement Proposals, no. 7775, September 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7775.