複数署名(マルチシグ)デプロイを使ったトークン転送
ここでは、複数署名(マルチシグ)を使ったデプロイファイルによるトークンの転送方法を見ていきます。このトークンの転送方法は、Casperネットワーク上でのアカウント間の複数署名(マルチシグ)転送を実装する際におすすめです。
make-transfer コマンドで、転送のデプロイ作成とその出力内容をファイルに保存できます。 sign-deploy コマンドを使って他のユーザーが署名したデプロイを作成し、それを send-deploy コマンドでネットワークに送信し実行します。
前提条件
デプロイコマンドを使用開始する前に、下記の前提条件を満たしているかご確認ください。
- 必要なセットアップに従って、ご自分のマシンをセットアップ済みである
- Testnet(テストネット)もしくは、Mainnet(メインネット)にアカウントを設定済みである
- 有効なノードアドレスをTestnet peers もしくは、Mainnet peersから取得済みである
- Casperのコマンドラインクライアント
- この概要でお伝えしているワークフローのように、複数署名デプロイ用の送信元アカウントのセットアップ
- 送信元のsecret key(秘密鍵)ファイルのパスを取得済みである
- 送信先のpublic key(公開鍵)のhexファイルを取得済みである
トークン転送のワークフロー
Casper CLI クライアントとデプロイファイルを使ったトークン転送の概要は、下記ステップのとおりです。
make-transferコマンドによって転送の作成と署名、ファイルへの出力内容の保存が行われますsign-deployコマンドによって複数署名転送へ追加署名が付与されますsend-deployコマンドによって転送を含むデプロイをネットワークへ送信されます

転送の作成
このセクションでは、Testnetで試せるサンプルを使ったmake-transferコマンドについて説明します。例えば、secret_key.pemを持つ送信元アカウントから送信先のターゲットアカウントへ、2,500,000,000 モーツを転送するとします。Mainnetにて同様のことを試すには、chain-name を casper-testからcasper に変更してください。※ make-transferコマンドによって出力された結果はtransfer.deployファイルに保存されます。
casper-client make-transfer --amount 2500000000 \
--secret-key [PATH]/secret_key.pem \
--chain-name casper-test \
--target-account [PUBLIC_KEY_HEX] \
--transfer-id [ID] \
--payment-amount 100000000 \
--output transfer.deploy下記テーブルでは、make-transferコマンドにて使用されるパラメータについて説明しています。
| パラメーター | 概要 |
| amount | 転送するモーツ数 (1 CSPR = 1,000,000,000 モーツ) |
| secret-key | 送信元アカウントの秘密鍵ファイルへのパス |
| chain-name | 間違えて、もしくは悪意を持って違うチェーンへのデプロイを未然に防ぐ為のチェーン名 ・テストネット用:casper-test ・メインネット用:casper |
| target-account | 送信先アカウントとしてメインパース(お財布)が使用されるアカウントの公開鍵を16進数に符号化したもの |
| transfer-id | 恒久的に転送と紐づいているユーザーの識別ID |
| payment-amount | ネットワーク上でコードを実行する際に支払われる合計値 デプロイとネットワークのchainspecをベースに、支払い合計は変化します。Testnetのノードバージョンが1.5.1の場合、wasmless転送は、10^8 モーツがかかります。 |
approvalsというセクションが出力内容にあります。送信元アカウントがDeployに署名を行う箇所です。
例:
casper-client make-transfer --amount 2500000000 \
--secret-key ~/KEYS/multi-sig/keys/default_secret_key.pem \
--chain-name casper-test \
--target-account 0154d828baafa6858b92919c4d78f26747430dcbecb9aa03e8b44077dc6266cabf \
--transfer-id 1 \
--payment-amount 100000000 \
--output transfer.deploy-
make-transferコマンドの出力サンプル
{ "hash": "88c49fa9108485397a330f294914a6c2d614c581fbe0a31de1a954baad6d709b", "header": { "account": "01360af61b50cdcb7b92cffe2c99315d413d34ef77fadee0c105cc4f1d4120f986", "timestamp": "2023-10-12T19:14:22.080Z", "ttl": "30m", "gas_price": 1, "body_hash": "1bb7436d4703816b5cbeef245dd83c0520f1c7173cdf609c664a29487cc5de1c", "dependencies": [], "chain_name": "casper-test" }, "payment": { "ModuleBytes": { "module_bytes": "", "args": [ [ "amount", { "cl_type": "U512", "bytes": "0400e1f505", "parsed": "100000000" } ] ] } }, "session": { "Transfer": { "args": [ [ "amount", { "cl_type": "U512", "bytes": "0400f90295", "parsed": "2500000000" } ], [ "target", { "cl_type": "PublicKey", "bytes": "0154d828baafa6858b92919c4d78f26747430dcbecb9aa03e8b44077dc6266cabf", "parsed": "0154d828baafa6858b92919c4d78f26747430dcbecb9aa03e8b44077dc6266cabf" } ], [ "id", { "cl_type": { "Option": "U64" }, "bytes": "010100000000000000", "parsed": 1 } ] ] } }, "approvals": [ { "signer": "01360af61b50cdcb7b92cffe2c99315d413d34ef77fadee0c105cc4f1d4120f986", "signature": "015e0db50b174f3627e0e27cb503f0836b30bd0e0f2c4b989366b0df57500a1cb2b0945408c938bc3c33c40dab59a9c6af6f4e01e474330cd27262bfc87680030e" } ] }
Transferへの署名
デプロイファイルが生成されると、他の指定したアカウントによる署名が行えます。この例では、2番目の鍵によるデプロイへの署名とtransfer2.deployファイルへの出力内容の保存を行っています。
casper-client sign-deploy \
--input transfer.deploy \
--secret-key [PATH]/another_secret_key.pem \
--output transfer2.deploy| パラメータ | 概要 |
|---|---|
| input | 署名が必要なデプロイファイルのパス |
| secret-key | デプロイに署名を行う際に使用される秘密鍵のパス |
| output | 複数署名を持つデプロイを保存する際に使用される出力ファイルのパス |
例:
casper-client sign-deploy \
--input transfer.deploy \
--secret-key ~/KEYS/multi-sig/keys/user_1_secret_key.pem \
--output transfer2.deploy以下の出力末尾に向かって、最初に転送を開始したアカウントによる署名とデプロイへの署名を行うアカウントの署名、と2つの署名を持つapprovals(承認)のセクションを確認いただけます。
-
transfer2.deployファイルに保存された出力サンプル
{ "hash": "88c49fa9108485397a330f294914a6c2d614c581fbe0a31de1a954baad6d709b", "header": { "account": "01360af61b50cdcb7b92cffe2c99315d413d34ef77fadee0c105cc4f1d4120f986", "timestamp": "2023-10-12T19:14:22.080Z", "ttl": "30m", "gas_price": 1, "body_hash": "1bb7436d4703816b5cbeef245dd83c0520f1c7173cdf609c664a29487cc5de1c", "dependencies": [], "chain_name": "casper-test" }, "payment": { "ModuleBytes": { "module_bytes": "", "args": [ [ "amount", { "cl_type": "U512", "bytes": "0400e1f505", "parsed": "100000000" } ] ] } }, "session": { "Transfer": { "args": [ [ "amount", { "cl_type": "U512", "bytes": "0400f90295", "parsed": "2500000000" } ], [ "target", { "cl_type": "PublicKey", "bytes": "0154d828baafa6858b92919c4d78f26747430dcbecb9aa03e8b44077dc6266cabf", "parsed": "0154d828baafa6858b92919c4d78f26747430dcbecb9aa03e8b44077dc6266cabf" } ], [ "id", { "cl_type": { "Option": "U64" }, "bytes": "010100000000000000", "parsed": 1 } ] ] } }, "approvals": [ { "signer": "01360af61b50cdcb7b92cffe2c99315d413d34ef77fadee0c105cc4f1d4120f986", "signature": "015e0db50b174f3627e0e27cb503f0836b30bd0e0f2c4b989366b0df57500a1cb2b0945408c938bc3c33c40dab59a9c6af6f4e01e474330cd27262bfc87680030e" }, { "signer": "01e3d3392c2e0b943abe709b25de5c353e5e1e9d95c7a76e3dd343d8aa1aa08d51", "signature": "017793ad52d27393b1aa8ff5bb9bdbcb48708910d6cdabd9a89b44690ca174edf8924aad340bf901ac343391cb4cba7cf4db07390372f28ecf471fd522e0b63803" } ] }
デプロイの送信
次のステップとして、ネットワークへデプロイを実行用に送信します。必要なセットアップの項目で述べた通り、アクティブなノードアドレスを対象のネットワークから取得してください。下記例では、テストネットのhttps://rpc.testnet.casperlabs.io/を使用しています。
casper-client send-deploy \
--input transfer2.deploy \
--node-address https://rpc.testnet.casperlabs.io/ | パラメーター | 概要 |
| input | 入力値として必要なデプロイファイルへのパス |
| node-address | ホスト名もしくはIPとノードのポート |
send-deployコマンドの出力から deploy_hash を記録し、デプロイの状態を確認します。
-
send-deployコマンドの出力サンプル
{ "jsonrpc": "2.0", "id": -818883417884028030, "result": { "api_version": "1.5.3", "deploy_hash": "88c49fa9108485397a330f294914a6c2d614c581fbe0a31de1a954baad6d709b" } }
💡NOTE
アカウントの認証エラーに出くわした場合、送信元アカウントがセッションコードを使用してデプロイにマルチシグ(multi-sig)を行えるようにセットアップが必要です。二者間によるデプロイへの複数署名(マルチシグ)のワークフローにてやり方を説明しています。
-
アカウント認証エラーのサンプル
{ "code": -32008, "message": "deploy parameter failure: account authorization invalid at prestate_hash: 5f0392de8ac3512a48a110acfc5bc10d4a6a07109b350ae14cbec0428656c8ac" }
転送の認証
転送のステータスを確認する方法については、トークンの転送確認をご確認ください。
💡TIP
ブロックエクスプローラを使用しアカウントの残高を確認すれば、転送が成功したかどうかを確認できます。