オルトプラスエンジニアの日常をお伝えします!

Solidityコードをデバッグする

この記事は Altplus Advent Calendar 2017 の5日目のエントリです。※Qiitaに書いた記事を転載しています。

はじめまして、オルトプラスラボの菊池(id:takuya-kikuchi)です。今年の4月からこちらで楽しく過ごしています。

最近思い出作りにSolidityを書き始めたので、開発環境の使い方のメモです。

Solidityとは

Ethereum上で動作させるスマートコントラクトを記述するための言語です。 jsっぽい?けど静的型付き言語。 Soliity言語で書いたコントラクトは、以下の手順を踏むことでEthereumネットワークにデプロイされ、他者が使用できる状態になります。

  1. コーディング
  2. コンパイル
  3. デプロイ

手順1〜2はテキストエディタとターミナルでもさほど問題ありませんが、3のデプロイ作業がなかなかに面倒です。手作業であたたかみのあるデプロイも人生には大事なのかもしれませんが、そういうところを楽させてくれるのが、Remixです。

Remix(browser-solidity)を使う

Remixは、もともとbrowser-solidtyと呼ばれていたものです。名前の通り、ブラウザ上で動作するSolidityのIDEです。github上からダウンロードすればローカルでも動かせます。

エディタ

なかなか高機能なエディタで、auto compileなんかも走らせることができます。なので、コンパイルエラーなんかがあれば常時アラートしてくれます。

https://camo.qiitausercontent.com/e89409282625c8dd7f13ae46d7fa60ba0d23b51b/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363138342f30303361643836652d326439652d376637612d653635652d3862326437306566373961332e706e67

ContractのDebugもできる

私はなかなか脳内デバッガーの精度が低く、ステップ実行してコードの動きを確認したくなることが多々あります。Remixであればそれも可能です。

コントラクトの中身はあまり本筋と関係ありませんが、今回はこのようなコントラクトを書いてみました。 Postで気になるあの人に向けたメッセージをブロックチェーン上に刻むことができ、Readで自分宛のメッセージを読むことができます。

pragma solidity ^0.4.0;

contract SampleContract {
    address public owner;
    mapping(address => string) public messages;

    // コンストラクタ
    function SampleContract() public {
        owner = msg.sender;
    }

    // 任意のアドレスに向けたメッセージを記す。
    function Post(address dest, string message) public {
        messages[dest] = message;
    }
    
    // メッセージを読む。何も存在しなければabort
    function Read() public constant returns (string message) {
        bytes memory strMem = bytes(messages[msg.sender]);
        require(strMem.length > 0);
        return messages[msg.sender];
    }
}

デバッグ手順

1. EnvironmentをJavaScript VMに変更

画面右側の[Run]タブにて、[Environment]を[JavaScript VM]とします。 他のEnvironmentを選択しているとデバッグできませんのでご注意。

https://camo.qiitausercontent.com/286e7fc7b5ab0f7eb2de76d51c0b9303b1c44d27/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363138342f63646665383364352d646131622d306566312d653032652d6163613465633066653339372e706e67

2. コントラクトのデプロイ

おなじく[Run]タブ内でデプロイしたいコントラクトを選択し、[Create]ボタンを押せばデプロイ完了です。

https://camo.qiitausercontent.com/f38d1dccccd6eb9746fdfca629ec17acd4a5ab6a/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363138342f66383361353862372d393639632d613565322d343330372d6236383061656231613431312e706e67

3. コントラクトの実行

Remix上でデプロイしたコントラクトが一覧表示されていますので、こちらから任意のfunctionを選んで実行します。

https://camo.qiitausercontent.com/e820a51831490d0d87b11f2ad363bf0faf873a2d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363138342f31633331303834622d383437332d396533612d303163322d3633393735383463393832332e706e67

4. デバッグ

エディタ下部のコンソールに次のようにコントラクトの実行結果が表示されていますので、右側の[Debug]をクリックします。

https://camo.qiitausercontent.com/30717b7e2af96f41c0b5758095906ea712b2a36d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363138342f39636665646466302d383131662d353238622d313537652d3430363039636336653865652e706e67

すると、右側のタブは自動的に[Debugger]に切り替わり、デバッグ対象のfunctionのエントリポイントで自動的に一時停止します。

https://camo.qiitausercontent.com/d8c75eb667fbb122daf07a8aa3c61c836403bdd7/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363138342f32323934326661642d663431612d653138362d373463632d6334363433383439363233332e706e67

あとは、表示されているボタンを使ってステップイン/ステップオーバー/ブレークポイントまで飛ばす・・・といった、 一般的なデバッガで可能な操作を行うことができます。

https://camo.qiitausercontent.com/26c95890f3ccb127549d0f3a0a011a5c7debf63c/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363138342f64396564376266312d303061352d343734632d383734362d3564336266646230363665342e706e67

ローカル変数の中身も表示可能。 Watchみたいなのはない・・・のかな?

おわりに

以上、Solidityコードをババっと書いてちゃちゃっとデバッグする方法でした。PCのメモリ上にデプロイされているだけなのであまり面白みはありませんが、Solidityでどんなことができるのか、というのを知るには良いのではないかと思います。

きちんとコントラクトのデバッグができたら、Ethereumネットワークにデプロイして遊んでみましょう。(まずはプライベートネットから!)

参考

Ethereum入門

Remix