Skip to main content

Unchecked

We know that before the Solidity version 0.8, it was necessary to manually import the SafeMath library to ensure data safety and avoid overflow, thereby preventing overflow attacks.

After Solidity version 0.8, Solidity performs a check every time there is a data change to determine whether there is an overflow, thus deciding whether to throw an exception.

This also means that the check incurs additional gas costs. By using unchecked wisely, it is possible to effectively remove the intermediate checking step, thus achieving the purpose of saving gas.

Learn more: Checked or Unchecked Arithmetic

Demo Code

Below, we demonstrate using both a conventional for-loop and an unchecked for-loop. Note that since iterations is already of type uint256, there will not be an overflow issue.

contract UncheckedExample {
// gas: 1910309
function conventionalForLoop(uint256 iterations) external pure returns (uint256 result) {
for (uint256 index = 0; index < iterations; index++) {
result = index + 1;
}
}

// gas: 570287
function uncheckedForLoop(uint256 iterations) external pure returns (uint256 result) {
for (uint256 index = 0; index < iterations; ) {
unchecked {
result = index + 1;
index++;
}
}
}
}

Recommendations for gas optimization:

🌟 In situations where security is controllable, the unchecked block can be used to save gas.