複数署名(マルチシグ)ワークフロー

このチュートリアルは、Casperアカウントのキーマネージメント(鍵管理)統合方法におけるサンプル例の提供を目的としています。このガイドは、他準備のうち二者間によるデプロイへの複数署名(マルチシグ)チュートリアルを終えられていることを前提としています。Casper CLI クライアントコマンドである make-deploysign-deploy, そして send-deployを使用するには、Casper CLI クライアントも必要となります。

DANGER
このチュートリアルで提供されたセッションコードは、本番環境では使用しないでください。

間違ったアカウント設定は、アカウントの機能不全や利用不可の状態を引き起こすこともあり、全てのCSPRトークンへのアクセスを失うことになります。

アカウントへのいかなる変更も、Mainnetなどの本番環境にて動かす前に、Testnetなどのテスト環境にてテストを実施するようにしてください。

事前準備

このワークフローでは、以下の事前準備が必要となります。

  1. 資金を持ったアカウント や Casper CLI クライアント を含む、開発環境の事前準備全てのセットアップが完了している
  2. 二者間によるデプロイへの複数署名(マルチシグ)ワークフローを完了しており、マルチシグデプロイ用のソース(送信元)アカウントをセットアップできている
  3. Casper アカウントモデルを理解できている

鍵管理に必要なセッションコード

アカウントのアソシエイトキーと閾値を管理するには、アカウントのコンテキストにて実行されるセッションコードを実行しなくてはいけません。このワークフローにて提供されているセッションコードは、一般的なものではなくユースケース毎に修正が必要となることはご留意ください。

💡CAUTION
このサンプル達は、Mainnet上では動作させないでください。環境に合わせて各コマンドを変更してください。

チュートリアルウォークスルー

Step 1: このワークフロー用のサンプルWasmのクローン

multi-sig GitHub リポジトリには、アソシエイトキーを使ったCasperアカウントとマルチシグデプロイの設定方法を学習するためのセッションコードが含まれています。レポジトリをクローンし、対応フォルダーに移動してください。

git clone https://github.com/casper-ecosystem/tutorials-example-wasm/ && cd multi-sig

Step 2: 提供されたサンプルWasmのビルド

環境準備を行い、与えられたセッションコードのビルドとテストを以下のコマンドを使用して実施します。

rustup update
make clean
make prepare
make test

Step 3: プライマリキーのweight(重さ)を上げて閾値設定を行う

プライマリキーのweightを1から3に増やしてこのワークフローを開始します。アカウントのアップデートを行うには、鍵のweightをkey_management閾値以上にしなくてはいけません。後続ステップでは、デプロイへの署名を行うアソシエイトアカウントを追加します。

ブロックエクスプローラもしくはCasper CLIクライアントを用いて、使用しているプライマリキーのアカウントハッシュを取得します。

casper-client account-address --public-key <INSERT_PUBLIC_KEY_HEX>

update_associated_keys.wasmを呼び出し、プライマリキーの weight を3にアップデートします。

casper-client put-deploy --node-address https://rpc.testnet.casperlabs.io/ \
--chain-name "casper-test" \
--payment-amount 500000000 \
--secret-key $PATH/secret_key.pem \
--session-path target/wasm32-unknown-unknown/release/update_associated_keys.wasm \
--session-arg "associated_key:key='account-hash-<ACCOUNT_HASH_HEX_HERE>'" \
--session-arg "new_weight:u8='3'"

このアカウントのプライマリキーのweightは、3になっているはずです。

アカウント詳細:

下記表が、アップデートのまとめとなります。

Threshold / KeyPrevious weightCurrent weight
deployment11
key_management11
Primary key (1ed5...)13

Step 4: アカウントのアクション閾値のアップデート

deployment と key_management の閾値をアップデートし、アカウントのマルチシグスキーマをセットアップします。

アカウントのアクション閾値は、以下のようになります。

"action_thresholds": {
  "deployment": 2,
  "key_management": 3
},

鍵管理には、このアカウントの累積weightを3に設定する必要があり、デプロイ送信には累積weightを2に設定する必要があります。例えば、2つのアソシエイトキーが持っているweightが1の場合、アソシエイトキーはアカウントコンテキストの一部として、デプロイへの署名と送信の両方を行うことになります。この2つの鍵の累積weightは、キーマネジメントの閾値に達することなありません。

アカウント詳細:

下記表が、アップデートのまとめとなります。

Threshold / KeyPrevious weightCurrent weight
deployment12
key_management13
Primary key (1ed5...)13

Step 5: プライマリアカウントへのアソシエイトキーの追加

アソシエイトキーをプライマリアカウントに追加するには、add_account.wasm を使用します。このサンプル例では、2つの鍵をプライマリアカウント (account-hash-d89c*): user_1 with account-hash-e2d0*user_2 with account-hash-04a9* に追加します。

casper-client put-deploy --node-address https://rpc.testnet.casperlabs.io/ \
--chain-name "casper-test" \
--payment-amount 500000000 \
--secret-key $PATH/secret_key.pem \
--session-path target/wasm32-unknown-unknown/release/add_account.wasm \
--session-arg "new_key:key='account-hash-e2d00525cac31ae2756fb155f289d276c6945b6914923fe275de0cb127bffee7" \
--session-arg "weight:u8='1'"

casper-client put-deploy --node-address https://rpc.testnet.casperlabs.io/ \
--chain-name "casper-test" \
--payment-amount 500000000 \
--secret-key $PATH/secret_key.pem \
--session-path target/wasm32-unknown-unknown/release/add_account.wasm \
--session-arg "new_key:key='account-hash-04a9691a9f8f05a0f08bd686f188b27c7dbcd644b415759fd3ca043d916ea02f" \
--session-arg "weight:u8='1'"

ここで、アカウントは weight 3の1つのプライマリキーとそれぞれのweight が1である2つのアソシエイトキーを持っています。

アカウント詳細:

💡NOTE

  1. 全てのアソシエイトキーは、アカウントのセキュリティと可用性を担保する為に、高度にセキュアな状態を維持しなければなりません。
  2. 全てのアソシエイトキーとアクション閾値を要求したマルチシグスキーマに設定後、元のプライマリキーのweightは、ユースケース次第で増減します。要注意です。プライマリキーのweightを鍵管理の閾値より低くした場合、アカウントは鍵管理にマルチシグが必要となります。アカウントに必要な数のアソシエイトキーが設定されていない場合、そのアカウントは使えません。

下記表に、アップデートをまとめています。

Threshold / KeyPrevious weightCurrent weight
deployment12
key_management13
Primary key (1ed5...)13
Associated key (04a9...)N/A1
Associated key (e2d0...)N/A1

Step 6: プライマリアカウントからのデプロイ送信

このステップでは、名前付き鍵をアカウントに追加する Wasm (contract.wasm)を持つデプロイを送信します。Wasmのソースコードは、hello-worldリポジトリにあります。プライマリアカウントの weightは3なので、デプロイの閾値より大きいことよりデプロイは成功します。

casper-client put-deploy --chain-name casper-test \
--payment-amount 3000000000 \
--session-path tests/wasm/contract.wasm \
--secret-key $PATH/secret_key.pem \
--session-arg "my-key-name:string='primary_account_key'" \
--session-arg "message:string='Hello, World'"

hello_world.wasm が実行され、アカウントに名前付き鍵が追加されます。

"named_keys": [
  {
    "key": "uref-9b9ecaa9e5e235fc6955d4d528cb1b5b38f2d800f6cbbc55351131a3701b5a81-007",
    "name": "my-key-name"
  }
]

Step 7: アソシエイトキーによるマルチシグデプロイの送信

このサンプル例に与えられたマルチシグスキーマがセットアップされ、2つの内の1つのアソシエイトキーからデプロイ送信するには、2つのアソシエイトキーによる署名が必要です。このサンプル例では、以下のコマンドを用いて複数鍵によるデプロイへの署名を行い、ネットワークへ送信します。

  1. make-deploy – デプロイの作成と署名を行い、出力をファイルに保存します
  2. sign-deploy – マルチシグデプロイ用の追加署名
  3. send-deploy – ネットワークへのデプロイ送信

step 6と同様に、このサンプル例では、アカウントに名前付き鍵を追加する Wasm (contract.wasm) を使用します。デプロイは、引数 --session-accountで識別されたプライマリアカウントが発生元となっています。デプロイは、deployment の weight が2となるように2つの署名が必要となります。両方のアソシエイトキーがデプロイに署名するとどちらか一方がネットワークへ送信します。

引数の --session-accountを用いる際、セッションコードが実行されるプライマリアカウントのコンテキストの16進数にエンコードされた公開鍵を識別します。

アソシエイトキーは、make-deployコマンドにてデプロイを作成し署名を行い、セッションコードが実行されるアカウントコンテキストを表示します。

casper-client make-deploy --chain-name casper-test \
--payment-amount 300000000 \
--session-path tests/wasm/contract.wasm \
--secret-key $PATH/user_1_secret_key.pem \
--session-arg "my-key-name:string='user_1_key'" \
--session-arg "message:string='Hello, World'" \
--session-account 01360af61b50cdcb7b92cffe2c99315d413d34ef77fadee0c105cc4f1d4120f986 \
--output hello_world_one_signature

2つめのアソシエイトキーは、アカウントのデプロイ閾値に達する為に sign-deploy にてデプロイに署名します。

casper-client sign-deploy -i hello_world_one_signature -k $PATH/user_2_secret_key.pem  -o hello_world_two_signatures

send-deploy コマンドを使用してネットワークにデプロイが送信します。

casper-client send-deploy --node-address https://rpc.testnet.casperlabs.io -i hello_world_two_signatures

hello_world.wasm は、名前付き鍵の実行とアカウントへの追加を行います。

侵害された鍵の削除

このサンプル例では、アカウントから侵害された鍵の削除方法について説明します。例では、remove_account.wasmセッションコードを用いて削除するアソシエイトキー1つだけを追加しています。

💡CAUTION
鍵を削除する時には、十分に気を付けてください!このサンプルは、Mainnet上では使用しないでください。

鍵を削除する前に、残ったアソシエイトキーの weight を併せて鍵管理の閾値に到達可能であることを確認します。そうでなければ、アカウントは使えなくなります。鍵のweightの変更もしくは新しいアソシエイトキーの追加が、鍵管理の閾値に到達する唯一可能な方法となります。

気を付けて先に進んでください。

現在の設定では、プライマリアカウントがアソシエイトキーを追加し、削除します。他のユースケースでは、鍵を削除するためにアソシエイトキーの署名を合わせてマルチシグデプロイを送信する場合もあります。

casper-client put-deploy --node-address https://rpc.testnet.casperlabs.io/ \
--chain-name "casper-test" \
--payment-amount 500000000 \
--secret-key $PATH/secret_key.pem \
--session-path target/wasm32-unknown-unknown/release/add_account.wasm \
--session-arg "new_key:key='account-hash-1fed34baa6807a7868bb18f91b161d99ebf21763810fe4c92e39775d10bbf1f8" \
--session-arg "weight:u8='1'"

アカウント詳細:

add_account.wasm を呼び出した後のアップデートを、下記表にまとめています。

Threshold / KeyPrevious weightCurrent weight
deployment12
key_management13
Primary key (1ed5...)13
Associated key (04a9...)11
Associated key (e2d0...)11
Associated key (1fed...)N/A1

remove_account.wasm は、新規追加されたアカウントを削除し、侵害されることもあるアソシエイトキーの削除の可能性について見ます。

casper-client put-deploy --node-address https://rpc.testnet.casperlabs.io/ \
--chain-name "casper-test" \
--payment-amount 500000000 \
--secret-key $PATH/secret_key.pem \
--session-path target/wasm32-unknown-unknown/release/remove_account.wasm \
--session-arg "remove_key:key='account-hash-1fed34baa6807a7868bb18f91b161d99ebf21763810fe4c92e39775d10bbf1f8"

結果的にアカウントは、削除したアソシエイトキーを持っていないはずです。

アカウント詳細:

remove_account.wasm を呼び出した後のアップデートを、下記表にまとめています。

Threshold / KeyPrevious weightCurrent weight
deployment12
key_management13
Primary key (1ed5...)13
Associated key (04a9...)11
Associated key (e2d0...)11
Associated key (1fed...)1N/A (Removed)

Next Steps

次のセクションでは、Casperのマルチシグ機能の役立て方の 追加サンプル例 について書かれています。