#blockchain #ethereum #solidity #smartcontracts #chainlink
Вопрос:
Я изучал API Chainlink и пытался создать простой контракт, который будет выполнять внешний вызов API и взимать плату с пользователя на основе результата запроса от Oracle.
Например, «Мы будем взимать с вас 1 доллар, если API приведет к true
и 0,25 доллара, если это приведет к false
»
Я запускаю это в тестовой сети Kovan, контракт финансируется с помощью LINK. Транзакция выполняется успешно каждый раз, когда я запускаю функцию «requestCompletedData». Но функция обратного вызова/выполнения никогда не запускается. Я проверял это различными способами.
Для справки, результат должен completed == true
основываться на данных из URL-адреса.
Вот адрес контракта и идентификатор задания для тестовых узлов Chainlink Kovan: 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;
}
Спасибо вам за вашу помощь!
Ответ №1:
Удалите validateChainlinkCallback(_requestId)
строку в своем fulfill()
методе, и он будет работать.
function fulfill(bytes32 _requestId, bool _completed) public recordChainlinkFulfillment(_requestId) {
completed = _completed;
}
В fulfill()
методе уже есть recordChainlinkFulfillment
модификатор, который в любом случае выполняет ту же проверку, validateChainlinkCallback(_requestId)
что и метод.
Ссылка: Исходный код ChainlinkClient.