DeFi 가격 오라클은 가격을 어떻게 집계하고 전달할까
가격 오라클의 관측값 집계, heartbeat와 편차 기반 갱신, 단위와 최신성 확인, L2 시퀀서 중단 대응을 살펴봅니다.
이 글에서 다루는 내용오라클은 기준값을 게시하며 체결 가능한 시세를 보장하지 않는다
짧은 요약
DeFi 가격 오라클은 블록체인 밖의 기준값을 스마트 계약이 읽을 수 있도록 전달하는 장치입니다. 흔한 푸시 피드에서는 여러 오프체인 관측값을 하나의 서명된 보고서로 모아 온체인에 게시하고, 프로토콜 계약이 최신 답을 읽습니다. 편차 임계값과 heartbeat는 게시 시점에 영향을 주며, 소비 계약은 `decimals`, 기준 통화, `updatedAt`, 그리고 일부 L2의 시퀀서 상태를 확인해야 합니다. 이런 제어는 특정 위험을 줄이지만 값이 진실인지, 모든 용도에 충분히 최신인지, 모든 거래가 안전한지를 보증하지 않습니다.
오라클은 기준값을 게시하며 체결 가능한 시세를 보장하지 않는다
오라클은 블록체인 외부의 정보를 온체인 코드가 사용할 수 있게 연결합니다. 대출 프로토콜은 담보 가치를 계산하기 위해 토큰 가격 피드를 읽고, 파생상품 계약은 결제나 위험 한도 판정에 기준값을 쓸 수 있습니다. 계약이 볼 수 있는 것은 체인 상태에 게시된 값입니다. 계약이 여러 거래소의 주문장을 직접 확인하고 어떤 호가가 공정한지 판단하는 것은 아닙니다.
“가격”이라는 말에는 서로 다른 측정치가 들어 있습니다. 피드는 한 자산을 기준 통화로 표시하거나, 프로토콜이 정한 상환 비율 또는 다른 수량을 나타낼 수 있습니다. 큰 물량을 실제로 팔 수 있는 가격과 같다고 볼 수 없습니다. 유동성 풀의 현물 비율과 중앙화 거래소의 마지막 체결가는 다른 이유로 움직일 수 있습니다. DEX 스왑 가이드는 풀 견적과 체결 결과가 달라지는 이유를 다루며, 마크 가격과 최종 체결가 비교는 거래소별 가격 기준의 차이를 설명합니다.
오라클 방식도 하나로 정해져 있지 않습니다. 푸시 피드는 계약에 답을 주기적으로 기록하므로 소비자가 최신 게시값을 읽을 수 있습니다. 풀 방식은 사용자가 요청할 때 서명된 보고서를 전달할 수도 있습니다. 이 글은 흔한 EVM 푸시 피드를 중심으로 Chainlink 문서의 인터페이스를 사례로 설명하며, 모든 DeFi 프로토콜이 같은 제공자나 갱신 규칙을 쓴다는 뜻은 아닙니다.
관측값이 온체인 답으로 바뀌는 과정
Chainlink의 Offchain Reporting 설계에서는 오라클 노드들이 오프체인에서 관측값을 교환하고 보고서에 합의합니다. 정족수의 노드가 보고서에 서명하고 전송자가 트랜잭션으로 제출하면, 애그리게이터가 서명을 확인한 뒤 답과 라운드 식별자, 타임스탬프를 노출합니다. 문서에 설명된 설계는 관측값의 중앙값을 제공합니다. 각 관측값마다 별도 온체인 트랜잭션을 만들지 않으면서 서명을 온체인에서 검증할 수 있습니다. 자세한 내용은 Offchain Reporting 문서를 참고하세요.
소비 계약이 보통 집계 과정 전체를 다시 수행하지는 않습니다. 피드 프록시의 latestRoundData()를 호출해 최신 라운드 정보를 읽습니다. Chainlink는 선택한 피드의 프록시 주소 사용을 권장하며, 프록시 뒤의 실제 애그리게이터는 교체될 수 있습니다. EVM 데이터 피드 사용 가이드와 API 참조는 인터페이스와 네트워크마다 주소가 다른 이유를 설명합니다.
집계만으로 데이터 품질이 완성되지는 않습니다. 독립 운영자가 같은 거래소나 데이터 제공자, 시장 관행에 의존할 수 있습니다. 유효 관측값이 충분하다면 중앙값이 튀는 일부 값을 완화할 수 있지만, 유동성이 낮은 시장을 두껍게 만들거나 잘못 지정된 자산을 바로잡거나 특정 프로토콜이 필요한 가격을 정해 주지는 못합니다.

heartbeat와 편차 임계값은 게시 주기를 조절한다
많은 푸시 피드는 편차 조건과 heartbeat를 함께 사용합니다. 편차 임계값은 직전 게시값에서 설정된 비율만큼 움직이면 새 보고서를 촉발할 수 있는 조건입니다. heartbeat는 그 임계값을 넘지 않더라도 일정 시간이 지나면 갱신을 요청할 수 있는 시간 조건입니다. 피드별 자산, 네트워크, 편차 임계값, heartbeat를 확인하려면 현재 Data Feeds 목록과 피드 주소 페이지에서 정확한 쌍과 네트워크를 확인하세요.
이 값은 각 피드의 설정이지 “몇 초마다 업데이트된다”는 보편적 약속이 아닙니다. 가격이 조금만 움직이면 편차에 따른 게시가 없고 heartbeat 조건이 올 때까지 기다릴 수 있습니다. 변동이 임계값을 넘으면 더 일찍 게시가 요청될 수 있지만, 관측값 수집과 보고서 전송, 블록 포함에는 운영과 네트워크 절차가 남아 있습니다. heartbeat는 트리거 규칙일 뿐 시장 기준값이 절대 오래되지 않는다거나 특정 순간에 업데이트가 도착한다는 보증이 아닙니다.
임계값은 프로토콜이 감당할 수 있는 가격 변동 폭을 결정해 주지 않습니다. 담보 가격이 빠르게 바뀌는 대출 시장은 느리게 움직이는 기준값을 쓰는 애플리케이션보다 더 엄격한 허용 시간이나 다른 위험 대응이 필요할 수 있습니다. 개발자는 피드 트리거 설정을 안전 정책으로 간주하지 말고 애플리케이션의 허용 기준을 따로 정해야 합니다.
answer의 decimals와 기준 통화를 해석한다
latestRoundData()는 roundId, answer, startedAt, updatedAt, answeredInRound를 반환합니다. API 참조 문서는 answeredInRound를 폐기 예정 인터페이스로 표시합니다. answer는 사람이 바로 읽는 달러 금액이 아니라 고정소수점 정수입니다. 해당 피드의 decimals()와 설명을 읽고 정확한 쌍과 네트워크에 맞춰 해석해야 합니다. 예를 들어 가상의 BTC/USD 피드가 decimals 8과 함께 6,725,000,000,000을 반환하면 환산값은 BTC 한 개당 67,250.00000000달러입니다.
피드 decimals와 토큰 decimals는 서로 다른 수량을 설명합니다. ERC-20 토큰 수량은 18자리로 표현되더라도 가격 답은 8자리일 수 있습니다. 계약에서 두 수를 곱하려면 각각의 단위에 맞게 스케일을 조정해야 합니다. 모든 피드가 소수점 여덟 자리를 쓴다고 가정하거나 토큰 decimals를 오라클 답에 적용하면 계산값이 여러 자릿수 규모로 달라질 수 있습니다.
쌍의 방향도 단위만큼 중요합니다. BTC/USD는 비트코인 한 개의 달러 가격을 뜻하므로 BTC 수량에 곱하면 달러 가치가 됩니다. USD/BTC는 역수 단위입니다. 파생 쌍을 만들 때는 양쪽 피드를 각각 보정한 뒤 올바른 순서로 나눠야 합니다. Chainlink의 가격 표시 단위 예시는 BTC/USD와 EUR/USD를 사용해 BTC/EUR를 계산합니다. 계약 주소와 쌍, 체인, 담보 자산이 의도한 항목과 같은지도 확인해야 합니다.
오래된 값 확인은 애플리케이션이 정하는 규칙이다
updatedAt은 최신 라운드가 갱신된 시간을 나타냅니다. 소비 계약은 이를 현재 블록 타임스탬프와 비교해 애플리케이션이 정한 최대 허용 시간보다 오래된 답을 거부할 수 있습니다. 피드와 프로토콜에 맞춰 업데이트 시간이 0이 아닌지, 양수 가격 자산의 답이 양수인지, 예상 최솟값과 최댓값 안에 있는지도 검사할 수 있습니다. 허용 범위는 상품마다 다르며, 고정 경계값 자체도 시장이 변하면 위험해질 수 있습니다.
가상의 대출 시장에서 담보 토큰 네 개를 받고 담보 인정 비율을 75%로 둔다고 가정해 봅시다. 피드는 소수점 여덟 자리를 쓰며 마지막 답은 200,000,000,000, 즉 토큰당 2,000달러입니다. 표시되는 대출 한도는 4 × $2,000 × 75% = $6,000입니다. 그런데 시장 가격이 1,820달러로 9% 하락했고, 가상의 피드에는 10% 편차 임계값과 60분 heartbeat가 설정되어 있다고 합시다. 설정한 두 조건 어느 쪽도 아직 새 보고서를 요청하지 않았을 수 있습니다. 1,820달러를 쓰면 같은 계산으로 $5,460이므로 이전 답은 이 사례의 한도를 540달러 과대 평가합니다.
애플리케이션이 가격의 최대 허용 시간을 5분으로 정했고 현재 라운드가 20분 전 값이라면, 2,000달러 답을 그대로 쓰는 대신 신규 대출을 막을 수 있습니다. 이 검사는 피드를 갱신하지 않습니다. 데이터가 정한 최신성 기준을 벗어난 동안 애플리케이션이 허용하는 동작을 바꿉니다. 신규 대출, 인출, 청산, 상환은 서로 다른 대응이 필요할 수 있습니다. 모든 작업을 멈추는 것도 해가 될 수 있기 때문입니다. 위 숫자와 트리거는 작동 방식을 보여 주기 위한 가정이며 실제 피드 설정이나 권장 위험 기준이 아닙니다.
L2 시퀀서 검사는 다른 종류의 중단 위험을 다룬다
L2에서는 사용자가 시퀀서를 통해 거래를 제출하는 경우가 많습니다. 시퀀서가 중단되거나 다시 켜지는 동안 정상적인 거래가 어려워지고 거래가 지연된 뒤 시장이 달라진 시점에 실행될 수도 있습니다. L2 오라클 답이 최신처럼 보여도 애플리케이션의 실행 경로가 정상이며 사용자가 같은 시점에 행동할 수 있었다는 뜻은 아닙니다.
Chainlink는 상태를 별도로 읽는 L2 Sequencer Uptime Feed를 문서화합니다. 설명된 인터페이스에서는 answer == 0이 시퀀서 가동, answer == 1이 중단을 뜻합니다. startedAt은 상태 변경 시각을 기록하고, 예시 소비 계약은 상태를 확인한 뒤 복구 시점부터 애플리케이션이 정한 유예 시간이 지나야 가격 피드를 사용합니다. 사용하는 L2에서 정확한 uptime 피드 주소와 네트워크 동작을 확인해야 합니다. 자세한 내용은 L2 Sequencer Uptime Feed 가이드를 참고하세요.
유예 시간은 중단 뒤 사용자와 시스템이 재개할 시간을 주지만 시장 데이터가 새로 고쳐졌다는 보증은 아닙니다. 대기 중인 거래가 모두 끝났거나, 가격이 정확해졌거나, 모든 동작을 동시에 재개해도 안전하다는 의미도 아닙니다. L2마다 시퀀서, 강제 거래 제출, 메시지 전달, 복구 방법이 다를 수 있으므로 롤업마다 같은 장애 경로가 있다고 가정하지 말고 해당 네트워크 문서를 기준으로 처리해야 합니다.
이 제어들은 정확한 값이나 공정한 결과를 보장하지 않는다
정족수, 중앙값, 편차 트리거, heartbeat, 최대 허용 경과 시간, 시퀀서 상태 확인은 각기 좁은 질문에 답합니다. 시장 유동성, 자산 식별, 데이터 제공자의 독립성, 특정 거래 규모에서 체결 가능한 가격까지 보증하지는 않습니다. 최신 타임스탬프가 잘못되었거나 조작된 값을 동반할 수 있고, 조용한 시장에서는 오래된 값이 시장과 비슷할 수도 있습니다.
게시 조건만으로 가격 공백을 없앨 수 없습니다. 보고 사이에 가격이 급변하거나, 피드를 사용할 수 없거나, 체인 혼잡이 발생할 수 있습니다. 계약에 단위 변환, 쌍 선택, 최신성 검사 또는 청산 로직 오류가 있을 수도 있습니다. 어떤 피드는 특정 값에 대해 단일 데이터원이나 제공자에 의존합니다. Chainlink의 피드 선택과 위험 안내는 자산 유동성과 데이터 의존성을 살펴보고 오래되거나 지연되거나 누락되거나 예상 밖인 값에 대비할 것을 안내합니다.
회로 차단기와 값 범위는 일부 동작을 제한하지만 모든 정상적인 시장 상황을 미리 알 수는 없습니다. 범위가 너무 좁으면 정당한 가격 움직임도 거부하고, 너무 넓으면 위험한 움직임을 막지 못할 수 있습니다. 오라클 조치는 스마트 계약, 거버넌스, 유동성, 브리지, 담보, 청산 위험을 제거하지 않습니다. 스테이블코인 오라클 가격은 보유자가 액면가로 상환할 수 있는지와도 별개입니다. 스테이블코인 디페그 가이드는 그 밖의 메커니즘을 설명합니다.
의존하기 전 가격이 흐르는 경로 전체를 확인한다
프로토콜에서는 정확한 체인, 피드 프록시, 자산 쌍, 기준 통화, answer decimals, 계약 주소부터 확인합니다. 피드 설명이 대상 자산과 맞는지 살피고 다른 네트워크의 주소를 복사하지 말고 지원 주소 목록을 봅니다. 더 엄밀한 모니터링이 필요하면 피드의 출처 구조와 최근 관측값 또는 업데이트 기록도 확인합니다. Chainlink는 네트워크별로 애그리게이터가 다를 수 있으므로 계약 소스와 설정을 확인하라고 안내합니다.
그 다음 소비 계약이 답을 어떻게 사용하는지 추적합니다. 토큰 수량과 가격 단위를 올바르게 바꾸는지, updatedAt을 검사하는지, 얼마나 오래되면 거부할지, 잘못된 값에서 어떤 동작을 막거나 바꾸는지 살펴봅니다. L2라면 uptime 피드, 상태값 해석, 복구 시각, 유예 시간, 시퀀서 지연 거래의 처리까지 확인합니다. 실제 계약 로직으로 오래된 피드와 중단·복구 사례를 각각 검토해야 합니다.
대출이나 거래 프로토콜을 이용하는 사람은 익숙한 오라클 이름만 보고 위험이 모두 해결됐다고 생각하지 말고 문서와 배포된 계약을 읽어야 합니다. 어떤 가격이 평가, 대출, 청산 또는 결제에 쓰이는지, 오래되거나 이용 불가능할 때 어떻게 되는지, 위험 설정을 누가 바꿀 수 있는지 확인하세요. 계정에 영향을 주는 것은 대시보드의 라벨이 아니라 프로토콜에 연결된 실제 가격 경로입니다.
자주 묻는 질문
Q1Heartbeat가 있으면 가격이 항상 그 시간 이내로 최신인가요?
아닙니다. Heartbeat는 피드 갱신 설계의 시간 조건이지, 게시와 블록 포함이 정확한 시각에 완료되거나 값이 항상 실시간 시장과 같다는 보증이 아닙니다. 소비자는 updatedAt을 확인하고 용도에 맞는 최신성 정책을 정해야 합니다.
Q2중앙값 오라클 피드도 틀릴 수 있나요?
그렇습니다. 중앙값은 일부 극단 관측값의 영향을 줄일 수 있지만, 여러 노드가 공유하는 데이터원 문제, 유동성이 낮거나 조작된 시장, 자산 쌍 오류, 소비 계약의 계산 오류를 고치지는 못합니다. 집계는 전체 위험 설계의 한 부분입니다.
Q3L2 시퀀서 가동 피드와 가격 오래됨 확인은 같은 기능인가요?
아닙니다. 가동 피드는 시퀀서 상태와 상태 변경 시각을 알립니다. 가격 최신성 검사는 가격 라운드의 updatedAt과 현재 시각을 비교합니다. 애플리케이션은 두 검사와 복구 유예 시간을 모두 필요로 할 수 있습니다.
출처와 더 읽을 자료
내용 정정 제보
이 아티클 링크를 담은 이메일 초안을 준비합니다. 직접 보내야 Mark에 제보가 접수됩니다
QUICK CHECK
글을 다 읽었다면, 3문항으로 확인해보세요
Question 01
BTC/USD 피드가 decimals 8과 함께 `6,725,000,000,000`을 반환했습니다. 환산 가격은 얼마인가요?
정답을 고르면 바로 설명을 볼 수 있어요