整数オーバーフローとは何ですか?
Solidity では、整数はデフォルトで 256 ビットです。加算演算を行う際に、結果が 256 ビットを超えるとオーバーフローが発生します。これにより予期しない結果が生じ、ハッカーに悪用される可能性があります。
例えば、ユーザー A が 10 個のトークンを契約に入金し、契約がトークンの残高を計算する際に、検証のない uint256 変数 balance を使用します。その後、ハッカーが非常に大きな値を入力することで演算がオーバーフローし、balance が再度 0 から計算され、ハッカーは無限にトークンを引き出すことができます。
整数オーバーフローを防ぐ方法:
安全な数学ライブラリを使用し、オーバーフローの起こりやすい演算を直接呼び出さないようにする。例えば、Safemath を使用する。
重要な変数にオーバーフローチェックを導入し、値を変更する前に新しい値が妥当かどうかを確認する。
オーバーフローの起こりやすい関数のループ呼び出しを避ける。ユーザーの呼び出し回数を制限する。
コード例: