데이터 피드를 읽기 위한 코드는 모든 EVM 호환 블록체인과 데이터 피드 유형에서 동일합니다. 용도에 따라 다른 유형의 피드를 선택할 수 있지만 요청 및 응답 형식은 동일합니다. 피드를 읽으려면 다음 변수를 지정합니다:
RPC endpoint URL: 스마트 컨트랙트가 실행될 네트워크를 결정합니다. node provider service를 사용하거나 자체 client.를 가리킬 수 있습니다. Web3 지갑을 사용하는 경우, 이미 여러 네트워크에 대한 RPC 엔드포인트가 구성되어 있으며 Remix IDE가 자동으로 감지합니다.
LINK token contract address:LINK 토큰 컨트랙트의 주소는 네트워크마다 다릅니다. 지원되는 모든 네트워크의 전체 주소 목록은 링크 토큰 컨트랙트 페이지에서 확인할 수 있습니다.
Feed contract address: 스마트 컨트랙트가 읽을 데이터 피드를 결정합니다. 컨트랙트 주소는 네트워크마다 다릅니다. 사용 가능한 컨트랙트 주소는 다음 페이지에서 확인할 수 있습니다:
이 문서의 예제에는 이러한 변수가 표시되어 있지만 다른 네트워크에서 작동하고 다른 피드를 읽도록 예제를 수정할 수 있습니다.
이 가이드에서는 다음 언어를 사용하여 데이터 피드를 읽는 코드 예시를 보여줍니다:
이 코드 예시는 데이터 피드를 읽고 값을 저장하는 소비자 컨트랙트를 온체인에 배포하는 방법을 보여드립니다.
가격 데이터를 소비하려면 스마트 콘트랙트는 데이터 피드에 의해 구현된 외부 기능을 정의하는 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 함수를 호출하면 다음과 같은 값을 얻을 수 있습니다.
체인링크 데이터 피드를 조합하여 다른 통화로 표시된 가격 쌍을 도출할 수 있습니다.
제공된 통화 이외의 다른 통화가 필요한 경우 두 개의 데이터 피드를 사용하여 필요한 가격 쌍을 도출할 수 있습니다. 예를 들어 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;
}
}
애그리게이터가 검색할 수 있는 데이터는 최신 가격만 있는 것은 아닙니다. 과거 가격 데이터도 검색할 수 있습니다. 자세히 알아보려면 과거 가격 데이터 페이지를 참조하세요.
체인링크 가격 피드의 다양한 사용 사례를 이해하려면 기타 튜토리얼을 참조하세요.
체인링크 양질의 데이터 피드 선택 - Selecting Quality Data Feeds (0) | 2023.04.14 |
---|---|
체인링크 NFT 가격 피드 - NFT Floor Price Feeds (0) | 2023.04.14 |
체인링크 예치금 피드 - Chaink Proof of Reserve Feeds (0) | 2023.04.14 |
체인링크 가격 피드 Chainlink Price Feeds (0) | 2023.04.13 |
체인링크 데이터 피드 Chainlink Data Feeds (0) | 2023.04.13 |