分散価格オラクル
消費者が Oracle サービスを要求した場合、さまざまな理由により Oracle が時間内に応答できず、単一障害点が発生する可能性があります。そのため、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 コントラクトを含む) の後、最終的に UniswapAnchoredView コントラクト (Compound によって使用される価格オラクル) の validate メソッドが呼び出されます。
重要なのは、両側のオラクルによって示された価格の偏差が範囲内であるかどうかを比較することです。
フィードレジストリ
前の使い方は簡単ですが、異なるトークンの価格が必要な場合は、トークンごとに setPriceFeed を実行する必要があります。管理コストは実際には少し高く、シナリオによっては柔軟性があまりありません。現時点では、フィード レジストリ メソッドを使用してアクセスすることを検討できます。
Feed Registry は、簡単に言えば PriceFeeds のアグリゲータとして理解できます。複数の価格フィードを集約しました。これにより、ユーザーは自分で priceFeeds を設定する必要がなくなり、以下に示すように Feed Registry を通じて価格データを直接読み取ることができます。
価格フィードメカニズム
まず、価格フィード内の価格は、複数のレベルでデータを集約することによって取得されます。実際には、データ集約レイヤーは、データ ソース集約、ノード オペレータ集約、および Oracle ネットワーク集約の 3 つあります。
元の価格データは主に、Binance、Huobi、Coinbase などの中央集権型取引プラットフォームと、Uniswap や Sushi などの分散型取引プラットフォームから取得されます。データ集約を専門とするサービスプロバイダー(Amberdata や Coingecko など)がいくつかあり、これらの取引プラットフォームから生の価格データを収集し、取引量、流動性、時差に基づいて加重計算を実行するなど、これらのデータソースを処理および統合します。
これは集約の最初のレベル、つまりデータ ソースの集約です。信頼できる価格データ フィードを得るための鍵は、包括的な市場カバレッジを備え、価格ポイントが単一の取引所または少数の取引所の価格ではなく、すべての取引環境の正確な集計を表すようにして、データの操作や価格の逸脱を防ぐことです。
2 番目のレイヤーは、Chainlink ノード オペレーターによって実行される集約です。各 Chainlink ノード オペレーターは、ブロックチェーン上で外部市場データを取得およびブロードキャストするために使用される Chainlink コア ソフトウェアの実行を主な責任としています。ノード オペレーターは、複数の独立したデータ集約サービスから価格データを取得し、それらの中央値を取得して、外れ値と API のダウンタイムを排除します。
最後の層は、オラクル ネットワーク全体の集約です。集計方法は多数ありますが、最も一般的な集計方法は、応答ノードの数が事前設定された値に達したときにデータの中央値を取得することです。たとえば、合計 31 個のノードがあり、事前設定値が 21 の場合、つまり 21 個のノードから応答を受信した後、これらのノードの価格データの中央値が最終価格として採用されます。ただし、すべてのラウンドの価格結果がチェーン上で更新されるわけではありません。これらは、2 つのトリガー パラメータ (偏差しきい値とハートビートしきい値) のいずれかが満たされた場合にのみ更新されます。さらに、これら 2 つのパラメータの値は、PriceFeeds ごとに異なる場合があります。
要約すると、Chainlink 価格オラクルはアクセスが容易で、セキュリティが比較的高いと言えます。ただし、価格更新メカニズムの偏差しきい値により、価格の更新は数分または数十分から 24 時間の更新まで、比較的遅くなります。したがって、通常は価格の更新にそれほど敏感でないアプリケーションにのみ適しています。これは Chainlink 価格オラクルの制限でもあり、すべてのシナリオに適用できるわけではありません。
この記事は、ZAN チーム (X アカウント@zan_team ) の XiG (X アカウント@SHXiGi ) によって書かれました。