Cosmos SDKで独自ブロックチェーンをつくる

  • 2019.03.25
  • DLT
Cosmos SDKで独自ブロックチェーンをつくる

LCNEMのCEO, CTOの木村です。

Cosmos Networkをご存知ですか?

https://cosmos.network

Cosmosは、「Internet of Blockchains」を掲げているとおり、異なるブロックチェーン同士をつなげ、相互運用させるプロジェクトです。

Cosmos HubというブロックチェーンをハブとしてIBC(=Inter Blockchain Communication)通信を行い、トークンなどの記録を送受信することができまあす。

例えばチェーンAとチェーンBがあったとしてそれぞれにトークンA’とトークンB’があるとします。

チェーンAとチェーンBがCosmos Network内のチェーンであった場合、チェーンAからBに対して、トークンA’を送信することが可能になるというわけです。

このCosmos Networkに参加する、つまりIBC通信に対応するブロックチェーンは、Cosmos SDKを使うことで開発できます。

https://github.com/cosmos/cosmos-sdk

弊社では、Cosmos Network内にLCNEM Cheque(ステーブルコイン)を流通させるべく、IBC通信に対応した独自のブロックチェーンを開発中です。

https://github.com/lcnem/lcnemint

この開発で得た知見をもとに、Cosmos SDKの基礎をご紹介します。

余談

lcnemintを開発するにあたって、Cosmosのドキュメントはout-of-dateなものが多く、まったく参考になりませんでした。

そこでgaia(=Cosmos Hubのコードネーム)のソースコードを読み、そしてout-of-dateなサンプルのソースコードを読み、両者から必要なものを移植したり、最新状態に生き返らせたりして、lcnemintのコードを書いていきました。

なのでこの記事は執筆時点で、一部、公式ドキュメントより強い可能性があります。

Cosmosの三要素

まず、Cosmosの三要素をご紹介します。

  • IBC
  • ABCI
  • Tendermint

です。逆の順番で説明していきます。

Tendermint

コンセンサスの部分など、ブロックチェーンの基盤となる部分を担ってくれます。

https://tendermint.com/

いわゆるPBFT系のコンセンサスアルゴリズムで、ブロック承認は確率的ではなく確定的となっています。即時ファイナリティがある、というやつです。

ABCI

コンセンサスの部分などを担うTendermintに対して、ブロックチェーンのロジック部分から情報を伝える窓口となるのがABCIです。

つまり、好きなようにブロックチェーンのロジック部分をつくり、ABCIという窓口を経由してTendermint側に情報を伝えれば、あとはTendermint側がコンセンサスなどをすべてやってくれて、ブロックチェーンとして機能するのです。

言わば、Tendermintを利用しつつも特有のロジックを持つブロックチェーンを簡単に作るための、Tendermintへの伝達窓口となります。

IBC

これは先程説明したとおり、Inter Blockchain Communicationの略で、Cosmos Hubというチェーンを中心として異なるブロックチェーン同士で情報をやり取りする通信規格です。

はい、ではいったんお茶にしましょう。

次に、これら三要素をうまく使ってブロックチェーンを作ることができるライブラリ「Cosmos SDK」の中身を紹介していきます。

基本エクステンション

Cosmos SDKの「x」フォルダ(extensionの略と考えられる)には、各種エクステンションが入っています。

執筆時点で、以下のようなものがあります。

  • auth…アカウント管理(ほぼ絶対使う)
  • bank…アセット送受信(ほぼ絶対使う)
  • distribution…アセットの分配
  • gov…オンチェーンガバナンス
  • ibc…IBC(無いともったいない)
  • mint…アセットのインフレ設定
  • params…パラメータ管理(ほぼ絶対使う)
  • slashing…不正なバリデータのステーク没収
  • staking…ステーキング(だいたい使う)

lcnemintは、auth,bank.gov,ibc,params,stakingを使っています。

lcnemintはコンソーシアム制ですが、コンソーシアム参加者にstakeというアセットを配ってステークしてもらう仕組みにすると、コードは楽に書けるようになります。

使い方

では最後に、実際の実装の仕方について解説します。

gaiaのコード構造にしたがって、lcnemintも以下のような構造になっています。

app/
  app.go
  app_test.go
  genesis.go
xxxcli/
  main.go
xxxd/
  main.go

xxxには好きなの入れてください。gaiacliやらlcnemintcliみたいになります。

appが、ブロックチェーンのロジック部分になります。

cliは、文字通りコマンドラインインターフェースを表します。ライトクライアントをここで実装します。

dは、daemonの略です。

app

appではやることがたくさんあります。

  • 各種エクステンションのkeeper,mapperの作成
  • Router,QueryRouterへのAddRoute
  • MountStore
  • ABCIの各種コールバックの設定

lcnemintのソースコードを見てみてください。

cli

ゴリゴリとライトクライアントを実装します。

cobraというCLI用のライブラリが使用されていて、再生産しないといけないコードは思ったほどは多くはありません(多少ありますが)。

  • Bech32アドレスタイプの登録(Cosmosには送受信用アドレスのほかにステークデリゲート用のアドレスがあったりします)
  • 各種エクステンションのコマンドの追加
  • restのroute追加
  • configに関して設定

これもlcnemintのソースコードを見てみてください。

d

デーモンを実装します。小暮閣下ではありません。

  • これもBech32アドレスタイプの登録
  • daemon用コマンドの追加
  • stateのexportに関する設定

しつこいようですがこれもlcnemintのソースコードを見てみてください。

おわりに

お疲れ様でした。

こんな感じで、Cosmos SDKを使って独自ブロックチェーンを作ることができます。

かなりの長文でしたが、いかがでしたか。

弊社はこんな感じで、他に誰もやっていないことに突っ込んでいく文化が割とあります。知的好奇心を満たすには良い場所です。

新しくジョインする仲間をいつでも募集しています。

採用情報はこちら

https://lcnem.com/company/recruit

それでは次回お楽しみください!

DLTカテゴリの最新記事