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 のようにウェブ上で実装することができます.
実装の様子は下記の記事で取り上げています.