Casper Clientを使用したトークンの再デリゲート

このドキュメントでは、バリデータにステークされたトークンがアンボンディング処理の実行中に1度のCallにて他のバリデータに再度デリゲートが可能となるワークフローの詳細について説明します。

もしくは、デリゲーターは2つのステップを踏むことになります。まず最初に、アンデリゲートリクエストを送信しそれから新しいバリデータにトークンをデリゲートします。

事前準備

  1. 有効なノードアドレスと Casper コマンドラインクライアントを持っているなど、すべての前提条件を満たしている。
  2. Casper ネットワーク上のバリデータにデリゲートしたトークンとそのバリデータの公開鍵を持っている。
  3. トークンの再デリゲート先となる新しいバリデータの公開鍵を持っている。詳細については、「バリデータの公開鍵を取得する」を参照してください。

方法 1: システムオークションコントラクトによる再委任(デリゲート)

この方法では、システムオークションコントラクトから既存のredelegateエントリーポイントを呼び出します。この方法を使用すると、コントラクトを構築する必要がないため、コストと複雑さが軽減されます。

casper-client put-deploy \
--node-address <HOST:PORT> \
--secret-key <PATH_TO_DELEGATOR_SECRET_KEY> \
--chain-name <CHAIN_NAME> \
--payment-amount 2500000000 \
--session-hash <SESSION_HASH> \
--session-entry-point redelegate \
--session-arg "delegator:public_key='<DELEGATOR_PUBLIC_KEY_HEX>'" \
--session-arg "validator:public_key='<CURRENT_VALIDATOR_PUBLIC_KEY_HEX>'" \
--session-arg "amount:u512='<DELEGATION_AMOUNT>'" \
--session-arg "new_validator:public_key='<NEW_VALIDATOR_PUBLIC_KEY_HEX>'"
  1. node-address – ネットワーク上のピアのIPアドレス。ノードのデフォルトJSON-RPC サーバーは、Mainnet とTestnet 共に7777です。
  2. secret-key – Deployの支払いを行うアカウントの秘密鍵を持っているファイル名
  3. chain-name – Deployを送信する先のネットワークのchain-name。Mainnetの場合はcasper、Testnetの場合はcasper-testを用います。
  4. payment-amount – Deployの支払い(単位:motes)。エントリーポイントの呼び出しには 2.5 CSPRが必要です。
  5. session-hash – 使用しているネットワークに格納されているオークションコントラクトの16進数にエンコードされたハッシュ。CasperのMainnetとTestnetの場合は下記の様な表示となります:
  • Testnet: hash-93d923e336b20a4c4ca14d592b60e5bd3fe330775618290104f9beb326db7ae2
  • Mainnet: hash-ccb576d6ce6dec84a551e48f0d0b7af89ddba44c7390b690036257a04a3ae9ea
  1. session-entry-point – コントラクトを呼び出す際に使用されるエントリーポイント名

redelegate エントリーポイントには4つの引数が必要です:

  1. delegator:public_key: 再デリゲートリクエストを提出するアカウントの16進数の公開鍵。この鍵はデプロイに署名を行う秘密鍵とペアとなっていなければなりません。
  2. validator:public_key: トークンをアンデリゲートするバリデータの16進数の公開鍵
  3. amount: 新しいバリデータに再デリゲートする合計
  4. new_validator:public_key: トークンをデリゲートするバリデータの16進数公開鍵

コマンドは、デプロイの処理結果の確証に必要となるデプロイハッシュを返します。

💡note
オークションコントラクト上のredelegateエントリーポイントを呼び出すには2.5 CSPRのコストがかかり、デリゲーションの最低価格は 500 CSPR に設定されており、これは再デリゲーションにも当て嵌まります。

例:
下記例では、プライベートネットワークにてcasper-node version 1.5を使用しています。支払い額は2.5 CSPRに指定しています。ネットワークのchainspec.tomlに基づき、支払いとデプロイのその他の値を修正しなくてはなりません。

casper-client put-deploy \
--node-address http://3.143.158.19:7777  \
--chain-name integration-test \
--secret-key ~/KEYS/integration/Test_secret_key.pem \
--payment-amount 2500000000 \
--session-hash hash-e22d38bcf3454a93face78a353feaccbf1d637d1ef9ef2e061a655728ff59bbe \
--session-entry-point redelegate \
--session-arg "validator:public_key='017fec504c642f2b321b8591f1c3008348c57a81acafceb5a392cf8416a5fb4a3c'" \
--session-arg "amount:u512='500000000000'" \
--session-arg "delegator:public_key='01360af61b50cdcb7b92cffe2c99315d413d34ef77fadee0c105cc4f1d4120f986'" \
--session-arg "new_validator:public_key='019e7b8bdec03ba83be4f5443d9f7f9111c77fec984ce9bb5bb7eb3da1e689c02d'"

次は、再デリゲーションの確証です。

方法 2: コンパイルしたWasmの再デリゲーション

再デリゲーションを送信する他手法として、redelegate.wasmをコンパイルしそれをデプロイにてネットワークへ送信するやり方もあります。ご自身でWasmをコンパイルするには、再デリゲーションWasmを含むcasper-nodeコントラクトをビルドしてください。

再デリゲーションリクエストの送信

Casper Mainnetなどライブ環境にて稼働させる前に公式のTestnet上にて下記ステップにてテストを実施することを推奨しています。

この例では、delegate.wasmを含むデプロイをネットワークへ送信し再デリゲーション処理にCasperクライアントを用いています。

casper-client put-deploy \
--node-address <HOST:PORT> \
--secret-key <PATH_TO_DELEGATOR_SECRET_KEY> \
--chain-name <CHAIN_NAME> \
--payment-amount <PAYMENT_AMOUNT> \
--session-path <PATH_TO_WASM>/redelegate.wasm \
--session-arg "delegator:public_key='<DELEGATOR_PUBLIC_KEY_HEX>'" \
--session-arg "validator:public_key='<CURRENT_VALIDATOR_PUBLIC_KEY_HEX>'" \
--session-arg "amount:u512='<DELEGATION_AMOUNT>'" \
--session-arg "new_validator:public_key='<NEW_VALIDATOR_PUBLIC_KEY_HEX>'"
  1. node-address:ネットワーク上のピアのIPアドレス。ノードのデフォルトJSON-RPC サーバーは、Mainnet とTestnet 共に7777です。
  2. secret-key:Deployの支払いを行うアカウントの秘密鍵を持っているファイル名
  3. chain-name:Deployを送信する先のネットワークのchain-name。Mainnetの場合はcasper、Testnetの場合はcasper-testを用います。
  4. payment-amount:Deployの支払い(単位:motes)。エントリーポイントの呼び出しには 2.5 CSPRが必要です。
  5. session-path:コンピューター上のredelegate.wasm へのパス

redelegate.wasm には4つの引数が必要です:

  1. delegator:public_key: 再デリゲートのリクエストを提出したアカウントの16進数公開鍵。この鍵はデプロイに署名をした秘密鍵とペアでなければなりません。
  2. validator:public_key: トークンがアンデリゲートされるバリデータの16進数公開鍵
  3. amount: 新しいバリデータに再デリゲートされる合計値
  4. new_validator:public_key: トークンがデリゲートされるバリデータの16進数公開鍵

出力から返されたdeploy_hashを保存し再デリゲーションDeploy情報をクエリできます。

💡note
redelegate.wasm の実行は、redelegate エントリーポイントをシステムオークションコントラクトから呼び出すよりも処理コストが高くなります。

例:
下記例では、プライベートネットワークにてcasper-node version 1.5を使用しています。支払い額は 8 CSPRに指定しています。ネットワークのchainspec.tomlに基づき、支払いとデプロイのその他の値を修正しなくてはなりません。

casper-client put-deploy \
--node-address http://3.143.158.19:7777  \
--chain-name integration-test \
--secret-key ~/KEYS/integration/Test_secret_key.pem \
--payment-amount 8000000000 \
--session-path ~/redelegate.wasm \
--session-arg "validator:public_key='017fec504c642f2b321b8591f1c3008348c57a81acafceb5a392cf8416a5fb4a3c'" \
--session-arg "amount:u512='500000000000'" \
--session-arg "delegator:public_key='01360af61b50cdcb7b92cffe2c99315d413d34ef77fadee0c105cc4f1d4120f986'" \
--session-arg "new_validator:public_key='019e7b8bdec03ba83be4f5443d9f7f9111c77fec984ce9bb5bb7eb3da1e689c02d'"

再デリゲーションの確証

再デリゲーション処理には、トークンが新しいバリデータに再デリゲートされる前のアンボンディング遅延が含まれます。それに反して、デリゲーションの初期化はCasperネットワークが関連するDeployをファイナライズした際に行われます。

この遅延により、新しいバリデータは再デリゲーションが完了する前に非アクティブになることもあり得ます。その場合、トークンはデリゲータに返還されます。

再デリゲーションのDeployが処理されると、オークションをクエリ出来るようになり再デリゲーションの確認が可能となります。この処理は、casper-client get-auction-infoコマンドを用いたデリゲートのリクエストの確証と同様です。