【Solidity】第7章第3回:オーバーフローとアンダーフローの回避

本記事では、スマートコントラクトにおけるオーバーフローとアンダーフローの問題と、それらを回避するための方法について解説します。これらのバグを理解し、対策を講じることで、安全性の高いスマートコントラクトを開発できます。
0. 記事の概要
この記事を読むメリット
- オーバーフローとアンダーフローの仕組みを理解:発生原因と影響を学べます。
- 防止策の習得:Solidityで安全な数値操作を実現する方法を理解できます。
- 開発品質の向上:スマートコントラクトのバグを防ぎ、信頼性を高める知識を得られます。
この記事で学べること
- オーバーフローとアンダーフローの基本概念
- Solidityでの防止策(SafeMathライブラリの活用など)
- 数値操作におけるベストプラクティス
1. オーバーフローとアンダーフローとは?

1.1 オーバーフローの仕組み
オーバーフローとは、整数型変数が表現できる最大値を超えた場合に発生するエラーです。例えば、uint8
型の変数に256を加算すると、値が0に戻ります。
1.2 アンダーフローの仕組み
アンダーフローは、整数型変数が表現できる最小値を下回った場合に発生します。例えば、uint8
型の変数から1を減算すると、値が255になります。
1.3 発生原因
これらの問題は、Solidityの古いバージョン(0.8.0以前)でデフォルトのエラーチェックがなかったことが主な原因です。
2. オーバーフローとアンダーフローの具体例

2.1 脆弱なコード例
// オーバーフローとアンダーフローが発生する例
pragma solidity ^0.8.0;
contract OverflowUnderflow {
uint8 public max = 255;
uint8 public min = 0;
function addOverflow() public {
max = max + 1; // 256に達し、0に戻る
}
function subtractUnderflow() public {
min = min - 1; // -1に達し、255に戻る
}
}
動作解説
このコードでは、max
やmin
に対する操作でオーバーフローやアンダーフローが発生します。これにより、不正な値が格納され、予期しない動作を引き起こします。
3. オーバーフローとアンダーフローの防止策

3.1 Solidity 0.8.0以降のデフォルトチェック
Solidity 0.8.0以降では、オーバーフローやアンダーフローが発生した際に自動的にエラーがスローされます。このため、基本的な数値操作は安全になっています。
3.2 SafeMathライブラリの活用
// SafeMathを使用した例
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
contract SafeMathExample {
using SafeMath for uint256;
uint256 public value = 0;
function add(uint256 amount) public {
value = value.add(amount); // オーバーフローを防ぐ
}
function subtract(uint256 amount) public {
value = value.sub(amount); // アンダーフローを防ぐ
}
}
動作解説
SafeMath
ライブラリを使用することで、加算や減算時にオーバーフローやアンダーフローが発生すると例外がスローされます。
3.3 オーバーフローとアンダーフローを防ぐ手動チェック
// 手動チェックを実装した例
pragma solidity ^0.8.0;
contract ManualCheck {
uint256 public value = 0;
function add(uint256 amount) public {
require(value + amount >= value, "Overflow detected");
value += amount;
}
function subtract(uint256 amount) public {
require(value >= amount, "Underflow detected");
value -= amount;
}
}
動作解説
手動で条件をチェックすることで、オーバーフローやアンダーフローの発生を防ぎます。この方法は、特定の条件でより詳細なエラー処理が必要な場合に役立ちます。
4. 練習問題
以下の課題に挑戦してみましょう:
- オーバーフローとアンダーフローを防ぐために
SafeMath
を使用したスマートコントラクトを作成してください。 - 数値操作において手動チェックを追加し、例外処理を適切に実装してください。
5. まとめ
本記事では、オーバーフローとアンダーフローの仕組み、具体例、および防止策について解説しました。これらの対策を実践することで、スマートコントラクトの安全性を大幅に向上させることができます。