Oracle 서비스를 통한 실시간 가격 정보

4e5ung·2024년 1월 11일
0

Oracle 서비스

블록체인상에 오라클 서비스란 외부에서 발생한 데이터를 블록체인에 안전하게 가져올 수 있도록 하는 서비스이며, 외부 이벤트, 가격 정보, 날씨 데이터 등과 상호 작용할 수 있게 하며, 블록체인의 자동화된 스마트 계약 로직을 현실 세계의 데이터와 통합할 수 있게 한다.

Oracle 서비스 이용

오라클 서비스를 사용하려면 백엔드 서비스 및 지속적인 트랜잭션을 활용한 데이터 정보가 필요한대, 이중 가격 정보 관련해서 체인링크를 이용하여 확인 해본다.

실시간 가격정보 갖고오기

체인링크 api-reference 에 따르면 AggregatorV3Interface를 활용하여 데이터 정보를 갖고 올 수 있다. (체인링크에서 트랜잭션을 주기적으로 발생시켜서 가격정보 업데이트)
https://docs.chain.link/data-feeds/api-reference

AggregatorV3Interface Interface

pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(
    uint80 _roundId
  ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

  function latestRoundData()
    external
    view
    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}

문서 내용에 따르면 다음과 같은 체인링크에서 제공하는 컨트랙트 주소
(가격정보를 확인 할 주소)를 활용하여, 가격정보를 갖고 올 수 있다.
https://docs.chain.link/data-feeds/price-feeds/addresses?network=ethereum&page=1

priceFeed = AggregatorV3Interface(0x92C09849638959196E976289418e5973CC96d645);

전체적인 구조는 체인링크쪽에서 주기적으로 roundId를 생성하여 해당 시점에 가격을 넣어주는 형태이며, 사용하는 측면에서는 roundId를 통해서 특정 시점의 가격정보(getRoundData) 및 최근 가격정보(latestRoundData)를 갖고 올 수 있는 형태로 이루어져 있다.

Aggregator 사용 예제

pragma solidity ^0.8.0;

import "./interfaces/AggregatorV3Interface.sol";

contract MyContract {
    function getPriceByOracle( 
        address _aggregatorAddress 
    ) view external returns(int256){

        if(_aggregatorAddress == address(0)){
            return 0;
        }

        (
            /* uint80 roundID */,
            int256 answer,
            /*uint startedAt*/,
            /*uint timeStamp*/,
            /*uint80 answeredInRound*/
        ) = AggregatorV3Interface(_aggregatorAddress).latestRoundData();

        if( answer < 0 ){
            return 0;
        }

        return answer;
    }
}

Ref

https://docs.chain.link/data-feeds/api-reference
https://docs.chain.link/data-feeds/price-feeds/addresses?network=ethereum&page=1

git repository

https://github.com/4e5ung/solidity-study/tree/main/aggregator

0개의 댓글