Chainlink 请求未满足

问题描述 投票:0回答:1

我正在尝试设置本地 Chainlink 节点来执行任务。请求正在正确执行,但由于未保存获取的数据,因此似乎未调用执行函数。

task list

即使最后一步被标记为暂停(我不知道这是否是我的问题的原因)。下一次执行代码后,它就完成了。我尝试将 minIncomingConfirmations 设置为 0,但它不断被覆盖为 1:

last task

这是执行请求的智能合约部分:

    function reEncryptData(
        string memory reEncryptionKey,
        string memory _encryptedData
    ) public returns (bytes32) {
        Chainlink.Request memory request = buildOperatorRequest(
            jobId,
            this.fulfillReEncryption.selector
        );
        request.add("reEncryptionKey", reEncryptionKey);
        request.add("encryptedData", _encryptedData);
        return sendOperatorRequest(request, fee);
    }

    function fulfillReEncryption(
        bytes32 requestId,
        bytes memory _data
    ) public recordChainlinkFulfillment(requestId) {
        reEncryptedData = string(_data);
    }

这是我工作的 .toml:

type = "directrequest"
schemaVersion = 1
name = "Re-Encrypt Data"
contractAddress = "0xC1CD77E8cd5FB78898815952117Aca334fe573cd"
maxTaskDuration = "0s"
minIncomingConfirmations = "0"
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)"]

    decode_cbor  [type=cborparse data="$(decode_log.data)"]
    fetch        [type=bridge name="re-encrypt" requestData="{\\"id\\": $(jobSpec.externalJobID), \\"data\\": { \\"encryptedData\\": $(decode_cbor.encryptedData), \\"reEncryptionKey\\": $(decode_cbor.reEncryptionKey)}}"]
    parse        [type=jsonparse path="data,reEncryptedData" data="$(fetch)"]
    encode_large [type=ethabiencode abi="(bytes32 requestId, bytes _data)" data="{\\"requestId\\": $(decode_log.requestId), \\"_data\\": $(parse) }"]
    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_large)}"
                 ]
    submit_tx    [type=ethtx to="0xC1CD77E8cd5FB78898815952117Aca334fe573cd" data="$(encode_tx)"]

    decode_log -> decode_cbor -> fetch -> parse -> encode_large -> encode_tx -> submit_tx
"""

这是调用智能合约功能的代码:

  await (
    await reEncryption
      .connect(dataSubject)
      .reEncryptData(
        "d48065aceb01496e1e4f8f74c7b68422ba16e1de7c80a9e927683f30c42b150804d505e4835912f719e96fd27f8e42345aa757070f5fa083974f5fb82fd384b4bdc74dbd75b6a60c68108d97e4c8dcd02c12a7d5552e28df3a7af366bb05b86ace",
        "eyJrZXkiOiIwNGU5MjcwMzhiMjFjMDJhZDI2MmUxZmMwNmY4YmU0NTFiYmUyODU0Y2FmZGNmMDg4YzY5NDBjNTUzMjI4M2E3OTE5NTY1NDU0N2ZjZmQ2Yzg1OWJiZWQ2NmNlZmNlN2FkOTUyMDhkNmI5MjNkNjVkYjRmNTQyYWEwYTI3M2VmY2U1MDRmMTE4NmRkYzMxMjZhYWMwNGJhZWNlN2I5NDA4YzkwMDVkY2Q2MjJhYTlkY2E4YjU4NDg1MmI0NjU0MzAyNzMwM2U4NjA2MWRlNTNmYjcxNzk1NTAzZjNiYzRiNDMyNTJhNWFiODRiZDE2YmZkN2M4ZjYzZWRmMWM1ODIzZjVlZDNlYzg3OGJmNGY0ZTAzMmYxN2NiNWI5Y2RlOWU1YzMwN2U5NzI4ZjJmYzBhMWUwNGM2NzA2MDRjM2MyM2Q1NWIiLCJjaXBoZXIiOiJlcGtLVU1abEU1Q29Ucm1RbUUydkFRPT0ifQ=="
      )
  ).wait();

我不明白我做错了什么,但我希望你能帮助我。谢谢!

我有:

  • 使用的操作员.sol
  • 通过 LINK 为该智能合约和运营商智能合约提供资金
  • 用 ETH 和 LINK 资助预言机节点
  • 向 setAuthorizedSenders 添加了 oracle 节点地址
solidity hardhat chainlink ganache
1个回答
0
投票

您是否使用区块浏览器检查过您的预言机(运营商)合约中的相关交易?由于您没有发布交易链接,我们必须在这里进行一些猜测:

  • 如果交易不存在(即 Chainlink 节点没有生成任何履行交易),则您的 Chainlink 节点存在问题,并且需要使用节点 GUI 或文件系统日志来调试作业运行。

  • 如果交易确实存在,请检查是否有任何错误代码。这里常见的一个是

    out of gas
    ,这意味着
    fulfillReEncryption
    函数中返回的预言机值和/或合约逻辑超出了节点每个请求允许花费的 Gas 量(通常默认为 500,000)。要解决此问题,您需要在节点(全局)或作业级别调整此值,减少响应中发送的数据量,或简化您的
    fulfillReEncryption
    逻辑。如果您没有看到
    out of gas
    错误,但确实看到交易出现一般性故障,则您的
    fulfillReEncryption
    函数逻辑中可能存在编码错误。仔细检查您的逻辑并重试。

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.