CosmosチュートリアルのNameserviceチェーンを動かす

インターオペラビリティの実現に向けたブロックチェーンプロダクトである Cosmos に触れてみようということで,チュートリアルで用意されている Nameservice を動かしてみたいと思います.

内容はチュートリアルの通りなので,最新情報はそちらで確認してください.

実行環境

  • Macbook Pro (15-inch, 2018) 2.9GHz 6-Core Intel Core i9
  • macOS Catalina 10.15.6
  • Go 1.14.6

Go のパス設定

~/.zshrc

export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:/$GOBIN

インストール

Git からクローンしてきてインストールします.

# Clone the source of the tutorial repository
$ git clone https://github.com/cosmos/sdk-tutorials.git
$ cd ./sdk-tutorials/nameservice

# install
$ make install

# test
$ nsd help
$ nscli help

nsd, nscli はそれぞれ bitcoind, bitcoin-cli のようなものです.

起動

ブロックチェーンの起動には初期設定ファイルと genesis.json が必要です.

手入力で設定することはできますが,デフォルト値で良ければコマンド実行でも可能です.

terminal

$sh ./init.sh

実行コマンドは以下の通りです.

init.sh

#!/usr/bin/env bash

rm -rf ~/.nsd
rm -rf ~/.nscli

nsd init test --chain-id namechain

nscli config chain-id namechain
nscli config output json
nscli config indent true
nscli config trust-node true
nscli config keyring-backend test 

nscli keys add jack
nscli keys add alice

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

nsd gentx --name jack --keyring-backend test

echo "Collectiong genesis txs..."
nsd collect-gentxs

echo "Validating genesis file"
nsd validate-genesis

~/.nsd~/.nscli はブロックチェーンの設定や起動中に生成したブロックのデータなどが入っています.うまく動かなくなった場合や内容を初期化したい場合は,ディレクトリの中身を消し去ることでまっさらな状態に戻すことができます.

設定が終了したら,以下のコマンドでブロックチェーンを起動できます.

terminal

$ nsd start

エラーの発生

上記コマンドを実行した際にエラーが出ることがあります.

terminal

[2020-08-29|02:03:22.943] Starting ABCI with Tendermint module=main
ERROR: Error during handshake: Error on replay: Validator set is nil in genesis and still empty after InitChain

設定ファイルや genesis.json に抜けがあったり,古いファイルが存在していたりすると発生すると考えられます.

エラーが発生した場合は,次の対策を実行してみてください.

  • ~/.nsd~/.nscli 以下を消してやり直す
  • バリデートを実行したか確認する
  • init.sh で設定してみる
  • ~/go/bin/nsd~/go/bin/nscli を消してインストールし直す

私は古い nsd, nscli を消してインストールし直したら実行できました.

RESTの起動

REST サーバに接続するときは別ターミナルで以下のコマンドを実行します.

terminal

$ nscli rest-server --chain-id namechain --trust-node

こうすることで,REST 経由で情報にアクセスできるようになります.

terminal

# Get the sequence and account numbers for jack to construct the below requests
$ curl -s http://localhost:1317/auth/accounts/$(nscli keys show jack -a)
> {"type":"auth/Account","value":{"address":"cosmos127qa40nmq56hu27ae263zvfk3ey0tkapwk0gq6","coins":[{"denom":"jackCoin","amount":"1000"},{"denom":"nametoken","amount":"1010"}],"public_key":{"type":"tendermint/PubKeySecp256k1","value":"A9YxyEbSWzLr+IdK/PuMUYmYToKYQ3P/pM8SI1Bxx3wu"},"account_number":"0","sequence":"1"}}

最後に

これで CLI で Nameservice チェーンの機能を使うことができるようになりました.

chainapsis が開発している cosmosjs を使うと,Ethereum における Web3 のようにウェブ上で実装することができます.

実装の様子は下記の記事で取り上げています.

https://blog.mktia.com/connect-nameservice-chain-with-cosmosjs