Cosmos-sdkのチュートリアルを触ってみる その1

Takuya Fujita
GBEC Tech Blog
Published in
9 min readJul 11, 2019

先日、Neutrinoさんでやっていたcosmosの勉強会に行ってきました。そこで、「どうすればcosmos-sdkでの独自チェーンの立ち上げを学ぶことができますか?」という質問が飛び、それに対して、Yu Kimura君が「cosmos-sdkは公式のドキュメントだけだと不十分で、gaia(Cosmos Hubのクライアント)のコードとか参考にしながら僕はやりました。日本語のドキュメントはまだないので、そこはみんなで協力して作って行かないといけないですね。」的なことを言ってたので、作ります。

HashHubもFUJITA TAKUYAも日本のCosomosコミュニティに貢献していきます!

いつも通り、僕自身も探りながら書いて行きます。
とりあえずは不十分らしいcosmos-sdkの公式チュートリアルを一緒に読んで行くことにしましょう!!何が使えるか、何を信用するかは自分で決めよう。公式チュートリアル等に修正が必要な場合は、あとで戻ってきてこの記事を修正します。

以下が公式チュートリアルのリンクです。

Getting Started

このチュートリアルをやれば、Cosmos SDKを使って、独自のブロックチェーンをスクラッチで簡単に立ち上げられるようになるよ!すごくね!!?

みたいなこと言ってます。

ここでは試しにNamecoinやENS、Handshakeのようなアカウント名を売買可能にするシステムをブロックチェーンという形で作っていきます。ユーザーはまだ使われていないユーザーネームを購入して使うことができ、またそれらの売り買いが可能になるもののようです。

・Requirements(必要条件)
golang は1.13.0以上のバージョンを使って、ちゃんと$GOPATH通してその中で実行させてください。

あなたが自身でブロックチェーンを作る!!っていう情熱も必要!

チュートリアルを通して、scaffolidツールを利用します。`git clone git@github.com:cosmos/scaffold.git && cd scaffold && make`で必要なリポジトリをインストールしておいてください。

・Tutorial
これからチュートリアル通りにやって行くと、以下のファイルを作ることになります。

チュートリアルでこんなに多くのファイルを作るの!?と正直思いましたが、ブロックチェーンを作ろうとしていることを忘れてはいけません。
早速、新しいgit リポジトリを作っていきます。

mkdir -p $GOPATH/src/github.com/{ .Username }/nameservice
cd $GOPATH/src/github.com/{ .Username }/nameservice
git init

$GOPATH内にnameserviceという名前のフォルダを作りました。

これから、以下のパートで別れてチュートリアルを行なって行きます。
1. アプリの設計
2. “app.go”でアプリの実装を初めよう
3. “Type”を定義してモジュールを作り始めよう
4. “key”モジュールで必要なkeyの定義付け
5. “Keeper”を使ってモジュールのメインを作る
6. “Msgs”と”handlers”を使って、状態の変化の仕方を定義する
7. “Queriers”を使ってあなたのチェーンのステートマシンの概観を作る
8. “alias file”を作る
9. “sdk.Codec”を使ってエンコーディングフォーマットでの型を登録
10. モジュールとよろしくやるためのCLI作成
11. ユーザーのためにnameserviceへアクセスするためのHTTPルートを作る
12. “AppModule interface”を実装する
13. “Genesis state”の設定
14. モジュールのインポートと、アプリのビルド終わり!!
15. あなたのアプリチェーンへ接続するポイントとなる”nsd”と”nscli”を作る
16. “go.mod”を使って依存モジュールの管理設定
17. 試しに動かしてみようぜ
18. RESTルートを動かす。

長いですね。。
軽い気持ちで手を出していいものではなかった気もしますが、この山を登れたら見える景色も変わってくるでしょう。ブロックチェーンとgolangの勉強を改めてするいい機会です。やっていき!!では始めて行きましょう!

1.Application Goals(アプリの設計)

この章では、アイデアをどうアプリケーションの設計に落とし込むのかを確認します。実装はまだです。
今回の目標は、「ユーザーがユーザーネームを買えて、そのユーザーネームのオーナーは、今現在そのネームに対してもっとも高値を付けた人である」という状況を達成することです。

Cosmos SDKでは、僕らがステートマシンを簡単に立ち上げられるように作られており、ブロックチェーンに必要な箇所をモジュールとして用意してくれています。それぞれのモジュールが相互にうまく繋がるようカスタマイズすることで、独自のブロックチェーンを立ち上げられるようになっています。これからそれぞれのモジュールの設定し、それらを互いに繋ぐことになります!

これからnameserviceで必要になるモジュールは以下一覧です。

・ auth: アカウントと手数料の設定、それらへの接続部
・ bank: アプリがトークンとその残高を管理できる
・ staking: アプリにデリゲート可能なバリデータを持たせる
・ distribution: バリデータとデリゲータに報酬を与える機能を使えるようにする
・ slashing: バリデータが不正を行なった際に、ペナルティを与える機能
・ nameservice: まだできてない。今から僕らで作る、アプリケションとして一番重要なところ

stakingやslashingのデフォルトの仕組みが気になる方は、Cosmos Hubのチェーンの仕様を調べてみるといいです。

モジュールの種類を確認したので、次はステートマシンを作っていく上でメインであるステートとメッセージのタイプについてみていきましょう。

・State

ステートというのは、その時々のアプリケーションの状態を表すものになります。今回のnameserviceにおいては、それぞれのアカウントがいくらトークンを保持していて、それぞれのユーザーネームの所有者と、それぞれのユーザーネームにいくらでの値付けがされているか、といったものにあたります。

トークンとアカウントについては”auth”と”bank”のモジュールによって決められます。そこはもうsdk側が用意しているので、あなたはユーザーネーム自体、ユーザーネームが誰のものか、いくらの値が付けられるのかというところを定義していく必要があります。sdkでは、multistoreという規格を用いて、それらに各情報を入れることにします。

・Messages

Messageというのはトランザクションの中に含まれているものであり、ステートを変更する時に発生させるものです。ここでは、nameserviceのアプリの形に沿う機能を持ったMessageを実装します。

・ MsgSetName: ネームの所有者は、ネームに値段を設定することができる。
・ MsgBuyName: ネームを購入してその所有者になることができる。誰かが名前を購入する際、前の所有者が支払った価格よりも高い価格を払う決まりとなっている。前の所有者がいない場合は、”MinPrice”の金額だけ支払う必要がある。

トランザクションがノードに伝わると、そのトランザクションが”ABCI”を介してアプリまで伝わり、messageとしてデコードされる。messageは適切なモジュールへと伝達され、stateを更新する場合は、”Handler”が”Keeper”を呼び出して更新を実行させます。

“Handler”や”Keeper”などのワードは次のステップで学んで行くことになります。

今回はここまでです!

次はやっと本格的に実装が始まり、コードを書き始めることになります!その2はこちらになります!いざ実装!

お知らせ

■HashHubでは入居者募集中です!
HashHubは、ブロックチェーン業界で働いている人のためのコワーキングスペースを運営しています。ご利用をご検討の方は、下記のWEBサイトからお問い合わせください。また、最新情報はTwitterで発信中です。

HashHub:https://hashhub.tokyo/
Twitter:https://twitter.com/HashHub_Tokyo

--

--