取引所などに頼らず自分のノードだけでビットコイン価格を推定できる方法が発明:UTXOracle
みなさんはビットコイン価格を知りたいとき、どのように調べていますか?
一般的な調べ方として以下のような方法が考えられると思います:
・取引所のウェブサイトやアプリ、APIから確認する
・TradingViewのようなトレードツールから確認する
・Googleなどで検索する
これらはどれも何らかの主体にデータ提供を依存しています。よくこの主体のことを「オラクル」と呼び、オラクルなしでは市場価格がわからない問題、ひいてはオラクルが嘘をつくことで市場を操作できる可能性を指して「オラクル問題」と呼んだりします。
イーサリアム上のDefiで数年前に普及し始めたAMMという取引所のようなスマートコントラクトでは預けられた資産の割合によって価格が決定するという斬新なアプローチを取っています。仮に「BTC・USDTペア」に1 BTCと1万USDTが預けられていれば現在のBTC価格は10,000 / 1 = 10,000 USDT、というふうに、そのスマートコントラクトに預けられている資産だけで価格が計算できます。つまりオラクルを使用しません。
それでも実際には安全性の面でオラクルを利用していたり、取引所の市場価格を参考にトレードされていますが。
さて、ビットコインにはAMMはありませんし、ビットコインのスマートコントラクトから利用できる形で実現する見込みもありません。設計が違うためです。DLCといったビットコイン上のP2P取引のためのプロトコルもオラクルに依存することを受け入れています。(複数のオラクルを使うこともできますが)
ところが最近、ビットコインノードのデータ分析を行っているUTXO.liveの開発者がビットコイントランザクションの分析だけでその日のビットコイン価格を誤差1%の精度で求めることができると発表しました。
今日はその仕組みと、ビットコインで活用できる見込みがあるのかについて検討してみます。
・「ドル建てと思われる」ビットコイン送金の抽出
・現状ではビットコインのスマートコントラクトから参照できない
・「BitVM」と呼ばれる新しいテクニックで参照できるようになる可能性は?
「ドル建てと思われる」ビットコイン送金の抽出
UTXOracleがビットコインのドル建て価格を推定できる原理は「ドル建てと思われる」ビットコイン送金を抽出することです。
具体的には、調べたい日の全てのトランザクションのうち10 BTCを超える超高額送金と、ついでに0.00001 BTC (1000 sats)以下の超少額の送金も大抵の場合は送金以外の目的がありノイズにしかならないので排除します。
次に「ビットコイン建てと思われる送金」を取り除きます。これは0.1 BTC、0.005 BTCのように端数のないきれいな数字の送金のことで、おそらく送金額をビットコイン建てで決められているものです。ただし、例えば1 BTC = 10,000ドルのような条件下においてはドル建て送金もこの特徴に一致してしまうため、端数のない送金は単純に取り除くのではなく平滑化処理(スムージング)を行って特異度を下げます。
さて、これで一部の送金を排除しビットコイン建てと思われる送金によるデータの偏りも目立ちにくくなりました。ここでドル建て金額をいくつか含む「ステンシル」を合わせることで実際のビットコイン価格を推定できます。
例えばステンシルが$100、$200、$500、$2,000、$3,000だとして、その日ビットコイン送金がたくさん行われた送金データの山が0.0015、0.003、0.0075、0.03、0.045にあったら$100 = 0.0015 BTC、つまり1 BTC = 66,666ドルとなります。

上記の手順をPythonで実行するためのソースコードがUTXOracle.pyとして公開されています。
現状ではスマートコントラクトから参照できない
さて、せっかくオラクルなしで精度もそこそこ高くビットコイン価格を求める方法が見つかったわけですが、残念ながら現状ではビットコインのスマートコントラクト(スクリプト)からは参照できません。ビットコインのスマートコントラクトはトランザクションごとに世界が閉じており、トランザクションの外部にあるデータ(ノードの情報や外部API、外部プログラムの実行結果など)を直接参照することができないためです。DLCなどでオラクルを利用するのはこのためです。
仮にUTXOracleがスクリプト内から参照できるとしたら、すべてのノードがそのトランザクションを検証するときに与えられた条件でUTXOracle.pyを実行することになりますが、その処理を行う負担は大きいと言えるでしょう。したがって今後も「このままの使い方では」利用できません。
ちなみに安全性の面に触れると、UTXOracleを操作しようと思うと非常に大きな数のトランザクションを作成してステンシルが合わないようにする、あるいは誤った値に合致してしまうようにする必要があり、かなり大きなコストがかかると考えられます。そういう意味では攻撃耐性は比較的高いと言えるでしょう。故にもったいない。
BitVMを使えば参照できるようになる?
今週ツイッターで話題になった別の発明に「BitVM」というものがあります。これはTaprootにより多量のデータ(スクリプトのツリー)にコミットできるようになったことを応用して「計算回路」にコミットしたトランザクションをProverとVerifierの二者間で実行できるというものです。ここで計算回路とは任意のプログラムをNANDゲートと呼ばれる論理回路だけで作り直したものを指します。NANDのロジックはBitcoin Scriptでも検証できるため、オンチェーンで計算の結果を検証できるということです。
工夫されているポイントとして数トランザクションにわたるチャレンジレスポンス方式の採用により、もしProverが事前に共有した内容と異なる計算結果を使用した場合にVerifierはProverの資金を没収できる仕組みになっており、BitVMはトランザクションをオフチェーンでまとめるOptimistic Rollupのようなものにも使えるのではないかと期待する声もあります。
同様に、任意のプログラムを実行できるということは前出のUTXOracle.pyを回路にしたものを実行できるかもしれません。そうすればオラクルを使わずに「10,000ブロック後に直近144ブロックのビットコイン価格を元に取引する」先物取引のようなものも作れるかもしれません。
ただしBitVMはまだ世に出たばかりのコンセプトであり、実装もされていないためこのテーマにはいつかまた戻ってくることになりそうです。
まとめ
UTXOracleはビットコイン上のドル建て送金に注目することでビットコイン価格を逆算するテクニックで、現状のビットコインではトランザクション内から参照できないため使い道はない。しかし、BitVMやその他の方法で将来的に任意のプログラムの実行による計算結果を条件とするスクリプトを記述できるようになると、外部のオラクルに頼る必要なくビットコイン価格に依存したコントラクトを記述できるかもしれない。
次の記事
読者になる
一緒に新しい世界を探求していきましょう。

ディスカッション