インタフェースを定義しよう
🤝 インタフェースを定義しよう
実装した機能をフロントエンドから呼び出す前に、インタフェースを定義する必要があります。ICPでは、キャニスターのインタフェースはCandidという言語で記述します。
Candid とは
Candidは、サービスのパブリック・インタフェースを記述することを主な目的としたインタフェース記述言語です。Candidの主な利点のひとつは、言語にとらわれず、Motoko、Rust、JavaScriptなどの異なるプログラミング言語で書かれたサービスとフロントエンド間の相互運用を可能にすることです。詳細はこちらをご覧ください。
Motokoでキャニスターを記述した場合、プログラムをコンパイルする際にコンパイラが自動的にCandidで記述されたファイル.didを生成してくれます。しかし、Rustでは2023年9月時点でそのような機能は組み込まれておらず、Candidインタフェースを自動生成するためには設定が必要です。
まずは、src/encrypted_notes/backend/lib.rsを更新します。export_candidマクロをインポートして、ファイルの一番下に追加してください。
use ic_cdk_macros::{export_candid, query, update};
...
// ===== ファイルの一番下に定義してください。 =====
// .didファイルを生成します。
export_candid!();
次に、candid-extractorをインストールします。これは、Rustファイルをコンパイルした際に生成されるWASMファイルから、Candidの定義を抽出するCLIツールです。
cargo install candid-extractor
最後に、Candidファイルを生成するためのスクリプトを追加します。プロジェクトのルートディレクトにscriptsディレクトリを作成し、その中にdid.shというファイルを作成してください。
ICP-Encrypted-Notes/
+├── scripts/
+│ └── did.sh
├── src/
├── dfx.json
├── LICENSE
├── README.md
└── dfx.json
did.shに、下記を記述してください。先ほどインストールしたcandid-extractorを使用して、WASMファイルからCandidインタフェースを生成するスクリプトとなります。
#!/bin/bash
function generate_did() {
local canister=$1
canister_root="src/$canister"
cargo build --manifest-path="$canister_root/Cargo.toml" \
--target wasm32-unknown-unknown \
--release --package "$canister"
candid-extractor "target/wasm32-unknown-unknown/release/$canister.wasm" > "$canister_root/$canister.did"
}
# The list of canisters of your project
CANISTERS=encrypted_notes_backend
for canister in $(echo $CANISTERS | sed "s/,/ /g")
do
generate_did "$canister"
done
これで、Candidインタフェースを自動生成する準備ができました! それでは、実際に生成してみましょう。下記のコマンドをプロジェクトのルートディレクトリで実行してください。
npm run generate:did
src/encrypted_notes_backend/encrypted_notes_backend.didを確認してみましょう。
type EncryptedNote = record { id : nat; data : text };
service : {
addNote : (text) -> ();
deleteNote : (nat) -> ();
getNotes : () -> (vec EncryptedNote) query;
updateNote : (EncryptedNote) -> ();
};
typeから始まる部分は、バックエンドキャニスターで定義した型が記述されています。serviceから始まる部分は、バックエンドキャニスターの関数が記述されます。関数は"関数名": (引数の型) -> (戻り値の型)という形式となり、引数や戻り値がない場合は、()を指定します。型は、Candidがサポートする型となります(例:RustのString型はtextを指定)。型に関する詳細は、こちらをご覧ください。