繁体   English   中英

Chainlink 核心适配器路径问题:httpGet uint256 从 treasury.gov API 返回 0

[英]Chainlink Core Adapter Path Issue: httpGet uint256 returning 0 from treasury.gov API

我正在尝试使用 Chainlink 连接到 API 以从以下请求中的 URL 获取 uint。 问题是,每次“音量”值回到 0 时。我感觉问题是以下两件事之一:

  1. oracle 不喜欢访问 arrays。 我试过“data[0]”和“data.0”。 两者都适用于文档页面上的jsonPath
  2. API 返回的是字符串而不是数字(因为数字包含在引号中)。 我也尝试了 bytes32 工作,只返回 0x0。 其他 StackOverflow 帖子也显示预言机将字符串数字读取为数字。

以下代码片段是对 Chainlink 文档中显示的“重新混合部署”代码所做的唯一更改: https://docs.chain.link/docs/make-a-http-get-request

request.add("get", "https://api.fiscaldata.treasury.gov/services/api/fiscal_service/v2/accounting/od/avg_interest_rates?sort=-record_date");

request.add("path", "data.0.avg_interest_rate_amt");

这些合约正在通过 Remix/Metamask 部署在 Kovan 上,并有大量的链接为合约提供资金。 我可能做错了什么?

有几个问题:

  1. 响应太大,因此节点仅在HttpGet任务处停止。 我已经在我的节点上对其进行了测试,这是我得到的确切错误: HTTP response too large, must be less than 32768 bytes 如果你能影响到这一点,那就太好了。 否则,您需要拥有自己的节点,该节点将返回符合上述限制的较短响应。

  2. 结果应该只有整数,Solidity 不理解小数点,而是使用 WEI。 这就是为什么你需要将结果乘以至少 100,10^18 是一个标准,所以我会用它 go 。 以下部分应该适合您:

    function requestData(string memory _id, string memory _field) public {
        Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfillData.selector);
        request.add("get", "https://api.fiscaldata.treasury.gov/services/api/fiscal_service/v2/accounting/od/avg_interest_rates?sort=-record_date");
        string[] memory path = new string[](3);
        path[0] = "data";
        path[1] = _id;
        path[2] = _field;
        request.addStringArray("path", path);
        int timesAmount = 10**18;
        request.addInt("times", timesAmount);
        sendChainlinkRequestTo(oracle, request, fee);
    }

我还将_id_field添加为 function arguments 以查询任何 object 的任何字段。 请注意,这只有在您能弄清楚如何获得更短的响应时才有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM