Cosmos-sdkを用いて、アプリケーションチェーンの実装を行うチュートリアルの解説記事を書いてたのですが、なかなかパッとどういうものを作っているのか概要を理解しにくいので、チュートリアル その0的な立ち位置として、すでにチュートリアル側が用意してくれているアプリケーションチェーンのノードを立てて、実際の挙動を確認してみる記事を用意することにしました。

わざわざ実装までしたくないけど、アプリケーションチェーンの雰囲気を知りたい人にもぴったりだと思います。

このチュートリアルで用意されているチェーンは、NamecoinやENS、Handshakeのようなアカウント名を売買可能なアプリチェーンとなっています。ユーザーはまだ使われていないユーザーネームを購入して使うことができ、またそれらの売り買いが可能になるもののようです。
オークション形式となっているため、あるアカウント名を購入したい場合、最後に支払われた額よりも高い額を支払えば、その支払った人にアカウント名の所有権が移動する仕組みとなっています。

では、実際にノードを立てて行きましょう。

goの開発環境は各自で整えてください。
Go 1.13.0+で動作します。

ノード起動

以下レポジトリをクローンします。

cosmos/sdk-application-tutorial

$GOPATH以下で作業することを忘れないであげてください。

$ git clone https://github.com/cosmos/sdk-application-tutorial.git
$ cd sdk-application-tutorial

インストールして、ノードのデーモンとcliがインストールできてるか確認します。

$ make install
$ nsd help
$ nscli help

それぞれhelpの表示が出たら無事インストールされています。
どちらも以下のように出るはず。

$ nsd --help
nameservice App Daemon (server)
Usage:
nsd [command]
Available Commands:
init Initialize private validator, p2p, genesis, and application configuration files
collect-gentxs Collect genesis txs and output a genesis.json file
gentx Generate a genesis tx carrying a self delegation
validate-genesis validates the genesis file at the default location or at the location passed as an arg
add-genesis-account Add genesis account to genesis.json
start Run the full node
unsafe-reset-all Resets the blockchain database, removes address book files, and resets priv_validator.json to the genesis state
  tendermint          Tendermint subcommands
export Export state to JSON
  version             Print the app version
help Help about any command
Flags:
-h, --help help for nsd
--home string directory for config and data (default "/Users/username/.nsd")
--log_level string Log level (default "main:info,state:info,*:error")
--trace print out full stack trace on errors
Use "nsd [command] --help" for more information about a command.

次にノードの設定とgenesis.jsonの初期化をしていきます。このgenesis.jsonによって、どのネットワークに繋げるのかを指定してあげることになります。

$ nsd init <ノードの名前(なんでもいい)> --chain-id namechain

json形式の何かが出力されると思います。これが初期化したgenesis.jsonの内容です。

次に、CLIを叩いて、アカウントを生成してあげましょう。

$ nscli keys add jack(好きな名前でいいです)
Enter a passphrase to encrypt your key to disk:
Repeat the passphrase:
- name: jack
type: local
address: cosmos1k0ay7mlzt3hge0q0uk6he5hqxc7efs7waf3rkf
pubkey: cosmospub1addwnpepqwfqnlfvjxqkuds4gmv88vrgpmsjmstrsqpzz7au2z6n7scnyrc57cgk2g2
mnemonic: ""
threshold: 0
pubkeys: []
**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.
between exact select hard satoshi lottery gauge civil neutral blind local loan citizen culture amazing boy spare charge blanket carry share camp replace wet

jackという名前のアカウントを作ろうとすると、アカウントのパスフレーズ設定を求められます。パスフレーズを二回入れると、新規で作成したアカウントのアドレスと公開鍵が表示されます。
あとでこのjackのアドレスを使うので別の場所にメモしておいてください。

もう一つaliceアカウントも作りましょう。こちらもアドレスを控えておいてください。

$ nscli keys add alice

次に、jackとaliceのアカウントに、初期設定としてこのブロックチェーンのトークンの付与とステーク額を付与してあげます。

$ nsd add-genesis-account $(nscli keys show jack -a) 1000nametoken,100000000stake
$ nsd add-genesis-account $(nscli keys show alice -a) 1000nametoken,100000000stake

これでgenesis.jsonに二つのアカウントの情報が追記されました。
.nsd/config/genesis.jsonを覗いてみると、追記されていることが確認できます。

次にnscliの設定をしていきます。ここら辺はおまじない。

$ nscli config chain-id namechain
$ nscli config output json
$ nscli config indent true
$ nscli config trust-node true

nsdとnscliの設定は大まかに終わったので、一番最初のgenesis transactionを作ってあげて、ノードを動かしていきます。
gentxでトランザクションを作る。パスフレーズを聞かれるので、アカウント作成時設定したものを入れてあげましょう。

$ nsd gentx --name jack(あなたが決めた名前ならなんでもいいです)
Password to sign with 'jack':

作成したトランザクションをgenesisブロックに入れて、ノードの起動をさせます。

$ nsd collect-gentxs
$ nsd validate-genesis
#ノード起動
$ nsd start
I[2019-09-28|11:06:47.500] Starting ABCI with Tendermint module=main
I[2019-09-28|11:06:52.877] Executed block module=state height=1 validTxs=0 invalidTxs=0
I[2019-09-28|11:06:52.891] Committed state module=state height=1 txs=0 appHash=9EB61B5D674D8644B349E14C95AD576CB1D3B9C59427EEA7DADE7B6F2E5B8ED1
I[2019-09-28|11:06:57.943] Executed block module=state height=2 validTxs=0 invalidTxs=0
.......

以上のようにブロックが生成されていってるのが確認できるはずです。
ノードの立ち上げ成功です!

アプリ機能を触ってみる

アプリとしての機能を触っていきましょう!ノードは立ち上げたままにするので、別でターミナルを開き、そこからcliでノードを叩いていきます。

まずは、作ったアカウントがちゃんと設定したようにトークンを保持しているか確認します。

$ nscli query account $(nscli keys show jack -a)
{
"type": "cosmos-sdk/Account",
"value": {
"address": "cosmos1k0ay7mlzt3hge0q0uk6he5hqxc7efs7waf3rkf",
"coins": [
{
"denom": "nametoken",
"amount": "1000"
}
],
"public_key": {
"type": "tendermint/PubKeySecp256k1",
"value": "A5IJ/SyRgW42FUbYc7BoDuEtwWOAAiF7vFC1P0MTIPFP"
},
"account_number": "0",
"sequence": "1"
}
}

ちゃんとnametokenを1000保持していることが確認できます。aliceも同様に出るのでやってみましょう
$(nscli kys show jack -a)はjackのアドレスを参照しています。

jackのアカウントから、jack.idという名前を5nametokenで購入してみます。まだ誰もこの名前を持っていないはずなので、設定した最低額のnametokenを支払えば購入が可能となっています。

$ nscli tx nameservice buy-name jack.id 5nametoken --from jack
{
"chain_id": "namechain",
"account_number": "0",
"sequence": "1",
"fee": {
"amount": [],
"gas": "200000"
},
"msgs": [
{
"type": "nameservice/BuyName",
"value": {
"name": "jack.id",
"bid": [
{
"denom": "nametoken",
"amount": "5"
}
],
"buyer": "cosmos1k0ay7mlzt3hge0q0uk6he5hqxc7efs7waf3rkf"
}
}
],
"memo": ""
}
confirm transaction before signing and broadcasting [y/N]: y
Password to sign with 'jack':

トランザクションを作った後に、チェーンにブロードキャストしていいの?って聞かれるのでオッケー出してあげましょう。サイドアカウントのパスワードも聞かれます。

これで名前の購入が完了しました。jackの残高を確認するとnametokenが995になっていることが確認できます。

次に、購入した名前のvalueを設定することができます。少しややこしいのですが、今購入した名前jack.idがkeyで、中のvalueはその名前の所有者のみが書き換えることができます。やってみましょう。

$ nscli tx nameservice set-name jack.id 8.8.8.8 --from jack

valueとして”8.8.8.8"を設定しました。valueの確認もできます。

$ nscli query nameservice resolve jack.id

逆に、jack.idという名前が誰のもので、いくらで最後に買われたのかを確認します。

$ nscli query nameservice whois jack.id
{
"value": "8.8.8.8",
"owner": "cosmos1k0ay7mlzt3hge0q0uk6he5hqxc7efs7waf3rkf",
"price": [
{
"denom": "nametoken",
"amount": "5"
}
]
}

このownerアドレスは、アカウントjackと同じことが確認できます。メモしたjackのアドレスと照らし合わせてみてください。

次に、aliceのアカウントから、jack.idを買ってみます。オークション形式となっているため、jack.idの最後の価格5nametokenよりも高い額を支払えば、aliceがこのjack.idを購入することができるはずです。

試しに低い額4nametokenで買ってみたら、所有権は変わらず、二人の残高が変わらないことも確認できます。

aliceから10nametokenでjack.idを買います。購入後にjack.idの所有権をみてみます。

$ nscli tx nameservice buy-name jack.id 10nametoken --from alice
#所有権が変更しているか確認
$ nscli query nameservice whois jack.id
{
"value": "8.8.8.8",
"owner": "cosmos1s0vg566vwlrdh72c3rqw702ferq7qh0mqvsqqw",
"price": [
{
"denom": "nametoken",
"amount": "10"
}
]
}

ownerとamountが変更されていますね!無事購入完了です。

所有している名前を削除することもできます。もちろんその名前を所有している人だけが使用可能な機能です。jackから買ったばかりの名前をすぐに削除しようとするaliceはjackのことが嫌いなのだろうか。

$ nscli tx nameservice delete-name jack.id --from alice
#所有権がどうなってるか確認
$ nscli query nameservice whois jack.id
{
"value": "",
"owner": "",
"price": [
{
"denom": "nametoken",
"amount": "1"
}
]
}

削除したことによって、jack.idは誰のものでもなくなり、購入必要額(amount)が初期値の1に戻っていることがわかります。

以上がノード起動から、アプリ部分を触ってみるチュートリアルです。
使わないノードはちゃんと閉じよう!お疲れ様でした!

おわりに

単純な機能ですが、アプリチェーンってどんなもんやという基本的な雰囲気は感じ取れたかと思います。これをcosmos-sdk上でどうやって実装してしているかを以下の記事で説明しているので、興味がある方はぜひ読んでみてください!
Cosmos-sdkの世界へ飛び立ちましょう!

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

お知らせ

■ステーキング事業の提供を始めました!
7月からHashHubでは、Cosmos,Tezos,IOSTの3つのトークンをステーキング出来るサービス「Sanka Network」を提供し始めました。本サービスのご利用をご検討の方は、下記のWEBサイトからお問い合わせください。

Sanke Network:https://www.sanka.network/

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

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

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

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

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


Cosmos-sdkチュートリアルを触ってみる その0 was originally published in Blockchain Engineer Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.

  • このエントリーをはてなブックマークに追加
 
Recommend article