Chapter10: Debugging Contracts | Solidity Programming Essentialsを読む
イーサリアムの知識を整理するために2022年6月発売のSolidity Programming Essentials 2nd Editionを読み進める試みです。この記事ではChapter10「Debugging Contracts」を読み進めます。
読書ログは以下のスクラップで逐次更新していきます。
この章で扱われるトピックは以下の通りです。
- Overview of Debugging contracts
- Debugging contracts using Remix and Solidity events
- Using a block explorer
Remixでデバッガを実行する
本書ではRemix IDEを推奨しているのですが、大体の人がSolidityをVisual Studio Code(以下VSCode)で書いていると思うので、VSCodeから直接Remixのデバッガを呼び出したいなーと思うのではないかと。
というわけで本書の流れを無視してVSCodeからRemixを使えるように設定しつつ、VSCodeのRemixからデバッグする手順について整理したいと思います。
Ethereum Remix拡張をインストールする
まずはEthereum Remixをインストールしましょう。

ローカルネット(Ganache)と接続し、コントラクト内の関数を実行する
すると左側のタブに新しくEthereum Remixのアイコンが追加されますので、タブを選択し「Run & Deploy」をクリックします。

するとURLを入力する欄が表示されるので、Ganacheの赤枠のURLをコピーして

ここに貼り付けます。

すると以下のような画面に切り替わるので、

下の方のこの枠にデプロイしたコントラクトのアドレスを入力します。

Ganacheにデプロイしたコントラクトは「CONTRACTS」タブから確認することができます。

今回はFirstコントラクトの動作を確認するとして、0xCf52E63ad3e4C564a67B591bc0ed06E17350597bをRemixのアドレス欄に入力します。

「At Address」ボタンをクリックするとコントラクト名が表示されるので、コントラクト名をクリックするとコントラクト内の関数とパラメータ設定画面を開くことができます。

パラメータを入力して「TRANSACT」ボタンをクリックすると、下のOutput欄に実行結果が表示されます。

実行したトランザクションをデバッグする
関数内にイベントがないと何が起こっているのかOutputからサッパリ分からないので、デバッガから内部情報を確認してみます。
今度はEthereum Remixのメニューから「Debugger」を選択してみましょう。「Activate」か「Deactivate」か選択肢が表示されるので、「Activate」を選びます。

するとデバッガタブが開くので、デバッグしたいトランザクションハッシュをコピペします。

先ほどのログからもトランザクションハッシュを確認できますし、Ganacheのトランザクション一覧からも確認することができます。

トランザクションハッシュを入力し「Start Debugging」をクリックすると、デバッガが開始されます。

Solidity Locals欄を見ると、引数_dataに400が設定されていることが分かりますね。
筆者の環境ではJump to the next breakpointを選択してもブレークポイントが完全に無視されてしまうのですが・・・実行時にどんなopcodeが実行されているか、最終的な関数の状態はどうなっているのかといった情報は確認することができます。

ブロックエクスプローラを使う
トランザクションのデバッグにローカルネットで実行したトランザクションのハッシュ値を利用していましたが、メインネットでもトランザクションのハッシュ値から様々な情報を得ることができます。
例えばEtherscanというサイトですが、

トランザクションハッシュから筆者が遊びで購入したmah-lab.ethドメインの取引履歴を参照することができます。メインネットの情報は全て公開情報というわけです。

この章の内容は以上になります。
Discussion