Tendermint、Cosmos SDK、LotionJSをちょっとだけ試す。

前回までにEthereum、HyperLedger Fabricと試してきましたが、ネットでブロックチェーン関連を調べているとTendermint、Cosmosに辿り着きました。 というわけで、今回はTendermint関連です。とはいってもTendermintはほぼ意識しないですが。

Cosmos scaffloldツールを使用したチュートリアル

結論から言うと、途中断念しています。

scaffloldツールで生成されるソースコード雛型とチュートリアルの内容に差異が結構あり、萎えました。 一応、確認したところまでメモしておきますが、ただの環境構築です。。。

公式はこちら。

tutorials.cosmos.network

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等の説明が続きます。

完成済みのチュートリアルを試す。

気を取り直して、動きだけでも確認しようと思い、完成済みのチュートリアルをインストールしてみます。 以下のサイト様を参考に進めました。公式サイトは探せておらず不明です。

goblockchain.network

www.blockchainengineer.tokyo

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のソースコードコンパイルされnsdnscliという名前の実行ファイルが$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はGoogleDNSのアドレスですが)

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フレームワークらしきものがありました。 公式サイト通りにやってみましたが簡単でした。簡単すぎて味気ないというか、歯ごたえがまるでないです。

lotionjs.com

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や中国の動きから検討せざるを得ない状況になっているのだろうと思います(そういえば、ブロックチェーンやってる人って中華系の人が多いような印象があります)。 これまでの検討状況では、「現時点の技術水準では困難」の見解のようですね。これから先、日銀他がどのようなインフラ技術をベースにしようとするのか興味があります。