“실전 오라클” 시리즈 1편 — 스마트 컨트랙트 엔지니어를 위한 실습형 연재. 이 시리즈의 모든 컨트랙트는 OpenZeppelin 5.x로 컴파일하고 실제 EVM에서 검증했습니다.
한 줄 요약은 이미 아실 겁니다. 스마트 컨트랙트는 바깥세상을 호출할 수 없다. 이 시리즈는 그 제약이 실제로 여러분에게 무엇을 강제하는지, 함정이 어디 묻혀 있는지, 그리고 데모가 아니라 공격자를 상대로 살아남는 오라클 소비 코드를 어떻게 짜는지에 관한 이야기입니다.
합의는 결정론적 재실행을 요구합니다. 모든 검증자가 여러분의 트랜잭션을 다시 계산해 동일한 상태에 도달해야 합니다. 외부 HTTP 호출은 이 모델에 자리가 없습니다. 1초 차이로 API를 호출한 두 노드가 다른 값을 볼 수 있고, 그러면 상태가 갈라지니까요. 그래서 EVM은 네트워크·파일시스템·시계(block.timestamp 외)에 대한 시스템 콜을 주지 않습니다. 컨트랙트가 “아는” 모든 것은 자기 스토리지에 쓰였거나 calldata로 전달된 것뿐입니다.
이것이 엔지니어링 언어로 표현한 오라클 문제의 전부입니다. 모든 외부 사실은 온체인 트랜잭션으로 도착해야 하고, 이는 어떤 계정이 그것에 서명하고 비용을 냈다는 뜻이며, 결국 여러분은 그 계정을 신뢰하는 것입니다. 여러분의 일은 그 신뢰를 없애는 게 — 불가능하니까요 — 아니라, 어떤 단일 행위자도 이득을 보며 거짓말할 수 없도록 신뢰를 구조화하는 것입니다.
실제로 손이 가는 갈래는 셋입니다. 이 시리즈는 각각에 한 편씩 할애합니다.
1. 푸시 피드 (Chainlink 등) — 탈중앙 오퍼레이터 집합이 오프체인에서 보고하고, median으로 집계해, 여러분이 AggregatorV3Interface.latestRoundData()로 읽는 aggregator에 씁니다. 직접 모을 수 없는 폭넓은 출처가 필요한 거래소 간 실물 가격(FX, 원자재, 대형 암호자산)에 씁니다. 함정은 신선도입니다. 피드는 블록마다가 아니라 편차나 heartbeat에 따라 갱신됩니다.
2. 온체인 TWAP (Uniswap V3) — DEX 풀에서 가격을 직접 읽되, 단일 블록의 밀치기가 값을 못 움직이도록 시간 평균을 냅니다. 깊은 V3 풀이 있는 자산이면서 외부 오퍼레이터 없는 순수 온체인 소스를 원할 때 씁니다. 함정은 cardinality와 윈도우 길이입니다.
3. 서명 쿼럼 — m-of-n 인가 서명자 집합이 같은 값에 EIP-712 서명으로 각자 보증하고, 컨트랙트는 임계치 이상일 때만 받아들입니다. 평균 낼 시장도 공개 피드도 없는 오프체인 사실에 쓰며, AI 모델 출력에도 점점 쓰입니다. 함정은 서명자 집합 거버넌스입니다.
절대적으로 최선인 건 없습니다. 진지한 프로토콜은 주 소스와 보조 소스를 조합하고, 일정 밴드를 넘는 괴리에서 revert합니다.
코드에 앞서, 프로덕션에서 오라클 소비자를 무너뜨리는 것들을 체화하세요.
updatedAt을 피드 heartbeat와 대조하세요.int256을 반환하고, 결함 시 <= 0이 나올 수 있습니다. 방어: uint256으로 캐스팅 전에 require(answer > 0).$0.01이나 $1M로 보고하는 망가진 피드가 청산을 몰면 안 됩니다. 방어: sanity bound.decimals()를 읽고 정규화하세요.한 가지 주제가 보입니다. 익스플로잇은 대개 여러분 로직의 버그가 아닙니다. 여러분 코드는 짠 그대로 동작합니다. 애초에 믿지 말았어야 할 값 위에서요. 오라클 보안은 돈이 걸린 입력 검증입니다.
소스가 무엇이든, 가치를 다루는 경로의 오라클 읽기는 이래야 합니다.
revert한다.이 시리즈의 모든 컨트랙트는 자기 소스에 맞게 이 체크리스트를 구현하며, 실패 모드가 온체인에서 읽히도록 custom error를 씁니다.
observe(), arithmetic mean tick 수학, 음의 무한대 방향 반올림 규칙, cardinality, 그리고 최소 윈도우를 초가 아니라 분 단위로 잡아야 하는 이유.딱 한 문장만 기억한다면: 모든 오라클 값을 검사를 통과하기 전까지는 적대적 calldata로 취급하라. 나머지는 디테일이고, 돈은 그 디테일에서 잃습니다.
Tags: Solidity, Ethereum, SmartContracts, Blockchain, Web3
중고거래 안전결제, 다들 써보셨죠? AI 결제에도 이게 필요합니다. 문제는, 생각보다 훨씬 까다롭다는 거예요. 중고거래를 떠올려…
앞 편의 x402가 자판기였다면, 이번 두 방식은 '용돈 한도'와 '술집 외상장부'에 가깝습니다. 앞 편 복습:…