问题描述
我一直在学习 Chainlink API 并尝试构建一个简单的合约,该合约将对 API 进行外部调用,并根据来自 Oracle 的请求结果向用户收费。
例如,“如果 API 的结果为 true
,我们将向您收取 1 美元,如果结果为 false
,我们将向您收取 0.25 美元”
我在 Kovan 测试网上运行这个,合同由 LINK 资助。每次运行“requestCompletedData”函数时,交易都会成功。但是回调/履行功能永远不会运行。我已经通过各种方式检查过了。
作为参考,它应该基于来自 URL 的数据产生 completed == true
。
以下是 Chainlink 的 Kovan 测试节点的合约地址和作业 ID:https://docs.chain.link/docs/decentralized-oracles-ethereum-mainnet/
//
constructor() public {
setPublicChainlinkToken();
oracle = 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e;
jobId = "6d914edc36e14d6c880c9c55bda5bc04";
fee = 0.1 * 10 * 18; // 0.1 LINK
}
// Make Chainlink request
function requestCompletedData() public returns (bytes32 requestId) {
Chainlink.Request memory request = buildChainlinkRequest(jobId,address(this),this.fulfill.selector);
// URL for request
request.add("get","https://jsonplaceholder.typicode.com/todos/4");
// Path to the final needed data point in the JSON response
request.add("path","completed");
return sendChainlinkRequestTo(oracle,request,fee);
}
function fulfill(bytes32 _requestId,bool _completed) public recordChainlinkFulfillment(_requestId) {
validateChainlinkCallback(_requestId);
completed = _completed;
}
感谢您的帮助!
解决方法
删除 validateChainlinkCallback(_requestId)
方法中的 fulfill()
行,它会起作用。
function fulfill(bytes32 _requestId,bool _completed) public recordChainlinkFulfillment(_requestId) {
completed = _completed;
}
fulfill()
方法已经具有 recordChainlinkFulfillment
修饰符,它无论如何都运行与 validateChainlinkCallback(_requestId)
方法相同的验证。