每隔 X 时间运行 Solidity 代码

9

我正在创建一个开发应用程序,在其中每隔5分钟,我想从我的ERC20代币的智能合约中运行一些代码。如何在solidity中每隔5分钟调用该函数?

3个回答

12

Solidity(或一般的EVM字节码)中没有原生延迟(sleep或任何等待一定时间的函数)功能。


每个Solidity函数都作为事务的一部分执行。

因此,您可以在离线应用程序上设置计时器,每5分钟发送一个事务。请注意,在从应用程序发送事务和实际发布包含该事务的区块之间存在延迟(由矿工发布)。

JS示例:

function sendTx() {
   myContract.methods.myFunction().send();
};

setInterval('sendTx', 5 * 100060);

您还可以在Solidity中验证延迟,并仅在自上次操作以来经过5分钟后执行操作。

pragma solidity ^0.8;

contract MyContract {
    uint256 lastRun;

    function myFunction() external {
        require(block.timestamp - lastRun > 5 minutes, 'Need to wait 5 minutes');

        // TODO perform the action

        lastRun = block.timestamp;
    }
}

7
感激不尽。如果我想让我的代币去中心化,我不想亲自调用这些函数。有没有业界认可的方法来触发它们? - geo10
4
有半中心化的预言机服务可以完成我回答中离线应用程序所做的相同事情。例如Chainlink Alarm Clock - 您可以定义您(合约)的回调函数,以一种方式使其在执行后不断重置睡眠间隔为另外5分钟。但是每次调用(从Chainlink到您的合约)都需要花费0.1 LINK,这可能会变得昂贵并且难以维护。 - Petr Hejda
5
你也可以在智能合约中设置奖励机制,允许任何人调用函数,如果足够的时间已经过去,则向调用者支付奖励。只要有一点利润,可能就会有人每5分钟放置一个机器人来收集奖励。通过这种方法,可能会比0.1 LINK更便宜。 - Albert Renshaw

3
最好的方法是使用 Chainlink Keepers。它基本上作为一个 Cron 作业,在您配置的每个时间间隔执行给定合约中的函数。
然而,这可能会变得很昂贵,所以请确保您知道成本效益。或者,您可以部署到 Polygon 或其他 L2 上以最小化成本。

3

您可以使用Gelato在智能合约中安排函数调用。 https://www.gelato.network/ 这是一个非常有用的工具,它需要一个智能合约地址、一个函数名称和一个执行计划来执行您选择的任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接