Chainlink 示例未更新值
Chainlink example not updating value
我正在按照 Chainlink documentation(也在下方)中的示例进行操作,并一直在混音中对其进行测试。我已经在 kovan 测试网上部署了合约并向其发送了 LINK,我能够执行 requestVolumeData() 并收到交易已完成的通知,并且我能够在 etherscan 上查看它。
但是,当检查音量值时,它总是 returns 0。我知道这可能需要一些时间,但等待 20 分钟后该值没有改变。
我已经使用以下 oracle 地址/作业 ID 进行了测试。
从例子
(0xc57B33452b4F7BB189bB5AfaE9cc4aBa1f7a4FD8 & d5270d1c311941d0b08bead21fea7747)
来自随附的 youtube 视频
(0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e & 29fa9aa13bf1468788b7cc4a500a45b8)
并来自 chainlink 市场(设置为 kovan 网络)。
(0xA1d76ABD287d87d6E1d92262F7D53Cbe4f290505 & fc3ea215bb9e44e088107b29bb495e2d)
我不确定哪里出了问题,我不认为是代码问题,因为它是从示例中复制粘贴的。但是没有一个地址有效。
pragma solidity ^0.8.7;
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol";
contract APIConsumer is ChainlinkClient {
using Chainlink for Chainlink.Request;
uint256 public volume;
address private oracle;
bytes32 private jobId;
uint256 private fee;
constructor() {
setPublicChainlinkToken();
oracle = 0xc57B33452b4F7BB189bB5AfaE9cc4aBa1f7a4FD8;
jobId = "d5270d1c311941d0b08bead21fea7747";
fee = 0.1 * 10 ** 18;
}
function requestVolumeData() public returns (bytes32 requestId) {
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
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);
return sendChainlinkRequestTo(oracle, request, fee);
}
function fulfill(bytes32 _requestId, uint256 _volume) public recordChainlinkFulfillment(_requestId) {
volume = _volume;
}
}
第 request.add("path", "RAW.ETH.USD.VOLUME24HOUR");
行应该是 request.add("path", "RAW,ETH,USD,VOLUME24HOUR");
(注意逗号而不是点)。
Chainlink 节点 1.0.0 及更高版本支持这种新的“基于逗号”的格式。 1.0.0 之前的 Chainlink 节点支持您在原始问题中提供的“基于点”的格式。
据我所知,官方文档已更新以包含此更改。
我正在按照 Chainlink documentation(也在下方)中的示例进行操作,并一直在混音中对其进行测试。我已经在 kovan 测试网上部署了合约并向其发送了 LINK,我能够执行 requestVolumeData() 并收到交易已完成的通知,并且我能够在 etherscan 上查看它。
但是,当检查音量值时,它总是 returns 0。我知道这可能需要一些时间,但等待 20 分钟后该值没有改变。
我已经使用以下 oracle 地址/作业 ID 进行了测试。 从例子 (0xc57B33452b4F7BB189bB5AfaE9cc4aBa1f7a4FD8 & d5270d1c311941d0b08bead21fea7747) 来自随附的 youtube 视频 (0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e & 29fa9aa13bf1468788b7cc4a500a45b8) 并来自 chainlink 市场(设置为 kovan 网络)。 (0xA1d76ABD287d87d6E1d92262F7D53Cbe4f290505 & fc3ea215bb9e44e088107b29bb495e2d)
我不确定哪里出了问题,我不认为是代码问题,因为它是从示例中复制粘贴的。但是没有一个地址有效。
pragma solidity ^0.8.7;
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol";
contract APIConsumer is ChainlinkClient {
using Chainlink for Chainlink.Request;
uint256 public volume;
address private oracle;
bytes32 private jobId;
uint256 private fee;
constructor() {
setPublicChainlinkToken();
oracle = 0xc57B33452b4F7BB189bB5AfaE9cc4aBa1f7a4FD8;
jobId = "d5270d1c311941d0b08bead21fea7747";
fee = 0.1 * 10 ** 18;
}
function requestVolumeData() public returns (bytes32 requestId) {
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
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);
return sendChainlinkRequestTo(oracle, request, fee);
}
function fulfill(bytes32 _requestId, uint256 _volume) public recordChainlinkFulfillment(_requestId) {
volume = _volume;
}
}
第 request.add("path", "RAW.ETH.USD.VOLUME24HOUR");
行应该是 request.add("path", "RAW,ETH,USD,VOLUME24HOUR");
(注意逗号而不是点)。
Chainlink 节点 1.0.0 及更高版本支持这种新的“基于逗号”的格式。 1.0.0 之前的 Chainlink 节点支持您在原始问题中提供的“基于点”的格式。
据我所知,官方文档已更新以包含此更改。