CosmosSDKとSubstrateは対になる概念ではない説

みなさんこんにちは。

弊社はCosmos SDK製ブロックチェーンのTypeScriptクライアントライブラリを開発するなど、Cosmosの知見に自信があるのですが、

https://github.com/lcnem/cosmos-client-ts

Cosmos SDKの対抗馬と目されているSubstrateを最近キャッチアップしまして、両者を冷静に観察したところ、見えてきたものがあります。

Cosmos NetworkPolkadot NetworkCosmos SDKSubstrateとよく言われますが、

Cosmos SDKとSubstrateは対になる概念ではないのではないか

という点です。

※Cosmos Networkは二方向ペッグによるブロックチェーン間相互運用ネットワークです。
※Polkadot Networkはマージバリデーションによるブロックチェーン間相互運用ネットワークです。
※Cosmos SDKはブロックチェーン開発キットです。Cosmos Network内チェーンを作りやすい。
※Substrateはブロックチェーン開発キットです。Polkadot Network内チェーンを作りやすい。

詳しく説明します。

SRML

Substrateでのブロックチェーン開発はどうしてもInk!によるRustマクロを利用したeDSLでのスマートコントラクト開発のイメージが強いですが、それは発展型であって、Cosmos SDKのようなモジュール集があります。

Substrate Runtime Module Libraryです。

(Substrateに詳しい人、見苦しいでしょうがご容赦ください)

  • Assets
  • Aura
  • Balances
  • Consensus
  • Contracts
  • Council
  • Democracy
  • Finality Tracker
  • Grandpa
  • Indices
  • Session
  • Staking
  • Sudo
  • Timestamp
  • Treasury

CosmosSDKにはbankモジュールやらgovモジュールやらstakingモジュールやらがありますが、似てそうなやつがあるのがわかりますよね。

SRMLはCosmosSDKのモジュールと違ってモジュール一つ一つが別個のライブラリになっている模様ですが、CosmosSDKのように、使いたいモジュールを取捨選択してブロックチェーンを作ることが出てきます。

ここで、

  • CosmosSDKと対応する概念はSRMLであり、Substrateではない疑惑

が浮上します。それをさらに後押しするのが以下のものです。

ABCI

https://github.com/tendermint/rust-abci

これはプログラミング言語Goで書かれたTendermintに対し、ABCI(Application Blockchian Interface)という情報受け渡し窓口の規格みたいなものを通じて、プログラミング言語Rustで作成したアプリケーションから情報をやりとりするためのパッケージです

かんたんに言うと、RustでTendermintブロックチェーンを作れます。

そうなんです。

CosmosSDKを使わなくても、Tendermintブロックチェーンは作れますし、プログラミング言語Goに依存する必要もありません。Rustでも作れます。

CosmosSDKは実は、ABCIというインターフェースを使えばすでにブロックチェーンは作れるのだけども、その上に更にもう一層ラッパーを噛ませて、ブロックチェーンを作るためのキット、なのです。

もう一層かませる理由としては、各種モジュールの提供なわけですね。

したがって、

  • Cosmos Network : Polkadot Network
  • Cosmos SDK : Substrate

という対比関係よりも、

  • Cosmos Network : Polkadot Network
  • ABCI : Substrate(概念)
  • Cosmos SDK : Substrate Core(ライブラリ), Substrate Runtime Module Ribrary

という対応関係のほうが合理的である可能性があるのです。

そしてもう一つの対応関係があります。

  • Tendermint : Aura, Babe, Grandpa

コンセンサス部分の対比関係ですね。

このコンセンサス部分の対比関係から、CosmosSDKとSubstrateの決定的な構造の違いが一つ浮かび上がってきます。

依存関係逆転

Substrate Runtime Module Libraryの部分をみていただくとわかるかと思いますが、例えばGrandpa(コンセンサスの一種で、ファイナリティのやり方が少し特殊)は、SRMLの一種として提供されています。

これの依存関係を描くと、以下のようになります。

独自ブロックチェーン
GRANDPA(コンセンサス) Substrate Runtime Module Library
Substrate Core
Substrate(概念)

一方、CosmosSDKで作ったブロックチェーンの依存関係を書こうとすると、以下のようになります。

独自ブロックチェーン
Cosmos SDKTendermint
ABCI

注目点は、Tendermintが一番下ではなく、ABCIが一番下に来ていること、そして独自ブロックチェーンがTendermintに対して依存関係がないという点でしょう。

これは依存関係逆転のパターンというやつで、CosmosSDKやそれに依存しているブロックチェーンは、Tendermintではなく、Tendermintパッケージが提供しているABCIという抽象インターフェースに依存しているのです。

つまり、現実的には工数はかかりますが、ABCIを間に挟むことによって、Tendermintではない他のコンセンサスに取り替えることも可能です。

Substrateの場合はSRMLでコンセンサス部分のモジュール付け替えられるようなので、全く同じことができます。

違いは、依存関係だけということになります。

この記事はCosmosSDKとSubstrateのどちらが優れているかを論じるものではありません。それは好みです笑

それを踏まえた上で、パッケージの依存関係や対比関係といった違いを理解いただければと思います。