今回の記事はSolidity Assembly入門という連載記事の第1回目です。
この連載ではSolidityのコードをコンパイルした時に生成されるopcodeについて解説していきます。
この連載ではSolidityのコードをデバッグするのに必要な知識を得られることを目的としています。
第1回目の今回は、今後の連載で使うことになるRemixのデバッグ機能の使い方を説明したいと思います。
スマートコントラクト
今回の記事ではこのスマートコントラクトを使っています。
pragma solidity ^0.4.24; contract SimpleContract { uint public a; bytes32 public b; constructor() public { } function setNum() public { a = 1; b = bytes32(0x02); } }
1.デバッガーの起動方法
1-1. メソッドの実行
デバッガーを起動するためには、とりあえずスマートコントラクトの何らかのメソッドを実行する必要があります。
Deployを押してスマートコントラクトをdeployし、何らかのメソッドを実行してください。
1-2. 実行ログからデバッガーの起動
Deploy後にメソッドを実行した場合、下図の様に2つのログが流れていると思います。この中で2番目のログがメソッドの実行時のtransactionになります。
ログの横にある「Debug」ボタンを押すとデバッガーが起動します。
デバッガーは「Debug」ボタンを押すたびに初期化され再実行できますので簡単にやり直すことができます。
2.デバッガーの使い方
2-1. 詳細を表示する情報
デバッガー起動するといろんな情報が表示され、詳細を確認できます。
僕がいつも表示する情報は「Instructions」「Stack」「Memory」の3つです。それ以外は邪魔になるのでだいたい閉じてます。
2-2. ステップ実行の仕方
下図にある、赤丸のボタンがnext stepのボタンです。青丸のボタンがback stepです。基本的にnext stepボタンを押下しながら、StackとMemoryの状態がどの様に変わっていっているのかを確認する流れになります。
2-3. program counterの開始位置について
デバッガー起動直後のprogram counterの開始位置は基本的にfunctionの先頭コードの位置になります。
デバッガーのボタンの上にあるスライドをいじることで、Contractの先頭コード(program counter 0番)からの実行内容も確認することができます。
functionを発見するためのopcodeや、functionの引数のデータをmemory上にコピーするためのopcodeの動きを確認したい場合はprogram counterの先頭からstep実行していくと良いと思います。
まとめ
以上がRemixのデバッガーの使い方です。最初はよくわからないと思いますが簡単なコードで何回か試すとどの情報がどのタイミングで変わるのか?どこをみておくのが重要なのか?みたいなコツはすぐに掴めると思います。
Hi-Ether Fukuoka MeetupでRemixでデバッグできることを知らないというお話を聞いたので、デバッガーの使い方についてまとめてみました。