こんにちは、エンジニアのオオバです。
Solidityには不変変数と定数といった性質が似ている変数があります。
- 不変変数 : コンパイル時に決定している必要はないが後から変更できない値
- 定数 : コンパイル時に決定している値
不変変数はimmutable
、定数はconstant
キーワードを変数の前に付与します。
コードに落としてみましょう。
contract Test {
// 不変変数はコンパイル時に値は決まらなくてOK
uint immutable piyo;
// 定数はコンパイル時に決定する必要あり
uint constant hoge = 999;
constructor(uint _piyo) {
// コンストラクタで決定
piyo = _piyo;
}
}
ここからが本題。
不変変数の方が定数よりパフォーマンスが悪くなる理由
定数・不変変数(immutable)ともに参照しているすべての場所にコピーされます。
ここまでは動作として同じなのです。
ところが不変変数は定数と違い、バイト数関係なく32バイトの領域を確保します。
32バイトより少ない不変変数を定義しても、使用されている箇所では32バイトの領域が確保されてしまうということです。
(メモリの無駄 => ガスの無駄遣い)
上記の理由から定数が使用できる箇所であれば、不変変数ではなく定数を使った方が良い場面が多そうです。
まとめ
Solidityの不変変数と定数について学びました。
- 不変変数・定数ともに後から値を変更できない
- 不変変数はコンストラクタで値が決定
- 定数はコンパイラ時に値が決定
- 不変変数は参照箇所で32バイト領域が確保される
- 定数が使える場所では定数を使うと良い事が多い
普通に変数を定義するより、不変変数、定数を使用する方がガス代を安くすませることができます。
最適化をしていく上で覚えておいた方がよいTipsですね。
この記事が気に入ったらフォローしよう
オススメ記事
検証環境
- Solidity v0.8.4
参考サイト