smacon.dev logo

Motoko プログラミング入門: Candid UI を使ってキャニスターを実行する

このページは、DFINITY(Internet Computer) の Motoko Language のチュートリアルを日本語で解説しています。

Increment a natural number

実際に使ったソースコードはGitHubからダウンロードできます。

はじめての方は先にこちらをご覧ください。

5 ステップではじめる Motoko プログラミング入門

実行環境

  • dfx: 0.8.4
  • macOS: 11.5.2
  • npm version: 8.1.3
  • 任意のターミナル
  • 任意のテキストエディタ

ターミナルとテキストエディタは好きなソフトウェアを使えば大丈夫です。

はじめは Mac 標準のターミナルでよいと思います。テキストエディタは筆者は Visual Studio Code を使っています。

手順

プロジェクトの作成

新しいプロジェクトを作ります。

dfx new my_counter
cd my_counter

ソースファイル名の変更

今回はmain.moというソースファイルの名前を変えます。 dfx.jsonの以下の行を変更します。

変更前
"main": "src/my_counter/main.mo",
変更後
"main": "src/my_counter/increment_counter.mo",

そして以下のコマンドでファイル名を変更します。

mv src/my_counter/main.mo src/my_counter/increment_counter.mo

コーディング

src/my_counter/increment_counter.moを以下のように編集して保存します。

// Create a simple Counter actor.
actor Counter {
  stable var currentValue : Nat = 0;

  // Increment the counter with the increment function.
  public func increment() : async () {
    currentValue += 1;
  };

  // Read the counter value with a get function.
  public query func get() : async Nat {
    currentValue
  };

  // Write an arbitrary value with a set function.
  public func set(n: Nat) : async () {
    currentValue := n;
  };
}

Counterという actor に 3 つの関数を定義しています。

  • increment
  • get
  • set

incrementcurrentValueを+1 します。

起動

以下のどちらかのコマンドでローカル PC で実行環境を起動します。

dfx start

オプションをつけない場合、Ctrl+C で IC を停止するまで他のコマンドを実行できません。 そのため別のターミナルウィンドウで他のコマンドを実行する必要があります。

dfx start --background

--backgroundをつけると起動後も同じウィンドウで他のコマンドを実行できます。

ビルド&デプロイ

以下のコマンドでビルド&デプロイを実行します。

dfx deploy

dfx deployでは以下の 3 つの処理を一気に実行できます。

  • dfx canister create
  • dfx build
  • dfx canister install

コンパイルされていなければコンパイルしてからデプロイをしてくれます。

my_counter % dfx deploy
Creating a wallet canister on the local network.
The wallet canister on the "local" network for user "default" is "rwlgt-iiaaa-aaaaa-aaaaa-cai"
Deploying all canisters.

<中略>

Committing batch.
Deployed canisters.

実行

get increment set の 3 つの関数を使って実行します。

dfx canister call my_counter get
出力
(0 : nat)

初期値は 0 です。 incrementを実行してキャニスターが持つcurrentValueを+1 します。

dfx canister call my_counter increment
dfx canister call my_counter get
出力
(1 : nat)

結果が 1 になっています。

setを使って(987)を設定します。

dfx canister call my_counter set '(987)'
dfx canister call my_counter get

incrementで+1 します。

dfx canister call my_counter increment
dfx canister call my_counter get

currentValueは 988 になっています。

ブラウザから実行 (Candid UI)

このプロジェクトには、Candid UI というテスト用のキャニスターがデプロイされています。 Candid UI のキャニスター ID を確認してみましょう。

dfx canister id __Candid_UI
r7inp-6aaaa-aaaaa-aaabq-cai

ローカル IC にデプロイされたキャニスターの一覧は以下のファイルに保存されています。 上のコマンドで表示された__Candid_UI というキャニスターもあります。

my_counter % cat .dfx/local/canister_ids.json
{
  "__Candid_UI": {
    "local": "r7inp-6aaaa-aaaaa-aaabq-cai"
  },
  "my_counter": {
    "local": "rrkah-fqaaa-aaaaa-aaaaq-cai"
  },
  "my_counter_assets": {
    "local": "ryjl3-tyaaa-aaaaa-aaaba-cai"
  }
}

もし、dfx stop で IC を停止していたら起動しましょう。

dfx start --background

ブラウザを使って以下の URL にアクセスします。

http://127.0.0.1:8000/?canisterId=<CANDID-UI-CANISTER-IDENTIFIER>

自分の環境の__Candid_UI のキャニスター ID に置き換えます。

http://127.0.0.1:8000/?canisterId=r7inp-6aaaa-aaaaa-aaabq-cai
my_counter % dfx canister id my_counter
rrkah-fqaaa-aaaaa-aaaaq-cai

以下のように Canister ID を入力する画面が表示されるはずです。

Candid UI

ここに my_counter のキャニスター ID を入力します。 キャニスター ID はさっき確認した.dfx/local/canister_ids.jsonにも書かれていますが、以下のコマンドでも表示できます。

my_counter % dfx canister id my_counter
rrkah-fqaaa-aaaaa-aaaaq-cai

この ID をブラウザのフォームのProvide a canister ID:に入力します。

Candid UI

GO をクリックすると以下のような画面表示に変わります。 Candid UI

QUERY, CALL, RANDOM をクリックして自由に試してみましょう!

ローカル実行環境の停止

終わったらローカル PC 上の実行環境を停止します。

dfx stop

こちらもおすすめ