- Developers(開発者ガイド)概要
- 開発の事前準備
- 必須となるRust Crate(クレート)
- Writing On-Chain Code
- Getting Started with Rust
- Getting Started with AssemblyScript
- 基本的なスマートコントラクトをRustで書く方法
- スマートコントラクトのテスト
- スマートコントラクトのアップグレードとメンテナンス
- スマートコントラクトの呼び出し
- コントラクトとセッションコード
- セッションコードの書き方
- セッションコードのテスト
- コントラクトによるイベント発行を有効に
- コントラクトハッシュとパッケージハッシュの使い分け
- Casperスマートコントラクトのベストプラクティス
- Casper JSON-RPC API
- DAppsのビルド
- SDKクライアントライブラリ
- dApp Technology Stack
- ReactのFront-endテンプレート
- URefのアクセス権限とセキュリティへの考慮
- トランザクションへの署名
- スペキュラティブ(推測的)実行によるガス・コストの見積もり
- NCTLを使ったローカルネットワーク設定
- NCTLを使ったスマートコントラクトのテスト
- イベントの監視と消費
- CLIを使ったBlockchainとのやり取り
スマートコントラクトのインストール
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 と呼ばれるコントラクトのインストール時に使用するエントリーポイントの名前
- category – install-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 コマンドラインクライアントを使ったグローバルステートのクエリについて