渋谷ほととぎす通信

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

【Ethereum開発】Solidity v0.4.21以降のバージョンごとのコンストラクタ仕様変更まとめ

Solidityを学習中、ここ数年で仕様が変わっている模様。
バージョン毎のSolidityコンストラクタ仕様を調査しました。

結論

  • v0.4.21まではContract名がコンストラクタ
  • v0.4.22以降はconstructorキーワードでコンストラクタをサポート
  • v0.6.12まではconstructorキーワードに対してpublic属性は必須
  • v0.7.0以降はコンストラクタにpublicは不要(v0.8.4も同様)

v0.4.21まではContract名がコンストラクタ

pragma solidity >=0.4.0 <=0.8.4;

contract HelloWorld 
{
    uint public storedData;
    
    function HelloWorld (uint value) public {
        storedData = value;
    }
}

v0.4.22以降はconstructorキーワードでコンストラクタをサポート

v0.4.22以降は👇 constructorキーワードを使った無名関数でコンストラクタを定義します。

pragma solidity >=0.4.0 <=0.8.4;

contract HelloWorld 
{
    uint public storedData;
    
    constructor (uint value) public {
        storedData = value;
    }
}

またv0.6.12まではコンストラクタにはpublicが必須です。
publicを外すと以下の警告👇。

Warning: No visibility specified. Defaulting to "public". constructor (uint value) { ^ (Relevant source part starts here and spans across multiple lines).

Contract名のメソッドを定義すると警告

Warning: Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead. function HelloWorld (uint value) public { ^ (Relevant source part starts here and spans across multiple lines).

👆のようにv0.4.22以降ではContract名のメソッドは定義できません。

v0.7.0以降はコンストラクタにpublicは不要

v0.7.0以降は👇以下のようにpublicを削除した形が正しいです。

pragma solidity >=0.4.0 <=0.8.4;

contract HelloWorld 
{
    uint public storedData;
    
    constructor (uint value) {
        storedData = value;
    }
}

とりあえず、最新のv0.8.4にしても正常にコンパイルは通りました。

環境

  • Solidiy v0.4.21 - v0.8.4