1

我从 Chainlink 文档 ( https://docs.chain.link/docs/large-responses/ ) 中获取了示例代码并对其进行了修改。我试图从一个 60 字节长的外部 API 中检索一个字符串。未修改的示例工作正常。我在 Kovan 测试网上运行代码。

  using Chainlink for Chainlink.Request;

  // variable bytes returned in a signle oracle response
  bytes public data;
  string public image_url;

  constructor() {
    setChainlinkToken(0xa36085F69e2889c224210F603D836748e7dC0088);
    setChainlinkOracle(0xc57B33452b4F7BB189bB5AfaE9cc4aBa1f7a4FD8);
  }

  function requestBytes(
  )
    public
  {
    bytes32 specId = "7a97ff8493ec406d90621b2531f9251a";
    uint256 payment = 100000000000000000;
    Chainlink.Request memory req = buildChainlinkRequest(specId, address(this), this.fulfillBytes.selector);
    req.add("get","--- ExampleApi---");
    req.add("path", "---ExamplePath---");
    requestOracleData(req, payment);
  }

  event RequestFulfilled(
    bytes32 indexed requestId,
    bytes indexed data
  );

  
  function fulfillBytes(
    bytes32 requestId,
    bytes memory bytesData
  )
    public
    recordChainlinkFulfillment(requestId)
  {
    emit RequestFulfilled(requestId, bytesData);
    data = bytesData;
    image_url = string(data);
  }

}

感谢 Etherscan,我知道,Oracle 收到了请求,但没有发送答案。我不确定为什么它不起作用。也许它与 jobId/specId 有关。

4

1 回答 1

1

此时的大响应查询无法转换字符串 -> 字节。

如果您运行该节点,您会看到以下错误:

insertEthTx failed while constructing EthTx data: can't convert String (UEsn31KH7GPNtXCdqw6iJrw5VkhFIXjPS6a7jAal1BQSKRM) to bytes, bytes should be 0x-prefixed hex strings: invalid abi encoding

这是因为“UEsn31KH7GPNtXCdqw6iJrw5VkhFIXjPS6a7jAal1BQSKRM”是一个字符串而不是字节对象。您必须将此 API 包装在一个 API 中,该 API 在将其返回链上之前将其转换为字符串 -> 字节对象。

于 2021-08-27T13:45:52.140 回答