【问题标题】:run solidity code after every x amount of time每x时间后运行solidity代码
【发布时间】:2021-09-02 13:04:18
【问题描述】:

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

【问题讨论】:

    标签: solidity erc20


    【解决方案1】:

    Solidity(或一般的 EVM 字节码)中没有原生延迟(睡眠或任何等待一段时间)功能。


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

    因此,您可以在链下应用上设置计时器,每 5 分钟发送一次交易。请注意,从您的应用发送交易与实际发布包含该交易的区块(由矿工)之间存在延迟。

    JS 中的示例:

    function sendTx() {
       myContract.methods.myFunction().send();
    };
    
    setInterval('sendTx', 5 * 1000 * 60);
    

    您还可以在 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;
        }
    }
    

    【讨论】:

    • 赞赏。假设我希望我的代币去中心化,我不想自己调用这些函数。是否有任何行业公认的触发方式?
    • 在我的回答中,有一些半去中心化的预言机服务与链下应用程序做同样的事情。例如Chainlink Alarm Clock - 你可以定义你的(合约)回调函数,在它执行后将睡眠间隔重新设置为另外 5 分钟。但是每次调用(从 Chainlink 到你的合约)都需要 0.1 LINK,这可能会变得很昂贵。
    • 你也可以在智能合约中建立一个赏金,允许任何人调用该函数,如果足够的时间过去了,它将向调用者支付奖励,只要它稍微有利可图。可能是在其上放置一个机器人以每 5 分钟收集一次赏金的人。使用该解决方案可能会比 0.1 LINK 便宜。
    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多