solidityでは状態を元に戻す例外が使われている。assert()もrequire()も
変更を元に戻して例外を返す。assert()は内部エラーの検証や不変量の確認に使われ、
require()はインプットやコントラクタの状態変数が有効かの確認に使われる。
下の例ではrequire()がインプット(msg.value)が偶数かチェックし、assert()はコントラクトの
の結果の正しさをチェックしている。
exception.sol
contract Sharer {
function sendHalf(address addr) public payable returns (uint balance) {
require(msg.value % 2 == 0);
uint balanceBeforeTransfer = this.balance;
addr.transfer(msg.value / 2);
assert(this.balance == balanceBeforeTransfer - msg.value / 2);
return this.balance;
}
}
またassert()はすべてのGasを使い切るが、require()は残ったGasを返却する。