グローバルステートのクエリ

このページでは、グローバルステートをクエリしアカウントやコントラクトそしてパッケージの詳細情報を取得する方法について説明しています。

前提条件

ステートルートハッシュの取得

グローバルステートをクエリする際、まず最初に現在のネットワークのステート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_pointsnamed_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 コマンドラインクライアントを使用したスマートコントラクトを呼び出す他手法について