【CryptZombies】レッスン3チャプター4:ガス(燃料)
ガス:イーサリアムDAppの燃料
Solidityでは、ユーザーが関数を使用するたびに、ガスと呼ばれる通貨を支払うことになっています。
ユーザーはEtherでガスを買い、アプリの関数を実行するのです。
関数を実行するために必要なガスの量は、関数のロジックの複雑さによります。
個々の操作には、その操作を実行するためにどれくらいの計算資源が必要になるのかを計算したものに基づいて、ガスのコストが決まっています。(例:storageへの書き込みは整数の足し算に比べてずっと高い)
各操作に必要なガスの価格の合計が、関数のガスのコストになります。
ユーザーは実際にお金を使って関数を動かすことになるので、イーサリアムはほかのプログラミング言語よりもずっとコードの最適化が重要になるのです。
ガスを節約するためのstruct構造
レッスン1では、uintには様々なタイプ(uint8、uint16、uint32等)があることを学習しました。
普通はこのサブタイプを使うメリットはありません。なぜならSolidityはuintのサイズにかかわらず256ビットのストレージを確保するからです。例えばuint(uint256)の代わりにuint8を使ってもガスの節約にはなりません。
しかし、structの中については例外です。
structの中に複数のuintがある場合、できる限り小さい単位のuintを使うことで、Solidityが複数の変数をまとめて、ストレージを小さくすることが可能です。
struct NormalStruct {
uint a;
uint b;
uint c;
}
struct MiniMe {
uint32 a;
uint32 b;
uint c;
}
// 複数の変数がまとめられるため、`mini` は`normal`に比べてガスコストが低くなる。
NormalStruct normal = NormalStruct(10, 20, 30);
MiniMe mini = MiniMe(10, 20, 30);
また、同じデータ型の変数を一か所にまとめることで(つまり、structの中で隣り合わせることで)、Solidityのstorageスペースを最小限に抑えることも可能です。
例えば、uintc; uint33 a; uint32b; は、uint32 a; uint c; uint32 b; よりもコストが低くなります。なぜなら2つのuint32変数をまとめることができるからです。
テストの実行
①Zombie structに2つのプロパティを追加せよ。プロパティはlevel(uint32)と、readyTime(uint32)である。このデータ型をまとめることができるようにstructの最後に設定せよ。※
※ゾンビのレベルとタイムスタンプの格納は32bitで十分です。そこで、通常のuint(256ビット)ではなく、よりタイトにデータを格納することでガスコストを節約するのです。
お疲れさまでした!
<参考>
CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network