Solidity当前版本下Chainlink GET请求突然无法运行问题求助
报错根因
该报错是Chainlink v0.8 版本库的接口设计调整导致的:
- Chainlink v0.6 版本库默认将
add、addInt等方法绑定到了Chainlink.Request结构体上,可直接作为成员方法调用 - Chainlink v0.8 版本库将这些方法改为了独立的库函数,默认没有绑定到结构体实例上,直接调用
request.add()就会触发方法未找到的报错
修复方案(无需降级Solidity版本)
只需要对你的0.8.x版本代码做一处修改即可正常运行:
在合约定义开头添加库作用域声明,将Chainlink库方法绑定到Chainlink.Request结构体,原有调用逻辑不需要改动,编译即可通过。
修改后的完整代码如下:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.6; import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol"; contract APIConsumer is ChainlinkClient { // 新增这一行,绑定库方法到Request结构体 using Chainlink for Chainlink.Request; uint256 public volume; address private oracle; bytes32 private jobId; uint256 private fee; address public _link = 0xa36085F69e2889c224210F603D836748e7dC0088; constructor() { if (_link == address(0)) { setPublicChainlinkToken(); } else { setChainlinkToken(_link); } oracle = 0x56dd6586DB0D08c6Ce7B2f2805af28616E082455; jobId = "b6602d14e4734c49a5e1ce19d45a4632"; fee = 0.1 * 10 ** 18; // 0.1 LINK } function requestVolumeData() public returns (bytes32 requestId) { Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector); // Set the URL to perform the GET request on request.add("get", "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD"); request.add("path", "RAW.ETH.USD.VOLUME24HOUR"); int timesAmount = 10**18; request.addInt("times", timesAmount); // Sends the request return sendChainlinkRequestTo(oracle, request, fee); } function fulfill(bytes32 _requestId, uint256 _volume) public recordChainlinkFulfillment(_requestId) { volume = _volume; } }
如果你不想加using声明,也可以直接把调用写法改为库函数调用格式:
// 替换 request.add("get", "...") Chainlink.add(request, "get", "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD"); // 其余add、addInt方法都按上述格式修改即可
内容的提问来源于stack exchange,提问作者funnycoinmaster
相关产品推荐
相关产品推荐

