2. Canister呼び出し

FrontendからCanisterへ通信を行うサンプルは、『テンプレート生成』でも解説したdfx newコマンドを使用して出力されたコードを必要に応じて修正していくことから慣れていくのがよいでしょう。

使用するFrame Workに合わせたBoilerplateは、ICPの様々な開発者がGitHubでも公開されていますから、検索してみてください。

1. プロジェクトの作成

$ dfx new --type=rust icptest

テンプレートが生成されます。

icptest
├── .env
├── .gitignore
├── Cargo.lock
├── Cargo.toml
├── README.md
├── dfx.json
├── README.md
├── node_modules
│   ︙
├── package-lock.json
├── package.json
├── src
│   ├── icptest_backend
│   │   ├── Cargo.toml
│   │   ├── icptest_backend.did
│   │   └── src
│   │       └── lib.rs
│   └── icptest_frontend
│       ├── assets
│       │   ├── .ic-assets.json5
│       │   ├── favicon.ico
│       │   ├── logo2.svg
│       │   ├── main.css
│       │   └── sample-asset.txt
│       └── src
│           ├── .ic-assets.json5
│           ├── index.html
│           └── index.js
└── webpack.config.js

2. Backend作成 (変更)

テンプレート出力されたら、まずはBackend側を用意します。

ここでは、didファイルでI/Fを定義、Tomlの依存パッケージを最新化、Rustのソースを修正という流れで、2. データ更新/参照で解説したシンプルなBackendとします。

(1) didファイル作成(修正)

src/icptest_backend/icptest_backend.did

(2) 依存パッケージ変更

src/icptest_backend/Cargo.toml

出力されるテンプレートのライブラリバージョンが古い場合には最新化しておきましょう。

Rustでは、[[cargo install cargo-edit:https://docs.rs/crate/cargo-edit/latest]]というコマンドをインストールして、cargo upgradeコマンドで依存パッケージを最新化できるようですが、自分の環境ではうまく行かなかったので、cargo rm & cargo addコマンドで最新化する手順を行います。今回のサンプルでは使わないライブラリも削除しておきます。

変更前 (2023/08/13時点)

変更後 (2023/08/13時点)

(3) Rustソース修正

src/icptest_backend/src/lib.rs

(4) Backendビルド

カレントディレクトリ(src/icptest_backend/)から、プロジェクトディレクトリへ移動して、ビルドを行います。

Local Network上でCanisterを起動した状態にして、Backendをビルド・配備します。

dfx deployコマンドを実行するとBackendに続いてFrontendのビルドも行われます。Frontend側はまだ修正していないため、本手順の後に再度ビルドが必要ですが、didファイルからFrontend向けのJavaScriptソースを生成するために実行します。以下の方法でBackendのみビルドするのでも構いません。

3. Frontend作成 (変更)

frontendは、src/icptest_frontend/ディレクトリ内に、画像などの資材を格納するassetsディレクトリと、HTMLやJavaScriptなどを格納するsrcディレクトリが作成されています。

今回用意したBackendに合わせて、以下の2ファイルを編集する。

  • index.html

  • index.js

src/icptest_frontend/src/index.html

src/icptest_frontend/src/index.html

補足説明

クライアント側では、dfx generateコマンドで生成されたソースをimportして、didで定義した関数を呼び出すだけで、Canisterとのやりとりが簡単に行うことができる。通信処理等の泥臭い部分は隠蔽されています。

4. deploy

Frontendの作成が終わったらCanisterへdeployします。

dfx deployコマンドの実行により、修正したhtmlやJavascriptなどのリソースがWepackでまとめられ、dist/icptest_frontendディレクトリに出力されます。

配備先がローカル開発環境かICネットワークかといった違いのほか、環境により割り当てられたCanister Idも変わってきます。

dfx newコマンドで生成されたテンプレートでは、そうしたwebpack.config.js ファイルや .envファイルで吸収しているようです。(dfx.jsonのoutput_env_file項目を指定することで.envに書き出されるようです)

この辺りは利用するWeb Frameworkや開発者によっても違いがあり、まだ色々と試行錯誤が繰り返されている状況ですので、将来的にやり方も変わるかもしれません。

最終更新

役に立ちましたか?