複数署名(マルチシグ)デプロイを使ったトークン転送

ここでは、複数署名(マルチシグ)を使ったデプロイファイルによるトークンの転送方法を見ていきます。このトークンの転送方法は、Casperネットワーク上でのアカウント間の複数署名(マルチシグ)転送を実装する際におすすめです。

make-transfer コマンドで、転送のデプロイ作成とその出力内容をファイルに保存できます。 sign-deploy コマンドを使って他のユーザーが署名したデプロイを作成し、それを send-deploy コマンドでネットワークに送信し実行します。

前提条件

デプロイコマンドを使用開始する前に、下記の前提条件を満たしているかご確認ください。

  1. 必要なセットアップに従って、ご自分のマシンをセットアップ済みである
  2. この概要でお伝えしているワークフローのように、複数署名デプロイ用の送信元アカウントのセットアップ
  3. 送信元のsecret key(秘密鍵)ファイルのパスを取得済みである
  4. 送信先のpublic key(公開鍵)のhexファイルを取得済みである

トークン転送のワークフロー

Casper CLI クライアントとデプロイファイルを使ったトークン転送の概要は、下記ステップのとおりです。

  1. make-transferコマンドによって転送の作成と署名、ファイルへの出力内容の保存が行われます
  2. sign-deployコマンドによって複数署名転送へ追加署名が付与されます
  3. 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
ブロックエクスプローラを使用しアカウントの残高を確認すれば、転送が成功したかどうかを確認できます。