블록체인상에 오라클 서비스란 외부에서 발생한 데이터를 블록체인에 안전하게 가져올 수 있도록 하는 서비스이며, 외부 이벤트, 가격 정보, 날씨 데이터 등과 상호 작용할 수 있게 하며, 블록체인의 자동화된 스마트 계약 로직을 현실 세계의 데이터와 통합할 수 있게 한다.
오라클 서비스를 사용하려면 백엔드 서비스 및 지속적인 트랜잭션을 활용한 데이터 정보가 필요한대, 이중 가격 정보 관련해서 체인링크를 이용하여 확인 해본다.
체인링크 api-reference 에 따르면 AggregatorV3Interface를 활용하여 데이터 정보를 갖고 올 수 있다. (체인링크에서 트랜잭션을 주기적으로 발생시켜서 가격정보 업데이트)
https://docs.chain.link/data-feeds/api-reference
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)를 갖고 올 수 있는 형태로 이루어져 있다.
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;
}
}
https://docs.chain.link/data-feeds/api-reference
https://docs.chain.link/data-feeds/price-feeds/addresses?network=ethereum&page=1
https://github.com/4e5ung/solidity-study/tree/main/aggregator