DeFiの価格オラクルは価格をどう集計して公開するのか
オラクルの観測値の集計、heartbeatと乖離による更新、単位と古さの確認、L2シーケンサー停止時の扱いと各対策の限界を解説します。
このガイドの内容オラクルが公開するのは参照値であり、約定できる市場価格ではない
短い要約
価格オラクルは、ブロックチェーン外の参照値をスマートコントラクトに届ける仕組みです。一般的なpush型フィードでは、複数のオフチェーン観測値を署名付きレポートにまとめてオンチェーンに公開し、プロトコルが最新の値を読みます。乖離しきい値とheartbeatは公開タイミングに影響します。利用側は小数桁、建値通貨、`updatedAt`、一部のL2ではシーケンサーの状態も確認します。これらの仕組みは個別のリスクを抑えますが、価格の正確さ、すべての用途に十分な新しさ、すべての取引の安全性を保証するものではありません。
オラクルが公開するのは参照値であり、約定できる市場価格ではない
オラクルはブロックチェーン外の情報をオンチェーンで実行されるコードにつなぎます。貸付プロトコルは担保評価に価格フィードを使い、デリバティブ契約は決済やリスク上限の判定に参照値を使うことがあります。契約が読めるのはチェーン上に記録された値です。すべての外部注文板を直接調べて公正価格を選ぶわけではありません。
「価格」は資産と建値通貨の組み合わせ、プロトコルが定める償還レート、または別の指標を指す場合があります。大口の売却で実際に得られる価格と同じとは限りません。DEXスワップの価格インパクトとスリッページやマーク価格と直近約定価格の違いも参照してください。この記事は一般的なEVM pushフィードを扱い、すべてのDeFiに共通する規則ではありません。
観測値がオンチェーンの答えになるまで
ChainlinkのOffchain Reportingでは、オラクルノードがオフチェーンで観測値を交換し、レポートについて合意します。定足数が署名し、送信者がトランザクションで提出すると、アグリゲーターが署名を検証して答え、ラウンドID、時刻を公開します。Offchain Reportingの文書は、この設計で観測値の中央値を公開する仕組みを説明しています。
利用側のコントラクトは通常、集計全体をやり直さず、フィードのプロキシアドレスに対してlatestRoundData()を呼び出します。プロキシの背後にあるアグリゲーターは変更される場合があります。EVMでの読み取りガイドとAPIリファレンスで、チェーンとフィードに対応するアドレスを確認してください。ノード数が多くてもデータ源の独立性は保証されず、同じ取引所やプロバイダーに依存する可能性があります。

heartbeatと乖離しきい値は公開トリガーを決める
多くのpushフィードは乖離しきい値とheartbeatを組み合わせます。直近の公開値から設定した割合だけ動くと新しいレポートが要求されることがあり、大きな値動きがなくても一定時間後にheartbeatが更新を要求することがあります。Data Feedsの一覧とフィードアドレスのページには、資産、ネットワーク、しきい値、heartbeatなどがフィードごとに示されています。
これらはフィード固有の条件であり、「N秒ごとに必ず更新する」という共通の約束ではありません。小さな変動では乖離条件に達しないことがあります。更新要求後も観測、レポート送信、ブロックへの取り込みが必要です。heartbeatは厳密な到着時刻も、価格が常に新鮮であることも保証しません。許容できる経過時間は、資産の変動や用途に合わせてプロトコル側が決めます。
answer、小数桁、建値通貨を読み解く
latestRoundData()はラウンドID、answer、startedAt、updatedAt、answeredInRoundを返します。APIリファレンスでは最後の項目は非推奨です。answerは固定小数点形式の整数で、読みやすいドル金額とは限りません。対象フィードのdecimals()と説明を確認します。仮のBTC/USDフィードが小数桁8で6,725,000,000,000を返すなら、BTCあたり67,250ドルです。
フィードの小数桁とトークンの小数桁は別の単位です。ERC-20数量が18桁でも価格の答えは8桁かもしれません。掛け合わせる前に各値をそれぞれの単位に合わせてスケールします。BTC/USDはBTC 1枚あたりのドル価格で、USD/BTCは逆の単位です。派生ペアでは両方の値を調整して正しい順番で割ります。価格単位の例ではBTC/USDとEUR/USDからBTC/EURを導いています。
古さの確認はアプリケーションが決めるルール
updatedAtは最新ラウンドが更新された時刻です。利用側は現在のブロック時刻と比較し、アプリが決めた最大経過時間を超える値を拒否できます。フィードに応じて更新時刻がゼロでないこと、正の価格を持つ資産なら答えも正であること、妥当な上下限などを検査します。範囲を狭くしすぎると正常な市場変動まで拒否する可能性があります。
仮に4単位の担保に75%の担保係数を使う貸付市場を考えます。小数桁8の答えが200,000,000,000なら、1単位あたり2,000ドルです。借入上限は4 × $2,000 × 75% = $6,000です。市場価格が1,820ドルに下がると9%の下落です。説明用に乖離しきい値を10%、heartbeatを60分と仮定すると、新しい報告はまだ要求されない場合があります。低い価格での上限は5,460ドルです。
アプリが5分より古い価格を拒否し、ラウンドが20分前の値なら、2,000ドルの値を使わず新規借入を止めることができます。この確認はフィードを更新せず、データが許容年齢を超えた時に可能な操作を変えます。借入、出金、清算、返済で異なる対応が必要な場合があります。すべての操作を止めることも損失につながるからです。数値と条件は仕組みを示す仮定で、実際のフィード設定や推奨値ではありません。
L2シーケンサーの確認は別の停止リスクに対応する
多くのL2では利用者がシーケンサー経由で取引を送ります。停止中や復旧直後は取引が遅れ、通常どおり操作できず、待機中の注文が市場変化後に実行されることがあります。L2の価格答えが新しく見えても、実行経路が使えたことや全員が同時に行動できたことは示しません。
ChainlinkはL2シーケンサーの状態を別のUptime Feedで公開しています。説明されている形式ではanswer == 0が稼働、answer == 1が停止です。startedAtは状態の変化時刻を記録し、例の利用側は状態を確認したうえで、復旧後にアプリ側が定める猶予時間を待ってから価格を読みます。L2 Sequencer Uptime Feedsガイドで対象L2のアドレスと挙動を確認してください。猶予時間は価格更新や待機中取引の完了を保証しません。
これらの制御は正確さや公平な結果を保証しない
定足数、中央値、乖離、heartbeat、経過時間の上限、シーケンサー状態は、それぞれ限定された問いに答えます。市場の流動性、資産識別、プロバイダーの独立性、取引サイズに応じた約定価格は保証しません。新しい時刻が誤った値や操作された値に付くこともあり、古い値が静かな市場で近いままの場合もあります。
トリガーだけでは価格ギャップ、ネットワーク混雑、スケール変換やペア選択、鮮度確認、清算ロジックの不具合はなくなりません。フィード選定とリスクのガイドは流動性と依存先を確認し、古い・遅い・欠けた・予想外の値を処理するよう勧めています。コントラクト、ガバナンス、ブリッジ、担保、清算のリスクも残ります。ステーブルコインのオラクル価格は額面での償還を保証しません。ディペッグのガイドも参照してください。
依存する前に価格の経路全体を追う
対象チェーン、フィードプロキシ、資産ペア、建値通貨、answerの小数桁、コントラクトアドレスを特定します。説明が対象資産に合うか確認し、別ネットワークのアドレスをコピーしないでください。必要に応じてデータ源の方式や更新履歴も調べます。Chainlinkはネットワークによってアグリゲーターが異なることがあるため、コードと設定の確認を案内しています。
次に答えの使われ方を追います。数量と価格の単位変換、updatedAt、最大経過時間、無効値への対応を確認します。L2ではUptime Feed、復旧時刻、猶予時間、遅延取引の扱いも調べます。実際のコントラクトで古い価格と停止・復旧の両方を確認しましょう。価格フィールドの違いはマーク価格と直近約定価格のガイドも参考になります。
よくある質問
Q1Heartbeatがあれば価格の古さはその間隔以内に収まりますか?
いいえ。これはフィード設計の時間トリガーであり、公開とブロック取り込みの時刻やライブ市場との一致を保証しません。updatedAtを確認し、用途に合う鮮度ルールを定めます。
Q2中央値を使うオラクルフィードも間違うことがありますか?
あります。中央値は一部の外れ値の影響を抑えますが、共有データ源の問題、薄い市場、誤ったペア、利用側コードの不具合は直せません。
Q3L2シーケンサーUptime Feedは価格の古さ確認と同じですか?
いいえ。前者はシーケンサーの状態と変化時刻を伝えます。鮮度確認は価格ラウンドのupdatedAtを現在時刻と比較します。両方と復旧猶予が必要な場合があります。
出典
問題を報告
この記事のリンクを含むメールを準備します。送信すると Mark に報告が届きます
クイックチェック
記事を読み終えたら、3問で確認しましょう
問題 01
小数桁8のBTC/USDフィードが`6,725,000,000,000`を返しました。換算後の価格は?
答えを選ぶと解説を確認できます