ウォレットから Cycle を受け取る
ローカルで開発を行っている場合、プロジェクト内のデフォルトのウォレットを使用して Cycle を送信し、Cycle 残高を確認することができます。しかし、例えば機能を実行したり、ユーザーにサービスを提供したりするために Cycle を受信して使用する必要がある Canister はどうすればよいでしょうか?このチュートリアルでは、デフォルトのテンプレートプログラムに、Cycle を受信し、Cycle 残高を確認する機能を追加する方法を説明するための簡単な例を提供します。
この例は、次のように構成されています:
wallet_balance
関数は、Canister の現在の Cycle バランスを確認することができます。wallet_receive
関数は、Canister に送信された Cycle をプログラムが受け取ることができるようにします。greet
関数はテキスト引数を受け取り、ターミナルに挨拶文を表示します。owner
関数は、メッセージの呼び出し元が使用している Principal を返します。
始める前に
チュートリアルを始める前に、以下を確認してください:
ダウンロードとインストールで説明されているように、SDK パッケージをダウンロードしインストールしていること。
IDE に Visual Studio Code を使用している場合は、言語エディタプラグインのインストールにあるように、Motoko 用プラグインをインストールしていること。
コンピューター上で動作しているローカル Canister の実行環境を停止していること。
新しいプロジェクトを作成する
アクセスコントロールとユーザー Identity の切り替えをテストするために、新しいプロジェクトディレクトリを作成するには:
ローカルコンピューターでターミナルシェルを開きます(まだ開いていない場合)。
Internet Computer のプロジェクトに使用しているフォルダがある場合はそちらに移動します。
次のコマンドを実行して、新しいプロジェクトを作成します:
dfx new cycles_hello
以下のコマンドを実行して、プロジェクトディレクトリに移動してください:
cd cycles_hello
デフォルトのプログラムを修正する
このチュートリアルでは、Cycle を受け入れ、Cycle バランスをチェックするための新しい関数を含めるために、テンプレートのソースコードを変更することになります。
デフォルトのプログラムを修正する:
src/cycles_hello/main.mo
ファイルをテキストエディタで開き、既存のコンテンツを削除します。このコードをコピーして、ファイルに貼り付けます。
このプログラムのいくつかの重要な要素を見てみましょう:
このプログラムは、Cycle を扱うための基本的な機能を提供する Motoko ベースライブラリ
ExperimentalCycles
をインポートしています。このプログラムでは、単一の Actor ではなく、「Actor クラス」を使用することで、複数の Actor インスタンスを持ち、すべてのインスタンスの
capacity
まで異なる Cycle の量を受け入れることができるようになっています。capasity
は、Actor クラスの引数として渡されます。msg.caller
は、呼び出しに関連する Principal を識別します。
変更を保存して、
main.mo
ファイルを閉じてください。
ローカル Canister 実行環境を起動する
access_hello
プロジェクトをビルドする前に、開発環境のローカルで動作している Canister 実行環境に接続するか、アクセス可能なサブネットに接続する必要があります。
ローカル Canister の実行環境を起動するには:
ローカルコンピューターで新しいターミナルウィンドウまたはタブを開きます。
必要であれば、プロジェクトのルートディレクトリに移動します。
以下のコマンドを実行して、PC のローカル Canister 実行環境を起動します:
dfx start --clean --background
ローカル Canister の実行環境が起動操作を完了したら、次のステップに進みます。
Dapp の登録、ビルド、デプロイ
ローカル Canister 実行環境に接続した後、ローカルで Dapp の登録、ビルド、デプロイができます。
ローカルに Dapp をデプロイするには:
必要に応じて、まだプロジェクトのルートディレクトリにいることを確認します。
以下のコマンドを実行して、Dapp を登録、ビルド、デプロイしてください:
dfx deploy --argument '(360000000000)'
この例では、 Canister の
capacity
を 360,000,000,000 Cycle に設定します。そして、dfx deploy
コマンドの出力は、このローカルプロジェクト用に作成されたウォレット Canister とウォレット Canister の識別子に関連する Identity など、実行した操作についての情報を表示します。例:
Deploying all canisters.
Creating canisters...
Creating canister "cycles_hello"...
Creating the canister using the wallet canister...
Creating a wallet canister on the local network.
The wallet canister on the "local" network for user "default" is "rwlgt-iiaaa-aaaaa-aaaaa-cai"
"cycles_hello" canister created with canister id: "rrkah-fqaaa-aaaaa-aaaaq-cai"
Creating canister "cycles_hello_assets"...
Creating the canister using the wallet canister...
"cycles_hello_assets" canister created with canister id: "ryjl3-tyaaa-aaaaa-aaaba-cai"
Building canisters...
Building frontend...
Installing canisters...
Installing code for canister cycles_hello, with canister_id rrkah-fqaaa-aaaaa-aaaaq-cai
Installing code for canister cycles_hello_assets, with canister_id ryjl3-tyaaa-aaaaa-aaaba-cai
Authorizing our identity (default) to the asset canister...
Uploading assets to asset canister...
Deployed canisters.
Dapp をテストする
ローカル Canister 実行環境に Dapp をデプロイした後、dfx canister call
コマンドを使ってウォレット機能を試したり、プログラムをテストしたりすることができます。
Dapp をテストするために:
以下のコマンドを実行して、
default
ユーザ Identity の Principal を確認します:dfx canister call cycles_hello owner
このコマンドは、現在の Identity に対して次のような出力を表示します:
(principal "g3jww-sbmtm-gxsag-4mecu-72yc4-kef5v-euixq-og2kd-sav2v-p2sb3-pae")
dfx deploy
コマンドを実行するときに使用していた Identity を変更していない場合は、dfx identity get-principal
コマンドを実行して同じ Principal を取得する必要があります。 Cycle の送信や他の カストディアン 識別子に Cycle を送信する許可を与えるなどの特定のタスクを実行するには、ウォレット Canister の所有者である必要があるため、これは重要なことです。以下のコマンドを実行して、初期のウォレット Cycle 残高を確認します:
dfx canister call cycles_hello wallet_balance
Canister に Cycle を送っていないので、コマンドは次のような残高を表示します:
(0)
以下のようなコマンドを実行して、 Canister の Principal を使用して、デフォルトウォレット Canister から
cycles_hello
Canister にいくつかの Cycle を送信します。dfx canister call rwlgt-iiaaa-aaaaa-aaaaa-cai wallet_send '(record { canister = principal "rrkah-fqaaa-aaaaa-aaaaq-cai"; amount = (256000000000:nat64); } )'
wallet_balance
関数を呼び出して、cycles_hello
Canister に転送した Cycle 数(許容容量以下の量を指定した場合)、またはdfx deploy
コマンドを実行したときに指定したcapacity
があるかどうかを確認します。dfx canister call cycles_hello wallet_balance
このコマンドは、次のような出力を表示します:
(256_000_000_000)
以下のようなコマンドを実行して、
wallet_balance
関数を呼び出し、デフォルトウォレットの Cycle 数を確認します:dfx canister call rwlgt-iiaaa-aaaaa-aaaaa-cai wallet_balance
このコマンドは、指定したウォレット Canister の識別子の残高を、Candid フォーマットを使用したレコードとして返します。例えば、
amount
フィールド(ハッシュ3_573_748_184
で表される)と残高 97,738,624,621,042 Cycleを持つレコードは、このように表示されるでしょう:(record { 3_573_748_184 = 97_738_624_621_042 })
この簡単なチュートリアルでは、 Cycle は
cycles_hello
Canister からではなく、デフォルトのウォレット Canister の残高からしか消費されないようにしています。以下のようなコマンドを実行して、
greet
関数を呼び出します:dfx canister call cycles_hello greet '("from DFINITY")'
デフォルトのウォレットから差し引かれた Cycle 数を確認するには、
wallet_balance
関数の呼び出しを再実行します:dfx canister call rwlgt-iiaaa-aaaaa-aaaaa-cai wallet_balance
たとえば、次のような結果が得られます:
(record { 3_573_748_184 = 97_638_622_179_500 })
ローカル Canister の実行環境を停止する
プログラムの実験が終了したら、ローカル Canister 実行環境を停止して、バックグラウンドで実行し続けないようにできます。
ローカル Canister の実行環境を停止するには、以下の手順に従います:
操作が表示されている端末で、Control-C キーを押して処理を中断します。
以下のコマンドを実行して、ローカル Canister の実行環境を停止します:
dfx stop
もっと学ぶには?
Cycle を使った仕事についてもっと知りたい方は、以下の関連資料をご覧ください: