見出し画像

【完全保存版】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」関数で値が変わったこと確認しています。

このようにテストがうまくいったようです。

今回は以上です。

サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊