如何在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
相关产品推荐
相关产品推荐

