こんにちは、エンジニアのオオバです。

Solidityには不変変数と定数といった性質が似ている変数があります。

不変変数はimmutable、定数はconstantキーワードを変数の前に付与します。

コードに落としてみましょう。

contract Test {  
    // 不変変数はコンパイル時に値は決まらなくてOK  
    uint immutable piyo;  

    // 定数はコンパイル時に決定する必要あり  
    uint constant hoge = 999;  

    constructor(uint _piyo) {  
        // コンストラクタで決定  
        piyo = _piyo;  
    }
}

ここからが本題。

不変変数の方が定数よりパフォーマンスが悪くなる理由

定数・不変変数(immutable)ともに参照しているすべての場所にコピーされます。
ここまでは動作として同じなのです。

ところが不変変数は定数と違い、バイト数関係なく32バイトの領域を確保します。
32バイトより少ない不変変数を定義しても、使用されている箇所では32バイトの領域が確保されてしまうということです。
(メモリの無駄 => ガスの無駄遣い)

上記の理由から定数が使用できる箇所であれば、不変変数ではなく定数を使った方が良い場面が多そうです。

まとめ

Solidityの不変変数と定数について学びました。

普通に変数を定義するより、不変変数、定数を使用する方がガス代を安くすませることができます。
最適化をしていく上で覚えておいた方がよいTipsですね。

オススメ記事
検証環境
参考サイト