本資料は教育目的に限られ、投資助言ではありません。投資では損失が生じる可能性があります。
要点
age = consumerClock - sourceTimestamp がその操作に設定された maxAge を超えると、オラクル値は当該利用側操作にとって陳腐化しています。価格が変わっていなくても新鮮な場合があり、直近に公開された値でも経済的に誤っている場合があります。利用側は、欠落または未来のタイムスタンプと無効な回答を先に拒否し、フィード、資産、チェーン、市場時間、操作に応じた受入方針を適用しなければなりません。
ハートビートと乖離率しきい値は公開のトリガーであり、鮮度保証やサービス水準合意ではありません。トリガー後も報告が遅れることがあり、操作がより短い最大経過時間を必要とする一方、市場変動が乖離率しきい値未満にとどまることもあります。プル型オラクルには別の境界もあります。呼び出し側が読み取り前に認証済み更新を提出する必要があり、コントラクトは規定時限より古い更新を拒否しなければなりません。
L2 では、シーケンサー状態と復旧猶予期間が別個のゲートを構成します。その通過は、資産価格の鮮度、L2 のファイナリティ、全利用者の公平なアクセスを証明しません。フォールバック価格や最終正常価格は制御された縮退モードであり、真実そのものではありません。各情報源と復旧経路について、単位、時刻、独立性、権限、許可操作、照合規則が必要です。
仕組み
- チェーン、ブロックと時刻、利用側コントラクトと操作、フィードプロキシとアグリゲーター、資産ペアと小数桁、インターフェース版、フォールバック設定、アップグレード状態を固定します。
- デプロイ済みインターフェースから正確な応答を読み、リバートやデータなしを処理します。回答、状態、該当する信頼度と、
sourceTimestamp != 0、sourceTimestamp <= consumerClockを検証してから減算します。 - ハートビート、乖離率、市場時間、公開設定を記録し、操作ごとに独立した
maxAgeを定めます。例えばage <= maxAgeを受け入れ、age > maxAgeを拒否するなど、境界を明示します。 - 対応する L2 デプロイでは、シーケンサーフィードの初期化と状態を検証し、文書化されたフィールドから復旧後の経過時間を求め、設定済み猶予期間を適用した後、価格の鮮度を別途確認します。
- 複合価格、比率価格、フォールバック価格の必要な全構成要素を追跡します。方向と単位を正規化し、最新時刻ではなく、必要な依存関係のうち最も古いものに実効鮮度を制約します。
- 操作ごとに通常、縮退、一時停止状態を定義します。新規借入、発行、レバレッジは安全側に停止しつつ、返済や担保追加を可能にできます。陳腐化価格、フォールバック価格、復旧価格について、エクスポージャー、流動性、清算者能力を試験します。
- 情報源とプロキシの変更、更新遅延、拒否率、シーケンサー状態、情報源間乖離、市場時間を監視します。停止、フォールバック障害、跳躍復旧、清算集中、MEV、不良債権処理、通常モード復帰を演習します。
Chainlink 型インターフェースでは、latestRoundData() がラウンド識別子、符号付き回答、開始時刻、更新時刻、旧来のラウンドフィールドを返し得ます。現行 API は answeredInRound を非推奨としているため、過去の不等式検査を現在の普遍的規則として示してはいけません。具体的なプロキシ、アグリゲーター、実装を確認します。タイムスタンプは文書上のフィード状態が更新された時刻であり、任意数量で約定可能な値であることを示しません。Solidity の block.timestamp は合意上の制約下にある現在ブロックの時刻であり、外部の壁時計オラクルではありません。
計算例
- 最大経過時間の境界。
consumerClock = 1,800,000,000、sourceTimestamp = 1,799,999,100とすると、age = 900 seconds = 15 minutesです。maxAge = 600 secondsの方針は300 seconds超過で拒否し、maxAge = 1,200 secondsの方針は300 secondsの余裕を残して受け入れます。同じフィード値が一方の操作では有効で、他方では陳腐化し得ます。 - トリガーは鮮度ではない。 前回公開価格を
100.00、乖離トリガーを1%、ハートビートを3,600 secondsとします。2,700 seconds後の観測市場価格100.80は0.8%の乖離にすぎず、どちらの説明用トリガーも発動しません。101.20では乖離が1.2%となり公開処理を開始し得ますが、有効な新規報告が取り込まれるまで利用側は100.00を読みます。 - L2 の二重ゲート。 シーケンサーフィードが稼働中を示し、
startedAt = 1,799,996,400、consumerClock = 1,800,000,000、grace = 3,600 secondsなら、経過時間は正確に3,600 secondsです。elapsed <= graceの間を遮断する方針では操作はまだ遮断され、3,601 secondsで適格になります。それでも価格時刻、回答、その他の利用側検査を別途満たす必要があります。 - 復旧の崖。 担保
10 ETH、債務12,000 USD、清算しきい値75%のとき、陳腐化した2,000 USD/ETHはhealthFactor = 10 * 2,000 * 0.75 / 12,000 = 1.25を与えます。復旧後の1,400 USD/ETHは0.875です。この説明用条件では清算対象になりますが、実行はプロトコル規則、流動性、清算者、ガス、順序、チェーン可用性に依存します。
リスク
- チェーン、フィード、プロキシ、アグリゲーター、資産ペア、インターフェース版が誤っている。
- 利用側がタイムスタンプや文書化された状態なしに回答を読む。
- ゼロ、未来の時刻、減算アンダーフローを拒否しない。
- 資産、操作、市場時間、変動性に対して最大経過時間が長すぎる。
- 最大経過時間が短すぎ、サービス拒否やリスク削減の阻害を招く。
- ハートビートを公開期限やサービス水準の保証とみなす。
- 乖離トリガー未満のドリフトやベーシスが蓄積する。
- 情報源、署名者、ネットワーク、ガス、中継、チェーン障害で報告が遅れる。
- 非推奨または実装固有のラウンド検査を普遍的に適用する。
- フィード、プロキシ、設定の変更を見落とす。
- 休場、休日、取引停止、繰越値の意味を無視する。
- 複合価格の必要な一要素が古いのに全体が新鮮に見える。
- L2 シーケンサー状態を無視する、未初期化、遅延、別ネットワークから読む。
- 復旧猶予がない、設定不良、境界が一つずれる。
- シーケンサー検査通過後も価格が古い、または利用不能である。
- L1、L2、観測、公開、壁時計の時刻を混同する。
- プル更新がない、古い、選択的、不正形式、資金不足である。
- フォールバックが古い、相関する、尺度が違う、循環する。
- フェイルオープンが危険操作を許し、一律停止が返済や担保追加を阻む。
- 復旧時の跳躍、清算集中、MEV、薄い流動性、停止競合、不良債権照合が二次損失を生む。
よくある誤解
- 「ハートビートごとに新鮮な更新が保証される。」 更新トリガー設定にすぎず、情報源やチェーン障害で公開は遅れ得ます。
- 「新しいタイムスタンプなら正しく約定可能な価格だ。」 文書上の更新時刻だけを示し、情報源品質、単位、信頼度、市場深度、利用側ロジックは別問題です。
- 「一つの最大経過時間を全フィードと操作に使える。」 資産、市場時間、チェーン、借入、清算、取引、決済には異なる遅延と可用性要件があります。
- 「シーケンサー復旧後は直ちに全操作を再開できる。」 復旧猶予と価格鮮度は独立ゲートで、追加の安全方針もあり得ます。
- 「フォールバックまたは全関数リバートが常に最安全だ。」 弱いフォールバックは誤評価し、無差別停止は返済や担保改善を妨げます。
関連トピック
出典
- Chainlink Data Feeds - Chainlink Documentation(参照日:2026-08-13)
- Data Feeds API Reference - Chainlink Documentation(参照日:2026-08-13)
- Developer Responsibilities - Chainlink Documentation(参照日:2026-08-13)
- L2 Sequencer Uptime Feeds - Chainlink Documentation(参照日:2026-08-13)
- How to Use Real-Time Data in EVM Contracts - Pyth Developer Hub(参照日:2026-08-13)
- Best Practices - Pyth Developer Hub(参照日:2026-08-13)
- Units and Globally Available Variables - Solidity Documentation(参照日:2026-08-13)
- SC03:2026 Price Oracle Manipulation - OWASP Smart Contract Security(参照日:2026-08-13)