nodes - Chainlink 作业没有返回值
问题描述
我有一个预言机和 JobID,我想提交给预言机以获取 ETH 价格数据。我已经资助了该节点,并且正在关注文档。但是,每次我请求价格时,我的 BTC 值都不会更新。合同似乎是由 LINK 资助的,我没有收到 gas 错误,但由于某种原因,这个数字不会改变。到底是怎么回事?
solidity
pragma solidity ^0.6.0;
import "github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/ChainlinkClient.sol";
contract testingData is ChainlinkClient {
address public owner;
uint256 public btc;
address ORACLE = 0xB36d3709e22F7c708348E225b20b13eA546E6D9c;
bytes32 constant JOB = "f9528decb5c64044b6b4de54ca7ea63e";
uint256 constant private ORACLE_PAYMENT = 1 * LINK;
constructor() public {
setPublicChainlinkToken();
owner = msg.sender;
}
function getBTCPrice()
public
onlyOwner
{
Chainlink.Request memory req = buildChainlinkRequest(JOB, address(this), this.fulfill.selector);
req.add("get", "https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=BTC&to_currency=USD&apikey=xxxx");
string[] memory copyPath = new string[](2);
copyPath[0] = "Realtime Currency Exchange Rate";
copyPath[1] = "5. Exchange Rate";
sendChainlinkRequestTo(ORACLE, req, ORACLE_PAYMENT);
}
function fulfill(bytes32 _requestId, uint256 _price)
public
recordChainlinkFulfillment(_requestId)
{
btc = _price;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
}
解决方案
对于此特定问题,请执行以下操作:
您需要为您的工作添加一个乘法适配器。在您的getBTCPrice()
中,添加一行:
run.addInt("times", 100000000);
下面有一个完整的示例代码,但是这里有一些关于可能发生的事情的提示。
- 节点地址不是用 ETH 资助的——你必须联系节点运营商。
为您的 Chainlink 节点使用的以太坊地址提供资金。您可以在 Keys 选项卡下的节点 Operator GUI 中找到该地址。节点的地址是Regular类型。您可以从多个水龙头获得测试 ETH。
jobid 或 oracle 地址错误 - 请仔细检查。
节点当前已关闭 - 询问节点操作员。
您被列入黑名单或未列入白名单。联系节点运营商。
在solidity 中,小数不起作用,因此每当您从oracle 中获取带小数的数字时,您需要添加一个乘法适配器以便它可以理解。
完整代码如下:
solidity
pragma solidity ^0.6.0;
import "github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/ChainlinkClient.sol";
contract testingData is ChainlinkClient {
address public owner;
uint256 public btc;
address ORACLE = 0xB36d3709e22F7c708348E225b20b13eA546E6D9c;
bytes32 constant JOB = "f9528decb5c64044b6b4de54ca7ea63e";
uint256 constant private ORACLE_PAYMENT = 1 * LINK;
constructor() public {
setPublicChainlinkToken();
owner = msg.sender;
}
function getBTCPrice()
public
onlyOwner
{
Chainlink.Request memory req = buildChainlinkRequest(JOB, address(this), this.fulfill.selector);
req.add("get", "https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=BTC&to_currency=USD&apikey=xxxx");
string[] memory copyPath = new string[](2);
copyPath[0] = "Realtime Currency Exchange Rate";
copyPath[1] = "5. Exchange Rate";
sendChainlinkRequestTo(ORACLE, req, ORACLE_PAYMENT);
}
function fulfill(bytes32 _requestId, uint256 _price)
public
recordChainlinkFulfillment(_requestId)
{
btc = _price;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
}
推荐阅读
- json - 如何在 Django REST Framework 序列化程序中按字段类型对 ManyToMany 进行分类?
- c++ - StretchBlt 仅在我处于 Aero 模式时有效
- javascript - 为什么我的 ScrollMagic.JS 将元素的高度设置为 0?
- reactjs - 如何更改我的句柄更改并提交给减速器?
- linux - 将参数传递给带有空格的 KSH 脚本
- java - doOnNext() 不会被称为 Spring Webflux
- node.js - NodeJs - ETAG 无法按预期与节点一起工作
- laravel - 无法使用 Laravel 将私有文件上传到 s3 存储桶/文件夹
- javascript - 如何获取 JSON 响应的特定部分
- sql - camel-sql 问题(不同的 sql server 版本)