Alert Source Discuss
⚠️ Draft Standards Track: Core

EIP-7833: 计划函数调用

通过允许区块生产者自动调用智能合约的函数,赋予智能合约生命力。

Authors Keyvan Kambakhsh (@keyvank), Nobitex Labs <labs@nobitex.ir>
Created 2024-12-06
Discussion Link https://ethereum-magicians.org/t/eip-7833-scheduled-function-calls/21975

摘要

以太坊的智能合约允许用户将他们的资金控制权委托给代码,但这些合约需要外部触发才能执行。时间通常至关重要,而诸如网络延迟或区块生产者的恶意行为(如 MEV 攻击)等问题可能会阻止及时执行。为了应对这些挑战,此以太坊改进提案(EIP)引入了一个新的操作码 OFFERCALL,允许合约计划函数调用。当函数自我计划时,它们会表现出类似机器人的行为。这些计划的调用将向区块生产者提供 ETH,作为优先执行它们而不是手动提交的交易的激励。如果 offer 未被履行,则机器人将被停用,直到所有者手动重新启动它。该 EIP 提议强制执行计划调用作为区块有效性的要求。这可能有助于缓解 MEV 攻击,因为区块生产者将被迫执行区块链内中和市场操纵的机器人。

规范

通过递归地计划在下一个区块中调用同一个函数,可以为 EVM 函数添加类似机器人的行为。我们建议引入一个新的 EVM 操作码 OFFERCALL,顾名思义,它提供 ETH 以燃烧给下一个区块的区块生产者,以换取调用一个函数。这些 offer 由以太坊节点聚合和排序,只保留前 N 个 offer;所有其他的都会被丢弃。计划的调用必须在任何用户交易之前执行,执行顺序由它们在排序列表中的排名决定。提供的 ETH 会被烧毁,以防止区块生产者通过安排将提供的金额返还给自己的调用来利用该系统。

以下是使用 OFFERCALL 的 solidity 示例:

contract Bot {
    uint256 offerPerCall;
    
    constructor(uint256 _offer) {
        offerPerCall = _offer;
        
        // 使用初始调用 offer 启动机器人
        offercall(update, offerPerCall);
    }
    
    function setOffer(uint256 _offer) external {
        offerPerCall = _offer;
    }

    function update() external {
        // 执行计划的任务

        // 被调用者可以重新安排自己,以便
        // 引入类似机器人的行为。
        // 被调用者必须小心其 offer
        // 否则它可能会死亡。
        offercall(update, offerPerCall);
        
        // 一旦 offercall 失败,合约所有者
        // 可能必须通过调用 `setOffer` 来设置一个新的 offer
        // 然后再次调用 `update()` 函数。
    }
}

OFFERCALL 在两种情况下会失败:

  • 合约没有持有至少提供的 ETH 金额。
  • 提供的金额不足以排在前 N 个 offer 之内。

在自我计划函数的情况下,一旦 OFFERCALL 失败,机器人就会被停用。恢复它的唯一方法是合约所有者再次手动调用该函数,很可能以更高的 offer 调用。

理由

此以太坊改进提案(EIP)背后的理由源于需要增强以太坊网络上智能合约执行的可靠性和公平性。虽然以太坊的智能合约允许高度的可编程性和自动化,但这些合约的执行通常取决于外部触发因素,例如用户交易或网络状况。这种依赖性带来了重大的挑战,尤其是在时间至关重要的情况下,或者当区块生产者等恶意行为者可以利用该系统来获取利润时。

向后兼容性

此 EIP 中引入的新 OFFERCALL 操作码需要网络升级,因为它添加了以太坊虚拟机(EVM)当前不支持的新功能。此更改将影响智能合约如何计划和激励特定函数调用的执行,从而引入区块生产者必须适应的新机制。

参考实现

N/A

安全考虑

此 EIP 的主要担忧是它是否可能导致中心化,因为较富裕的用户可能会主导执行优先级。燃烧未履行的 offer 在一定程度上解决了这个问题,因为它阻止了无休止的 offer。

版权

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

Citation

Please cite this document as:

Keyvan Kambakhsh (@keyvank), Nobitex Labs <labs@nobitex.ir>, "EIP-7833: 计划函数调用 [DRAFT]," Ethereum Improvement Proposals, no. 7833, December 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7833.