Remix IDEでデバッグする


私はSolidityの開発に、Remix(リミックス)というブラウザベースのIDEを使ってます。
RemixはSolidityのコンパル、デプロイまでブラウザでできるのでとっても便利です。

ですがデバッグについては、現時点ですごく難しいと感じました。
Remixはコードを書いたら画面右上のタブから諸々操作します。
タブをよーく見ると「Debugger」タブもしっかりありますね。

ここからデバッグできるのですが、このデバッグが非常に分かりづらい。
しかも挙動が怪しい時もあり、それがバグなのか自分の操作ミスなのか、切り分けも難しくて心が折れます。

そこでとりあえず簡単にデバッグするために、私はevent修飾子を利用してlogに情報を出力してます。
やり方はeventを事前に定義して、それをemitで呼び出します。
分かりづらいと思うので、簡単なSolidityのサンプルコードを用意しました。

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にデバッグ情報が出力されます。
下図の赤枠の箇所です。

ちょっと見づらいので、JSONの"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を使ったフロントの実装はまた改めて学習します。