【Solidity】エラー処理のassertとrequireの違い

こんにちは、学生ブロックチェーンエンジニアのアカネヤ(@ToshioAkaneya)です。

例外処理は、コントラクトの状態に加えられた変更を取り消し、呼び出し元にエラーを返すことです。

Solidityではassertかrequireを使うことで条件をチェックして例外処理ができます。

使い方は

のようにします。

どちらも条件がfalseの場合、例外が投げられます。

assertとrequireの違い

assertは例外発生時に使用可能なGasを全て消費します。

一方、requireはその処理までのGasを消費しますが、残りのGasは戻ってきます。

使い分けですが、基本的にはGasを消費しないrequireを使うのが良さそうです。

一方、assertはGasを消費しきるのでその後の動作が一切停止するというメリットもあります。

詳しくは公式ドキュメントが参考になります。

僕も結構調べたのですが、はっきりとした使い分けの基準は分かりませんでした。

ただ、try/catchを実装しようというissueがopenしているあたり、今後の実装によってより使い分けハッキリして来そうだなと思いました。

もし使い分けについてご存知の方がいらっしゃれば、@ToshioAkaneyaまでお知らせ頂けると幸いです。

スポンサーリンク