LoginSignup
14
5

More than 3 years have passed since last update.

Solidity v0.6.0の重大な変更

Posted at

はじめに

寒いですね。私の財布も寒いです。
ところでもうすぐSolidityのv0.6が出るらしいですね。
今v0.5系でもの作ってるんですが、いずれは対応しなければいけないので、どんなもんかと調べました。
そしたらやっぱり入ってました、破壊的な変更
何個かあるのですが、その中でもわかりやすいのをいくつかピックアップして説明します。
ありえないコードをある程度こんな感じかなーと想像で書いてるところもあるので、その辺りはご了承ください。
あと間違ってたらごめんね。
なんでもいいけど早くv1出して欲しいですね。

変更点

virtualってつけないとオーバーライドできない

contract Parent {
    function getFugaFuga() externa view returns (uint256){}

    function getHogeHoge() external virtual view returns (uint256){
            return 5;
        }

    function getFooBaa() external view returns (uint256){
            return 15;
        }
}

contract Child is Parent {
    //セーフ!!!
    function getFugaFuga() external view returns (uint256){
            return 1;
        }
    //セーフ!!!
    function getHogeHoge() external virtual view returns (uint256){
            return 1;
        }
     //アウト!!!
    function getFooBaa() external view returns (uint256){
            return 2;
        }
}

インターフェース、もしくは「virtual」修飾子がないとオーバーライドはエラーになるらしい。つけずにオーバーライドしている箇所が既存のコードにあったら修正不可避

array.lengthは完全に読み取り専用

function hoge() externa view returns (uint256){
    uint[] numbers;
    numbers.push(1);
    numbers.length = 2; //アウト!!!
    return numbers.length; //セーフ!!!
}

今まではlengthに直接数字セットして配列数とかセットできたけど、今後はなしとのこと。
使えないわけではなく読み取り専用になっただけなので、参照するのはセーフ。

arrayのpushは長さを返さない

function hoge() externa view returns (uint256){
    uint[] numbers;
    return numbers.push(1); //アウト!!!
}

配列のpushが配列数を返却しなくなった。配列数を取得したい場合は上の場合だとpushしたあとちゃんとlengthでとること。

address(constract) が使えない

function hoge() externa view returns (address){
    return address(contractObject); //アウト!!!
}

function Huga() externa view returns (address){
    return contractObject.address; //セーフ!!!
}

コントラクトのアドレスを取得する際、addressで囲っていたけど、v0.6以降はcontract.addressで取得することになる。

フォールバック関数に名前をつけることになった

function () external payable {  //アウト!!!
    // 何かしらの処理 
}
function fallback() external payable {  //セーフ!!!
    // 何かしらの処理 
}

今まで名前つけなくてよかったけど、v0.6からはつけるようになる。

abstractが使える

contract Parent {
    function getHogeHoge() external view returns (uint256){
            return getFooBaa();
        }

    function getFooBaa() external abstract view returns (uint256){};
}

contract Child is Parent {
    function getFooBaa() external view returns (uint256){
            return 2;
        }
}

新機能の紹介。
抽象メソッドを明示的に宣言できるようになった。個人的にこれが一番嬉しい。

最後に

以上終わり。もっと気になる人は破壊的な変更をみればいいと思う。

14
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
5