【Solidity】第2章第8回:require, assert, revertの違いと使い分け

本記事では、Solidityにおけるエラーハンドリングで使用されるrequire
、assert
、revert
の違いや使い分けについて詳しく解説します。適切に活用することで、安全性と効率性の高いスマートコントラクトを構築することが可能です。
0. 記事の概要
この記事を読むメリット
- エラーハンドリングの基礎を理解:スマートコントラクト内でエラーを検出し、処理を中断する方法を学べます。
- 適切なエラーハンドリングの実装:コードの安全性と信頼性を向上させるためのテクニックが分かります。
- スマートコントラクトの効率化:不要なガス消費を防ぎ、最適化されたコードを記述する方法が学べます。
この記事で学べること
require
、assert
、revert
の使い分け- エラーハンドリングのベストプラクティス
- よくあるエラーとその解決策
1. requireの基本と使い方

1.1 requireとは?
require
は、特定の条件が満たされない場合にエラーをスローし、現在の処理を中断するために使用されます。ガスを消費する処理が巻き戻される点が特徴です。
// requireの基本構文
require(条件式, "エラーメッセージ");
1.2 コード例
// 例: 入力値が10以上であることを確認
function checkValue(uint256 value) public pure {
require(value >= 10, "値は10以上である必要があります");
// 処理続行
}
動作解説
このコードでは、入力値が10未満の場合にエラーがスローされ、処理が中断します。10以上の場合は、正常に処理が進みます。
2. assertの基本と使い方

2.1 assertとは?
assert
は、コード内のロジックが正しいことを確認するために使用されます。assert
が失敗した場合、ガスがすべて消費され、トランザクションが終了します。
// assertの基本構文
assert(条件式);
2.2 コード例
// 例: 内部変数が特定の範囲内にあることを確認
function validateInternalState(uint256 x) public pure {
uint256 max = 100;
assert(x <= max);
// 処理続行
}
動作解説
このコードでは、内部変数x
がmax
より大きい場合にassert
が失敗し、トランザクションが終了します。
3. revertの基本と使い方

3.1 revertとは?
revert
は、特定の条件が満たされない場合に、トランザクション全体を巻き戻すために使用されます。require
に似ていますが、複雑な条件や独自のロジックでエラーをスローしたい場合に適しています。
// revertの基本構文
revert("エラーメッセージ");
3.2 コード例
// 例: 条件に応じたエラーハンドリング
function performAction(uint256 value) public pure {
if (value < 0) {
revert("負の値は許可されていません");
}
// 処理続行
}
動作解説
このコードでは、value
が負の値である場合にrevert
がエラーをスローし、トランザクションが終了します。
4. require, assert, revertの違い
キーワード | 主な用途 | 特徴 |
---|---|---|
require | 外部からの入力や条件チェック | ガスが巻き戻され、エラーメッセージを返す |
assert | 内部ロジックの検証 | ガスを消費し、トランザクションを終了 |
revert | 複雑な条件やロジックのエラー処理 | ガスが巻き戻され、エラーメッセージを返す |
5. よくあるエラーとその解決策
5.1 不適切なassertの使用
assert
を外部条件のチェックに使用すると、不必要なガス消費が発生します。
// 悪い例
function checkValue(uint256 value) public pure {
assert(value >= 10); // 外部条件チェックに使用
}
// 改善例
function checkValueImproved(uint256 value) public pure {
require(value >= 10, "値は10以上である必要があります");
}
5.2 エラー時の不適切なメッセージ
エラー発生時のメッセージが不足していると、原因の特定が困難になります。
// 悪い例
require(value > 0); // メッセージなし
// 改善例
require(value > 0, "値は正でなければなりません");
6. 練習問題
以下の課題に挑戦してみましょう:
- 入力された数値が正の場合のみ処理を実行し、それ以外はエラーをスローする関数を作成してください。
- 内部状態を検証するために
assert
を使用する関数を作成してください。
7. まとめ
本記事では、require
、assert
、revert
の違いと使い分けについて解説しました。これらを適切に活用することで、安全かつ効率的なスマートコントラクトを構築できます。次回は、制御構文を活用したスマートコントラクト例について解説します。