Запрос на получение API Chainlink не возвращает значение

#chainlink

Вопрос:

Я создаю следующий смарт — контракт. Он делает запрос по цепочке, который не возвращает значение из API. Я использую следующий [JobID][1] и этот [узел][2], но узел не запускает задание, и я не знаю, почему. Я проверил, что у узла есть баланс токенов ССЫЛОК, но у него их нет, и я не знаю, как отправить баланс на узел контракта.

Я использую тестовую сеть Kovan, чтобы попробовать смарт-контракт. Не могли бы вы сказать мне что-нибудь, что я мог бы попробовать?

 // This example code is designed to quickly deploy an example contract using Remix.

pragma solidity ^0.6.0;

import "@chainlink/contracts/src/v0.6/ChainlinkClient.sol";

contract APIConsumer is ChainlinkClient {
  
    uint256 public volume;
    
    address private oracle;
    bytes32 private jobId;
    uint256 private fee;
    
    /**
     * Network: Kovan
     * Chainlink - 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e
     * Chainlink - 29fa9aa13bf1468788b7cc4a500a45b8
     * Fee: 0.1 LINK
     */
    constructor() public {
        setPublicChainlinkToken();
        oracle = 0x56dd6586DB0D08c6Ce7B2f2805af28616E082455;
        jobId = "b6602d14e4734c49a5e1ce19d45a4632";
        fee = 0.1 * 10 ** 18; // 0.1 LINK
    }
    
    /**
     * Create a Chainlink request to retrieve API response, find the target
     * data, then multiply by 1000000000000000000 (to remove decimal places from data).
     ************************************************************************************
     *                                    STOP!                                         * 
     *         THIS FUNCTION WILL FAIL IF THIS CONTRACT DOES NOT OWN LINK               *
     *         ----------------------------------------------------------               *
     *         Learn how to obtain testnet LINK and fund this contract:                 *
     *         ------- https://docs.chain.link/docs/acquire-link --------               *
     *         ---- https://docs.chain.link/docs/fund-your-contract -----               *
     *                                                                                  *
     ************************************************************************************/
    function requestVolumeData() public returns (bytes32 requestId) {
        
        Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
        
        // Set the URL to perform the GET request on
        request.add("get", "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETHamp;tsyms=USD");
    
        // Set the path to find the desired data in the API response, where the response format is:
        // {"RAW":
        //      {"ETH":
        //          {"USD":
        //              {
        //                  ...,
        //                  "VOLUME24HOUR": xxx.xxx,
        //                  ...
        //              }
        //          }
        //      }
        //  }
    
        request.add("path", "RAW.ETH.USD.VOLUME24HOUR");
        //request.add("path", "data.0.Myvalue");

        // Multiply the result by 1000000000000000000 to remove decimals
        // Multiply the result by 1000000000000000000 to remove decimals
        int timesAmount = 10**18;
        request.addInt("times", timesAmount);        
        // Sends the request
        return sendChainlinkRequestTo(oracle, request, fee);
    }
    
    /**
     * Receive the response in the form of uint256
     */ 
    function fulfill(bytes32 _requestId, uint256 _volume) public recordChainlinkFulfillment(_requestId) {
        volume = _volume;
    }
    
    /**
     * Withdraw LINK from this contract
     * 
     * NOTE: DO NOT USE THIS IN PRODUCTION AS IT CAN BE CALLED BY ANY ADDRESS.
     * THIS IS PURELY FOR EXAMPLE PURPOSES ONLY.
     */
    function withdrawLink() external {
        LinkTokenInterface linkToken = LinkTokenInterface(chainlinkTokenAddress());
        require(linkToken.transfer(msg.sender, linkToken.balanceOf(address(this))), "Unable to transfer");
    }
}
``


  [1]: https://market.link/jobs/0609deab-6d61-4937-85e4-a8e810b8b272/runs
  [2]: https://market.link/nodes/323602b9-3831-4f8d-a66b-3fb7531649eb/metrics?start=1631783169amp;end=1632387969
 

Ответ №1:

Глядя на активность Etherscan, похоже, что используемый вами узел может быть неактивен. Попробуйте этот узел и JobID:

 Oracle = 0xc57B33452b4F7BB189bB5AfaE9cc4aBa1f7a4FD8; 
JobId = "d5270d1c311941d0b08bead21fea7747";
 

Они были взяты из официальных документов Chainlink.

Чтобы проверить, может ли узел быть неактивным или нет, проверьте адрес oracle в обозревателе блоков. Здесь вы можете видеть, что исходный узел, который вы пытались использовать, довольно давно не проводил транзакцию.

Если узел неактивен, вам нужно будет найти новый или разместить его самостоятельно. Чтобы найти больше узлов и заданий, вы можете проверить market.link или использовать тот, который найден в документах, как упоминалось ранее.