Error
In Solidity, developers can define errors in three main forms: revert
, require
, and assert
. The main differences between these methods from a functional perspective are two-fold:
- Whether they can throw developer-defined error reasons;
- Whether they can throw developer-defined errors carrying variables;
The main differences are as follows:
Type | Custom Reason | Carries Variable | Example |
---|---|---|---|
revert | ✅ | ✅ | Reason: UnauthorizedAccess(0x05D01CAF54524A610CCF187082201120757f7AE5) |
require | ✅ | ❌ | Reason: UnauthorizedAccess |
assert | ❌ | ❌ | Reason: Assertion violated |
DemoCode
Below, we use the three forms of errors to observe the changes in gas usage:
contract Error {
error UnauthorizedAccess();
// gas: 164
function errorRevert() external pure {
if (true) revert UnauthorizedAccess();
}
// gas: 268
function errorRequire() external pure {
require(false, "UnauthorizedAccess");
}
// gas: 180
function errorAssert() external pure {
assert(false);
}
}
the gas optimization suggestions are as follows:
🌟1. revert
is the most recommended as it can throw error messages as well as related variables.
🌟2. The string in require
is stored on-chain, which not only consumes more gas but also increases the contract size. It is recommended to choose based on actual needs.
🌟3. If there's a scenario where assert
is used, it's suggested to replace it with revert
.