複数の Actor を使用する
このチュートリアルでは、複数の Actor を持つプロジェクトを作成します。現在、Motoko ファイルで定義できる Actor は1つだけで、1つの Actor は常に1つの Canister にコンパイルされます。しかし、複数の Actor を持つプロジェクトを作成し、同じdfx.json
設定ファイルから複数の Canister をビルドすることが可能です。
このチュートリアルでは、同じプロジェクトで3つの Actor に対して別々のプログラムファイルを作成することになります。このプロジェクトでは、以下の無関係な Actor を定義しています:
assistant
Actor は、ToDo リストにタスクを追加、表示する機能を提供します。簡略化するために、このチュートリアルのコードサンプルには、ToDo 項目を追加する関数と、追加された ToDo 項目の現在のリストを表示する関数だけを含んでいます。この Canister のより完全なバージョン(項目を完了にしたり、リストから削除したりする追加機能)は examples リポジトリの Simple to-do checklist として公開されています。
rock_paper_scissors
Actor は、ハードコードされたジャンケン大会で勝者を決定するための関数を提供します。このコードサンプルは、ハードコードされたプレーヤーと選択肢を持つ Motoko プログラムにおける
switch
とcase
の基本的な使い方を説明するものです。daemon
Actor は、デーモンを起動したり停止したりするためのモック関数を提供します。このコードサンプルは、デモンストレーションのために、単に変数を代入し、メッセージを表示するものです。
始める前に
チュートリアルを始める前に、以下を確認してください:
ダウンロードとインストールで説明されているように、SDK パッケージをダウンロードしインストールする。
コンピューター上で動作しているローカル Canister の実行環境を停止しています。
このチュートリアルの所要時間は約 20分です。
プロジェクトを作成する
このチュートリアルのための新しいプロジェクトを作成するには:
ローカルコンピューターでターミナルシェルを開いてください(まだ開いていない場合)。
Internet Computer のプロジェクトに使用しているフォルダがあれば、そこに移動します。
以下のコマンドを実行して、新しいプロジェクトを作成します:
dfx new multiple_actors
以下のコマンドを実行して、プロジェクトディレクトリに移動してください:
cd multiple_actors
デフォルトコンフィグレーションを修正する
新しいプロジェクトを作成すると、デフォルトの dfx.json
設定ファイルがプロジェクトディレクトリに追加されることはすでにお分かりいただけたと思います。このチュートリアルでは、このファイルにセクションを追加して、ビルドしたい Actor を定義する各 Canister の場所を指定する必要があります。
デフォルトの設定ファイル dfx.json
を変更するには:
テキストエディタで
dfx.json
設定ファイルを開き、デフォルトのmultiple_actors
Canister 名とソースディレクトリをassistant
に変更します。例えば、
canisters
キーの下には以下のようになります:"assistant": {
"main": "src/assistant/main.mo",
"type": "motoko"
},設定ファイルのこの
canisters
セクションに設定を追加するので、assistant
のメインソースコードファイルの場所と Canister タイプを囲む中括弧の後にコンマも追加する必要があります。ファイルから
multiple_actors_assets
セクションを削除します。Canister 名、ソースコードの場所、Canister タイプを
rock_paper_scissors
に、同じく Canister 名、ソースコードの場所、 Canister タイプをdaemon
プログラムファイルに追加し、assistant
Canister 定義の下に追加します。変更後、
dfx.json
ファイルのcanisters
セクションは、このような形になるはずです。その他の部分はそのままで大丈夫です。
変更を保存し、
dfx.json
ファイルを閉じて続行します。以下のコマンドを実行して、デフォルトのソースファイルディレクトリの名前を
dfx.json
設定ファイルで指定された名前と一致するように変更します:cp -r src/multiple_actors/ src/assistant/
以下のコマンドを実行して
assistant
ソースファイルのディレクトリをコピーし、rock_paper_scissors
Actor のメイン Canister ファイルを作成します:cp -r src/assistant/ src/rock_paper_scissors/
以下のコマンドを実行して、
assistant
のソースファイルのディレクトリをコピーし、daemon
Actor のメイン Canister ファイルを作成します:cp -r src/assistant/ src/daemon/
デフォルト Canister を修正する
これで src
ディレクトリに3つのディレクトリができ、それぞれに main.mo
というテンプレートファイルができました。このチュートリアルでは、各テンプレート main.mo
ファイルの内容を別の Actor で置き換えます。
デフォルトのソースコードを変更するには:
テキストエディタで
src/assistant/main.mo
ファイルを開き、既存の内容を削除してください。このコードをコピーして、ファイルに貼り付けてください。
変更を保存して、
main.mo
ファイルを閉じて続行します。テキストエディタで
src/rock_paper_scissors/main.mo
ファイルを開き、既存の内容を削除してください。このコードをコピーして、ファイルに貼り付けてください。
変更を保存して、
main.mo
ファイルを閉じて続行します。テキストエディタで
src/daemon/main.mo
ファイルを開き、既存の内容を削除してください。このコードをコピーして、ファイルに貼り付けてください。
変更を保存して、
main.mo
ファイルを閉じて続行します。
ローカル Canister 実行環境を起動する
ローカルに multiple_actors
プロジェクトをインストールする前に、ローカル Canister 実行環境を起動する必要があります。もし、Internet Computer のブロックチェーンメインネットにデプロイするつもりであれば、このセクションはスキップします。
ローカル Canister の実行環境を起動するには:
ローカルコンピューターで新しいターミナルウィンドウまたはタブを開きます。
必要であれば、プロジェクトのルートディレクトリに移動します。
次のコマンドを実行して、ローカルの Canister 実行環境を起動します。
dfx start
Canister の実行操作を表示しているターミナルは開いたままにして、フォーカスを新しいプロジェクトを作成した元のターミナルに切り替えます。
マルチ Canister 型 Dapp をデプロイする
マルチ Canister Dapp をデプロイするには、ローカル Canister 実行環境または Internet Computer ブロックチェーンメインネットに Canister を登録、ビルド、インストールする必要があります。
ローカルに Dapp をデプロイするには:
必要に応じて、まだプロジェクトのルートディレクトリにいることを確認します。
以下のコマンドを実行して、アプリケーションを登録、ビルド、デプロイします:
dfx deploy
Internet Computer ブロックチェーン・メインネットに Dapp をデプロイするには:
必要に応じて、まだプロジェクトのルートディレクトリにいることを確認します。
dfx deploy
コマンドに--network
オプションとdfx.json
ファイルで設定されたネットワークエイリアスを指定して実行します。例えば、ネットワークエイリアスic
で指定された URL で Internet Computer メインネットに接続する場合、以下のようなコマンドを実行します:dfx deploy --network ic
dfx deploy
コマンドの出力には、実行された操作に関する情報が表示されます。例えば、このコマンドは dfx.json
設定ファイルで定義された3つの Canister の識別子を表示します。
Deploying all canisters.
Creating canisters...
Creating canister "assistant"...
"assistant" canister created with canister id: "75hes-oqbaa-aaaaa-aaaaa-aaaaa-aaaaa-aaaaa-q"
Creating canister "daemon"...
"daemon" canister created with canister id: "cxeji-wacaa-aaaaa-aaaaa-aaaaa-aaaaa-aaaaa-q"
Creating canister "rock_paper_scissors"...
"rock_paper_scissors" canister created with canister id: "7kncf-oidaa-aaaaa-aaaaa-aaaaa-aaaaa-aaaaa-q"
Canister を呼び出してデプロイを確認する
これで、3つの Canister スマートコントラクトが、ローカル Canister 実行環境または Internet Computer ブロックチェーンメインネット上にデプロイされ、dfx canister call
コマンドを使用してそれらをテストすることができるようになりました。
ローカルにデプロイした Canister をテストするには:
dfx canister call
コマンドを使用して、addTodo
関数を使って Canisterassistant
を呼び出し、以下のコマンドを実行して追加したいタスクを渡します:dfx canister call assistant addTodo '("Schedule monthly demos")'
以下のコマンドを実行して、
showTodos
関数を使用して ToDo リストの項目が返されることを確認します:dfx canister call assistant showTodos
このコマンドは、次のような出力を返します:
("
___TO-DOs___
(1) Schedule monthly demos")dfx canister call
コマンドを使用して、以下のコマンドを実行し、contest
機能を使用して Canisterrock_paper_scissors
を呼び出します:dfx canister call rock_paper_scissors contest
コマンドは、以下のようなハードコードされたコンテストの結果を返します:
("Bob won")
dfx canister call
コマンドを使用して、以下のコマンドを実行し、launch
機能を使用して、daemon
Canister を呼び出します。dfx canister call daemon launch
モック
launch
関数が "The daemon process is running" というメッセージを返すことを確認します:(""The daemon process is running"")
Internet Computer ブロックチェーン・メインネット上で動作する Canister をテストするには、上記と同じコマンドを使用します。—network
オプションと dfx.json
ファイルで設定したネットワークエイリアスを指定します。
ローカルネットワークを停止する
Dapp のテストが終わったら、ローカル Canister の実行環境を停止して、バックグラウンドで実行し続けないようにします。
ローカル Canister の実行環境を停止するには、以下のようにします:
ネットワーク操作が表示されているターミナルで、Control-C キーを押して、ローカルネットワークの処理を中断します。
以下のコマンドを実行して、ローカル Canister の実行環境を停止します:
dfx stop