- 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 Network上にインストールしたコントラクトを保持している
ステートルートハッシュの取得
グローバルステートをクエリする際、まず最初に現在のネットワークのステートIDとなるステートルートハッシュを取得します。いわゆるコミットヒストリーでいうGit コミットIDであり、特定のタイミングにおけるブロックチェーン・ステートのスナップショットを提供してくれます。
💡NOTE
ネットワークへトランザクションを送信後、グローバルステートに反映された変更内容を確認するには新規ステートルートハッシュをフェッチする必要があります。その工程なしでは過去のバージョンのステートをクエリすることになります。
ステートルートハッシュを取得するには、get-state-root-hashコマンドを使用します:
casper-client get-state-root-hash --node-address [NODE_SERVER_ADDRESS]サンプルリクエスト:
casper-client get-state-root-hash --node-address http://localhost:11101サンプルレスポンス:
{
"jsonrpc": "2.0",
"id": -4225403855447288375,
"result": {
"api_version": "2.0.0",
"state_root_hash": "6b5849caa605acdc29564f303764396a27ef7a6b1a61f7b13109b129e7e70d81"
}
}アカウントのクエリ
ご自分のアカウントの詳細を確認するには、アカウントハッシュを用いてグローバルステートをクエリすることから始まります。レスポンスにはアカウントの詳細情報のクエリに必要となるエンティティアカウントIDが含まれています。下記情報が必要となります:
- node address:ネットワーク上のピアのIPアドレスを表示
- state root hash:16進数にエンコードされたステートルートハッシュ
- クエリ用のkey識別子:この場合はアカウントハッシュ
casper-client query-global-state \
--node-address [NODE_SERVER_ADDRESS] \
--state-root-hash [STATE_ROOT_HASH] \
--key [ACCOUNT_HASH]サンプルリクエスト:
casper-client query-global-state \
--node-address http://localhost:11101 \
--state-root-hash 6b5849caa605acdc29564f303764396a27ef7a6b1a61f7b13109b129e7e70d81 \
--key account-hash-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463サンプルレスポンス:
{
"jsonrpc": "2.0",
"id": 2591514718461273084,
"result": {
"api_version": "2.0.0",
"block_header": null,
"stored_value": {
"CLValue": {
"cl_type": "Key",
"bytes": "11016a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463",
"parsed": "entity-account-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463"
}
},
"merkle_proof": "[2566 hex chars]"
}
}次に、get-entityコマンドとエンティティ識別子もしくはアカウントハッシュを用いてより詳細なアカウント情報を確認します。両方のコマンドによる出力は同様のものとなります。下記情報が必要となります:
- node address:ネットワーク上のピアのIPアドレスを表示
- エンティティもしくはアカウントの識別子:エンティティハッシュか公開鍵もしくはアカウントハッシュ
casper-client get-entity \
--node-address [NODE_SERVER_ADDRESS] \
--entity-identifier [FORMATTED_STRING_OR_PATH]サンプルリクエスト:
casper-client get-entity \
--node-address http://localhost:11101 \
--entity-identifier entity-account-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463もしくは
casper-client get-entity \
--node-address http://localhost:11101 \
--entity-identifier account-hash-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463サンプルレスポンス:
サンプルのレスポンスには、”counter”、”counter_package_name” そして “version”等いくつかの名前付き鍵が含まれていることを確認いただけるはずです。次の例に取りあげている通り、これらの値を使用しコントラクトステートを更にクエリすることができます。
-
▶サンプルレスポンスを確認する(クリック)
{ "jsonrpc": "2.0", "id": 4470312592511523509, "result": { "api_version": "2.0.0", "entity": { "AddressableEntity": { "entity": { "protocol_version": "2.0.0", "entity_kind": { "Account": "account-hash-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463" }, "package_hash": "package-1bf60faed9931e95e99912aa82f545a85f374dcbcd0c145ee2a5820b39b31d51", "byte_code_hash": "byte-code-0000000000000000000000000000000000000000000000000000000000000000", "main_purse": "uref-21dc8fc358c4e30ae29786bd4842a5f99da83efa0b9ca8461cd2196ffbfd07f1-007", "associated_keys": [ { "account_hash": "account-hash-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463", "weight": 1 } ], "action_thresholds": { "deployment": 1, "upgrade_management": 1, "key_management": 1 }, "message_topics": [] }, "named_keys": [ { "name": "counter", "key": "entity-contract-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68" }, { "name": "counter_access_uref", "key": "uref-29feb2af8a9d7b6d2ef6be875a0aa326b646a00b7cdd2dd4a65365e84e9f2e9a-007" }, { "name": "counter_package_name", "key": "package-50d487af45f8cec533c6813801a7630ff97e5ee3964daf7915d5451b4812ac94" }, { "name": "version", "key": "uref-7bc25880db57763fccfa858185becd8de40a890d9e006e067352f011bdcf03bf-007" } ], "entry_points": [] } }, "merkle_proof": "[3010 hex chars]" } }
💡TIP
アカウントハッシュが不明な場合は下記コマンドを実行してください:
casper-client account-address --public-key [PATH_TO_PUBLIC_KEY]コントラクトのクエリ
対象のコントラクトIDとquery-global-stateコマンドにてグローバルステートをクエリします。コントラクトはアカウントの名前付き鍵に格納されており、”counter”という名前の鍵とIDとしてentity-contract-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68を持っています。出力結果には、コントラクトのpackage_hash, main_purse, associated_keys そして action_thresholdsは含まれているが、コントラクトの名前付き鍵やエントリポイントなど更なる詳細情報は含まれていません。それらの詳細情報を取得するには、get-entityコマンドを代わりに使用してください。
query-global-stateコマンドの場合、下記情報が必要となります:
- node address:ネットワーク上のピアのIPアドレスを表示
- state root hash:16進数にエンコードされたステートルート ハッシュ
- クエリ用のkey識別子:この場合はコントラクトのアカウントハッシュ
casper-client query-global-state \
--node-address [NODE_SERVER_ADDRESS] \
--state-root-hash [STATE_ROOT_HASH] \
--key [CONTRACT_ADDRESS_HASH]サンプルリクエスト:
casper-client query-global-state \
--node-address http://localhost:11101 \
--state-root-hash 6b5849caa605acdc29564f303764396a27ef7a6b1a61f7b13109b129e7e70d81 \
--key "entity-contract-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68"サンプルレスポンス:
-
▶サンプルレスポンスを確認する(クリック)
{ "jsonrpc": "2.0", "id": -750547909804067196, "result": { "api_version": "2.0.0", "block_header": null, "stored_value": { "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": [] } }, "merkle_proof": "[1508 hex chars]" } }
次に、対象のコントラクトIDとget-entityコマンドにてグローバルステートをクエリすると、コントラクトのentry_pointsやnamed_keysなどのより詳細な情報が提供されます。下記情報が必要となります:
casper-client get-entity \
--node-address [NODE_SERVER_ADDRESS] \
--entity-identifier [FORMATTED_STRING_OR_PATH]サンプルリクエスト:
casper-client get-entity \
--node-address http://localhost:11101 \
--entity-identifier entity-contract-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68サンプルレスポンス:
-
▶サンプルレスポンスを確認する(クリック)
{ "jsonrpc": "2.0", "id": -530362264865678930, "result": { "api_version": "2.0.0", "entity": { "AddressableEntity": { "entity": { "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": [] }, "named_keys": [ { "name": "count", "key": "uref-65f3f583bf1ac01b6c90d9c9478bd239c09e46f48fb693918726eaab03631407-007" } ], "entry_points": [ { "V1CasperVm": { "name": "counter_get", "args": [], "ret": "I32", "access": "Public", "entry_point_type": "Called", "entry_point_payment": "Caller" } }, { "V1CasperVm": { "name": "counter_inc", "args": [], "ret": "Unit", "access": "Public", "entry_point_type": "Called", "entry_point_payment": "Caller" } } ] } }, "merkle_proof": "[1508 hex chars]" } }
パッケージのクエリ
パッケージ情報のクエリをそのパッケージハッシュにて行えます。下記情報が必要となります:
- node address:ネットワーク上のピアのIPアドレス
- state root hash:16進数にエンコードされたステートルートハッシュ
- クエリ用のkey識別子:この場合はパッケージの識別子となります
casper-client query-global-state \
--node-address [NODE_SERVER_ADDRESS] \
--state-root-hash [STATE_ROOT_HASH] \
--key [PACKAGE_ADDRESS]サンプルリクエスト:
casper-client query-global-state \
--node-address http://localhost:11101 \
--state-root-hash 6b5849caa605acdc29564f303764396a27ef7a6b1a61f7b13109b129e7e70d81 \
--key package-1bf60faed9931e95e99912aa82f545a85f374dcbcd0c145ee2a5820b39b31d51サンプルレスポンス:
レスポンスには addressable_entity_hashやパッケージのlock_statusそして現在のentity_versionが記載されているはずです。
-
▶サンプルレスポンスを確認する(クリック)
{ "jsonrpc": "2.0", "id": -8280509649720542989, "result": { "api_version": "2.0.0", "block_header": null, "stored_value": { "Package": { "versions": [ { "entity_version_key": { "protocol_version_major": 2, "entity_version": 1 }, "addressable_entity_hash": "addressable-entity-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463" } ], "disabled_versions": [], "groups": [], "lock_status": "Unlocked" } }, "merkle_proof": "[2934 hex chars]" } }
Named Key(名前付き鍵)のクエリ
オプショナルのクエリパス引数 -q や–query-pathを用いてグローバルステートに格納されたデータを深堀りできます。下記情報が必要となります:
- node address:ネットワーク上のピアのIPアドレスを表示
- state root hash:16進数にエンコードされたステートルートハッシュ
- クエリ用のkey識別子:適切にフォーマットされた公開鍵やアカウントハッシュ、コントラクトアッドレスハッシュ、URef、トランスファーハッシュ、deploy-infoハッシュ、era-infoナンバー、bid、withdrawもしくはディクショナリアドレス
- query path(クエリパス):このインスタンスに q として入力されているオプショナルのクエリパス引数であり、鍵に関する特定のクエリを掘り下げていくことを可能とします。
casper-client query-global-state \
--node-address [NODE_SERVER_ADDRESS] \
--state-root-hash [STATE_ROOT_HASH] \
--key [HASH_STRING] \
-q "PATH_FROM_KEY"コントラクトアドレスハッシュとその名前付き鍵を使った値のクエリ
次は、コントラクトに紐づいた名前付き鍵をquery-global-stateコマンドと-qオプションを用いたクエリが可能となります。
casper-client query-global-state \
--node-address http://localhost:11101 \
--state-root-hash [STATE_ROOT_HASH] \
--key [CONTRACT_ADDRESS_HASH] \
-q "count"サンプルリクエスト:
casper-client query-global-state \
--node-address http://localhost:11101 \
--state-root-hash 6b5849caa605acdc29564f303764396a27ef7a6b1a61f7b13109b129e7e70d81 \
--key "entity-contract-a1d0bf9d96f3efc9ea67f627df3a7cba390bfc582956032db91060ca5d413e68" \
-q "count"サンプルレスポンス:
{
"jsonrpc": "2.0",
"id": -672620332620630019,
"result": {
"api_version": "2.0.0",
"block_header": null,
"stored_value": {
"CLValue": {
"cl_type": "I32",
"bytes": "00000000",
"parsed": 0
}
},
"merkle_proof": "[7272 hex chars]"
}
}アカウントハッシュとその名前付き鍵を使った値のクエリ
インストールされたコントラクトのアカウントハッシュにてグローバルステート内の特定のコントラクト変数のステートを確認することも可能です。ここでは、他の鍵識別子に格納され”counter”という名のコントラクトの名前付き鍵”count”をクエリします。
casper-client query-global-state \
--node-address http://localhost:11101 \
--state-root-hash [STATE_ROOT_HASH] \
--key [ACCOUNT_HASH] \
-q "counter/count"サンプルリクエスト:
casper-client query-global-state \
--node-address http://localhost:11101 \
--state-root-hash 6b5849caa605acdc29564f303764396a27ef7a6b1a61f7b13109b129e7e70d81 \
--key account-hash-6a56c4eee172043975aea72221eaf09f3c3a24f09a379935e44c9979f1ae9463 \
-q "counter/count"サンプルレスポンス:
{
"jsonrpc": "2.0",
"id": -8997536139716357387,
"result": {
"api_version": "2.0.0",
"block_header": null,
"stored_value": {
"CLValue": {
"cl_type": "I32",
"bytes": "00000000",
"parsed": 0
}
},
"merkle_proof": "[14486 hex chars]"
}
}What’s Next?
Casper コマンドラインクライアントを使用したスマートコントラクトを呼び出す他手法について