每 x 时间后运行 Solidity 代码

geo*_*o10 9 solidity erc20

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

Pet*_*jda 13

Solidity(或一般的 EVM 字节码)中没有本机延迟(睡眠,或任何等待一定时间的东西)功能。

\n
\n

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

\n

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

\n

JS 中的示例:

\n
function sendTx() {\n   myContract.methods.myFunction().send();\n};\n\nsetInterval('sendTx', 5 * 1000 *\xc2\xa060);\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
pragma solidity ^0.8;\n\ncontract MyContract {\n    uint256 lastRun;\n\n    function myFunction() external {\n        require(block.timestamp - lastRun > 5 minutes, 'Need to wait 5 minutes');\n\n        // TODO perform the action\n\n        lastRun = block.timestamp;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 赞赏。假设我希望我的代币去中心化,我不想自己调用这些函数。有没有行业公认的触发它们的方法? (7认同)
  • 您还可以在智能合约中建立一个赏金,允许任何人调用该函数,如果经过足够的时间,它将向调用者支付奖励,只要它有一点点利润,就可能有人会安装机器人它每 5 分钟收集一次赏金。使用该解决方案可能可以获得比 0.1 LINK 更便宜的价格。 (5认同)
  • 在我的回答中,有一些半去中心化的预言机服务与链下应用程序执行相同的操作。例如 [Chainlink Alarm Clock](https://docs.chain.link/docs/chainlink-alarm-clock/) - 您可以定义您的(合约)回调函数,将睡眠间隔重置为另外 5 分钟执行后。但每次调用(从 Chainlink 到您的合约)都会花费 0.1 LINK,这可能会导致维护成本高昂。 (4认同)