Tendermint、Cosmos SDK、LotionJSをちょっとだけ試す。
前回までにEthereum、HyperLedger Fabricと試してきましたが、ネットでブロックチェーン関連を調べているとTendermint、Cosmosに辿り着きました。 というわけで、今回はTendermint関連です。とはいってもTendermintはほぼ意識しないですが。
Cosmos scaffloldツールを使用したチュートリアル
結論から言うと、途中断念しています。
scaffloldツールで生成されるソースコード雛型とチュートリアルの内容に差異が結構あり、萎えました。 一応、確認したところまでメモしておきますが、ただの環境構築です。。。
公式はこちら。
Go-lang、Git、makeのほか、Github CLI、Cosmos scaffold tool、そして「自分のブロックチェーンを作りたいという気持ち」が必要とのこと。
OSは毎度お馴染みのUbuntu18.04LTS。Git、makeはすでに入っていたので、Goをいつも通りsnapでインストール。
PATH関連はちゃんと設定していないと動かないです。以下は.profile
に追記した設定例です。記載したらsourceコマンドか再起動で反映。
export GOPATH=$HOME/go export GOBIN=$GOPATH/bin export PATH=$PATH:$GOBIN
Github CLIのインストール
以下でOK。でも、どこで使ってるのか分からない。。。
wget https://github.com/cli/cli/releases/download/v0.9.0/gh_0.9.0_linux_amd64.deb sudo apt install ./gh_0.9.0_linux_amd64.deb
Cosmos scaffloldツールのインストール
公式には、git clone git@github.com:cosmos/scaffold.git
と記載されていますが、リポジトリが無いと怒られてしまいました。
以下のようにするとちゃんと通ります。
git clone https://github.com/cosmos/scaffold.git
scaffold
という名前のディレクトリが作成され、ソースコードがクローンされいるはず。この後、ツールをmakeするのですが、ここで前述のGo関連のPATHがちゃんと設定されていないと、go-bindataが見つからないと怒られてしまいます。(go-bindataが必要なのも、何だかなぁと思いつつ)
cd scaffold
make
エラーが出なければCosmos scaffloldツールが使えるようになったはずです。このツールを使ってブロックチェーンアプリの雛型を生成していきます。
nameserviceブロックチェーンの作成
まずはアプリの大枠を生成。
scaffold app lvl-1 <ユーザ名> <リポジトリ名>
公式には、Githubの<ユーザ名>と<リポジトリ名>をとの記載がありますが、たぶん適当で大丈夫なんじゃないかと。 <リポジトリ名> は今回はcosmossdk-tutorialとしました。コマンド実行後、<リポジトリ名> のディレクトリが生成されます。 コマンド実行直後のcosmossdk-tutorialの状態は以下の通りです。
cosmossdk-tutorial ├── app │ ├── app.go │ └── export.go ├── cmd │ ├── appcli │ │ └── main.go │ └── appd │ ├── genaccounts.go │ └── main.go ├── go.mod ├── Makefile └── x
次に、x
ディレクトリに移動して、scaffloldツールでnameservice
という名前のモジュールを生成します。(xって名前もどうなのと思いつつ)
scaffold module <ユーザ名> <リポジトリ名> nameservice
コマンド実行するとnameservice配下に以下のようなファイルやディレクトリが生成されます。
x └── nameservice ├── abci.go ├── alias.go ├── client │ ├── cli │ │ ├── query.go │ │ └── tx.go │ └── rest │ ├── query.go │ ├── rest.go │ └── tx.go ├── genesis.go ├── handler.go ├── keeper │ ├── keeper.go │ ├── params.go │ └── querier.go ├── module.go ├── README.md ├── spec │ └── README.md └── types ├── codec.go ├── errors.go ├── events.go ├── expected_keepers.go ├── genesis.go ├── key.go ├── msg.go ├── params.go └── querier.go
ここで断念。
ここから公式サイトに沿って確認、コード追記等していくのですが、ここで断念。 公式通りに修正する気力が湧きませんでした。。。。
公式は、types/types.go
のコード追加、keeper、codec等の説明が続きます。
完成済みのチュートリアルを試す。
気を取り直して、動きだけでも確認しようと思い、完成済みのチュートリアルをインストールしてみます。 以下のサイト様を参考に進めました。公式サイトは探せておらず不明です。
gccがないとmakeできないようですので、インストールしておきましょう。
sudo apt install build-essential
git clone https://github.com/cosmos/sdk-application-tutorial.git
cd sdk-application-tutorial/nameservice
make install
これで、Goのソースコードがコンパイルされnsd
とnscli
という名前の実行ファイルが$GOPATH/bin
ディレクトリに生成されたはず。
コマンドはspf13/cobraで作られているようです。
あとは参考サイトそのままです。
nsd init cosmos --chain-id namechain
jackとaliceという名前のアカウントを追加して、それぞれに1,000nametoken、100,000,000stakeの初期値割り当て
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
初期値の設定ファイルgenesis.json
確認(目視)
cat ~/.nsd/config/genesis.json
nscliの設定
nscli config chain-id namechain nscli config output json nscli config indent true nscli config trust-node true
nscli設定値の確認(目視)
cat ~/.nscli/config/config.toml
ノード起動
nsd gentx --name jack nsd collect-gentxs nsd validate-genesis nsd start
ちなみに、nsdサブコマンドは以下の説明になっています。
- init : Initialize private validator, p2p, genesis, and application configuration files
- add-genesis-account : Add a genesis account to genesis.json
- gentx : Generate a genesis tx carrying a self delegation
- collect-gentxs : Collect genesis txs and output a genesis.json file
- validate-genesis : Validates the genesis file at the default location or at the location passed as an arg
- start : Run the full node
ここから別コンソール。
jackの初期値確認
nscli query account $(nscli keys show jack -a)
jack.idという名前を5tokenで買ってみる。
nscli tx nameservice buy-name jack.id 5nametoken --from jack
jackのアカウントからtokenが減ってるか確認。
nscli query account $(nscli keys show jack -a)
jack.idの名前に8.8.8.8というIPアドレスを設定してみる。(8.8.8.8はGoogleのDNSのアドレスですが)
nscli tx nameservice set-name jack.id 8.8.8.8 --from jack
jack.idという名前からIPアドレスを引いてみる。(結果は8.8.8.8が表示される)
nscli query nameservice resolve jack.id
aliceがjack.idを買うところは面倒なので省略。
LotionJSを試す。
Cosmos-SDKのチュートリアルで辟易としたので、Tendermint関連で別のものがないか調べていると、Javascriptのフレームワークらしきものがありました。 公式サイト通りにやってみましたが簡単でした。簡単すぎて味気ないというか、歯ごたえがまるでないです。
Node.js、npmが必要です。使用したバージョンは以下の通りです。
- Node 12.16.3
- npm 6.14.5
Lotion、Lotion-CLIをインストール。-gオプションは不要かもしれませんが、念のため。一緒にTendermintとかもインストールされるようです。
npm install lotion
npm install -g lotion-cli
インストールされたバージョンはこんな感じでした。
- lotion 0.4.27
- tendermint 0.31.5
- tendermint-node 5.1.5
適当なディレクトリ内にapp.js
ファイルを作成して、以下のようなコードを記述(公式からのコピペ)。
let lotion = require('lotion') let app = lotion({ initialState: { count: 0 } }) function transactionHandler(state, transaction) { if (state.count === transaction.nonce) { state.count++ } } app.use(transactionHandler) app.start().then(appInfo => console.log(appInfo.GCI))
そして実行。
node app.js
実行すると、Global Chain Identifier (GCI)と呼ばれる超長い文字列が表示されます。この文字列はこの後のlotion動作確認で使用します。
ここから別ターミナルを開いて動作を確認。
lotion state <GCI>
<GCI>
の箇所には、先ほどのnodeコマンドで表示された超長い文字列を指定します。
結果、countの初期値は0になっています。
{ "count": 0 }
トランザクションを発行?してcountを変更してみます。
lotion send <GCI> '{ "nonce" : 0 }'
(nonceが0って何だかなぁと思いつつ)以下のような値が表示されます。
{ "check_tx": {}, "deliver_tx": {}, "hash": "E11E0D22061B3359D4A331E76BDC2DB2F95ECCE19E969EB1780CC671D5AF52C9", "height": "65" }
生成ブロックの情報でしょうか。hash値とheightがはまってますね。
countの値を再度確認してみます。
lotion state <GCI>
結果
{ "count": 1 }
countが+1されています。
感想
個人的にブロックチェーンでやりたいことは、デジタルコンテンツ(Non-Fungibleトークン的なもの)とFungibleトークンの価値交換とか、参加者限定の分散台帳なのですが、今回のTendermint関連でやれるかと考えると、情報が足りない(私自身の勉強も足りませんが)、ナレッジベースが洗練されていない感触でした。 アプリケーション開発者目線での「なんかできそう」感は、現時点ではEthereumの方がありますね。 CosmosはLino Network/D-Liveが採用してサービスインしていたり、Cosmos Hubがローンチされているという記事を読んだので期待していたのですが。。。ウワモノを作る人にとっては敷居が高いかもしれません。
雑記:デジタル円検討会のニュースについて
2020/06/03付で、デジタル円(CDBC:Central Bank Digital Currency)検討会発足のニュースがでていました。参加企業はメガバンク、大手の情報通信、キャッシュレス決済サービスを運用している運輸、流通・小売、そして法律事務所と納得のラインナップになっていました。 FacebookのLibraや中国の動きから検討せざるを得ない状況になっているのだろうと思います(そういえば、ブロックチェーンやってる人って中華系の人が多いような印象があります)。 これまでの検討状況では、「現時点の技術水準では困難」の見解のようですね。これから先、日銀他がどのようなインフラ技術をベースにしようとするのか興味があります。