【问题标题】:Is there a way to ensure performUpkeep isn't called again before it finishes performing work?有没有办法确保 performUpkeep 在完成工作之前不再被调用?
【发布时间】:2021-11-04 03:31:44
【问题描述】:

我有一个调用 checkUpkeep 的 keeper 并且它返回 true,但是在 performUpkeep 中,导致 checkUpkeep 返回 false 的条件在从链下返回数据之前不会设置(这是 bc 我想确保如果某些失败的原因,checkUpkeep 将再次返回 true 以重试)

我将如何处理这个问题,以便在检索数据时不会再次调用 checkUpkeep,从而触发第二次 performUpkeep?

例如:

  function checkUpkeep(bytes calldata checkData)
    external
    view
    returns (bool upkeepNeeded, bytes memory performData)
  {
    require(revealed);
    require(round < 7);
    uint32 secondsInDay = 86_400;

    _getDateBeforeTimestamp(block.timestamp) >= latestDateChecked + secondsInDay
        ? upkeepNeeded = true
        : upkeepNeeded = false;
    performData = checkData;
  }

  function performUpkeep(bytes calldata /* performData */) external {
    requestVolumeData(); // latestDateChecked is updated once requestVolumeData successfully receives data offchain and calls fulfill function
  }

【问题讨论】:

    标签: chainlink


    【解决方案1】:

    我不确定你所担心的是否可能。

    在 EVM 中,事务要么成功,要么失败。没有等待或异步。或者可能发生了一些我还没有了解的链链接魔法(涉及不在同一个区块中发生的交易)。

    我的建议:使用 blocknumber (block.number) 创建一个额外的进入条件。这就是我用来让守门员调用函数的方法。一天一次。

        function checkUpkeep(bytes calldata checkData)
        external
        view
        returns (bool upkeepNeeded, bytes memory performData)
      {
        require(revealed);
        require(round < 7);
        **require(block.number >= lastUpkeepBlock + 10 )** //if you can afford artificial constraint
    
        uint32 secondsInDay = 86_400;
    
        _getDateBeforeTimestamp(block.timestamp) >= latestDateChecked + secondsInDay
            ? upkeepNeeded = true
            : upkeepNeeded = false;
        performData = checkData;
        
        **uint lastUpkeepBlock = block.number;**
        
      }
    
      function performUpkeep(bytes calldata /* performData */) external {
        requestVolumeData(); // latestDateChecked is updated once requestVolumeData successfully receives data offchain and calls fulfill function
      }
    

    或 OpenZeppelin 的 nonReentrant 修饰符。

    相关概念: Reentrancy Race condition

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      相关资源
      最近更新 更多