이번 게시글에서는 Solidity의 표현식 문법 중 하나인 unchecked에 대해 알아보겠습니다.
Solidity의 0.7 버젼 이하는 Overflow와 Underflow 애러를 검사해주지 않았습니다.
Overflow : 컴퓨터의 정수 연산의 계산 결과가 허용 범위를 초과할 때 발생하는 오류.
Underflow : Overflow의 반대되는 개념으로서 컴퓨터의 정수 연산의 결과가 취급할 수 있는 수의 범위보다 작을 때 발생하는 오류
> 위 함수 코드 보기
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Unchecked {
function getMaxUint() public pure returns(uint) {
return type(uint256).max;
}
function getMinUint() public pure returns(uint) {
return type(uint256).min;
}
}
ㅤ
EVM에서 표현할 수 있는 가장 큰 숫자는 2²⁵⁶-1, 가장 작은 숫자는 0입니다.
만약 Smart Contract의 전역 변수에 2²⁵⁶-1보다 큰 수가 저장되면 Overflow가 발동하여 자동으로 0이 저장됩니다.
만약 Smart Contract의 전역 변수에 0보다 작은 수가 저장되면 Underflow가 발동하여 자동으로 2²⁵⁶-1이 저장됩니다.
때문에 해당 애러로 인해 스마트 컨트렉트가 공격당하는 사례가 빈번하게 발생했습니다.
Soldity는 0.8 업데이트 이후, 모든 산술 연산 시 Overflow와 Underflow를 검사합니다. 이로 인해 해당 애러는 잡혔지만, 애러 검사 진행 시, 추가적인 가스비가 발생합니다.
Solidity의 표현식 문법 중 하나인 unchecked는 산술 연산 시, 연산의 Overflow와 Underflow 애러 검사를 하지 않고 코드를 실행시켜줍니다. 때문에 애러 검사에 필요한 가스비가 발생하지 않습니다.
> Solidity Unchecked 공식 문서
https://docs.soliditylang.org/en/v0.8.17/control-structures.html#checked-or-unchecked-arithmetic
🛠 Example Code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Unchecked {
// Execution cost : 22285
function JustdAdd(uint x, uint y) public pure returns(uint) {
return x + y;
}
// Execution cost : 22125 gas
function UncheckedAdd(uint x, uint y) public pure returns(uint) {
unchecked {
return x + y;
}
}
}
x와 y를 더하는 단순한 로직이지만,
function JustAdd()는 unchecked 적용이 안돼 있고, function UncheckedAdd()는 unchecked가 적용되어 있습니다.
2022.11.27 기준 Ethereum Average Gas : 9 gwei
function JustAdd() Gas fee = 22285 * 9 = 200565 gwei => 0.000200565 ether
function UncheckedAdd() Gas fee = 22125 * 9 = 199125 gwei => 0.000199125 ether
Total gas fee(KRW) : 0.000200565 - 0.000199125 = 0.00000114 ether ≒ 2.304 KRW
unchecked를 사용함에 따라 약 2.304원의 수수료 차이가 발생합니다. 물론 아주 작은 수수료의 차이입니다.
하지만 단순 x + y가 아닌 디파이 프로토콜이나 알고리즘 같은 경우, 한 번의 트랜잭션에 복잡하고 다양한 공식이 여러 개 실행되기에 가스비가 몇 배로 발생할 수 있습니다. 이런 경우 unchecked는 트랜잭션 가스비를 최적화하기 위해 충분히 고려할만한 부분입니다.
지금까지 Solidity의 unchecked 문법에 대해 알아봤습니다.
감사합니다.
📝 Example Code GitHub :
https://github.com/imelon2/My-Solidity-Playground/blob/main/Tool/Unchecked.sol
'Block Chain > Solidity' 카테고리의 다른 글
[Solidity] 비트마스크(BitMask) 연산 || Solidity 0.8 | Operators || (0) | 2023.01.09 |
---|---|
[Solidity] Array Memory에서 사용하는 방법 || Solidity 0.8 || (0) | 2022.12.17 |
[Solidity] Event || emit | indexed | ethers | Solidity 0.8 || (0) | 2022.11.21 |
[Solidity] 가스비(gas fee) 줄이는 코딩 방법 || Solidity 0.8 || KR (0) | 2022.10.06 |
[Solidity] Access Control 구현 || Grant & Revoke Role | Solidity 0.8 || KR (2) | 2022.10.01 |
댓글