playground

The world is a playground.

Solidity 0.4.22 以上でのコンストラクタの書き方

Solidity 0.4.21 までのコンストラクタの書き方

  • Solidity 0.4.21 までは、コントラクトと同じ名前の関数がコンストラクタでした。
  • ただ、この仕様だと、コントラクト名を変更したときに、コンストラクタだけ変更されずに、意図した初期化処理が行われない可能性がありました。
  • なお、Solidity における「コントラクト」は、一般的なプログラミング言語の「クラス」と考えて差し支えないと思います。

例: Piyo という名前のコントラクトの場合

  • コンストラクタはコントラクト名 Piyo と同名の関数となります。
pragma solidity 0.4.21;

contract Piyo {
    string public message;
    
    // コンストラクタ
    function Piyo(string _message) public {
        message = _message;
    }
    
}

Solidity 0.4.22 以上でのコンストラクタの書き方

  • constructor という宣言キーワードを使用した無名関数を使用します。
  • 注意: function constructor(args) {...} とはせず、 constructor (args) {...} とします。

例: Piyo という名前のコントラクトの場合

  • コンストラクタはキーワード constructor を使用した無名関数です。
pragma solidity 0.4.22;

contract Piyo {
    string public message;
    
    // コンストラクタ
    constructor (string _message) public {
        message = _message;
    }
    
}

その他の注意点

  • Solidity 0.4.22 で導入されたこの仕様は、意図しないバグを防ぐためのものでしたが、Solidity 0.4.22 では 0.4.21 以前の方法でもコンストラクタを書くことができてしまうというバグがあります。
  • Solidity 0.4.22 でコンパイルしたコードに、コントラクト名と同名の関数を使用したコンストラクタと、constructor キーワードを使用したコンストラクタの両方が存在した場合、どちらか1つのコンストラクタのみが使用されるようです。
  • 実験してみたところ、最初に呼ばれたコンストラクタが使用されるようですが、特別な理由がない限りは Solidity 0.4.23 以上を使用すべきかと思います。