スマートコントラクトのインストール

Casper command-lineクライアントput-deployコマンドを使ったCasperスマートコントラクトのインストール方法の詳細について説明しています。

前提条件

  • Casper Networkへ送信するコンパイルしたコントラクトWasmを持っている
  • ネットワークとやり取りするCasper CLI クライアントをインストール済みである
  • トランザクションを初期化する為の公開鍵と秘密鍵のペアを持つCasper Accountを持っている
  • トランザクションへの支払いに十分なCSPRトークンがアカウントのメインパースに保有している。Casper Testnetを使用する場合は、テスト用アカウントのメインパースへのフォーセットを使ったトークン付与方法についてご確認ください。

グローバルステートにおけるコントラクトのインストール

グローバルステートにコントラクトをインストールするには、コントラクトWasmと一緒にトランザクションをネットワークへ送信する必要があります。put-transactionセッションコマンドもしくは同等の put-txnセッションコマンドを用いると実行できます。

casper-client put-transaction session \
--node-address [NODE_SERVER_ADDRESS] \
--chain-name [CHAIN_NAME] \
--secret-key [KEY_PATH]/secret_key.pem \
--gas-price-tolerance [MAX_GAS_AMOUNT] \
--pricing-mode fixed \
--transaction-path <PATH> \
--session-entry-point call \
--category 'install-upgrade'

上記にて使用している引数は:

  • node-address – ネットワーク上に存在するピアのIPアドレスです。MainnetとTestnetのデフォルトJSON-RPC サーバーは 7777です。
  • chain-name – トランザクションを送信する先のネットワークです。Mainnetの場合はcasperを、Testnetの場合はcasper-testを使用します。
  • secret-key – トランザクションへの支払いをするアカウントの秘密鍵を持つファイル名
  • gas-price-tolerance – ユーザーが決めた実行コストに対するガスの最高値
  • pricing-mode – MainnetとTestnetに”fixed”を設定
  • transaction-path – コントラクト(.wasmファイル)をコンパイルしたご自分のPC上の場所を示しているコントラクトWasmのパス
  • session-entry-point – 通常 call と呼ばれるコントラクトのインストール時に使用するエントリーポイントの名前
  • categoryinstall-upgradeを最大としたWasmのサイズに基づいたトランザクションの型

このコマンドを呼ぶとトランザクションハッシュが返されます。トランザクションの実行が成功したことを検証する際にこのハッシュを使用します。

💡TIP

価格モードは各ネットワークのchainspecに基づき異なります。MainnetとTestnetの場合、価格モードは “fixed”となっておりコストは価格表に従い固定されているため送信者は支払い額を指定できません。

Example – コントラクトのインストールローカルネットワークのNCTLへcounter-installer.wasmを送信します:

casper-client put-transaction session \
--node-address http://localhost:11101 \
--chain-name casper-net-1 \
--secret-key ~/casper/casper-nctl/assets/net-1/users/user-1/secret_key.pem \
--gas-price-tolerance 10 \
--pricing-mode fixed \
--transaction-path ~/test_contracts/counter_installer.wasm \
--session-entry-point call \
--category 'install-upgrade'

クエリ結果にはtransaction_hashが含まれます:

{
  "jsonrpc": "2.0",
  "id": 90342686534145684,
  "result": {
    "api_version": "2.0.0",
    "transaction_hash": {
      "Version1": "49c36616a50962fa5a7dd7901677ae44667fa9f8c542e49eb2284ba2c900bba2"
    }
  }
}

トランザクションを検証するには、get-transactionを呼びput-transactionにて取得したトランザクションハッシュを提供します。

casper-client get-transaction --node-address http://localhost:11101 [TRANSACTION_HASH]
  • ▶ここをクリックして開いて、サンプルレスポンスの詳細を確認してください
    {
      "jsonrpc": "2.0",
      "id": 5297043714444661948,
      "result": {
        "api_version": "2.0.0",
        "transaction": {
          "Version1": {
            "hash": "49c36616a50962fa5a7dd7901677ae44667fa9f8c542e49eb2284ba2c900bba2",
            "header": {
              "chain_name": "casper-net-1",
              "timestamp": "2024-08-21T11:21:36.201Z",
              "ttl": "30m",
              "body_hash": "543df05d05c456e9b6b5d657029e9ad20c674c6e6b56f498af0052ec87ee9f80",
              "pricing_mode": {
                "Fixed": {
                  "gas_price_tolerance": 10
                }
              },
              "initiator_addr": {
                "PublicKey": "0149d133f697b5867d312e18ae0b129ef0c63499df2815fe339dca727963edb80d"
              }
            },
            "body": {
              "args": [],
              "target": {
                "Session": {
                  "module_bytes": "[105936 hex chars]",
                  "runtime": "VmCasperV1"
                }
              },
              "entry_point": "Call",
              "transaction_category": 2,
              "scheduling": "Standard"
            },
            "approvals": [
              {
                "signer": "0149d133f697b5867d312e18ae0b129ef0c63499df2815fe339dca727963edb80d",
                "signature": "01537684dd531ce6a4c9383ba7ea565e9408ed2c5dd8bb12787f131e1148fd0f057f45dbaa7bbc0230743cc5740c67db64f66bab1df57547722899f7d7289c1f0c"
              }
            ]
          }
        },
        "execution_info": {
          "block_hash": "24ead40278a71966e16823150b06c06675a216dbef761c1d6ad1439da4147f4a",
          "block_height": 8463,
          "execution_result": {
            "Version2": {
              "initiator": {
                "PublicKey": "0149d133f697b5867d312e18ae0b129ef0c63499df2815fe339dca727963edb80d"
              },
              "error_message": null,
              "limit": "1000000000000",
              "consumed": "46747144601",
              "cost": "1000000000000",
              "payment": [],
              "transfers": [],
              "size_estimate": 53215,
              "effects": [
                {
                  "key": "balance-hold-0121dc8fc358c4e30ae29786bd4842a5f99da83efa0b9ca8461cd2196ffbfd07f172b7ab7491010000",
                  "kind": {
                    "Write": {
                      "CLValue": {
                        "cl_type": "U512",
                        "bytes": "050010a5d4e8",
                        "parsed": "1000000000000"
                      }
                    }
                  }
                },
                {
                  "key": "uref-65f3f583bf1ac01b6c90d9c9478bd239c09e46f48fb693918726eaab03631407-000",
                  "kind": {
                    "Write": {
                      "CLValue": {
                        "cl_type": "I32",
                        "bytes": "00000000",
                        "parsed": 0
                      }
                    }
                  }
                },
                {
                  "key": "uref-29feb2af8a9d7b6d2ef6be875a0aa326b646a00b7cdd2dd4a65365e84e9f2e9a-000",
                  "kind": {
                    "Write": {
                      "CLValue": {
                        "cl_type": "Unit",
                        "bytes": "",
                        "parsed": null
                      }
                    }
                  }
                },
                {
                  "key": "package-50d487af45f8cec533c6813801a7630ff97e5ee3964daf7915d5451b4812ac94",
                  "kind": {
                    "Write": {
                      "Package": {
                        "versions": [],
                        "disabled_versions": [],
                        "groups": [],
                        "lock_status": "Unlocked"
                      }
                    }
                  }
                },
                {
                  "key": "named-key-entity-account-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463-05c3e063406ddde43671e0d47c45e31a10e9204137171f96ce818bdc725a4e1b",
                  "kind": {
                    "Write": {
                      "NamedKey": {
                        "named_key": {
                          "cl_type": "Key",
                          "bytes": "1050d487af45f8cec533c6813801a7630ff97e5ee3964daf7915d5451b4812ac94",
                          "parsed": "package-50d487af45f8cec533c6813801a7630ff97e5ee3964daf7915d5451b4812ac94"
                        },
                        "name": {
                          "cl_type": "String",
                          "bytes": "14000000636f756e7465725f7061636b6167655f6e616d65",
                          "parsed": "counter_package_name"
                        }
                      }
                    }
                  }
                },
                {
                  "key": "named-key-entity-account-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463-6409273bf327d5a6a39a29dbd07c5cd2f48ee4f227fd443d025adc51e1bd5103",
                  "kind": {
                    "Write": {
                      "NamedKey": {
                        "named_key": {
                          "cl_type": "Key",
                          "bytes": "0229feb2af8a9d7b6d2ef6be875a0aa326b646a00b7cdd2dd4a65365e84e9f2e9a07",
                          "parsed": "uref-29feb2af8a9d7b6d2ef6be875a0aa326b646a00b7cdd2dd4a65365e84e9f2e9a-007"
                        },
                        "name": {
                          "cl_type": "String",
                          "bytes": "13000000636f756e7465725f6163636573735f75726566",
                          "parsed": "counter_access_uref"
                        }
                      }
                    }
                  }
                },
                {
                  "key": "package-50d487af45f8cec533c6813801a7630ff97e5ee3964daf7915d5451b4812ac94",
                  "kind": "Identity"
                },
                {
                  "key": "entity-system-1f15cf43df68e8b382415a8ef687521f61f1ecce6960b72eaa13f43bfc448139",
                  "kind": "Identity"
                },
                {
                  "key": "package-f1c97c9b6228be3f316753e4e1289d910071fb880dddccce18881abfb9f53526",
                  "kind": "Identity"
                },
                {
                  "key": "entry-point-v1-entity-system-1f15cf43df68e8b382415a8ef687521f61f1ecce6960b72eaa13f43bfc448139-21bddc7e4379ba445c7118cb51962954e0d1e5aa5cacc0c4ff6095b57eb9fb33",
                  "kind": "Identity"
                },
                {
                  "key": "uref-2cb7e46fcde2c4d395a6850bb3b7edbb0b4db6018643e535fa0dfdeeb006d6ef-000",
                  "kind": {
                    "Write": {
                      "CLValue": {
                        "cl_type": "Unit",
                        "bytes": "",
                        "parsed": null
                      }
                    }
                  }
                },
                {
                  "key": "balance-2cb7e46fcde2c4d395a6850bb3b7edbb0b4db6018643e535fa0dfdeeb006d6ef",
                  "kind": {
                    "Write": {
                      "CLValue": {
                        "cl_type": "U512",
                        "bytes": "00",
                        "parsed": "0"
                      }
                    }
                  }
                },
                {
                  "key": "byte-code-v1-wasm-0577a7c92fd20e1af76aa9e257631cb240e8187191bba2025e88663d0288e936",
                  "kind": {
                    "Write": {
                      "ByteCode": {
                        "kind": "V1CasperWasm",
                        "bytes": "[82290 hex chars]"
                      }
                    }
                  }
                },
                {
                  "key": "named-key-entity-contract-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68-5fed34ec1b2c38445b984eee743ce17fb1e5e89a8cb910cc2f9f12b005360eef",
                  "kind": {
                    "Write": {
                      "NamedKey": {
                        "named_key": {
                          "cl_type": "Key",
                          "bytes": "0265f3f583bf1ac01b6c90d9c9478bd239c09e46f48fb693918726eaab0363140707",
                          "parsed": "uref-65f3f583bf1ac01b6c90d9c9478bd239c09e46f48fb693918726eaab03631407-007"
                        },
                        "name": {
                          "cl_type": "String",
                          "bytes": "05000000636f756e74",
                          "parsed": "count"
                        }
                      }
                    }
                  }
                },
                {
                  "key": "entry-point-v1-entity-contract-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68-399a84b0da15b34ecd774b1c4ad47c72a9e1298df057d83bee93d22ac4972aa5",
                  "kind": {
                    "Write": {
                      "EntryPoint": {
                        "V1CasperVm": {
                          "name": "counter_get",
                          "args": [],
                          "ret": "I32",
                          "access": "Public",
                          "entry_point_type": "Called",
                          "entry_point_payment": "Caller"
                        }
                      }
                    }
                  }
                },
                {
                  "key": "entry-point-v1-entity-contract-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68-3eba75fc27f0ec2786e09c09d72d61e4c28a86d44d8efc9911460d5438396481",
                  "kind": {
                    "Write": {
                      "EntryPoint": {
                        "V1CasperVm": {
                          "name": "counter_inc",
                          "args": [],
                          "ret": "Unit",
                          "access": "Public",
                          "entry_point_type": "Called",
                          "entry_point_payment": "Caller"
                        }
                      }
                    }
                  }
                },
                {
                  "key": "entity-contract-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68",
                  "kind": {
                    "Write": {
                      "AddressableEntity": {
                        "protocol_version": "2.0.0",
                        "entity_kind": {
                          "SmartContract": "VmCasperV1"
                        },
                        "package_hash": "package-50d487af45f8cec533c6813801a7630ff97e5ee3964daf7915d5451b4812ac94",
                        "byte_code_hash": "byte-code-0577a7c92fd20e1af76aa9e257631cb240e8187191bba2025e88663d0288e936",
                        "main_purse": "uref-2cb7e46fcde2c4d395a6850bb3b7edbb0b4db6018643e535fa0dfdeeb006d6ef-007",
                        "associated_keys": [
                          {
                            "account_hash": "account-hash-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463",
                            "weight": 1
                          }
                        ],
                        "action_thresholds": {
                          "deployment": 1,
                          "upgrade_management": 1,
                          "key_management": 1
                        },
                        "message_topics": []
                      }
                    }
                  }
                },
                {
                  "key": "package-50d487af45f8cec533c6813801a7630ff97e5ee3964daf7915d5451b4812ac94",
                  "kind": {
                    "Write": {
                      "Package": {
                        "versions": [
                          {
                            "entity_version_key": {
                              "protocol_version_major": 2,
                              "entity_version": 1
                            },
                            "addressable_entity_hash": "addressable-entity-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68"
                          }
                        ],
                        "disabled_versions": [],
                        "groups": [],
                        "lock_status": "Unlocked"
                      }
                    }
                  }
                },
                {
                  "key": "uref-7bc25880db57763fccfa858185becd8de40a890d9e006e067352f011bdcf03bf-000",
                  "kind": {
                    "Write": {
                      "CLValue": {
                        "cl_type": "U32",
                        "bytes": "01000000",
                        "parsed": 1
                      }
                    }
                  }
                },
                {
                  "key": "named-key-entity-account-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463-174ccaaa723ba74cee869017501fab28512b6ef9296d48a38daff7d0da13d1a1",
                  "kind": {
                    "Write": {
                      "NamedKey": {
                        "named_key": {
                          "cl_type": "Key",
                          "bytes": "027bc25880db57763fccfa858185becd8de40a890d9e006e067352f011bdcf03bf07",
                          "parsed": "uref-7bc25880db57763fccfa858185becd8de40a890d9e006e067352f011bdcf03bf-007"
                        },
                        "name": {
                          "cl_type": "String",
                          "bytes": "0700000076657273696f6e",
                          "parsed": "version"
                        }
                      }
                    }
                  }
                },
                {
                  "key": "named-key-entity-account-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463-83b1cde13136393741a1e906a892ccdd289e7827cc9ef84a98cc96e86464bde0",
                  "kind": {
                    "Write": {
                      "NamedKey": {
                        "named_key": {
                          "cl_type": "Key",
                          "bytes": "1102a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68",
                          "parsed": "entity-contract-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68"
                        },
                        "name": {
                          "cl_type": "String",
                          "bytes": "07000000636f756e746572",
                          "parsed": "counter"
                        }
                      }
                    }
                  }
                },
                {
                  "key": "balance-hold-0121dc8fc358c4e30ae29786bd4842a5f99da83efa0b9ca8461cd2196ffbfd07f172b7ab7491010000",
                  "kind": {
                    "Prune": "balance-hold-0121dc8fc358c4e30ae29786bd4842a5f99da83efa0b9ca8461cd2196ffbfd07f172b7ab7491010000"
                  }
                },
                {
                  "key": "balance-hold-0021dc8fc358c4e30ae29786bd4842a5f99da83efa0b9ca8461cd2196ffbfd07f172b7ab7491010000",
                  "kind": {
                    "Write": {
                      "CLValue": {
                        "cl_type": "U512",
                        "bytes": "050010a5d4e8",
                        "parsed": "1000000000000"
                      }
                    }
                  }
                },
                {
                  "key": "entity-system-b76adcf84d4900edec0af9001e727bcc3d4920a40afaa6a0e43137bacf62b91e",
                  "kind": "Identity"
                },
                {
                  "key": "entity-system-1f15cf43df68e8b382415a8ef687521f61f1ecce6960b72eaa13f43bfc448139",
                  "kind": "Identity"
                },
                {
                  "key": "entity-system-1d29f1bd6ba7016f430498de2d0fe7c9d2c14c200d79be33e0ad240bc2a0d229",
                  "kind": "Identity"
                },
                {
                  "key": "bid-addr-01f47c77764d4d4c0030c563266724e78e07b2b4719ecfceeae816470c5ecf882d",
                  "kind": "Identity"
                },
                {
                  "key": "bid-addr-04f47c77764d4d4c0030c563266724e78e07b2b4719ecfceeae816470c5ecf882d0903000000000000",
                  "kind": {
                    "Write": {
                      "BidKind": {
                        "Credit": {
                          "validator_public_key": "01e4bb993269e0fe33d6e575ab6a642fdcaf692449a1529c4f73e636dfff9d3e61",
                          "era_id": 777,
                          "amount": "1000000000000"
                        }
                      }
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }

上記サンプル出力結果に記載のあるコントラクトのエンティティアドレスをメモしてください。インストールしたコントラクトのクエリをする際に必要となります。ここの例では、entity-contract-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68 がアドレスとなります。

次に、コントラクトのインストールに成功した場合の詳細についてグローバルステートのクエリにて確認してみましょう。

What’s Next?

 Casper コマンドラインクライアントを使ったグローバルステートのクエリについて