渋谷ほととぎす通信

Unity・ゲーム開発 技術で一生食べていく情報発信

【Solidity】不変変数より定数を使うとパフォーマンスが良い場合が多い

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