株式会社Datachainにて主にブロックチェーンの研究開発を担当している吉田です。
ブロックチェーン技術を用いて構築された製品やサービスの商用化が進むにつれ、ブロックチェーンのインターオペラビリティに対する需要が急増しています。複数のブロックチェーンを接続する方法や規格はいくつかありますが、IBC(Inter-Blockchain Communication)はそのうちの1つです。
Datachainは、複数の異なるブロックチェーンをIBCで接続することを可能にするモジュールやフレームワークの研究・開発に取り組んできました。そのモジュールの一部をHyperledgerに寄贈しており、現在は”YUI”というプロジェクト名になっています。
では、IBCとはそもそもどのようなものなのでしょうか?IBCはどのようにしてブロックチェーン間のインターオペラビリティを実現するのでしょうか?この記事では、IBC/TAOやIBC/APPなど、IBCのアーキテクチャと主要コンポーネントについて説明します。最後に、例としてクロスチェーン送金の実現方法を説明していきます。
IBCの概要
IBCは、異なる台帳間のインターオペラビリティを実現するためのプロトコルです。これは、複数のTendermintベースまたは非Tendermintベースの台帳が相互に接続し合うCosmosネットワークの、コアコンポーネントとして設計及び実装されています。理論的には、あらゆるブロックチェーンがIBCを介して相互に接続し、通信することができます。IBCはICS(Inter-chain standard)としてこちらで標準化されています。
IBCのアーキテクチャ
IBCは、以下の2つの層で構成されるレイヤープロトコルです。
- 下位のトランスポート・認証・順序付けを行う層(IBC/TAO)
- 上位の(TAOの上に構築される)アプリケーション層(IBC/APP)
IBCを実装する上での苦労は、ほとんどがTAO層に存在します。対象となる元帳のためにTAO層が実装されれば、その上にさまざまなAPP層のプロトコルを簡単に実装することができます。
IBC/TAO
IBC/TAOは、2つのブロックチェーン間のパケットを、信頼性、順序性、認証性のある方法で中継するためのレイヤーです。
“信頼性”とは、送信元チェーンが確かに送信したパケットだけが、宛先チェーンによって正確に一度だけ受信されることを意味し、その際に信頼できる第三者を必要としません。実際には、ブロックチェーン自体が他のブロックチェーンと通信することはありません。そのため、あるブロックチェーンから別のブロックチェーンへとパケットを中継する “Relayer”が必要となりますが、Relayerは自由参加、つまり誰でもRelayerを運営することができます。
“順序性”とは、送信元チェーンがパケットを送信したのと同じ順番で、送信先チェーンがパケットを受信することを意味します。
“認証性”とは、IBCがパケットを中継する際に、後述する “チャネル “という抽象化を使用し、そのチャネルの両端が特定のスマートコントラクトに排他的に割り当てられていることを意味します。したがって、チャネルを介して宛先チェーンがパケットを受信した場合、送信元チェーンのチャネルに割り当てられた特定のスマートコントラクトがパケットを送信したことが証明され、他のスマートコントラクトはそのチャネルを使用してパケットを送信することはできません。
IBC/TAOは、IBCを介して相互に接続された両方のブロックチェーン上で動作するスマートコントラクトとして実装され、そのスマートコントラクトは “IBC/TAOモジュール “と呼ばれます。IBC/TAOモジュールは、以下のコンポーネントで構成されています。
- オンチェーン・ライトクライアント
- コネクション抽象
- チャネル抽象
オンチェーン・ライトクライアントは、IBC/TAOの基盤となるもので、提示された状態が実際に相手側ブロックチェーン上に存在することを、信頼できる第三者に頼ることなく検証します。その基盤の下で、コネクション抽象とチャンネル抽象が定義され、これらは2つのブロックチェーン上のスマートコントラクト同士を接続し、それらの間でパケットを中継するために使用されます。
オンチェーン・ライトクライアント
IBC/TAOにおけるオンチェーン・ライトクライアントのシンタックスとセマンティクスは、ICS-2で標準化されています。このコンポーネントの概要を以下に示します。
相手側ブロックチェーンに新しいブロックヘッダが付加されるたびに、Relayerはそのヘッダを問い合わせ、ローカルブロックチェーン上のIBC/TAOモジュールに提出します。そして、IBC/TAOモジュールは、相手側ブロックチェーンの種別に応じたライトクライアントプロトコルを実行して、ブロックヘッダが有効かどうかをチェックし、ブロックヘッダが有効な場合にのみ、相手側ブロックチェーンをミラーするClientStateを更新します。
ClientStateが更新されて相手側ブロックチェーンの最新ブロックヘッダを格納すると、IBC/TAOモジュールは、提示された状態が相手側ブロックチェーンに保存されているかどうかを確認することができます。例えば、相手側ブロックチェーンがワールドステートを保存するためにマークルツリーを使用しており、各ブロックヘッダーにマークルツリーのルートハッシュを含む場合(Ethereumのように)、ツリー内のスマートコントラクトの状態は、マークルプルーフを使用してブロックチェーン上に存在することを証明及び検証することができます。
コネクション抽象
IBC/TAOにおけるコネクションのシンタックスとセマンティクスはICS-3で規定されています。基本的に、IBCの文脈における「コネクション」とは、異なる2つのブロックチェーン上のClientState同士の接続されたペアを表します。
後述する「チャネル」抽象を用いてパケットの中継を開始する前に、双方のブロックチェーン上のIBC/TAOモジュールは、通信相手となるClientStateを決定し、認証する必要があります。この目的のために、コネクション抽象が使用されます。ブロックチェーン間の接続は、TCPの3ウェイハンドシェイクのようなメカニズムで確立されます。
コネクションハンドシェイク
コネクションの状態は以下のように推移します。すべての操作は、Relayerが送信するトランザクションによって開始されます。
- (connOpenInit) 開始側ブロックチェーンは、INITステータスの新しいコネクションを作成して保存します。
- (connOpenTry) 相手側ブロックチェーンは、開始側ブロックチェーンがINITステータスのコネクションを作成したことを確認すると、TRYOPENステータスの新しいコネクションを作成して保存します。
- (connOpenAck) 開始側ブロックチェーンは、相手側ブロックチェーンがTRYOPENステータスのコネクションを作成したことを確認すると、コネクションの状態をINITからOPENに更新します。
- (connOpenConfirm) 相手側ブロックチェーンは、開始側ブロックチェーンがコネクションの状態をINITからOPENに更新したことを確認すると、コネクションの状態をTRYOPENからOPENに更新します。
チャネル抽象
IBC/TAOにおけるチャネルのシンタックスとセマンティクスはICS-4で規定されています。IBCにおけるチャネル抽象は、異なるブロックチェーン上のスマートコントラクト同士の接続されたペアを表現するために使用されます。
チャネルは、コネクション抽象とほぼ同じハンドシェイクのメカニズムを通じて確立されます。一度確立されたチャネルは、ブロックチェーン間で繰り返しパケットを中継することができます。パケットの中継自体も、TCPと同様の3ウェイハンドシェイクの仕組みで行われます。
チャネルハンドシェイク
チャネルの状態は以下のように推移します。すべての操作は、リレイヤーが送信するトランザクションによって開始されます。
- (chanOpenInit) 開始側ブロックチェーンは、INITステータスの新しいチャネルを作成して保存します。
- (chanOpenTry) 相手側ブロックチェーンは、開始側ブロックチェーンがINITステータスのチャネルを作成したことを確認すると、TRYOPENステータスの新しいチャネルを作成して保存します。
- (chanOpenAck) 開始側ブロックチェーンは、相手側ブロックチェーンがTRYOPENステータスのチャネルを作成したことを確認すると、チャネルの状態をINITからOPENに更新します。
- (chanOpenConfirm) 相手側ブロックチェーンは、開始側ブロックチェーンがチャネルの状態をINITからOPENに更新したことを確認すると、チャネルの状態をTRYOPENからOPENに更新します。
パケット中継
確立されたチャネルを用いて、スマートコントラクト同士は以下のようにパケット(=任意のバイトシーケンス)を送受信することができます。
- (sendPacket) 送信元チェーンは、シーケンス番号N=nextSequenceNumberの新しいパケットを作成して保存します。そして、nextSequenceSendをインクリメントします。
- (recvPacket) 宛先チェーンは、送信元チェーンが正確にパケットを送信(作成)したことを確認すると、シーケンス番号Nを持つ新しいパケットを作成して保存します。
- (acknowledgePacket) 送信元チェーンは、シーケンス番号Nのパケットを削除します。
ここにはこれまでの操作とは重要な違いがあります。recvPacketとacknowledgePacketは、コネクションチャネルのハンドシェイク操作と同じように、Relayerが直接実行しますが、sendPacketはブロックチェーン外のエンティティから直接実行されることはなく、アプリケーションスマートコントラクトから実行されます。次項ではその具体例を紹介します。
IBC/APP
パケットを中継する単一のシンプルな仕組み(IBC/TAO)により、任意のクロスチェーンプロトコルが実現可能になります。IBC/TAOの上に構築されたアプリケーションプロトコルを総称してIBC/APPと呼びます。
例: クロスチェーン送金(ICS-20)
ICS-20は、IBC/APPプロトコルの良い例で、クロスチェーンでのトークン転送を可能にするものです。IBC/APPの実装者は、ブロックチェーン相互運用性の仕組み全体を設計・実装する必要はありません。IBC/APPの実装者は、sendPacket、recvPacket、acknowledgePacketと共に呼び出されるプラグインを実装するだけでよいのです。
例えば、ChainAからChainBにICS-20を介してトークンを転送する場合、以下のようになります。
- ChainAは、以下の操作をアトミックに実行
▹ トークンをICS-20モジュールにlock
▹ ロックされたトークンの金額とデノミを指定するパケットを、sendPacketオペレーションで送信 - ChainBは、以下のオペレーションをアトミックに実行
▹ パケットをrecvPacketオペレーションで受信
▹ ICS-20モジュールでロックされたトークンと等価なバウチャー・トークンをmint - ChainAは、通常通りacknowledgePacketを実行
トークンは次のようにして、ChainBからChainAへ返送されます。
- ChainBは、以下のオペレーションをアトミックに実行
▹ ICS-20モジュールでバウチャー・トークンをburn
▹ burnしたバウチャーの金額とデノミを指定するパケットを、sendPacketオペレーションで送信 - ChainAは、以下のオペレーションをアトミックに実行
▹ パケットをrecvPacketオペレーションで受信
▹ ICS-20モジュールでburnしたバウチャーと同等のトークンをunlock - ChainBは、通常通りacknowledgePacketを実行
前述のICS-20モジュールは、以下の機能しか持っていません。このように、IBC/TAOが実装されていれば、各ブロックチェーン・プラットフォーム用にICS-20を実装することは簡単です。
- トークンのlock/unlock
- バウチャーのmint/burn
最後に
ビットコインが発明されて以来、様々なパラダイムのブロックチェーンが提案され、現在も多様なブロックチェーン・プラットフォームが運用されています。特にエンタープライズブロックチェーンの文脈では、企業や業界ごとにニーズや企業間の関係が異なるため、すべての企業が同じ統一されたブロックチェーンプラットフォーム上でブロックチェーンアプリケーションを運用することは考えられません。そのため、インターオペラビリティは、この業界において今後ますます重要な技術となってくるはずです。
IBCは、このような異種のブロックチェーンを相互運用可能にするためのシンプルで汎用的な技術です。IBCは、私たちDatachainを含む様々なバックグラウンドを持つメンバーで構成されるコミュニティに支えられています。私たちは、YUIプロジェクトを通じて、IBCの開発に貢献していきます。
FYI: IBCを用いたインターオペラビリティをCordaで可能にする「Corda-IBC」についてのMediumも同時に公開しました。もし宜しければ、合わせてご覧ください。