【Solidity】第2章第9回:エラーハンドリングの基礎

本記事では、Solidityにおけるエラーハンドリングの基礎を解説し、スマートコントラクトにおける安全な設計方法について学びます。エラー処理を適切に実装することで、契約の信頼性と効率性を向上させることが可能です。
0. 記事の概要
この記事を読むメリット
- エラー処理の基本を理解:スマートコントラクトのエラー処理フローを学べます。
- スマートコントラクトの信頼性向上:予期しない動作やバグを防ぐ設計方法を習得します。
- 効率的なデバッグ:エラーハンドリングの実装によって問題の特定が容易になります。
この記事で学べること
- Solidityでのエラー処理の基本構文
- require、assert、revertの使い方
- 安全なエラーハンドリングの設計例
1. Solidityにおけるエラーハンドリングの重要性

1.1 なぜエラーハンドリングが必要か?
スマートコントラクトは自律的に実行されるため、予期しない動作を防ぐエラーハンドリングが不可欠です。これにより、以下のようなメリットがあります:
- ユーザーに明確なエラー情報を提供
- 安全で信頼性の高いコードの実現
- バグの早期発見と修正
1.2 Solidityで使用されるエラーハンドリングの種類
Solidityでは、以下の3つの方法でエラーを処理します:
- require: 外部からの入力や条件チェック
- assert: 内部ロジックの検証
- revert: 複雑な条件のエラーハンドリング
2. requireの基本的な使い方

2.1 基本構文
require
は、特定の条件が満たされない場合にエラーをスローし、トランザクションを巻き戻すために使用されます。
// requireの基本構文
require(条件式, "エラーメッセージ");
2.2 コード例
// 例: 入力値が正であることを確認
function checkPositiveValue(uint256 value) public pure {
require(value > 0, "値は正である必要があります");
// 処理続行
}
動作解説
このコードでは、value
が正でない場合にエラーをスローします。それ以外の場合は処理が継続されます。
3. assertの基本的な使い方

3.1 基本構文
assert
は、コードの内部ロジックが正しいことを検証するために使用されます。
// assertの基本構文
assert(条件式);
3.2 コード例
// 例: 内部状態が特定の条件を満たしていることを確認
function checkInternalState(uint256 x) public pure {
uint256 max = 100;
assert(x <= max);
// 処理続行
}
動作解説
このコードでは、x
がmax
を超えた場合にassert
がエラーをスローします。
4. revertの基本的な使い方
4.1 基本構文
revert
は、複雑な条件を満たさない場合や特定のエラーハンドリングが必要な場合に使用されます。
// revertの基本構文
revert("エラーメッセージ");
4.2 コード例
// 例: 条件が満たされない場合にエラーをスロー
function customErrorHandling(uint256 value) public pure {
if (value < 0) {
revert("負の値は許可されていません");
}
// 処理続行
}
動作解説
このコードでは、value
が負の値である場合にrevert
がエラーをスローします。
5. 練習問題
以下の課題に挑戦してみましょう:
- 入力された値が範囲内であることを
require
を使って検証する関数を作成してください。 - 内部変数が特定の条件を満たしているかを
assert
で検証する関数を作成してください。
6. まとめ
本記事では、Solidityにおけるエラーハンドリングの基礎について学びました。require
、assert
、revert
を正しく使い分けることで、安全かつ効率的なスマートコントラクトを設計することができます。次回は、エラーハンドリングを活用したスマートコントラクトの具体例を紹介します。