![見出し画像](https://assets.st-note.com/production/uploads/images/117153280/rectangle_large_type_2_0c10eebd895d3dd0cb9a68d53f4adbac.png?width=1200)
【完全保存版】Flipperコントラクトの解説について
0 はじめに
当記事は、下の記事で、「Flipper」コントラクト作成後、その内容を知るために記載しました。
1 構成について
コントラクトを作る際は3つのファイルから構成されます。
「Cargo.toml」「lib.rs」「rust-toolchain.toml」の3つです。
![](https://assets.st-note.com/img/1695611865495-Eev8CP2uu7.png?width=1200)
2 Cargo.tomlについて
1 概要
まずは、「Cargo.toml」についてです。
こちらは、プロジェクトの設定ファイルです。
2 package
「package」セクションでは、基本的なメタデータを設定しています。
![](https://assets.st-note.com/img/1695611915864-T0i7txeBwT.png?width=1200)
3 dependencies
次に、「dependencies」についてです。
その名の通り、依存関係です。
また、デフォルトフィーチャーを無効化しています。
![](https://assets.st-note.com/img/1695611957175-qzhnXfhiS1.png?width=1200)
4 lib
次は、「lib」についてです。
メインとなるソースファイルが、同じ階層の「lib.rs」であることを示しています。
![](https://assets.st-note.com/img/1695611981000-XyxNUmbfwW.png?width=1200)
5 features
そして、「features」で有効とするフィーチャーを設定しています。
ここでは、「ink/std」「scale/std」「scale-info/std」の3つをデフォルトに設定しています。
![](https://assets.st-note.com/img/1695612070329-wBzEIWxDN0.png?width=1200)
3 ust-toolchain.toml
こちらの「rust-toolchain.toml」でツールチェーンを指定しています。
channelで、Rustのバージョンを指定しています。
また、componentsでは、使用するツールを指定しています。
「rustfmt」はコードフォーマッター、「clippy」はリンターです。
![](https://assets.st-note.com/img/1695612123292-FBpMlSDlln.png?width=1200)
そして、ターゲットトリプレットでwasmを指定しています。
![](https://assets.st-note.com/img/1695614178724-0VEyTFjPu0.png?width=1200)
また、「profile」を「minimal」でインポートするコンポーネントを最小限にします。
![](https://assets.st-note.com/img/1695614072121-F6ubns5HQs.png?width=1200)
4 lib.rsについて
1 cfg_attr
まずは、下の部分の「cfg_attr」で条件付きの設定をしています。
「std」が無効な時、「no_std」と「no_main」属性と適用しています。
![](https://assets.st-note.com/img/1695618598367-5xPRXzt3jA.png?width=1200)
そして、WebAssembly開発では、セキュリティの関係上、「no_std」属性を使用します。
![](https://assets.st-note.com/img/1695620302815-4dnsnA2lz9.png?width=1200)
そして、「no_std」で標準ライブラリを無効にし、「no_main」でmain関数の要求を取り除いています。
![](https://assets.st-note.com/img/1695618760632-wj6QQ5PoQZ.png?width=1200)
2 use ink
この部分で、inkを使用できるようにしています。
なお、inkは「Cargo.toml」で規定しています。
![](https://assets.st-note.com/img/1695618857398-5DPVj5DzzE.png?width=1200)
ちなみに、ink!はこちらです。
![](https://assets.st-note.com/img/1695622100635-vncid7kCrm.png?width=1200)
3 #[ink::contract]
そして、この#[ink::contract]でコントラクトが開始しています。
ここで、「flipper」というコントラクトを定めています。
![](https://assets.st-note.com/img/1695618891618-RytFCYCHkI.png?width=1200)
4 #[ink(storage)]
次に、#[ink(storage)]でストレージを定めています。
構造体を使い、boo型のvalueを定義しています。
![](https://assets.st-note.com/img/1695618923033-BBzZ24wkBG.png?width=1200)
5 imlp
「impl」で構造体に対して、メソッドを定義していきます。
![](https://assets.st-note.com/img/1695618942222-yIEY11yMQK.png?width=1200)
6 #[ink(constructor)]
まずは#[ink(constructor)]の部分です。
ここは、デプロイ時に一度だけ行われる処理で、valueの値を渡した値で設定しています。
![](https://assets.st-note.com/img/1695618991176-c6jAF1BmRA.png?width=1200)
こちらも#[ink(constructor)]です。
ここでは、上で設定した、new関数を用いて、デフォルトの値(bool型の場合は、false)を設定しています。
![](https://assets.st-note.com/img/1695619020420-5yO8Cvurm3.png?width=1200)
7 #[ink(message)]
次に、#[ink(message)]の部分でコントラクト外から呼べる関数を指定します。
また、今回のように、selfの値が変わる場合には、「&mut self」として、可変であることを示しています。
![](https://assets.st-note.com/img/1695619086660-Hgh9cwdV2W.png?width=1200)
次に、get関数についてです。
値が変わらないので、「&self」となっています。
![](https://assets.st-note.com/img/1695619121131-TVx0OBCcg9.png?width=1200)
8 #[cfg(test)]
テストの部分も見てみましょう。
![](https://assets.st-note.com/img/1695619394677-w2JWZo0iVB.png?width=1200)
9 use super::*;
まずは、こちらで、親モジュールの全てのアイテムをインポートしています。
![](https://assets.st-note.com/img/1695619411865-eiOxlcyVKv.png?width=1200)
具体的には、この「flipper」モジュールのアイテムを使えるようにしています。
![](https://assets.st-note.com/img/1695621399418-gPI1LK7MBQ.png?width=1200)
10 #[ink::test]
では#[ink::test]でテストの部分を見てみましょう。
下のように、デフォルトで、「flipper」のインスタンスを作成し、値が「false」であることを確認しています。
![](https://assets.st-note.com/img/1695619514721-eYwOtekeoF.png?width=1200)
次は「false」を入れた上で、インスタンスを作成しています。
その上で、「flip」関数で値が変わったこと確認しています。
![](https://assets.st-note.com/img/1695619536283-TE8xumj0C0.png?width=1200)
このようにテストがうまくいったようです。
![](https://assets.st-note.com/img/1695619754908-u090U6iMRt.png?width=1200)
今回は以上です。
いいなと思ったら応援しよう!
![ユウキ](https://assets.st-note.com/production/uploads/images/52347520/profile_e7d36b385c74618d7fec56da47f68a35.jpeg?width=600&crop=1:1,smart)