분산 가격 오라클
소비자가 오라클 서비스를 요청할 때 오라클은 다양한 이유로 제때 응답하지 못할 수 있으며, 이로 인해 단일 장애 지점이 발생할 수 있습니다. 따라서 ChainLink는 사용자에게 서비스를 제공하기 위해 분산형 가격 오라클 설계를 채택합니다. 예를 들어, BTC USD 가격을 제공하는 서비스는 31개의 가격 오라클을 모아 사용자에게 서비스를 제공합니다.
애그리게이터의 계약 소스 코드는 Etherscan에서 볼 수 있습니다: https://etherscan.io/address/0xae74faa92cb67a95ebcab07358bc222e33a34da7#readContract
그 중에서도 계약서에서 전송자 메서드를 호출하면 집계기에 포함된 모든 오프체인 오라클을 볼 수 있습니다.
각 오프체인 오라클은 전송 메서드를 호출하여 집계기의 사용자 요청에 응답하여 가격 데이터를 제공할 수 있습니다. 이러한 오프체인 오라클은 BTC/USD 집계자에게 가격 데이터를 제공할 뿐만 아니라 ETH/USD와 같은 다른 집계자에게도 가격 데이터를 제공할 수 있는 EOA 계정입니다.
온체인 계약:
1. 먼저 현재 계약 상태를 읽고 일련의 확인을 수행합니다.
2. 이 모든 과정을 통과한 후에는 다음과 같은 준비 작업을 할 수 있습니다.
3. 다음으로, ecrecover()를 사용하여 각 서명 데이터를 검증하고 해시 값이 _report의 해시인지 확인합니다. 동시에 서명자의 역할이 Signer인지 확인하고 서명의 중복 여부를 확인하는 것이 필요합니다.
4. 마지막으로 관찰 내용이 올바른지 확인하세요. 그런 다음 정렬된 관찰치에서 중앙값을 선택하고 중앙값이 상한 및 하한 임계값을 초과하지 않는지 확인합니다. 모든 것이 정상이면 s_transmissions에 오라클의 답변을 기록합니다. 또한, 답변을 검증해야 합니다.
여기서 일련의 호출(중간에 Proxy 계약 포함) 후, Compound에서 사용하는 가격 오라클인 UniswapAnchoredView 계약의 validate 메서드가 마지막으로 호출됩니다.
핵심은 양쪽 오라클이 제시한 가격 편차가 범위 내에 있는지 비교하는 것입니다.
피드 레지스트리
이전 사용법은 간단하지만, 서로 다른 토큰의 가격이 필요한 경우 각 토큰에 대해 setPriceFeed를 실행해야 합니다. 관리 비용은 실제로 약간 높고 일부 시나리오에서는 그다지 유연하지 않습니다. 이때, 피드 레지스트리 방법을 사용하여 접근하는 것을 고려해 볼 수 있습니다.
Feed Registry는 간단히 PriceFeeds를 모아 놓은 사이트라고 이해하면 됩니다. 여기에는 여러 개의 priceFeed가 집계되어 있습니다. 이를 사용하면 사용자는 priceFeeds를 직접 설정할 필요가 없으며, 아래에 표시된 대로 Feed Registry를 통해 가격 데이터를 직접 읽을 수 있습니다.
가격 공급 메커니즘
첫째, Price Feed의 가격은 여러 레벨의 데이터를 집계하여 얻습니다. 실제로는 데이터 소스 집계, 노드 운영자 집계, 오라클 네트워크 집계라는 세 가지 데이터 집계 계층이 있습니다.
원래 가격 데이터는 주로 Binance, Huobi, Coinbase와 같은 중앙 집중형 거래 플랫폼과 Uniswap, Sushi와 같은 분산형 거래 플랫폼에서 제공됩니다. 일부 서비스 제공업체는 데이터 집계를 전문으로 하며(예: Amberdata, Coingecko) 이러한 거래 플랫폼에서 원시 가격 데이터를 수집하고 거래량, 유동성, 시간 차이에 따라 가중치를 적용한 계산을 수행하는 등 이러한 데이터 소스를 처리하고 통합합니다.
이는 첫 번째 수준의 집계, 즉 데이터 소스의 집계입니다. 신뢰할 수 있는 가격 데이터 피드를 갖추는 핵심은 포괄적인 시장 범위를 확보하여 가격 지점이 단일 거래소나 몇몇 거래소의 가격이 아닌 모든 거래 환경을 정확하게 집계한 값을 나타내는지 확인하는 것입니다. 이를 통해 데이터 조작 및 가격 편차를 방지할 수 있습니다.
두 번째 계층은 Chainlink 노드 운영자가 수행하는 집계입니다. 각 Chainlink 노드 운영자는 주로 블록체인에서 외부 시장 데이터를 수집하고 방송하는 데 사용되는 Chainlink 핵심 소프트웨어를 실행하는 책임을 맡습니다. 노드 운영자는 여러 독립적인 데이터 집계 서비스에서 가격 데이터를 수집하고 이들 간의 중간값을 구하여 이상치와 API 다운타임을 제거합니다.
마지막 계층은 전체 오라클 네트워크의 집계입니다. 집계 방법은 여러 가지가 있지만 가장 일반적인 집계 방법은 응답 노드 수가 사전 설정된 값에 도달했을 때 데이터의 중앙값을 취하는 것입니다. 예를 들어, 총 31개의 노드가 있고 미리 설정된 값이 21이라면, 즉 21개 노드로부터 응답을 받은 후, 이 노드들의 가격 데이터의 중앙값을 최종 가격으로 취합니다. 하지만 모든 가격 결과가 체인에 업데이트되는 것은 아닙니다. 이는 두 가지 트리거 매개변수(편차 임계값 및 하트비트 임계값) 중 하나가 충족될 때만 업데이트됩니다. 게다가, 이 두 매개변수의 값은 PriceFeed마다 다를 수 있습니다.
요약하자면, 체인링크 가격 오라클은 접근하기 쉽고 보안성이 비교적 높습니다. 하지만 가격 업데이트 메커니즘의 편차 임계값으로 인해 가격 업데이트가 비교적 느리며, 몇 분에서 수십 분에서 24시간 업데이트까지 걸립니다. 따라서 일반적으로 가격 업데이트에 크게 민감하지 않은 애플리케이션에만 적합합니다. 이는 Chainlink 가격 오라클의 한계이기도 하며, 모든 시나리오에 적용할 수는 없습니다.