Звено цепи — Задание не выполняется

#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.