Paoの技術力を磨くブログ

機械学習やブロックチェーン等の技術を身に付けていくブログです。

【Ethereum】Solidityでの例外処理(require,revert)でエラーメッセージを出力する

日本語での情報があまりなかったので書いておく。

Solidity0.4.22より、require()revert()による例外処理でエラーメッセージが出力できるようになった。

記述方法

require(条件, メッセージ);
revert(メッセージ);

具体例(require)

require(msg.value % 2 == 0, "Even value required.");

具体例(revert)

if (msg.value % 2 != 0){
    revert("Even value required.");
}

デバッグが捗って嬉しい!

例えば、以下のsetNumber()のようなやたら制限したがる関数があったとする。
この関数を呼び出すトランザクションを発行してエラーになったとき、どこでエラーになったのかパッと見て分からない。
そこで、setNumber2()のように書いてあると、エラーが出力されエラーの原因がすぐにわかる!

pragma solidity ^0.4.22;

contract test{
    address  owner;
    uint number;
    constructor () public{
        owner = msg.sender;
    }
    //エラーの理由がわからない
    function setNumber(uint _number) public {
        require(msg.sender == owner);
        require(msg.sender.balance > 100000);
        require(_number > 0);
        require(_number%10 == 0);
        number = _number;
    }
    //エラーの理由がわかる!!!
    function setNumber2(uint _number) public {
        require(msg.sender == owner, "only owner");
        require(msg.sender.balance > 100000, "balance: more than 100000 wei required");
        require(_number > 0, "_number: more than 0 required");
        require(_number%10 == 0, "_number: cannot be devisible by 10");
        number = _number;
    }

}

ちなみに、assert()についてはメッセージ出力は現時点では対応していないっぽい。

以下、参考。