Cosmos SDKでHello World ! その2

Takuya Fujita
GBEC Tech Blog
Published in
6 min readDec 2, 2019
12月になってしまった

前回まで

前回、hcdとhccliのコードを書いて、アプリチェーンを実装していく過程において、基盤となるブロックチェーンの基本的なコードを準備しました。

今回はアプリケーション部分である、greeterモジュールを一通り実装していきます。モジュールを作る際にどういうパーツがあるのか、そのファイルは何をしているのかを確認しながら一緒に作成していきます。

今回はとにかくコードを書く作業が中心になりす。
頑張っていきましょう!

Types

まず、types、型についてです。
今回のチュートリアルでは、主にGreetingモジュールを実装していきます。僕らはフルノードに送られる”greeting”(つまるところトランザクション)を作ったり、アップデートしたり、回収するためにこのGreetingモジュールを使うことになります。

そのGreetingモジュールを実装していく上で、必要な型を定義していきましょう。
x/greeter/internal/types/types.go を以下のように作成してください。

たまにコメントで補足説明もしてあるので、一つ一つのコードが何を意味するのか考えながら読んでみると理解が深まるかもしれません。

Module

Cosmos-SDKでできたアプリ専用チェーンは、大半は切り離しができて他のチェーンでも再利用可能なモジュールを組み合わせて構成されています。それらをどう組み合わせるのかの設定に関しては、`app.go`で定義されています。

モジュールというのは、Cosmos SDKにおいてはMessage(ほぼトランザクションみたいなもの)を定義するためのものとなっています。

それぞれ全てのモジュールはAppModule interfaceにしたがって実装される必要がありますが、ここでは簡単のため、その1の時と同様、”starter”パッケージを用いて実装していきます。

x/greeter/module.go を作成してください。
あとでまたこのファイルに戻ってきて編集します。

Handlerはとりあえずわからなくて大丈夫です。

Msgs

Msgsとは、アプリチェーンの状態(ステート)の遷移を定義するものです。こういう言い方をすると少しわかりにくいが、つまるところ、AさんからBさんへの5ATOMの送金の場合、AさんのATOMが5減って、BさんのATOMが5増えるという状態変化が起きており、その変化を起こすためのものをMsgと定義しています。

それってトランザクションじゃない?って声が聞こえてきそうですが、トランザクションはMsgsを内包して、ブロックチェーンネットワークをブロードキャストされるものであり、同義ではありません。Msgsを運んでくれるのがトランザクションってことですね。

一つのモジュールが扱えるMsgは一つだけとなっています。

x/greeter/internal/types/msgs.go を作成してください。

このファイルでは送り主、受取人、”greeting”という情報を持ったメッセージを定義します。

Handler

次はHandler関数についてです。Handler関数は、チェーンに取り込まれたブロックの中にあるトランザクション、の中にあるMsgを全てみて、そのモジュールで実行するべきMsgsがあるかどうかを確認するためのものです。今期の場合、greeterモジュールに関するMsgがないかを確認し、あればそれをgreeterモジュールに渡してチェーンのステートを更新してもらいます。

モジュールの入り口に立って、新しいMsgの中でうちのモジュールで請け負うMsgがないかを判別して、あればモジュールに引き渡してくれるナイスガイです。

x/greeter/handler.go を作成してください。短いです。

Keeper

それぞれのモジュールにいるKeeperは、アプリ専用チェーンにおけるデータストアのCRUDを担当するところ。MVCでいう、いわゆるmodelに対応する部分となる。

今回のHellochainはgreetingモジュールのみを考えるかなりシンプルな実装となっているが、もしより洗練されたアプリチェーンを作る場合は、モジュールが他のモジュールのKeeperと接続し、モジュール間通信を行うこともあるだろう。

それらモジュール間通信を行う際に、必要な関数を定義したのがKeeperとなる。

x/greeter/internal/keeper/keeper.go を作成してください。

Querier

このアプリ専用チェーンに対して、ステートを参照するためのクエリを有効にするためのファイルです。websocket / rpc を介してクライアントが送信できるクエリを定義します。

x/greeter/internal/keeper/querier.go を作成してください。

Alias

今まで定義してきたgreeterモジュールの型や変数に関する必要なAliasを定義してあげます。

x/greeter/alias.go を作成してください。

まとめ

今回はここまでです。お疲れ様でした!
greeterモジュールの実装をほぼほぼ終わりました。
次回は今回のgreeterモジュールの実装を受け、前回作ったhcd,hccliの修正やアプリチェーン全体の実装を行い、実際にブロックチェーンを動かすところまでやりたいと思っています!やっと何か動くので結構楽しいよ。
ではまた!

つづく

fressetsお知らせ

fressetsは積極的に採用を行っています!詳細は下記のリンクからご確認下さい。
Link: https://fressets.com/careers/careers-416/
Link: https://fressets.com/careers/careers-0/

HashHubお知らせ

■HashHubでは下記のポジションを積極採用中です!
・コミュニティマネージャー
・ブロックチェーン技術者・開発者
・ビジネスディベロップメント
詳細は下記Wantedlyのページをご覧ください。

Wantedly:https://www.wantedly.com/companies/hashhub/projects

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

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

--

--