【Dfinity】Internet Computer の概要と Bitcoinとの統合についての解説
はじめに
こんにちは。Dfinity JP(非公式コミュニティ)の @hoosan16 です。Dfinity の開発している Internet Computerと Bitcoin ネットワークの統合について、自分が調べた範囲の内容をできるだけ噛み砕いてまとめたいと思います。説明が足りていなかったり、分かりにくい部分もあるかと思いますが、どなたかの理解の助けになれば嬉しく思います。間違いがありましたらご指摘いただけますと幸いです。
用語(注):この記事では「Dfinity」は「Dfinity Foundation(組織)」を指し、Internet Computer は「Dfinityの開発する分散型クラウドコンピューティングプラットフォーム」を指します。
クロスチェーンブリッジの課題:カストディアンの存在
現在 Bitcoin とEthereum(任意の既存チェーンに対して同様ですが、ここでは代表として Ethereum を挙げます)の接続は、 WBTC(Wrapped Bitcoin)で行われています。WBTC の場合、世の中にある全ての WBTC に対してカストディアンである BitGo が同額の BTC に相当する金額を保有・管理することで、WBTC には BTC と同額の価値があることが担保されています。つまり、BitGo への信頼によってブリッジが成立しています。
実際には WBTC のミントは大口(数百〜数千 BTC)で行われます[参照]
BitGo はカストディアンとしてその役目を今日まで果たしており、幸いにもこれまでハッキング被害を受けていませんが、クロスチェーン Bridge 全般にハッキングのリスクが常につきまとうことは周知の通りです。実際、クロスチェーンプラットフォームである Poly Network が 670 億円のハッキング被害にあったことは記憶に新しいところであり、Bridge におけるセキュリティの重要性が再認識されました[参照]。1ヶ月ほど前にVitalik氏もクロスチェーンBridgeを問題視するツイートをしています[参照]。また、この記事を書いているさなか、クロスチェーン Bridge の Wormhole が 370 億円のハッキング被害に遭いました[参照]。
このような問題に対して、Dfinity ではカストディアンを挟まずに Bitcoin を Internet Computer 内のスマートコントラクトでプログラマブルに送金できる仕組みである、 Internet Computer と Bitcoin ネットワークの統合(マルチチェーンBridge)が進められています。
Bitcoin トランザクションのおさらい
Internet Computer とBitcoin の統合について話を進める前に、Bitcoin のトランザクションについて簡単におさらい[参照]しましょう。ご存知の方も多いと思いますので、必要ない場合は読み飛ばしていただいて結構です。
いつものように Alice と Bob に登場してもらって、Alice から Bob に Bitcoin を送金します。
トランザクションは、誰がいくら送金するかを表す インプット と、誰がいくら受け取るかを表す アウトプット の組み合わせで作られています。Alice は、インプットとして、以前のトランザクションで受け取ったアウトプットのうち、まだ使用していないものを使うことができます。これを、未使用トランザクションアウトプット(UTXO; Unspent Transaction Output) と呼びます。上の図では Alice は複数の UTXO をまとめて Bob に支払おうとしていますが、これは以前受け取った少額のコインをまとめて次の支払いに使うのと似ています。
Bitcoin トランザクションとは、送信元(Alice)の UTXO を使って送信先(Bob)のアドレスに紐づいた UTXO を作ることです。UTXO は Bitcoin ネットワーク全体によって認識されており、所有者が将来の取引で使用することができます。使用する UTXO が Alice のものだということを証明するために、Alice のウォレットの秘密鍵を用いて署名を行います。署名されたトランザクションは Bitcoin ネットワークの複数のノードに送信され、ノードによって検証されながらネットワーク上を伝搬していきます。
UTXO にかけられた鍵(Locking Script)に対し、署名によって解除するスクリプト(Unlocking Script)をトランザクションが含んでいることで、トランザクションが有効であることを Bitcoin ネットワークのノードで検証可能にしています。なお、Bitcoin ネットワークは Script 言語を有していますが、ループやif文などの分岐処理ができないようにその機能を意図的に制限しており、汎用言語ではありません。
IF 文は可能でした[参照]。間違いご指摘いただきありがとうございました。
トランザクションはブロックと呼ばれる元帳にまとめられ、マイナーによってブロックチェーンの最新のブロックとして承認(Confirmed)されます。経験的にトランザクションがブロックチェーンに追加されてから6ブロック伸びると正しくブロックチェーンに取り込まれたと判断します(10分/ブロック×6ブロック=60分)。マイナーはブロックチェーンに記録する権利を競争しており、十分なコンピュータリソースが注ぎ込まれた証明(Proof of Work)が Bitcoin のセキュリティモデルの基礎となっています。
Internet Computer と Bitcoinの 統合を理解する上で重要なことは、Bitcoinネットワークの UTXO を Internet Computer の内部から参照する必要があるということと、トランザクションを組んだり署名したりする段階ではBitcoinネットワークに繋がっている必要はなく、作られたトランザクションが最終的にBitcoinネットワークに伝えられ、承認されれば良いということです。
また、Bitcoin ネットワークのトランザクションの署名には秘密鍵が必要ですが、例えば Ethereum のスマートコントラクトで Bitcoin ネットワークのトランザクション署名をすると、秘密鍵がスマートコントラクトに載ってしまい、安全な署名ができません。Internet Computer では、この後の章で述べるように秘密鍵を秘密分散して閾値署名(一定数以上のノードが集まったら署名できる)を行う仕組みがあり、この機能を拡張することでスマートコントラクトで Bitcoin ネットワークのトランザクション署名を行うことが可能になります。
Internet Computer の概要
Internet Computer と Bitcoin ネットワークの統合について説明する前に、Internet Computer についての簡単な概要を以下に示します。ご存知の方は読み飛ばして頂いて結構です。
Internet Computer では、地理的に分散されたデータセンタ内に置かれた複数のノードマシン(ハードウェア)上で、レプリカ(Replica)と呼ばれるソフトウェアが動作しています。ノードマシンはサブネット(Subnet)と呼ばれる集合体に(データセンタのノードマシンが散らばるように)グルーピングされており、それぞれのサブネットでそれぞれのブロックチェーンが動作しています[参照]。また、一つのサブネット内では各ノードのステート(状態)が複製されています(ソフトウェアがレプリカと呼ばれる所以です)。以下の図は、異なるデータセンタのノードが集まってサブネットが構成する様子を示しています。
ノードマシンは登録制で、承認された団体(主に企業)が運営しています。運営者はノードプロバイダと呼ばれ、ダッシュボードから一覧を確認することができます[参照]。
Internet Computer は、(AWSのような)クラウドコンピューティング環境を提供する PaaS として、ソフトウェアを実行する計算リソース(CPUとメモリ)を開発者に提供しており、デプロイされたアプリケーションにユーザーがアクセスすることができます。重要なのは、Internet Computer にデプロイされたアプリケーションは(この後の説明にたびたび登場する)Canister と呼ばれる単位で実行されるということです。
Canister の実態は、WASM(WebAssembly)にコンパイルされたバイトコードとメモリがバインドされたものです)。
各ノードで実行されているレプリカ(ソフトウェア)では、Internet Computer のプロトコルが動いており、サブネット間でのメッセージング、コンセンサスアルゴリズム、Canister の実行などの諸々が行われています。以下は、Internet Computer のプロトコルを4つのレイヤーに分けて示した図です。
各層の役割について以下に簡単に説明を加えます。
Peer-to-peer 層
この層では、外部からのユーザー入力や、他のサブネットからのメッセージをサブネット内のノード間に複製するための Peer-to-peer メッセージングを行います。ネットワーキング層とも呼ばれます。
コンセンサス層
コンセンサス層では、ユーザーからの入力や他のサブネットから受け取ったメッセージ(Canister へのインプット)を順序づけして並べ、ビザンチン障害耐性(BFT; Byzantine Fault Tolerance)を有するコンセンサスアルゴリズムによって公証(Notarization)とブロックの確定(Finalization)を行い、ブロックチェーンのブロックを作成します。
サブネット内のノードのうち、ブロックを作成する Block Makerと公証を行う Notary の役割を担うノードがランダムに決められます。Notary は Proof-of-Stake でいうところのバリデータに対応していますが、ステーク量に応じたバリデータ選出の重み付けのようなことは行われず、全てのノードが平等に扱われます。このランダムな選出を行う手段が重要(事前にどのノードが選出されるかを予測できてはいけないし、選出に偏りがあってはいけない)であり、Internet Computer では検証可能なランダム関数(VRF; Verifiable Random function)を用いてランダム選出が行われています。この VRF の役割を果たす選出機構は Internet Computer の用語ではランダムビーコン(Random Beacon)と呼ばれており、後述する閾値BLS署名を使って「一定数以上のノードが集まると乱数を生成でき、各ノードは乱数の結果が正しい(改変されていない)ことを検証可能である」ことが実現されています[参照](署名によって得られるハッシュ値を乱数として使用していると考えられます[要出典])。以下の図[引用]はRandom Beacon、Notary、Block Makersの関係を表しています。
Block Maker に選出されたノードはリーダー(Leader)と呼ばれ、ブロックを提出して他のノードから公証されます。全体の 2/3 以上のノードの合意が得られると公証が成立し、かつネットワークが同期的(synchronous)だった場合、そのブロックは閾値BLS署名されてそのままツリーに追加されます。閾値署名の検証はNNSのレジストリに登録されている公開鍵を行うことで可能です。次章で説明しますが、ノードに秘密分散されている秘密鍵の"かけら"は一定間隔で再分散(re-sharing)されることで安全が担保されています。 この、一つの不変の公開鍵でブロックの合意形成(閾値署名)を検証できること が Internet Computer の(おそらく最も大きな)特徴です。
ブロックチェーンにおける閾値署名というと、BitcoinのTaprootで実装されたシュノア署名のように、マルチシグネチャにおいて(従来の複数署名に対して)署名集約する文脈で使われることが多いと思います。Internet Computer での閾値署名の使い方は、サブネット全体で一つの公開鍵があり、ノードが秘密鍵の”かけら”を持つことで、ブロックそのものの合意形成の証明を閾値署名で行う というものです。これにより、Genesis ブロックからの全てのブロック情報を同期することなく、ブロックが改変されていないことを検証することができます。
なお、公証が否定されたり、ネットワークが非同期的(asynchronous)だった場合には、他のノードが Block Maker となります。複数のブロックが提出された場合、時間内に提出されて公証されたブロックのうち最もランクが低い(0が最も低く、1, 2と続く)Block Maker が提出したブロックが最終的に採用(Finalized)されることになります[参照]。
以下の図は、ブロックチェーンを模式的に表した図[引用]です。四角がブロック、四角の中の数字がブロック高さを表し、ノードのランクを小さい文字で示しています。Nがついているのは、このブロックが公証されたことを表しており、色の濃い四角は確定(Finalized)されたブロックを示します。以下の図では、ブロック高さが31と34の時に、ランク0のノードが公証されず、ランク1とランク2のノードのブロックが時間内に公証され、結果的に最も高いランクのもの(図ではランク1)が採用されている様子を表しています。
ブロックの確定には2/3のノードの合意が必要なので、攻撃者が 1/3 未満であるという前提のもとで安全に合意形成できるというのがInternet Computer のセキュリティモデル(安全性の拠り所)となっています。逆にいうと 1/3 以上のノードに不正されてしまうと合意形成ができなくなってしまいますので、これを防ぐためにノードの分散性は非常に重要です。 Bitcoin ブロックチェーンを攻撃するためには全体のハッシュパワーの 51% 以上の計算リソースを必要とすることを考えると Internet Computer のセキュリティモデルは Bitcoin ブロックチェーンと比較すると貧弱であり、現状 Internet Computer のノードプロバイダになれる団体を承認性にすることでシビルアタック対策を行っています。なお、ブロックの分岐は各ラウンドでは起こりうるものの、そのラウンドでファイナライズされた時点で過去のチェーンは覆ることはなく、ナカモト・コンセンサス(複数の分岐の中から、最もコストがかかった歴史を正史として認める合意形成)は行われません。
ノードの "不品行" はブロックに含めるペイロードの改変のみならず、他のノードに不必要なリクエストを大量に送りつける DDoS 攻撃などもあります。さまざまなパターンの不品行の検出やノードへのペナルティは長期的なR&D対象となっています[参照]。
メッセージルーティング層
メッセージルーティング層には、コンセンサス層で確定したブロックに含まれるペイロード(payload)が送られてきます。ペイロードには、Canister への入力シークエンスと前のブロックのハッシュ値が含まれています。メッセージルーティング層では、ペイロードに含まれる入力シークエンスの実行層への入力キューを管理しています。Canister の実行結果(出力)はメッセージルーティング層に再び返され、ユーザーや他のサブネットへメッセージングされます。
実行層(または実行環境)
実行層では、Canister のランタイム環境と、他の Canister や外部ユーザーとメッセージパッシングによって通信するための環境が提供されています。Canister はステートマシンレプリケーション(SMR; State Machine Replication)になっており、生成された出力に対してここでも BLS 閾値署名が行われ、メッセージルーティング層に渡されます。
ステートマシンレプリケーションとは、状態遷移がある順序づけられた入力のシーケンスによって引き起こされ、その状態遷移が決定論的(Deterministic)である場合に、ノードで実行されたステートが(悪意を持って改変しない限りにおいて)同一であることを保証することです。つまりは、Canisterへの入力はブロックチェーンによって確定しているので、実行されるCanisterがステートマシンであれば各ノードの実行結果は等しくなるはずであり、出力に対して(サブネット内での合意形成として)閾値署名を行うことで、実行結果が改変されていないことを保証できるということです。
秘密計算とBLS閾値署名
Internet Computer と Bitcoin ネットワークの統合では秘密計算(データを秘匿しながら計算すること)、特に複数ノードで計算するマルチパーティ計算(MPC; Multi-Party Computation)が重要なので、概要を簡単に説明します。
秘密計算とは、「 人がそれぞれ ”秘密の値” を持っており、互いに秘密の値を見せることなくある関数を計算する」ことです。前章で出てきたBLS閾値署名は「 個のノードがそれぞれ秘密の値(分割された秘密鍵)を持っており、お互いに秘密の値を見せることなくある関数を計算する(署名を作る)」手段ですので、まさに秘密計算の一種です。
BLS 閾値署名では、秘密鍵を分割した秘密の値 〜 を各ノードに持たせています(秘密鍵に対応する公開鍵はサブネットに登録されています)。秘密鍵を分割してある閾値でもって復元するのには 閾値秘密分散法という方法がとられています。これは、秘密鍵 を 個に分割し、そのうち 個集まれば復元できるという方法です。有名なのはシャミアの秘密分散法(SSSS; Shamir’s Secret Sharing Scheme)で、「秘密にしたい値が定数項になるような 次多項式を用意してその式上の点を 個とっておいて分散し、 個の点が集まるとその多項式は一意に定まるので定数項が復元できる」という、いたってシンプルなものです[参照]。
また、秘密鍵そのものを復元してしまったら秘密でなくなってしまって秘密分散の意味がありませんので、誰も元の秘密鍵を知ることなく閾値署名を行うDKG(Distributed Key Generation)という技術が用いられています。さらに、各ノードが自分の持つ秘密の値が正しいものかどうか検証可能なように、Feldman (1987)によって提案された検証可能な秘密分散(VSS; Verifiable Secret Sharing)を組み込んだ Joint-feldman DKG を Internet Computer では用いています。これは、秘密鍵 を秘密の値 〜 に秘密分散する際に、秘密の値の定数倍である 〜 を公開しておき、各ノードは検証用の式を使って確認することで、自分の持つ秘密の値が正しいかどうかを検証できるというものです。
さらに Internet Computer では同じ秘密の値(秘密鍵が秘密分散されたもの)を使い続けるのではなく、元の秘密鍵を復元せずに一定期間ごとにリフレッシュする技術が用いられています。これにより秘密鍵の漏洩を防ぐのと同時に、サブネット内のノード数が変わったりしても安全な秘密計算ができるようになっています。この、秘密鍵の再分散(re-sharing)と閾値署名周りの暗号技術を総称して Dfinity では Chain-Key 暗号と呼んでいます。
一般的に電子署名は (1) 鍵生成 (2) 署名 (3) 検証の3ステップからなります。BLS署名では、(1) 秘密鍵 と を 倍した を公開鍵とする (2) 署名したいメッセージ に対してハッシュ値 をとり、秘密鍵 倍して署名 を作る(3) メッセージ と署名をもらった人 は公開鍵 を使って検証するという流れになります[参照]。署名時に乱数を使わない(ハッシュ値を定数倍するだけの)決定論的な手法なので秘密分散と相性がよいと言われています[参照](ただし、見た目は簡単そうに見えますが定数倍の実際の演算は複雑なものです)。BLS閾値署名のコンセンサスアルゴリズムへの適用に関しては、こちらの記事に詳しく解説されています[参照]。Internet Computer で用いられている BLS や、Bitcoin や Ethereum ネットワークで用いられている ECDSA といった楕円曲線暗号は、「秘密鍵 とその定数倍である を求めることは簡単だが、 が与えられた時に となる を見つけるのが困難」である楕円曲線上の離散対数問題(ECDLP; Elliptic Curve Discrete Logarithm Problem)を安全性の拠り所としています。
暗号と認証についての広範で分かりやすい説明をお求めの方は、光成滋生さんの著書をご参照ください[参照]。さらに数学的な背景まで学びたい方は同じく光成さんの著作である「クラウドを支えるこれからの暗号技術」をご参照ください[参照]。光成さんは Internet Computer の BLS 署名ライブラリの実装をされた方です。ちなみに、PRMLの略称で知られる「パターン認識と機械学習(Pattern Recognition and Machine Learning)」の教科書ガイドの著者でもあります[参照]。
Internet Computer と Bitcoin ネットワークの統合
さて、ようやく本題です。まず初めに、統合の概要を以下に示します。ユーザーは Bitcoin を外部のアドレスから Internet Computer 内部のアドレスに送金し、Internet Computer 内部では Canister 同士が Bitcoin を送金したり、Internet Computer 外部の Bitcoin アドレスに Canister から送金できるようになります[参照]。
これが実現すると、Internet Computer のスマートコントラクトで Bitcoin の送金をコントロールすることができるようになります。
もう少し具体的な仕様としては、以下のようになります。
- Canister が Bitcoinのアドレスを持つ(秘密鍵はサブネット内のノードに秘密分散される)
- Canister から Bitcoin ネットワークのUTXOが参照できる
- Canister が Bitcoinトランザクションの署名を秘密計算できる
ポイントとしては、Canister が Bitcoin のアドレスを持ち、Canister が ネイティブの Bitcoin を直接扱うようになることです。これは、Bitcoin アドレスの秘密鍵がサブネット内に秘密分散されており、署名の際に閾値署名を行うことで、秘密鍵が漏洩することなく署名できることで可能になります。
前章で Internet Computer は BLS 閾値署名を実装していると述べましたが、Bitcoin では ECDSA という、BLS とは別の楕円曲線暗号が用いられています。Dfinity が取り組む技術開発の一つには、この ECDSA 署名を Internet Computer で閾値署名できるようにするというのがあります。ECDSA 閾値署名自体は過去に提案されている手法がある[参照]ものの、これらは同期的ネットワークを前提としているため、非同期的に閾値署名を行う Internet Computer では独自の研究開発が必要な領域になっています[参照]。
さて、Bitcoin ネットワークとInternet Computer の接続についてもう少し詳しくみていきましょう。先ほど見たInternet Computer の4つのレイヤを思い出すと、一番下の Peer-to-peer 層は、外部からのユーザー入力などをサブネット内のノードに伝えるネットワーキングを行う役目でした。あるサブネットの Peer-to-peer 層が Bitcoin ネットワークから Bitcoin ブロックを受け取ると、サブネット内のノード全体にブロックの情報が伝搬されます。Bitcoin ブロックの情報は Internet Computer のスマートコントラクト(Canister)のインプットになりますので、コンセンサス層で Internet Computer のブロックチェーンに書き込まれます。次に、コンセンサス済のブロックメッセージルーティング層を介して実行層の Canister に伝えられます。デザイン上は、Bitcoin のブロック情報を持つ BTC System Component が用意され、他の Canister が UTXO にライブラリを介してアクセスできる仕様になるようです。以下の画像はフォーラムに貼られていたものをそのまま引用しています[参照]。
なお、「統合によって Bitcoin のトランザクションがほぼゼロコストになってファイナリティが2秒になる」とDfinityの創業者であるDominic氏が発言[参照]していますが、Dfinityが開発しているのはあくまで「Canister が Bitcoin ネットワークのトランザクションを閾値署名できる」仕組みであり、それ自体は Bitcoin の取引速度を上げるものでもトランザクションの手数料を下げるものでもありません。Canister が Bitcoinトランザクションを扱えるようになることで、例えば Internet Computer 内部のスマートコントラクトで BTC にペグされた Wrapped BTC のようなものがいずれ開発され、結果的に高速な取引を実現するサービスが現れるという意味だと思われます。今後 Bitcoin の高速取引や低コスト取引を実現するサービスが実際に現れるのは非常に楽しみですが、どのような仕組みで動いているのかについては個別によく確認する必要があるでしょう。
リスクを理解する
ここまで Internet Computer と Bitcoin の統合について解説を行ってきましたが、サービスが今後出てきた際に気をつけるべき点について最後に説明します。
ここでは、Bitcoin のレンディングを行う Canister に対して、ユーザーが Bitcoin を預けているシナリオを想定しています。ユーザーは外部の Bitcoin アドレスから Canister の Bitcoin アドレスへと預入を行っています。おそらく、高い年利が約束されていることでしょう。
Ethereum のスマートコントラクトと Canister の大きな違いとして、Internet Computer では Canister を後からアップグレード可能であるということです。具体的には、Canister にはコントローラと呼ばれる ID(principal ID)を設定でき、その ID を有するユーザからの Canister のアップデートが可能です。このため、今回のケースではたとえば開発者が Canister を書き換え、別の Bitcoin アドレスに送金し、集まった Bitcoin を抜いてしまうことができます[参照]。
Alice は年利を受け取るどころか、預けていた Bitcoin を全て盗まれてしまいました。これではユーザーは全く安心してサービスを使うことができませんし、スマートコントラクトと呼べたものではありません。Canister のコントローラは開発者が取り除くことで Ethereum のように修正できないスマートコントラクトにすることができます[参照]ので、レンディングサービスなどにまとまった金額を預けるような場合には、開発者が Canister を悪意を持って改変できないような仕様になっているか、よく確認したほうが良いでしょう。
Canister のコントローラは、例えば Canlista のような外部サービスによって確認することができます。
おわりに
2022年2月3日15:00 UTC(日本時間:2022年2月4日00:00)に開発者向けプレビューが開始され、注目が高まっている Internet Computer と Bitcoin ネットワークの統合についてまとめました。今後 Ethereum との統合も予定されており、Internet Computer でしか実現不可能な高いインターオペラビリティが、ネットワーク間の Bridge のあり方を変えるものになるのではないかと期待しています。一方で、 Internet Computer の Bridge だから絶対安全と考えるのではなく、Canister のバグや悪意を持った改変などのリスクがあることを踏まえたサービスの利用を推奨します。
最後に宣伝です。Dfinity JP というコミュニティで Dfinity 関係の情報交換、勉強会、Internet Computer のドキュメントの翻訳活動などを行っています。ご興味ございましたらお気軽にご参加ください。