You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Solidity中通过Chainlink从GET响应中获取两个变量

问题解决:Chainlink多字段提取返回0的原因及修复

核心问题

你直接重复调用req.add("path", "...")的方式是错误的——Chainlink的请求参数中,同名的add操作会覆盖之前的值,而非添加多个字段。同时你之前使用的jobId对应的Job大概率只支持提取单个数值,无法处理多路径,这才导致第二个字段返回0。

关键认知纠正

你对jobId的理解有误:jobId不仅指定返回值类型,它还对应Chainlink节点上预定义的Job逻辑——比如有的Job只处理单个JSON路径的数值提取,有的Job支持同时提取多个路径并返回多值。要提取两个uint256,必须使用支持多返回值的Job,并匹配对应的参数传递方式。

修复方案

1. 更换匹配的JobId

首先确认你使用的Chainlink节点有支持返回两个uint256的Job,获取对应的jobId替换掉原来的ca98366cc7314957b8c012c72f05aeeb。

2. 修改请求参数传递方式

对于支持多路径提取的Job,通常需要用不同的参数名传递多个路径(比如path1、path2),同时对应设置每个字段的倍数参数(比如times1、times2):

function request() public {
    // 替换为支持双uint256返回的JobId
    Chainlink.Request memory req = buildChainlinkRequest('YOUR_DOUBLE_UINT_JOB_ID', address(this), this.fulfill.selector);
    req.add(
        'get',
        'https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD'
    );
    // 用不同参数名传递两个路径
    req.add('path1', 'RAW,ETH,USD,VOLUME24HOUR');
    req.add('path2', 'RAW,ETH,USD,PRICE'); // 示例第二个字段(ETH/USD价格)
    // 对应每个字段的倍数处理
    req.addInt('times1', 10**18);
    req.addInt('times2', 10**18);
    sendChainlinkRequest(req, (1 * LINK_DIVISIBILITY) / 10);
}

3. 更新fulfill函数参数

对应的fulfill函数需要接收两个uint256参数,参数数量和类型必须和Job返回的一致:

uint256 public volume24h;
uint256 public ethPrice;

function fulfill(bytes32 requestId, uint256 volume, uint256 price) public recordChainlinkFulfillment(requestId) {
    volume24h = volume;
    ethPrice = price;
}

额外注意事项

  • 如果你的Chainlink节点没有现成的多值提取Job,需要自己在节点上创建对应的Job配置,明确指定要提取的多个路径、处理逻辑和返回值类型。
  • 测试时可以先单独验证第二个路径是否正确(比如单独用该路径请求单个值),确认路径无误后再整合多字段请求。

内容的提问来源于stack exchange,提问作者Ignat Kharlamov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:40:14