【完全保存版】Flipperコントラクトの解説について
0 はじめに
当記事は、下の記事で、「Flipper」コントラクト作成後、その内容を知るために記載しました。
1 構成について
コントラクトを作る際は3つのファイルから構成されます。
「Cargo.toml」「lib.rs」「rust-toolchain.toml」の3つです。
2 Cargo.tomlについて
1 概要
まずは、「Cargo.toml」についてです。
こちらは、プロジェクトの設定ファイルです。
2 package
「package」セクションでは、基本的なメタデータを設定しています。
3 dependencies
次に、「dependencies」についてです。
その名の通り、依存関係です。
また、デフォルトフィーチャーを無効化しています。
4 lib
次は、「lib」についてです。
メインとなるソースファイルが、同じ階層の「lib.rs」であることを示しています。
5 features
そして、「features」で有効とするフィーチャーを設定しています。
ここでは、「ink/std」「scale/std」「scale-info/std」の3つをデフォルトに設定しています。
3 ust-toolchain.toml
こちらの「rust-toolchain.toml」でツールチェーンを指定しています。
channelで、Rustのバージョンを指定しています。
また、componentsでは、使用するツールを指定しています。
「rustfmt」はコードフォーマッター、「clippy」はリンターです。
そして、ターゲットトリプレットでwasmを指定しています。
また、「profile」を「minimal」でインポートするコンポーネントを最小限にします。
4 lib.rsについて
1 cfg_attr
まずは、下の部分の「cfg_attr」で条件付きの設定をしています。
「std」が無効な時、「no_std」と「no_main」属性と適用しています。
そして、WebAssembly開発では、セキュリティの関係上、「no_std」属性を使用します。
そして、「no_std」で標準ライブラリを無効にし、「no_main」でmain関数の要求を取り除いています。
2 use ink
この部分で、inkを使用できるようにしています。
なお、inkは「Cargo.toml」で規定しています。
ちなみに、ink!はこちらです。
3 #[ink::contract]
そして、この#[ink::contract]でコントラクトが開始しています。
ここで、「flipper」というコントラクトを定めています。
4 #[ink(storage)]
次に、#[ink(storage)]でストレージを定めています。
構造体を使い、boo型のvalueを定義しています。
5 imlp
「impl」で構造体に対して、メソッドを定義していきます。
6 #[ink(constructor)]
まずは#[ink(constructor)]の部分です。
ここは、デプロイ時に一度だけ行われる処理で、valueの値を渡した値で設定しています。
こちらも#[ink(constructor)]です。
ここでは、上で設定した、new関数を用いて、デフォルトの値(bool型の場合は、false)を設定しています。
7 #[ink(message)]
次に、#[ink(message)]の部分でコントラクト外から呼べる関数を指定します。
また、今回のように、selfの値が変わる場合には、「&mut self」として、可変であることを示しています。
次に、get関数についてです。
値が変わらないので、「&self」となっています。
8 #[cfg(test)]
テストの部分も見てみましょう。
9 use super::*;
まずは、こちらで、親モジュールの全てのアイテムをインポートしています。
具体的には、この「flipper」モジュールのアイテムを使えるようにしています。
10 #[ink::test]
では#[ink::test]でテストの部分を見てみましょう。
下のように、デフォルトで、「flipper」のインスタンスを作成し、値が「false」であることを確認しています。
次は「false」を入れた上で、インスタンスを作成しています。
その上で、「flip」関数で値が変わったこと確認しています。
このようにテストがうまくいったようです。
今回は以上です。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊