在满足请求时在 Chainlink 节点上恢复交易

fpl*_*uis 1 solidity chainlink

我的 Chainlink 节点上的交易已恢复,我正在寻找一些有关如何调试它的提示。节点接收 Oracle 请求并且作业成功运行。我的履行功能很小:

function checkConditions(address _oracle, string memory _jobId) external {
    setPublicChainlinkToken();
    Chainlink.Request memory request = buildChainlinkRequest(
        stringToBytes32(_jobId),
        address(this),
        this.fulfill.selector
    );

    request.add("ytChannelId", "UCfpnY5NnBl-8L7SvICuYkYQ");
    sendChainlinkRequestTo(
        _oracle,
        request,
        1 * LINK_DIVISIBILITY
    );
}

event OnFulfill(uint256 _ytViews, uint256 _ytSubs);

function fulfill(
    bytes32 _requestId,
    uint256 _ytViews,
    uint256 _ytSubs
) public recordChainlinkFulfillment(_requestId) {
    emit OnFulfill(_ytViews, _ytSubs);
}
Run Code Online (Sandbox Code Playgroud)

我从这个github blob改编了作业规范,因为它是一个带有桥的多变量作业,这正是我的用例。我的 .toml 文件:

type = "directrequest"
schemaVersion = 1
name = "mysocialcontract-ea-job"
contractAddress = "0x2Db11F9E1d0a1cDc4e3F4C75B4c14f4a4a1a3518"
maxTaskDuration = "0s"
observationSource = """
    decode_log   [type="ethabidecodelog"
                  abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)"
                  data="$(jobRun.logData)"
                  topics="$(jobRun.logTopics)"]
    decodecbor  [type="cborparse" data="$(decode_log.data)"]
    fetch  [type="bridge" name="mysocialcontract" requestData="{\\"id\\": \\"0\\", \\"data\\": {\\"ytChannelId\\": $(decodecbor.ytChannelId)}}"]
    decode_log -> decodecbor -> fetch
    ytSubs    [type=jsonparse path="result,ytSubs"]
    ytViews    [type=jsonparse path="result,ytViews"]
    fetch -> ytSubs 
    fetch -> ytViews
    ytSubs -> encode_mwr
    ytViews -> encode_mwr
    encode_mwr [type=ethabiencode abi="(bytes32 _requestId, uint256 _ytViews, uint256 _ytSubs)"
            data="{\\"_requestId\\": $(decode_log.requestId),\\"_ytViews\\": $(ytViews),\\"_ytSubs\\": $(ytSubs)}"]
    encode_tx [type=ethabiencode
            abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)"
            data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_mwr)}"]
    submit [type=ethtx to="0x2Db11F9E1d0a1cDc4e3F4C75B4c14f4a4a1a3518" data="$(encode_tx)" gasLimit="5000000"]
    encode_mwr -> encode_tx -> submit
"""
Run Code Online (Sandbox Code Playgroud)

我运行的最后一次尝试之一的交易:https://kovan.etherscan.io/tx/0x2b58d0b9c6a6718817acbfb4cfb1bdcc893b28cedf111a8b5293473842a9a9c3

这是我的设置:

  • Chainlink 节点部署在 AWS 上。
  • 我自己的桥+外部适配器。
  • 一个小函数,用于使用硬编码值在 Remix IDE 上测试 Oracle。

fpl*_*uis 5

感谢 Chainlink Discord 上的一位用户,我成功地让多字请求正常工作。正如他所说,问题是我使用的是 Oracle.sol 合约而不是 Operator.sol 合约,然后在节点作业上调用“fulfillOracleRequest2”。问题出在合同上,而不是 .toml 工作上。事实上,我最终从节点作业中更改的唯一内容是预言机地址。

为了使合约正常工作,我刚刚改编了 chainlink 文档中的 MultiWordConsumer.sol 合约。我在 Chainlink 文档上找不到有关 Operator.sol 合约的太多信息,因此希望这能帮助那些面临与我相同问题的人:

  • 您已经部署了自己的 Operator.sol 合约实例。您可以在 Remix 中通过创建仅导入 Operator.sol 合约的合约来实现此目的: import "@chainlink/contracts/src/v0.7/Operator.sol";

  • 部署 Operator 合约后,您必须将节点设置为授权发送者。您可以通过使用节点地址调用“setAuthorizedSenders”来完成此操作,即[“0xb7 ...”]