상세 컨텐츠

본문 제목

이더리움과 EVM Chain에서 체인링크 오라클을 활용해서 Data Feed를 사용하는 법

Blockchain/Oracle - Chainlink

by Yongari 2023. 4. 20. 21:54

본문

데이터 피드를 읽기 위한 코드는 모든 EVM 호환 블록체인과 데이터 피드 유형에서 동일합니다. 용도에 따라 다른 유형의 피드를 선택할 수 있지만 요청 및 응답 형식은 동일합니다. 피드를 읽으려면 다음 변수를 지정합니다:

 

 

RPC endpoint URL: 스마트 컨트랙트가 실행될 네트워크를 결정합니다. node provider service를 사용하거나 자체 client.를 가리킬 수 있습니다. Web3 지갑을 사용하는 경우, 이미 여러 네트워크에 대한 RPC 엔드포인트가 구성되어 있으며 Remix IDE가 자동으로 감지합니다.

LINK token contract address:LINK 토큰 컨트랙트의 주소는 네트워크마다 다릅니다. 지원되는 모든 네트워크의 전체 주소 목록은 링크 토큰 컨트랙트 페이지에서 확인할 수 있습니다.

Feed contract address: 스마트 컨트랙트가 읽을 데이터 피드를 결정합니다. 컨트랙트 주소는 네트워크마다 다릅니다. 사용 가능한 컨트랙트 주소는 다음 페이지에서 확인할 수 있습니다:

 

이 문서의 예제에는 이러한 변수가 표시되어 있지만 다른 네트워크에서 작동하고 다른 피드를 읽도록 예제를 수정할 수 있습니다.

이 가이드에서는 다음 언어를 사용하여 데이터 피드를 읽는 코드 예시를 보여줍니다:

 

Reading data feeds on-chain

이 코드 예시는 데이터 피드를 읽고 값을 저장하는 소비자 컨트랙트를 온체인에 배포하는 방법을 보여드립니다.

Solidity

가격 데이터를 소비하려면 스마트 콘트랙트는 데이터 피드에 의해 구현된 외부 기능을 정의하는 AggregatorV3Interface를 참조해야 합니다.

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

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

contract PriceConsumerV3 {
    AggregatorV3Interface internal priceFeed;

    /**
     * Network: Sepolia
     * Aggregator: BTC/USD
     * Address: 0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
     */
    constructor() {
        priceFeed = AggregatorV3Interface(
            0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
        );
    }

    /**
     * Returns the latest price.
     */
    function getLatestPrice() public view returns (int) {
        // prettier-ignore
        (
            /* uint80 roundID */,
            int price,
            /*uint startedAt*/,
            /*uint timeStamp*/,
            /*uint80 answeredInRound*/
        ) = priceFeed.latestRoundData();
        return price;
    }
}

remix.ethereum.org에서 세폴리아 테스트네트워크와 연결한 뒤  위 스마트 컨트랙트를 컴파일하고getLatestPrice 함수를 호출하면 다음과 같은 값을 얻을 수 있습니다. 

 

Getting a different price denomination

체인링크 데이터 피드를 조합하여 다른 통화로 표시된 가격 쌍을 도출할 수 있습니다.

제공된 통화 이외의 다른 통화가 필요한 경우 두 개의 데이터 피드를 사용하여 필요한 가격 쌍을 도출할 수 있습니다. 예를 들어 BTC / EUR 가격이 필요한 경우 BTC / USD 피드와 EUR / USD 피드를 가져와 분할을 사용하여 BTC / EUR를 도출할 수 있습니다.

 

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

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

/**
 * Network: Sepolia
 * Base: BTC/USD
 * Base Address: 0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
 * Quote: EUR/USD
 * Quote Address: 0x1a81afB8146aeFfCFc5E50e8479e826E7D55b910
 * Decimals: 8
 */

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

contract PriceConverter {
    function getDerivedPrice(
        address _base,
        address _quote,
        uint8 _decimals
    ) public view returns (int256) {
        require(
            _decimals > uint8(0) && _decimals <= uint8(18),
            "Invalid _decimals"
        );
        int256 decimals = int256(10 ** uint256(_decimals));
        (, int256 basePrice, , , ) = AggregatorV3Interface(_base)
            .latestRoundData();
        uint8 baseDecimals = AggregatorV3Interface(_base).decimals();
        basePrice = scalePrice(basePrice, baseDecimals, _decimals);

        (, int256 quotePrice, , , ) = AggregatorV3Interface(_quote)
            .latestRoundData();
        uint8 quoteDecimals = AggregatorV3Interface(_quote).decimals();
        quotePrice = scalePrice(quotePrice, quoteDecimals, _decimals);

        return (basePrice * decimals) / quotePrice;
    }

    function scalePrice(
        int256 _price,
        uint8 _priceDecimals,
        uint8 _decimals
    ) internal pure returns (int256) {
        if (_priceDecimals < _decimals) {
            return _price * int256(10 ** uint256(_decimals - _priceDecimals));
        } else if (_priceDecimals > _decimals) {
            return _price / int256(10 ** uint256(_priceDecimals - _decimals));
        }
        return _price;
    }
}

 

More Aggregator Functions

애그리게이터가 검색할 수 있는 데이터는 최신 가격만 있는 것은 아닙니다. 과거 가격 데이터도 검색할 수 있습니다. 자세히 알아보려면 과거 가격 데이터 페이지를 참조하세요.

체인링크 가격 피드의 다양한 사용 사례를 이해하려면 기타 튜토리얼을 참조하세요.

 

 

관련글 더보기