Cosmos Validator Part 2 ~小宇宙へ開く~

Yuya Sugano
28 min readJun 23, 2019

--

3月13日 7 PM EST に Cosmos Hub のメインネットがローンチされました。バリデータとステークトークンを委譲するデリゲータの概要およびフルノードを動かす手順について前回解説しました。今回は構築したフルノードをバリデータとして動かす方法をまとめています。

※ Inter-Blockchain Communication(IBC)はまだドラフト中です

This is called Cosmos yeah ?

公式のバリデータセットアップの内容を基本として展開します。[1]

前回の内容のうち『バリデータ』と『デリゲータ』の内容だけおさらいしてから構築したフルノードにバリデータの設定を行っていきます。

目次

  • バリデータ
  • デリゲータ
  • Atomを送金
  • バリデータを構築

バリデータを事業者として運営する場合には、セキュリティ対策やインシデントレスポンスなど運用体制を整える必要があります。

この記事では前回 Ubuntu で作成したプチフルノードをバリデートできるようにすることを主眼としていますので現実的なバリデータ運営とは異なることをご了承ください。

バリデータ

Cosmos Hub は Tendermint ベースのパブリックブロックチェーンで、 PoS(Proof of Stake)による合意形成を執り行うバリデータにより運用されています。バリデータはフルノードを運用し、自身の秘密鍵を使用してブロック生成の投票へ参加します。ステーキングトークンである Atoms の比率によって、ブロックを提案できる頻度やトランザクションによる報酬が変化するため、この Atoms のステーク量は非常に重要です。

バリデータになるためには2つの技術的な必要条件があります。

  • フルノードを運用する(サーバやコンピュータ)
  • declare-candidacyトランザクションを送付する

また追加条件で Atoms のステーク量が上位でないとバリデータにはなれないようになっています。現段階(初年度)では上位 100 位までですが、次年度には上位 113位までがバリデータになれます。事前に10年後までのバリデータ数が決定していて、2029年次で上位 300 位のノードがバリデータとして稼働する予定です(以下表を参照のこと)。

Predefined schedule for validator

フルノードを運用していても declare-candidacy のトランザクションを送出しない、もしくは各段階で明記されている上位バリデータになっていない場合はバリデータとしてフルノードを運用することはできません(バリデータではない単純なフルノードです)。

バリデータを運用する上では以下のような対応も求められます。

  • 最新のソフトウェアへのアップデート
  • ガバナンスプロセスへの参加 — 全提案への投票が義務付けられる
  • セキュリティと可用性 — 秘密鍵の保全とアップタイム

フルノードがバリデータとしてネットワークに参加するには declare-candidacy トランザクションを送信する必要があります。以下のようなパラメータを設定します。

  • Validator’s PubKey: バリデータの公開鍵、 prevotes および precommit へ署名するために使用される秘密鍵に対応する、バリデータはこの署名用のアカウントおよび Atoms を保有するアカウントなど複数のアカウントを保有できる
  • Validator’s name: バリデータの名前
  • Validator’s website (オプショナル): バリデータのWebサイト、なくてもよいがバリデータの運営会社についてや運営方法について情報を掲載できる
  • Validator’s description (オプショナル): バリデータの説明
  • Initial commission rate: 初期コミッションレート
  • Maximum commission: 最大コミッションレート
  • Commission change rate: 日別のコミッションの可能な最大の変化量
  • Minimum self-bond amount: バリデータが自身でステークする Atoms の最低量、この数値を下回った場合はプールのすべてステークが解除される(非常に危険w)
  • Initial self-bond amount: バリデータの Atoms ステークの初期値

フルノードがこの宣言を行いバリデータとなると、他の Atoms 保有者はこのバリデータのプールに Atoms をステーキングできるようになります。バリデータ自身の Atoms もプールへ Self-bond できるので、ステーキングプールのトータルはバリデータ自身がステークした分とデリゲータがこのバリデータにステークした合計です。

バリデータはデリゲータのステークした Atoms を盗むことはできませんが、アップタイムの低下やハッキングなどの被害によるペナルティによってデリゲータは Atoms を失う可能性があります。

デリゲータ

デリゲータはフルノードを運用しない、または運用していてもバリデータとして Cosmos Hub に参加したくない Atoms 保有者で、Atoms をバリデータへ預けるユーザのことです。バリデータへ権限を委譲することで、ブロック生成やガバナンスへ間接的に関与します。責任を共有することと同時に、ステークした Atoms の比率に応じて報酬(リワード)を得ることができます。

ただしバリデータによる不正行為や発生した障害によってステークした Atoms がスラッシュにより減損される可能性があります。

Deligators share revenue with their validators, delegators also share responsiblity. Should a validator misbehave, each of its delegators will be partially slashed in proportion to their stake.

したがってデリゲータはバリデータに対してデューデリすることが重要で、場合によってステークするバリデータを分散させるなどのリスクオフの姿勢が必要でしょう。

この点は分散投資とも考え方が似てくるかもしれません。スプリターネットなどの地政学的リスクも考え、ステークするノードは国や地域を分ける、もしくはトップのバリデータと比較的中位のバリデータでステーク先を分けるなど様々な手法が考えられます。

後で述べますがトップバリデータはハッキングや DoS 攻撃の対象となりやすいためスラッシュの可能性が高まります。

デリゲータがバリデータを選定する主な基準を見てみましょう。

  • バリデータ自身の Atoms ステーク — バリデータがプールにどれぐらいの Atoms を自身でステークしているかを評価します
  • デリゲートされている Atoms ステーク — デリゲータからどれぐらいの Atoms を合計でステークされているかを評価します、多くのデリゲータからデリゲートされていることで信用が高まります
  • コミッションレート — 報酬に対するコミッションレートの高低を評価します
  • トラックレコード — バリデータ歴などの情報を評価します、過去の提案(プロポーサル)への投票履歴、アップタイムやハッキングによる不正攻撃にあったかなどの情報が含まれます

バリデータは自身のWebサイトなどでも情報を公開するなどしてレピュテーションに配慮した運営を行う必要がありますが、同時に多くの情報を公開することはハッカーにとっても都合がよいためリスクとのバランスを考慮した上でノード運用を行う必要があります。

Atom を送金

Self-bond としてアカウントから自身のバリデータプールへステークしたい場合は、事前に Atoms を送金しておきます。※Binance などの取引所からノードのアドレスへ送付できます、以下はBinanceの例です

Send ATOM from Binance to your node address

前回まででフルノードの構築が完了していることを前提としています。[2]

接続するホストを設定します。

$ gaiacli config node tcp://localhost:26657
/home/ether/.gaiacli/config/config.toml does not exist
configuration saved to /home/ether/.gaiacli/config/config.toml
$ gaiacli config trust-node true
configuration saved to /home/ether/.gaiacli/config/config.toml

メインネットの chain-id である cosmoshub-2 を設定してください。

$ gaiacli config chain-id cosmoshub-2
configuration saved to /home/ether/.gaiacli/config/config.toml

送金するためのローカルアドレスをフルノード上で作成します。バリデータの Atoms ステークの初期値と最低ステーク量がありますので、最低ステーク量以上のトークンを初期値に設定しましょう。ステークの最低保有量を下回ると全てのステークが解除されてしまいます。これは危険です。パラメータは Minimum Self Delegation で 1 以上である必要があるようです。1 Atom以上をノード上のローカルアカウントへ送金します。

フルノード構築時ではアドレスは存在しません。

$ gaiacli keys list
NAME: TYPE: ADDRESS: PUBKEY:

gaiacli keys add でアドレスを生成します。

$ gaiacli keys add <YOUR KEYNAME>NAME:   TYPE:   ADDRESS:
<YOUR KEYNAME> local cosmos16j5uk7zt8kh38fjdane7fkuxrmlarrg09a62y3
**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.
<YOUR MNEMONIC PHRASE>

キー名、タイプ、Cosmos のアドレス、公開鍵が上段に表示され、下段にパスワードを失念した際にアカウントをリカバリするための MNEMONIC が表示されます。これは忘れないように紙にメモりましょう。

※上の Cosmos のアドレスはでたらめなアドレスに変えてあります

Binanceなどの取引所か自身のハードウェアウォレット(Ledgerなど)からローカルアカウントへ送金します。Atomの着金が確認できたら gaiacli で対象のアカウントのAtomの残高を確認します。以下の例では 50atom が入金されています。

※1atom = 1000000uatom

$ gaiacli query account cosmos16j5uk7zt8kha0w46373jfhdrmlarrg09a62y3
Account:
Address: cosmos16j5uk7zt8kha0w46373jfhdrmlarrg09a62y3
Pubkey:
Coins: 50990000uatom
AccountNumber: 11385
Sequence: 0

フルノードのチェーンが同期していない場合および対象アカウントにAtomがない場合は以下のエラーが出ます。アカウントが存在していないというエラーメッセージですが、上記の2つのうちどちらかが理由です。

ERROR: {"codespace":"sdk","code":9,"message":"account cosmos16j5uk7zt8kha0w46373jfhdrmlarrg09a62y3 does not exist"}
Error occurrence with gaiacli query account

Webウォレットである https://lunie.io/ でも残高が確認できます。[3]

Atoms in your wallet in lunie.io

これで事前にステークする Atom が準備できました。

バリデータ構築

フルノードからトランザクションを作成してバリデータとなる宣言をします。『Run a Validator on the Cosmos Hub Mainnet』に沿って進めていきます。

gaiad tendermint show-validator コマンドで cosmosvalpub から始まるバリデータの公開鍵を表示します。フルノードを構築済みの場合は既に割り当てられているはずです。

gaiad init を行ってノードを立ち上げた場合は作成されている

$ gaiad tendermint show-validator
cosmosvalconspub1zcjduepqd7szufvheqd5vunyw48058aypr4xac6q0y9stskc20zp50m5h87qf59hf8

Tendermint Key: This is a unique key used to sign consensus votes.

It is associated with a public key cosmosvalconspub (Get this value with gaiad tendermint show-validator)

It is generated when the node is created with gaiad init.

gaiacli tx staking create-validator コマンドで declare-candidacy トランザクションを送出します。

事前に以下のパラメータ値を決めておく必要があります。 --amount で最初に渡す Atom は自身のアカウントに保持しているトークン量以下でかつ --min-self-delegation より大きい値である必要があります。

最低ステークトークン量は 1atom から設定可能です。

  • Initial commission rate: 初期コミッションレート
  • Maximum commission: 最大コミッションレート
  • Commission change rate: 日別のコミッションの可能な最大の変化量
  • Minimum self-bond amount: バリデータが自身でステークする Atoms の最低量、この数値を下回った場合はプールのすべてステークが解除される
  • Initial self-bond amount: バリデータの Atoms ステークの初期値

※以下のトランザクションは失敗します。

$ gaiacli tx staking create-validator --amount=30000000uatom --pubkey=$(gaiad tendermint show-validator) --moniker="<YOUR MONIKER>" --chain-id=cosmoshub-2 --commission-rate="0.10" --commission-max-rate="1.00" --commission-max-change-rate="0.01" --min-self-delegation="1" --gas="auto" --gas-prices="0.025uatom" --from=<YOUR KEYNAME>gas estimate: 100656
{"chain_id":"cosmoshub-2","account_number":"11385","sequence":"0","fee":{"amount":[{"denom":"uatom","amount":"2517"}],"gas":"100656"},"msgs":[{"type":"cosmos-sdk/MsgCreateValidator","value":{"description":{"moniker":"cosmos-hub.com","identity":"","website":"","details":""},"commission":{"rate":"0.100000000000000000","max_rate":"1.000000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"cosmos16j5uk7zt8kh38fjdane7fkuxrmlarrg09a62y3","validator_address":"cosmosvaloper16j5uk7zt8kha0w4637h36kuxrmlarrg0qfwlgz","pubkey":"cosmosvalconspub1zcjduepqd7szufvheqd5vunyw48058aypr4xac6q0y9stskc20zp50m5h87qf59hf8","value":{"denom":"uatom","amount":"30000000"}}}],"memo":""}
confirm transaction before signing and broadcasting [Y/n]: Y
Password to sign with '<YOUR KEYNAME>':
Response:
TxHash: EB0F32ECBB8E1436EEB89464EB515086F3F432095913544B116B9059D023006A

トランザクションハッシュを検索してみましょう。 out of gas で失敗しています。これはガスコストがうまく計算できていないことが原因のようでした。

$ gaiacli query tx EB0F32ECBB8E1436EEB89464EB515086F3F432095913544B116B9059D023006A
Response:
Height: 764414
TxHash: EB0F32ECBB8E1436EEB89464EB515086F3F432095913544B116B9059D023006A
Code: 12
Raw Log: {"codespace":"sdk","code":12,"message":"out of gas in location: ReadFlat; gasWanted: 100728, gasUsed: 100942"}
GasWanted: 100728
GasUsed: 100942
Timestamp: 2019-06-22T15:14:28Z

ガスコストが auto でうまく計算できないときは --gas-adjustment のオプションを追加してください。--gas-adjustment="1.5" が推奨されているようですが、以下のIssueで記載されている通り--gas-adjustment="1.15" でも問題なく取り込まれました。

再度 gaiacli tx staking create-validator コマンドで declare-candidacy トランザクションを送出します。

$ gaiacli tx staking create-validator --amount=30000000uatom --pubkey=$(gaiad tendermint show-validator) --moniker="<YOUR MONIKER>" --chain-id=cosmoshub-2 --commission-rate="0.10" --commission-max-rate="1.00" --commission-max-change-rate="0.01" --min-self-delegation="1" --gas="auto" -
-gas-adjustment="1.15" --gas-prices="0.025uatom" --from=<YOUR KEYNAME>
gas estimate: 115982
{"chain_id":"cosmoshub-2","account_number":"11385","sequence":"2","fee":{"amount":[{"denom":"uatom","amount":"2900"}],"gas":"115982"},"msgs":[{"type":"cosmos-sdk/MsgCreateValidator","value":{"description":{"moniker":"cosmos-hub.com","identity":"","website":"","details":""},"commission":{"rate":"0.100000000000000000","max_rate":"1.000000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"cosmos16j5uk7zt8kh38fjdane7fkuxrmlarrg09a62y3","validator_address":"cosmosvaloper16j5uk7zt8kha0w4637h36kuxrmlarrg0qfwlgz","pubkey":"cosmosvalconspub1zcjduepqd7szufvheqd5vunyw48058aypr4xac6q0y9stskc20zp50m5h87qf59hf8","value":{"denom":"uatom","amount":"30000000"}}}],"memo":""}
confirm transaction before signing and broadcasting [Y/n]: Y
Password to sign with '<YOUR KEYNAME>':
Response:
TxHash: F9C5A83CD6B2FA478EF643903ED83862B253DE0E424E913424C2DF172225721B

トランザクションが成功しブロックに取り込まれていることが確認できました。

$ gaiacli query tx F9C5A83CD6B2FA478EF643903ED83862B253DE0E424E913424C2DF172225721B
Response:
Height: 770222
TxHash: F9C5A83CD6B2FA478EF643903ED83862B253DE0E424E913424C2DF172225721B
Raw Log: [{"msg_index":"0","success":true,"log":""}]
Logs: [{"msg_index":0,"success":true,"log":""}]
GasWanted: 115982
GasUsed: 104337
Tags:
- action = create_validator
- destination-validator = cosmosvaloper16j5uk7zt8kha0w4637h36kuxrmlarrg0qfwlgz
- moniker = cosmos-hub.com
- identity =
Timestamp: 2019-06-23T02:21:45Z

ノードに設定している moniker である cosmos-hub.com がバリデータとして認識しているか確認してみます。

Webウォレットの https://lunie.io/ でバリデータとして表示されました。

Validator has become live now !!

また gaiacli query staking validator コマンドを使用することでより詳細なステータスが確認できます。

$ gaiacli query staking validator cosmosvaloper16j5uk7zt8kha0w4637h36kuxrmlarrg0qfwlgzValidator
Operator Address: cosmosvaloper16j5uk7zt8kha0w4637h36kuxrmlarrg0qfwlgz
Validator Consensus Pubkey: cosmosvalconspub1zcjduepqd7szufvheqd5vunyw48058aypr4xac6q0y9stskc20zp50m5h87qf59hf8
Jailed: false
Status: Unbonded
Tokens: 30000000
Delegator Shares: 30000000.000000000000000000
Description: {cosmos-hub.com }
Unbonding Height: 0
Unbonding Completion Time: 1970-01-01 00:00:00 +0000 UTC
Minimum Self Delegation: 1
Commission: rate: 0.100000000000000000, maxRate: 1.000000000000000000, maxChangeRate: 0.010000000000000000, updateTime: 2019-06-23 02:21:45.584908623 +0000 UTC

上位のバリデータに入っていない場合はアクティブなバリデータノードとはなりません。 gaiacli query tendermint-validator-set ではアクティブなバリデータのみを表示できます。

grep "($gaiad tendermint show-validator)" をパイプで渡して何もでてこない場合、バリデータはアクティブになっていないと考えられます。

$ gaiacli query tendermint-validator-set | grep "$(gaiad tendermint show-validator)"

以上でバリデータの構築は完了です。

バリデータ設定変更

バリデータの詳細を確認するとバリデータのアバター画像や、Website、Descriptionが空欄のままとなっていると思います。各パラメータは gaiacli tx staking edit-validator でトランザクションを送ることで編集することができます。

Your own validator pane in lunie.io

--identity オプションに https://keybase.io/ のIDを設定することでバリデータのアバター画像を Keybase.io から取得できます。[4]

バリデータのアバター画像が必要な方は Keybase.io からアカウント登録をしてIDを取得してください。

$ gaiacli tx staking edit-validator
--moniker="<YOUR MONIKER>" \
--website="<YOUR WEBSITE URL>" \
--identity=<YOUR KEYBASE ID> \
--details="<YOUR DESCRIPTION>" \
--chain-id="cosmoshub-2" \
--gas="auto" \
--gas-prices="0.025uatom" \
--from=<YOUR KEYNAME> \
--commission-rate="<NEW COMMISSION RATE>"

--commission-rate では新しいコミッションレートを設定できますが、現在の設定値から commission-max-change-rate 以上乖離した値は設定できません。コミッションレートの最大値と日別の変化値は一度バリデータを構築すると後から変更できないため注意が必要です。

参考まで、バリデータであるCosmospool.orgのサイトで便利コマンドがまとめられています。[5]

一部ご紹介します。

// アカウントの残高確認
$ gaiacli query account <yourAddress>

// バリデータ一覧を取得
$ gaiacli query staking validators

// 指定したアドレスのバリデータ情報を取得 (e.g. cosmosvaloper1n5pepvmgsfd3p2tqqgvt505jvymmstf6s9gw27)
gaiacli query staking validator <validatorAddress>

// 指定したアドレスから作成されたデリゲーション情報を取得 (e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg)
gaiacli query staking delegations <delegatorAddress>

// 指定したアドレスのデリゲータから指定したアドレスのバリデータへのステーキング情報を取得 (e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg) to a validator (e.g. cosmosvaloper1n5pepvmgsfd3p2tqqgvt505jvymmstf6s9gw27) given their addresses
gaiacli query staking delegation <delegatorAddress> <validatorAddress>

// 指定したデリゲータに分配されたリワード情報を取得 (e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg)
gaiacli query distr rewards <delegatorAddress>

以上です。

まとめ

  • Cosmos Hub は Tendermint ベースのパブリックブロックチェーンで、 PoS(Proof of Stake)を採用している
  • バリデータというブロック生成やガバナンスへ参加するユーザと、バリデータへ Atoms をステークすることで権限移譲するデリゲータというユーザが存在する
  • スラッシングによってバリデータやデリゲータのステークした Atoms は毀損する可能性がある
  • gaiacli tx staking create-validator コマンドでバリデータの宣言をするトランザクションを送出できる
  • トランザクションのガスコストがうまく計算されない場合は--gas-adjustment オプションを使用して調整できる

--

--

Yuya Sugano
Yuya Sugano

Written by Yuya Sugano

Cloud Architect and Blockchain Enthusiast, techflare.blog, Vinyl DJ, Backpacker. ブロックチェーン・クラウド(AWS/Azure)関連の記事をパブリッシュ。バックパッカーとしてユーラシア大陸を陸路横断するなど旅が趣味。

No responses yet