【问题标题】:Chainlink Keeper not performing upkeepChainlink Keeper 不进行维护
【发布时间】:2021-12-08 14:26:10
【问题描述】:

我有一份使用 Chainlink 管理员进行维护的合同,但 checkUpKeep/performUpkeep 没有运行。我已经为维护提供了足够的资金,以确保它有很高的余额。合约中的代码之前已部署,但现在包含一个小改动(在 Chainlink 函数之外),并且之前的合约正在接受维护。我的 checkUpKeep 和 performUpKeep 代码如下:

function **checkUpkeep**(bytes calldata /* checkData */) external view override returns (bool upkeepNeeded, bytes memory /* performData */) {
    if(lottery_state == LOTTERY_STATE.OPEN){
        upkeepNeeded = (block.timestamp - lastTimeStamp) >= duration;
    }
    else{
        upkeepNeeded = false;
    }
  }

function **performUpkeep**(bytes calldata /* performData */) external override {
    require(msg.sender == 0x4Cb093f226983713164A62138C3F718A5b595F73);
    lottery_state = LOTTERY_STATE.DRAWING;
    Random(random).getRandomNumber();
  }

正如我之前提到的,这段代码正在另一个正在接受维护的合同中使用,所以我很困惑为什么它在新合同中不起作用。

【问题讨论】:

  • 工作合同是否也有此require 声明?这是在 Kovan 测试网上,对吧?
  • 是的,工作合同有同样的require声明。它是 keeper 注册表的地址。是的,它在 Kovan 测试网上。
  • 谢谢。您可以添加与此合同关联的已注册 upKeep 的链接吗?
  • 当然。给你:keepers.chain.link/kovan/1877
  • 不幸的是,我无法调试它,因为您的智能合约没有在 Etherscan 上验证。您已成功注册维护,已获得资金,可通过注册表合同进行验证。考虑仔细检查这些细微的变化,因为这个问题有解决方案。从这里提供的代码sn-p,我只能说lottery state没有打开或者duration大于(block.timestamp - lastTimeStamp)

标签: chainlink


【解决方案1】:

如果您的维护没有进行,请务必仔细检查以下项目:

  • Chainlink Keepers 目前在您要部署到的网络上可用吗?
  • 你的智能合约是KeeperCompatible吗?
  • 致电checkUpkeep。是返回true 还是false
  • 你能performUpkeep吗?
  • 您是否注册了维护合同?
  • 你资助了吗?

【讨论】:

  • 我已经完成了您列出的所有建议,除了调用checkUpkeep 以查看它是否返回真假和performUpkeep。我无法测试performUpkeep' as the function can only be called by the keeper registry address for security reasons. However, I have difficulty testing checkUpkeep`,因为该函数需要bytes 参数。即使我将其注释掉,它在调用或失败时仍然需要它。无论我尝试将什么作为bytes 的输入传递给它,它都不接受它并且仍然失败。
猜你喜欢
  • 2021-09-13
  • 1970-01-01
  • 2022-11-12
  • 2022-08-18
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多