オラクル:ブロックチェーンはどうやって価格を知るのか、なぜ重要なのか

ブロックチェーンは外の世界を見られません。Chainlinkなどの価格オラクルが市場価格をチェーンに届ける仕組み、失敗しうる点、自分で確かめる方法を解説します。

11分で読めます

細身のテラゾーの塔の頂にオレンジ色に輝く球があり、その光が下のコインを照らしている様子
このページの内容
  1. 要点
  2. オラクル問題
  3. 分散型の価格フィードの仕組み
  4. 一つの市場の価格が危険な理由
  5. 融資・取引サービスは価格フィードをどう使うか
  6. チェーン上の価格は誰でも確かめられる
  7. ほかの方式:PythとUniswapのTWAP
  8. よくある質問
  9. 出典

スマートコントラクトは何百万ドルもの資産を預かり、ルールどおりに完璧に動きます。それでも、ビットコインがいくらなのかは知りません。ブロックチェーンが見られるのは、すでにチェーン上にあるデータだけだからです。その橋渡しをするのがオラクルです。外部の情報、多くの場合は価格を、チェーン上に届けるサービスを指します。

この記事では、なぜその橋渡しが必要なのか、Chainlinkのような分散型の価格フィードがどう動くのか、一つの市場だけを信じると何が起きるのか、そしてチェーン上の価格を自分で確かめる方法を説明します。

要点

  • ブロックチェーンは、外部のデータを自力で取りに行けません。オラクルが、通常のトランザクションとしてチェーンに書き込みます。
  • Chainlinkの価格フィードは、それぞれ複数のデータ源を使う多数の独立したノード運営者の回答をまとめ、中央値を公開します。値は、一定の価格変動か一定の時間経過で更新されます。
  • 一つの取引所やプールのスポット価格に頼るのは危険です。2020年には融資サービスbZxへのフラッシュローン攻撃が、たった1回のトランザクションで約63万5,000ドルの利益を上げました。
  • 融資や取引のサービスは、オラクルの価格で担保を評価し、清算を発動します。慎重なサービスは独自の安全策も加えています。
  • パブリック・チェーン上の価格は透明です。最新の値、それが記録された時刻、過去の履歴を誰でも読めます。

オラクル問題

ブロックチェーンのネットワークでは、すべてのノードがすべてのトランザクションを実行し直し、まったく同じ結果にたどり着かなければなりません。そうすることで、互いを知らない何千もの参加者が、信頼し合わなくても残高について合意できます。もしコントラクトがウェブサイトに問い合わせられたら、ノードごとに違う答えが返ったり、同じノードでも1分後には別の答えが返ったりして、合意が崩れてしまいます。

そのためブロックチェーンは、チェーン上に保存されたデータだけを使って合意を形成します。外部のデータは、誰かがトランザクションとして書き込む必要があり、その誰かがオラクルです。ここにオラクル問題があります。コントラクトの信頼性は、それが使うデータの信頼性を超えられません。一つのデータ提供者に頼れば、ブロックチェーンがなくそうとした「信頼」を呼び戻すことになります。

分散型の価格フィードの仕組み

Chainlink Data Feedsは、単一の当事者が価格を決められないように設計されています。Chainlinkは3層の集約を説明しています。まず、データ集約業者が多数の取引所の生の価格をまとめ、出来高で重み付けし、外れ値を取り除きます。次に、各ノード運営者が複数の集約業者からデータを取得し、その中央値をとります。最後に、ネットワークが多数の独立したノード運営者の回答をまとめ、もう一度中央値をとります。

素材の異なる細い柱が何本も並び、中央の台座に光を送り込んでいる様子
多くの独立した情報源から、一つにまとめた答えを

重い処理は、Offchain Reporting(OCR)というプロトコルでチェーンの外で行われます。ノードはピアツーピアのネットワークで署名付きの観測値を交換し、リーダー役のノードがそれを一つのレポートにまとめます。定足数のノードが署名すると、1回のトランザクションでレポートがチェーンに届けられます。アグリゲーター・コントラクトは署名を確認し、中央値をタイムスタンプとラウンド番号とともに保存します。

手順:ノードが価格を集める → 観測値を共有する → 定足数が一つのレポートに署名 → 1ノードが送信する → コントラクトが値を保存 → アプリが最新値を読む1ノードが価格を集める複数のデータ集約業者から2観測値を共有するチェーン外、ピアツーピアで3定足数が一つのレポートに署名中央値を含む41ノードが送信する1回のトランザクションで5コントラクトが値を保存タイムスタンプとラウンドIDつき6アプリが最新値を読むプロキシ・コントラクト経由で手順:ノードが価格を集める → 観測値を共有する → 定足数が一つのレポートに署名 → 1ノードが送信する → コントラクトが値を保存 → アプリが最新値を読む1ノードが価格を集める複数のデータ集約業者から2観測値を共有するチェーン外、ピアツーピアで3定足数が一つのレポートに署名中央値を含む41ノードが送信する1回のトランザクションで5コントラクトが値を保存タイムスタンプとラウンドIDつき6アプリが最新値を読むプロキシ・コントラクト経由で
  1. ノードが価格を集める (複数のデータ集約業者から)
  2. 観測値を共有する (チェーン外、ピアツーピアで)
  3. 定足数が一つのレポートに署名 (中央値を含む)
  4. 1ノードが送信する (1回のトランザクションで)
  5. コントラクトが値を保存 (タイムスタンプとラウンドIDつき)
  6. アプリが最新値を読む (プロキシ・コントラクト経由で)

わずかな値動きまで毎回チェーンに書き込むと、手数料の無駄になります。そこでフィードは、二つの条件のどちらかが満たされたときに更新されます。乖離しきい値(deviation threshold)は、チェーン外の価格がチェーン上の値から一定の割合以上ずれたときに新しいラウンドを始めます。ハートビート(heartbeat)は、価格がほとんど動いていなくても、前回の更新から一定の時間がたつとラウンドを始めます。

主要な数字31イーサリアム上のETH/USDを支えるオラクルノード数0.5%更新のきっかけになる価格変動1時間更新と更新の最大間隔主要な数字31イーサリアム上のETH/USDを支えるオラクルノード数0.5%更新のきっかけになる価格変動1時間更新と更新の最大間隔
  • 31: イーサリアム上のETH/USDを支えるオラクルノード数
  • 0.5%: 更新のきっかけになる価格変動
  • 1時間: 更新と更新の最大間隔
イーサリアム上のフィード乖離しきい値ハートビート
ETH/USD0.5%1時間
BTC/USD0.5%1時間
USDC/USD0.25%23時間
USDT/USD0.25%24時間
TAO/USD2%24時間

これは2026年9月29日時点でChainlinkが公開している設定です。値動きの少ないステーブルコインのフィードは1日1回しか更新されないこともありますが、ETH/USDは相場が荒れると1時間に何度も更新されます。

一つの市場の価格が危険な理由

価格をチェーンに届ける最も簡単な方法は、一か所から読むことです。つまり、一つの取引所か、分散型取引所(DEX)の一つのプールです。しかし、価格の動かしにくさは、動かすのに必要な資金の額で決まります。取引の薄い市場なら、その額は驚くほど小さいことがあります。

フラッシュローンが事態をさらに悪くします。フラッシュローンは、同じトランザクションの中で借りて返さなければならない融資で、返済されなければトランザクション全体が取り消されます。そのため誰でも、攻撃が一度で元を取れる限り、担保なしで一瞬だけ何百万ドルも動かせます。

2020年2月のbZx攻撃

2020年2月18日、ある攻撃者がまさにこの手口で、イーサリアム上の融資・証拠金取引サービスbZxを狙いました。bZxはステーブルコインsUSDの価格を、UniswapのプールとKyberのリザーブという二つの小さなオンチェーン市場から取っていました。インペリアル・カレッジ・ロンドンの研究者は、後にその手順を再現しています。

手順:7,500 ETHを借りる → 小さな二つのプールでsUSDを買う → 市場価格でさらにsUSDを買う → 110万sUSDをbZxに担保として預ける → 6,799 ETHを借りてローンを返す17,500 ETHを借りるフラッシュローン、1回の取引内2小さな二つのプールでsUSDを買うそこで価格が跳ね上がる3市場価格でさらにsUSDを買うSynthetixで約94万4,0004110万sUSDをbZxに担保として預けるつり上がった価格で評価56,799 ETHを借りてローンを返す約2,381 ETHが手元に残る手順:7,500 ETHを借りる → 小さな二つのプールでsUSDを買う → 市場価格でさらにsUSDを買う → 110万sUSDをbZxに担保として預ける → 6,799 ETHを借りてローンを返す17,500 ETHを借りるフラッシュローン、1回の取引内2小さな二つのプールでsUSDを買うそこで価格が跳ね上がる3市場価格でさらにsUSDを買うSynthetixで約94万4,0004110万sUSDをbZxに担保として預けるつり上がった価格で評価56,799 ETHを借りてローンを返す約2,381 ETHが手元に残る
  1. 7,500 ETHを借りる (フラッシュローン、1回の取引内)
  2. 小さな二つのプールでsUSDを買う (そこで価格が跳ね上がる)
  3. 市場価格でさらにsUSDを買う (Synthetixで約94万4,000)
  4. 110万sUSDをbZxに担保として預ける (つり上がった価格で評価)
  5. 6,799 ETHを借りてローンを返す (約2,381 ETHが手元に残る)

二つのプールでは、sUSDが一時的に他の市場の約2.5倍の値段になっていました。そのためbZxは、担保の実際の価値をはるかに上回るETHを貸してしまいました。攻撃者の手元には2,381.41 ETH、当時の約63万4,900ドルが残り、トランザクション手数料は118.79ドルでした。損失を負ったのはbZxの貸し手です。

平均をとれば万全、ではない

情報源を組み合わせても、どれもが同じ薄い市場を見ていれば意味がありません。米商品先物取引委員会(CFTC)の訴状によると、2022年10月、暗号資産の取引・融資サービスMango Marketsのあるトレーダーが、同サービスのオラクルに価格を供給していた三つの取引所でMNGOトークンを大量に買いました。オラクルが示すMNGOの価格は30分で13倍を超え、トレーダーは膨らんだポジションを担保に1億1,000万ドル超を引き出しました。

Chainlink自身もドキュメントで、取引の少ない資産はフラッシュローンを使った攻撃や資金力のある参加者によって操作されうると警告しています。

注意

価格の強さは、それを動かすのに必要なお金の量で決まります。一つの取引所、一つのプール、あるいは取引の少ないトークンで担保を評価するアプリでは、十分に大きな取引やフラッシュローンによって、その価格を一瞬ほぼ思いどおりの値にできてしまいます。

融資・取引サービスは価格フィードをどう使うか

融資サービスでは、担保を預けてそれを元にお金を借ります。サービス側は、融資がまだ安全かどうかを判断するために、すべての資産の価格を必要とします。Aaveはこれをヘルスファクターで表します。担保の価値に清算しきい値という安全率を掛け、借入額で割った値です。これが1を下回ると、第三者が借金の一部を返済し、代わりに担保の一部をボーナス付きで受け取れます。これが清算です。Aave V3の価格オラクルはChainlinkのアグリゲーターから価格を取り、フィードがゼロ以下を返した場合は予備のオラクルに切り替えます。

価格の誤りは、どちらの方向でも高くつきます。低すぎれば健全な借り手が清算され、高すぎれば借り手が担保の価値以上のものを持ち去れます。bZxの貸し手が経験したとおりです。

レバレッジ取引のサービスには、ハートビートより速い価格が必要です。そのため多くは、Chainlink Data Streamsのようなプル型のフィードを使います。1秒未満の間隔で署名付きレポートとして届く価格を、それを使うトランザクションの中でチェーン上で検証する仕組みです。

慎重なサービスは独自の点検を加えています。Chainlinkは、価格の上限・下限、サーキットブレーカー、鮮度の確認を勧めています。旧MakerDAOのSkyプロトコルは、価格をOracle Security Moduleに通し、新しい値を標準で1時間保留してから使います。オラクルへの攻撃に対応する時間を確保するためです。

チェーン上の価格は誰でも確かめられる

フィードはパブリック・ブロックチェーン上にあるので、すべての更新は誰でも調べられるトランザクションです。フィードの最新の回答、更新時刻、ラウンド番号を読み、過去のラウンドをさかのぼり、どのノードがそのフィードを支えているかも確認できます。融資サービスが誰かを清算したとき、使われた価格は記録に残っています。

たとえば、イーサリアム上のETH/USDフィードのプロキシ・アドレスは0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419です。ブロックエクスプローラーでlatestRoundDataを呼び出すと、小数点以下8桁の価格と最終更新時刻が返ってきます。nowcoinも同じ方法で、表示する価格をチェーン上のChainlinkフィードから読み取っています。

ただし、この透明性には限界もあります。ネットワークがいつ何を報告したかは見えますが、その背後にあるデータ提供者の生の入力がすべて見えるわけではありません。

ほかの方式:PythとUniswapのTWAP

Chainlinkのプッシュ型フィードは、いくつかある方式の一つです。

マインドマップ:価格オラクルプッシュ型Chainlink Data Feeds乖離かハートビートで更新プル型PythChainlink Data Streamsオンチェーン平均Uniswap v2のTWAPUniswap v3の観測値単一のスポット価格一つの取引所やプール操作されやすい価格オラクルマインドマップ:価格オラクル価格オラクルプッシュ型Chainlink Data Feeds乖離かハートビートで更新プル型PythChainlink Data Streamsオンチェーン平均Uniswap v2のTWAPUniswap v3の観測値単一のスポット価格一つの取引所やプール操作されやすい

マインドマップ:価格オラクル

  • プッシュ型
    • Chainlink Data Feeds
    • 乖離かハートビートで更新
  • プル型
    • Pyth
    • Chainlink Data Streams
  • オンチェーン平均
    • Uniswap v2のTWAP
    • Uniswap v3の観測値
  • 単一のスポット価格
    • 一つの取引所やプール
    • 操作されやすい

Pythはプル型を採っています。価格の出どころは、取引所、銀行、トレーディング会社、マーケットメーカーなど120を超えるファーストパーティーの提供者で、400ミリ秒ごとに更新されます。各価格には信頼区間が付いており、提供者の見方が割れるほど幅が広がります。標準的なプル型の運用では、価格は必要とされたときにだけブロックチェーンに届きます。誰でも署名付きの更新をPythのコントラクトに送ることができ、コントラクトはそれを検証します。多くの場合、その価格を使うのと同じトランザクションの中で行われます。

Uniswapは、時間加重平均価格(TWAP)という別の道具を提供しています。Uniswap v2のプールは、各ブロックの最初に測った価格を、その価格が続いた時間で重み付けして累積値に加えていきます。二つの時点の累積値を比べれば、その間の平均価格がわかります。1時間のTWAPを5%動かすには、攻撃者はプールの価格を約1時間にわたって市場から5%ずらし続け、その間ずっと裁定取引業者に支払いを続けなければなりません。Uniswap v3のプールは最大65,535個の観測値を保存できますが、v4には組み込みのオラクルがありません。

方式仕組み主な弱点
プッシュ型ノードが乖離やハートビートを条件に中央値を書き込むしきい値未満の値動きは反映されない
プル型署名付きの価格を使うときに検証するアプリが更新を取得し、古さを確かめる必要がある
TWAPプール自身の価格を時間で平均する速い相場に遅れる。安全性はプールの厚みしだい
単一のスポット価格一つの取引所やプールを直接読む安く操作できてしまう

よくある質問

スマートコントラクトが取引所のウェブサイトを直接見られないのはなぜですか?

すべてのノードがコントラクトを実行し直し、同じ結果を出す必要があるからです。ウェブのデータは刻一刻と変わり、場所によって違うこともあるため、ノード間で食い違ってしまいます。オラクルは外部データをトランザクションに変え、どのノードからも同じに見えるようにします。

Chainlinkの価格はどのくらいの頻度で更新されますか?

価格がフィードの乖離しきい値を超えるか、ハートビートの時間が来るか、どちらか早いほうで更新されます。イーサリアム上のETH/USDなら、0.5%の変動か1時間です。

オラクルが間違うことはありますか?

あります。元になる市場が操作されることも、ノードが故障することも、フィードが廃止されることもあります。Chainlinkによれば、停止したフィードはゼロを返すか、データを返しません。だからこそアプリは、鮮度の確認、価格の上限・下限、予備の手段を組み込みます。

プッシュ型とプル型のオラクルは何が違うのですか?

プッシュ型は自らのスケジュールで価格をチェーンに書き込むので、最新の値がいつでも読めます。プル型は署名付きの価格をチェーンの外に置いておき、アプリや利用者が必要なときに送信します。多くの場合、その価格を使うのと同じトランザクションの中です。

出典

情報提供のみを目的としています。金融、法律、税務に関する助言ではありません。

暗号資産を、ひとつのウォレットで。

ビットコイン、イーサリアム、USDT、USDCなどをひとつのアカウントで保有できます。価格はオンチェーンで取得し、手数料はすべて確定前に表示します。

アカウント作成