Remix IDEでデバッグする

私はSolidityの開発に、Remix(リミックス)というブラウザベースのIDEを使ってます。

RemixはSolidityのコンパル、デプロイまでブラウザでできるのでとっても便利です。

Remix - Solidity IDE

ですがデバッグについては、現時点ですごく難しいと感じました。

Remixはコードを書いたら画面右上のタブから諸々操作します。

タブをよーく見るとはい、「Debugger」タブもしっかりありますね。

f:id:msak_y:20190121121638p:plain

ここからデバッグできるのですが、このデバッグが非常に分かりづらい。

しかも挙動が怪しい時もあり、それがバグなのか自分の操作ミスなのか、切り分けも難しくて心が折れます。

そこでとりあえず簡単にデバッグするために、私はevent修飾子を利用してlogに情報を出力してます。

やり方はeventを事前に定義して、それをemitで呼び出します。

分かりづらいと思うので、簡単なサンプルコードを用意しました。

pragma solidity ^0.4.24;

contract Sample {

    mapping(uint => address) test;
    event eventDebugger(string dm, address test);
    
    function debuggTest() public {
        
        test[0] = msg.sender;
        string memory dm = "Hello debugg";
        
        emit eventDebugger(dm, test[0]);
    }
}

event修飾子で定義されたeventDebugger()が、今回デバッグするための関数です。

eventで定義した関数を、emitで発火させるイメージです。

emitはdebuggTest()の中で実行してます。

上記のコードをデプロイして実行すると、Remixのコンソールのlogsにデバッグ情報が出力されます。

下図の赤枠の箇所です。

f:id:msak_y:20190121235708p:plain

ちょっと見づらいので、logsだけ抜粋しました。

"event": "eventDebugger",
        "args": {
            "0": "Hello debugg",
            "1": "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c",
            "dm": "Hello debugg",
            "test": "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c",
            "length": 2
        }

このようにeventで発火させた関数名があり、その中にパラメータで渡した値が出力されてます。

簡単なブロックチェーンアプリを作成するくらいなら、このやり方でも十分デバッグ可能です。

ちなみにweb3.jsというJSのライブラリを使うと、web3.js経由でargsの値をフロント側で受信できます。つまり、フロントエンドを実装する際にもこのevent機能は大いに価値を発揮するわけです。

というか本来はフロントにイベント通知するための機能なので、web3.jsを使ったフロントの実装はまた改めて学習します。

以上