Rust Clientを使ったスマートコントラクトの呼び出し

スマートコントラクトは、格納されたon-chainロジックとして存在しており、組み込まれたエントリーポイントの呼び出しを可能にします。チュートリアルでは、Casperコマンドラインクライアントput-deploy コマンドにてCasperコントラクトを呼び出すいくつかの異なる手法をお伝えします。以下の各セクションには、いくつかのサンプル出力内容をお見せするショート動画も用意されています。

下記例では、Testnet上の2つのコントラクトを使用します。

Prerequisites(前提条件)

コントラクトハッシュを使用したコントラクトの呼び出し

グローバルステートにコントラクトをインストール後、コントラクトのハッシュを使用してそのエントリーポイントの内の1つを呼び出せます。以下にある put-deploy の使い方は、エントリーポイントの呼び出しとデプロイハッシュの取得を可能にします。ハッシュは、デプロイが問題なく処理されたことを確認する際に必要となります。

casper-client put-deploy \
    --node-address [NODE_SERVER_ADDRESS] \
    --chain-name [CHAIN_NAME] \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount [PAYMENT_AMOUNT_IN_MOTES] \
    --session-hash [HEX_STRING] \
    --session-entry-point [ENTRY_POINT_FUNCTION]

上記で使用した引数は、以下です。

  • node-address – ネットワーク上のピアのIPアドレス。MainnetとTestnetのJSON-RPCサーバのデフォルトポートは、7777です。
  • chain-name – デプロイ送信を行うネットワークのチェーン名Mainnetの場合はcasperを使用し、Testnetの場合は casper-testを使用。
  • secret-key – デプロイの支払いを行うアカウントの秘密鍵を持つファイル名
  • payment-amount – モーツ単位表記のデプロイの支払い
  • session-hash – セッションとして呼び出すために保存したコントラクトの16進数にエンコードしたハッシュ
  • session-entry-point – セッションコントラクトを呼び出す際に使用するメソッド名

例 – ハッシュを使用したカウンターコントラクトの呼び出し:

この例では、”counter-inc”という entry-point を持つ保存されたコントラクトを、--session-hash オプションが識別します。

casper-client put-deploy \
    --node-address http://65.21.235.219:7777 \
    --chain-name casper-test \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount 100000000 \
    --session-hash hash-22228188b85b6ee4a4a41c7e98225c3918139e9a5eb4b865711f2e409d85e88e \
    --session-entry-point "counter-inc"

put-deployコマンドは、コントラクトのインストールに使用するコマンドとほぼ同等です。 ここでは、Wasmバイナリを指している session-path の代わりに、on-chainのコントラクトを識別している session-hash と session-entry-point と紐づいたエントリーポイントを持っています。この例では、コントラクトは既にブロックチェーン上にあり、エントリーポイントは値を返さないため、Wasmファイルは不要です。エントリーポイントが値を返す場合は、ランタイムリターンバリューを疎通するコードを使用します。

💡TIP

支払い合計額は、各デプロイとネットワークのchainspec次第で変化します。

以下のサンプルレスポンスには、ここに書かれているように、グローバルステートにて変更点を確認する際に必要となる deploy_hash が含まれています。

  • サンプルレスポンス
    {
      "id": 1197172763279676268,
      "jsonrpc": "2.0",
      "result": {
        "api_version": "1.4.5",
        "deploy_hash": "24b58fbc0cbbfa3be978e7b78b9b37fc1d17c887b1abed2b2e2e704f7ee5427c"
      }
    }

Video – ハッシュを使用したコントラクトの呼び出し:

このビデオでは、事前にインストール済みのカウンターコントラクトをハッシュでクエリする方法をお見せしています。

セッション引数を使用したコントラクトの呼び出し

コントラクトのエントリーポイントを呼び出す際は、セッション引数にて情報を渡す必要があります。put-deployコマンドが、--session-arg オプションを用いてそれを行います。

casper-client put-deploy \
    --node-address [NODE_SERVER_ADDRESS] \
    --chain-name [CHAIN_NAME] \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount [PAYMENT_AMOUNT_IN_MOTES] \
    --session-hash [HEX_STRING] \
    --session-entry-point [ENTRY_POINT_FUNCTION] \
    --session-arg ["NAME:TYPE='VALUE'" OR "NAME:TYPE=null"]...

引数についての概要は、以下です。

  • session-hash – セッションとして呼び出す保存されたコントラクトの16進数にエンコードされたハッシュ
  • session-entry-point – セッションコントラクトを呼び出す際に使用されるメソッド名
  • session-arg – シンプルなCLTypesの場合は、名前があり、型をもつ引数がWasmコードに渡されます。’casper-client put-deploy –show-arg-examples’を実行し、各型の例を確認できます。

例 – セッション引数を使用したオークションコントラクトの呼び出し:

この例では、オークションコントラクトのエントリーポイントであるdelegateを、これらの引数で呼び出す方法についてお見せします。

  • 引数 validator は、トークンがデリゲートされるバリデータの公開鍵です。
  • 引数 amount は、デリゲートされるトークン数です。
  • 引数 delegatorは、バリデータにトークンをデリゲートするアカウントの公開鍵です。

呼び出すためには、コントラクトハッシュ hash-93d923e336b20a4c4ca14d592b60e5bd3fe330775618290104f9beb326db7ae2 と --session-hash オプションを使用します。

casper-client put-deploy \
    --node-address http://65.21.235.219:7777 \
    --chain-name casper-test \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount 2500000000 \
    --session-hash hash-93d923e336b20a4c4ca14d592b60e5bd3fe330775618290104f9beb326db7ae2 \
    --session-entry-point "delegate" \
    --session-arg "validator:public_key='0145fb72c75e1b459839555d70356a5e6172e706efa204d86c86050e2f7878960f'" \
    --session-arg "amount:u512='500000000000'" \
    --session-arg "delegator:public_key='0154d828baafa6858b92919c4d78f26747430dcbecb9aa03e8b44077dc6266cabf'"

Video – セッション引数を使用したコントラクトの呼び出し:

このビデオでは、修正されたカウンターコントラクトをセッション引数を使用して呼び出す方法をお見せしています。

パッケージハッシュを使用したコントラクトの呼び出し

コントラクトパッケージの一部であるコントラクトのエントリーポイントを呼び出すことも可能です。(参照:スマートコントラクトのアップグレード)保存されたパッケージハッシュとアクセスしたいエントリーポイント、コントラクトのバージョン、そしてランタイム引数を使い、put-deployを呼び出します。バージョンが指定されていない場合は、デフォルトでは最新のバージョンを呼び出す仕様となっています。

casper-client put-deploy \
    --node-address [NODE_SERVER_ADDRESS] \
    --chain-name [CHAIN_NAME] \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount [PAYMENT_AMOUNT_IN_MOTES] \
    --session-package-hash [HEX_STRING] \
    --session-entry-point [ENTRY_POINT_FUNCTION] \
    --session-version [INTEGER]

引数についての概要は、以下です。

  • session-package-hash – セッションとして呼び出す保存されたパッケージの16進数にエンコードされたハッシュ
  • session-entry-point – セッションコントラクトを呼ぶ際に使用するメソッド名
  • session-version – 呼び出したセッションコントラクトのバージョン。デフォルトとして最新版を使用。

例1 – パッケージハッシュとバージョンによるカウンターの呼び出し:

この例では、カウンターコントラクトをそのパッケージハッシュとバージョンにて呼び出しています。呼び出されたエントリーポイントは、”counter-inc” です。

casper-client put-deploy \
    --node-address http://65.21.235.219:7777 \
    --chain-name casper-test \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount 100000000 \
    --session-package-hash hash-76a8c3daa6d6ac799ce9f46d82ac98efb271d2d64b517861ec89a06051ef019e \
    --session-entry-point "counter-inc" \
    --session-version 1

コントラクトパッケージハッシュを見つけるには、コントラクトに紐づいたアカウントの名前付き鍵を参照します。以下が例です。

{
    "key": "hash-76a8c3daa6d6ac799ce9f46d82ac98efb271d2d64b517861ec89a06051ef019e",
    "name": "counter_package_name"
}

例2 – パッケージハッシュとバージョンによるアクションの呼び出し:

この例では、Auctionコントラクトのデリゲートエントリーポイントを、--session-package-hashオプションを用いたパッケージハッシュの指定による呼び出し方法をお見せしています。オプションの --session-version にて、どのバージョンも指定されていない場合は、デフォルトの最新バージョンを呼び出します。

casper-client put-deploy \
    --node-address http://65.21.235.219:7777 \
    --chain-name casper-test \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount 2500000000 \
    --session-package-hash hash-e375d42c29c0e4b2baefa63cf2d70af34439eda851e08129d8515515d63bd6a9 \
    --session-entry-point "delegate" \
    --session-arg "validator:public_key='0145fb72c75e1b459839555d70356a5e6172e706efa204d86c86050e2f7878960f'" \
    --session-arg "amount:u512='500000000000'" \
    --session-arg "delegator:public_key='0154d828baafa6858b92919c4d78f26747430dcbecb9aa03e8b44077dc6266cabf'"

Video – パッケージハッシュを使用したコントラクトの呼び出し:

このビデオでは、事前にインストールしたCounterコントラクトパッケージをクエリする方法についてお見せしています。

コントラクト名によるコントラクトの呼び出し

鍵を使っているコントラクトをコントラクト名として参照することも可能です。コントラクトを書く際、put_key 関数を使用してコントラクトの NamedKeys に ContractHash を追加します。

鍵を持つことで、グローバルステートにあるコントラクトの entry-point を、以下に記載のあるように put-deploy コマンドを使って呼び出すことが可能となります。

casper-client put-deploy \
    --node-address [NODE_SERVER_ADDRESS] \
    --chain-name [CHAIN_NAME] \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount [PAYMENT_AMOUNT_IN_MOTES] \
    --session-name [NAMED_KEY_FOR_SMART_CONTRACT] \
    --session-entry-point [ENTRY_POINT_FUNCTION]

引数についての概要は、以下です。

  • session-name – セッションとして呼び出す(実行アカウントに紐づいている)保存済みコントラクト名
  • session-entry-point – セッションコントラクトを呼び出す際に使用するメソッド名

例1 – 名前付き鍵を使用したCounterコントラクトの呼び出し:

この例では、”counter”という名前付き鍵にてグローバルステートに保存されたCounterコントラクトを使用します。コードによって、コントラクトがグローバルステートにインストールされた時点で参照可能になるUrefに、ContractHashを格納されます。実装全体については、GitHubにて確認いただけます。

runtime::put_key(CONTRACT_KEY, stored_contract_hash.into());

以下のコマンドによて、エントリーポイントの”counter_inc” と “counter”という名前付き鍵にて格納されたコントラクトを呼び出します。

casper-client put-deploy \
    --node-address http://65.21.235.219:7777 \
    --chain-name casper-test \
    --secret-key [PATH_TO_YOUR_KEY]/secret_key.pem \
    --payment-amount 100000000 \
    --session-name "counter" \
    --session-entry-point "counter_inc"

サンプルのレスポンスには、ここに記載のあるようにグローバルステートの変更を確認する際に使用する deploy_hash が含まれています。

例2 – 名前付き鍵を使用したAuctionコントラクトの呼び出し:

この例では、”auction”キーにてグローバルステートに格納されたAuctionシステムコントラクトと delegate エントリーポイントを使用しています。

casper-client put-deploy \
    --node-address http://65.21.235.219:7777 \
    --chain-name casper-test \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount 2500000000 \
    --session-name "auction" \
    --session-entry-point "delegate" \
    --session-arg "validator:public_key='0145fb72c75e1b459839555d70356a5e6172e706efa204d86c86050e2f7878960f'" \
    --session-arg "amount:u512='500000000000'" \
    --session-arg "delegator:public_key='0154d828baafa6858b92919c4d78f26747430dcbecb9aa03e8b44077dc6266cabf'"

Video – 名前付き鍵を使用したコントラクトの呼び出し:

このショートビデオでは、名前付き鍵を使用した事前にインストール済みのCounterコントラクトをクエリする方法についてお見せします。

パッケージ名によるコントラクトの呼び出し

コントラクトパッケージ名を参照してコントラクト内のエントリーポイントを呼び出すには、session-package-namesession-entry-point,  session-version の引数を使用します。以下にお見せしている通り、これで put-deployコマンドを使用したグローバルポイント内のエントリーポイントへのアクセスが可能となります。

casper-client put-deploy \
    --node-address [NODE_SERVER_ADDRESS] \
    --chain-name [CHAIN_NAME] \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount [PAYMENT_AMOUNT_IN_MOTES] \
    --session-package-name [NAMED_KEY_FOR_PACKAGE] \
    --session-entry-point [ENTRY_POINT_FUNCTION] \
    --session-version [INTEGER]

引数についての概要は、以下です。

  • session-package-name – セッションとして呼び出される格納済みのパッケージ名
  • session-entry-point – セッションコントラクトを呼び出す際に使用するメソッド名
  • session-version – 呼び出すセッションコントラクトのバージョン。デフォルトでは最新のものを使用。

例1 – パッケージ名とバージョンの指定:

この例では、”counter_package_name”というコントラクトパッケージ名とバージョン1、ランタイム引数はなしのエントリーポイント”counter-inc”を呼び出します。

事前にnew_contractを用いて作成したコントラクトと new_contract の引数 hash_name として提供されたコントラクトパッケージ名を持っていなくてはいけません。

このサンプルコードは、グローバルステートにコントラクトをインストールすることで参照可能となるNamedKeyに “contract_package_name” を格納します。

    let (stored_contract_hash, contract_version) =
        storage::new_contract(counter_entry_points,
            Some(counter_named_keys),
            Some("counter_package_name".to_string()),
            Some("counter_access_uref".to_string())
    );

パッケージ名にてコントラクトを呼び出すコマンドは、以下となります。

casper-client put-deploy \
    --node-address http://65.21.235.219:7777 \
    --chain-name casper-test \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount 100000000 \
    --session-package-name "counter_package_name" \
    --session-entry-point "counter-inc" \
    --session-version 1

例2 – バージョン指定なしでパッケージを呼び出す方法:

この例では、ランタイム引数を使用している erc20_test_callパッケージのコントラクトを呼び出す方法いついてお見せしています。この呼び出しでは、エントリーポイントの “check_balance_of” を呼び出し、バージョンを指定していないため、有効な最新バージョンをデフォルト設定とします。

    casper-client put-deploy \
    --node-address http://3.143.158.19:7777 \
    --chain-name integration-test \
    --secret-key ~/casper/demo/user_a/secret_key.pem \
    --payment-amount 1000000000 \
    --session-package-name "erc20_test_call" \
    --session-entry-point "check_balance_of" \
    --session-arg "token_contract:account_hash='account-hash-b568f50a64acc8bbe43462ffe243849a88111060b228dacb8f08d42e26985180'" \
    --session-arg "address:key='account-hash-303c0f8208220fe9a4de40e1ada1d35fdd6c678877908f01fddb2a56502d67fd'"

Video – パッケージ名を使用したコントラクトの呼び出し:

このビデオでは、パッケージ名によるバージョン化されたコントラクトの呼び出し方法についてお見せしています。

Wasmを使用したコントラクトの呼び出し

セッションコードもしくはコントラクトコード(Wasmにコンパイル済み)は、コントラクト上で実行され状態を変更できます。put-deploy コマンドは、このメカニズムもサポートしています。

casper-client put-deploy \
    --node-address [NODE_SERVER_ADDRESS] \
    --chain-name [CHAIN_NAME] \
    --secret-key [KEY_PATH]/secret_key.pem \
    --payment-amount [PAYMENT_AMOUNT_IN_MOTES] \
    --session-path [PATH]/[FILE_NAME].wasm

引数についての概要は、以下です。

  • session-path – コンピューター上のコンパイル済みのWasmへのパス

例 – コントラクト上のセッションコード:

カウンターコントラクトチュートリアルでは、セッションコード(counter-call.wasm)を使用したコントラクト(counter-v1.wasm)の状態の変更方法についてお伝えしています。


casper-client put-deploy \
    --node-address http://65.21.235.219:7777 \
    --chain-name casper-test \
    --secret-key [PATH_TO_YOUR_KEY]/secret_key.pem \
    --payment-amount 25000000000 \
    --session-path [PATH_TO_YOUR_COMPILED_WASM]/counter-call.wasm

Video – Wasmを使用したコントラクトの呼び出し:

値を返すコントラクトの呼び出し

Runtime Return Valueの活用チュートリアルでは、セッションコードもしくはコントラクトコードを使った値を返すコントラクトの呼び出し方法について習得できます。

What’s Next?