상세 컨텐츠

본문 제목

Chainlink Single Word Response

Blockchain

by Yongari 2023. 4. 4. 15:49

본문

한 번의 호출로 단일 단어 응답을 가져옵니다.
Cryptocompare GET /데이터/가격 멀티풀 API는 필요한 다른 통화로 된 암호화폐 목록의 현재 거래 정보(가격, 거래량, 시가총액, 고가, 저가)를 반환합니다. 응답을 확인하려면 브라우저에 다음 URL을 직접 붙여넣거나 https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD 또는 터미널에서 이 명령을 실행하면 됩니다:

 

curl -X 'GET' \
  'https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD' \
  -H 'accept: application/json'

 

{
  "RAW": {
    "ETH": {
      "USD": {
        "TYPE": "5",
        "MARKET": "CCCAGG",
        "FROMSYMBOL": "ETH",
        "TOSYMBOL": "USD",
        "FLAGS": "2049",
        "PRICE": 2867.04,
        "LASTUPDATE": 1650896942,
        "MEDIAN": 2866.2,
        "LASTVOLUME": 0.16533939,
        "LASTVOLUMETO": 474.375243849,
        "LASTTRADEID": "1072154517",
        "VOLUMEDAY": 195241.78281014622,
        "VOLUMEDAYTO": 556240560.4621655,
        "VOLUME24HOUR": 236248.94641103,
        ...
}

 

 

여러 응답이 있는 API를 사용하려면, 컨트랙트는 체인링크클라이언트를 가져와야 합니다. 이 컨트랙트는 Chainlink.Request라는 구조체를 노출하며, 컨트랙트는 이 구조체를 사용해 API 요청을 빌드해야 합니다. 요청에는 다음 파라미터가 포함되어야 합니다:

링크 토큰 주소
오라클 주소
작업 ID
요청 수수료
작업 매개변수
콜백 함수 서명

 

 

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

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

/**
 * Request testnet LINK and ETH here: https://faucets.chain.link/
 * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: https://docs.chain.link/docs/link-token-contracts/
 */

/**
 * THIS IS AN EXAMPLE CONTRACT WHICH USES HARDCODED VALUES FOR CLARITY.
 * THIS EXAMPLE USES UN-AUDITED CODE.
 * DO NOT USE THIS CODE IN PRODUCTION.
 */

contract APIConsumer is ChainlinkClient, ConfirmedOwner {
    using Chainlink for Chainlink.Request;

    uint256 public volume;
    bytes32 private jobId;
    uint256 private fee;

    event RequestVolume(bytes32 indexed requestId, uint256 volume);

    /**
     * @notice Initialize the link token and target oracle
     *
     * Sepolia Testnet details:
     * Link Token: 0x779877A7B0D9E8603169DdbD7836e478b4624789
     * Oracle: 0x6090149792dAAeE9D1D568c9f9a6F6B46AA29eFD (Chainlink DevRel)
     * jobId: ca98366cc7314957b8c012c72f05aeeb
     *
     */
    constructor() ConfirmedOwner(msg.sender) {
        setChainlinkToken(0x779877A7B0D9E8603169DdbD7836e478b4624789);
        setChainlinkOracle(0x6090149792dAAeE9D1D568c9f9a6F6B46AA29eFD);
        jobId = "ca98366cc7314957b8c012c72f05aeeb";
        fee = (1 * LINK_DIVISIBILITY) / 10; // 0,1 * 10**18 (Varies by network and job)
    }

    /**
     * Create a Chainlink request to retrieve API response, find the target
     * data, then multiply by 1000000000000000000 (to remove decimal places from data).
     */
    function requestVolumeData() public returns (bytes32 requestId) {
        Chainlink.Request memory req = buildChainlinkRequest(
            jobId,
            address(this),
            this.fulfill.selector
        );

        // Set the URL to perform the GET request on
        req.add(
            "get",
            "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&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"); // Chainlink nodes prior to 1.0.0 support this format
        req.add("path", "RAW,ETH,USD,VOLUME24HOUR"); // Chainlink nodes 1.0.0 and later support this format

        // Multiply the result by 1000000000000000000 to remove decimals
        int256 timesAmount = 10 ** 18;
        req.addInt("times", timesAmount);

        // Sends the request
        return sendChainlinkRequest(req, fee);
    }

    /**
     * Receive the response in the form of uint256
     */
    function fulfill(
        bytes32 _requestId,
        uint256 _volume
    ) public recordChainlinkFulfillment(_requestId) {
        emit RequestVolume(_requestId, _volume);
        volume = _volume;
    }

    /**
     * Allow withdraw of Link tokens from the contract
     */
    function withdrawLink() public onlyOwner {
        LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress());
        require(
            link.transfer(msg.sender, link.balanceOf(address(this))),
            "Unable to transfer"
        );
    }
}

이 계약을 사용하려면:

1. Remix에서 컨트랙트를 엽니다.

2. Injected Provider 환경을 사용하여 컨트랙트를 컴파일하고 배포합니다. 컨트랙트에는 세폴리아 테스트넷에 대한 모든 구성 변수가 포함되어 있습니다. 지갑이 Sepolia를 사용하도록 설정되어 있는지 확인합니다. 생성자는 다음 매개변수를 설정합니다:

- setChainlinkToken 함수를 호출하여 세폴리아의 체인링크 토큰 주소.
- setChainlinkOracle 함수를 호출하여 세폴리아의 오라클 컨트랙트 주소.
- jobId: 오라클 노드가 실행할 특정 작업입니다. 이 경우 퍼블릭 API를 호출하도록 구성된 작업을 호출하고, 응답에서 숫자를 구문 분석하여 소수점을 제거해야 합니다. 여기에서 찾을 수 있는 일반적인 GET>uint256 작업을 사용하겠습니다.

3. 0.1 LINK로 컨트랙트에 자금을 조달합니다. 컨트랙트에 LINK를 전송하는 방법을 알아보려면 컨트랙트 자금 조달하기 페이지를 참조하세요.

4. 볼륨 함수를 호출하여 볼륨 상태 변수가 0과 같은지 확인합니다.

5. 요청 볼륨 데이터 함수를 실행합니다. 올바른 매개변수를 사용해 체인링크 요청을 빌드합니다:

- req.add("get", "<cryptocompareURL>") 요청 매개변수는 오라클 노드에 ETH-USD 거래 정보를 가져올 수 있는 URL을 제공합니다.
- req.add('path', 'RAW,ETH,USD,VOLUME24HOUR') 요청 매개변수는 오라클 노드에 json 응답에서 24시간 ETH 볼륨을 가져올 위치를 알려줍니다. 중첩된 객체에는 쉼표(,)로 구분된 문자열이 포함된 JSONPath 표현식을 사용합니다. 예: 'RAW,ETH,USD,VOLUME24HOUR'.
- req.addInt('times', timesAmount) 요청 매개변수는 가져온 볼륨에 곱하는 배수 timesAmount를 오라클 노드에 제공합니다. 이를 사용하여 볼륨에서 소수를 제거합니다. 참고: times 매개변수는 필수입니다. 호출하는 API가 소수점이 없는 숫자를 반환하는 경우 timesAmount에 1을 입력합니다. 위 예제의 APIConsumer는 get, 경로 및 timesAmount의 URL이 정확하다면 모든 공개 API를 호출할 수 있을 만큼 유연합니다.
몇 초 후 볼륨 함수를 호출합니다. 0이 아닌 응답을 받아야 합니다.

 

Response Types

 

계약에서 사용해야 하는 데이터 유형을 지원하는 오라클 작업을 선택해야 합니다. 다음과 같은 여러 데이터 유형을 사용할 수 있습니다:

uint256 - 부호 없는 정수
int256 - 부호 있는 정수
bool - 참 또는 거짓 값
string - 문자열
bytes32 - 문자열 및 바이트 값. 문자열을 반환해야 하는 경우 bytes32를 사용합니다. 다음은 bytes32를 문자열로 변환하는 한 가지 방법입니다. 현재 모든 반환 값은 32바이트 이내여야 합니다. 값이 그보다 크면 여러 번 요청하세요.
바이트 - 임의 길이의 원시 바이트 데이터

 

 

 

 

setChainlinkToken 함수는 배포하려는 네트워크의 LINK 토큰 주소를 설정합니다. setChainlinkOracle 함수는 컨트랙트가 API 호출을 하는 특정 체인링크 오라클을 설정합니다. jobId는 해당 노드가 실행할 특정 작업을 나타냅니다.

각 작업은 고유하며 다른 유형의 데이터를 반환합니다. 예를 들어, API에서 bytes32 변수를 반환하는 작업은 동일한 데이터를 검색하는 작업과 다른 jobId를 갖지만, uint256 변수의 형태로 반환합니다.

 

 

출처: https://docs.chain.link/any-api/get-request/examples/single-word-response

 

'Blockchain' 카테고리의 다른 글

Running a Chainlink Node  (0) 2023.04.05
Random Numbers: Using Chainlink VRF  (0) 2023.04.04
Obol Key concepts  (0) 2023.03.30
Obol Network  (0) 2023.03.30
What is DVT (2023 DE-FERENCE 참고)  (0) 2023.03.30

관련글 더보기