본문 바로가기
Block Chain/Solidity

[Solidity] Unchecked || Optimization of gas cost | Solidity 0.8 ||

by 개발이 체질인 나그네 2022. 11. 27.
반응형

이번 게시글에서는 Solidity의 표현식 문법 중 하나인 unchecked에 대해 알아보겠습니다.

 

 

Solidity의 0.7 버젼 이하는 OverflowUnderflow 애러를 검사해주지 않았습니다.

Overflow : 컴퓨터의 정수 연산의 계산 결과가 허용 범위를 초과할 때 발생하는 오류.
Underflow : Overflow의 반대되는 개념으로서 컴퓨터의 정수 연산의 결과가 취급할 수 있는 수의 범위보다 작을 때 발생하는 오류

EVM Uint Max,Min Value

> 위 함수 코드 보기

더보기
// 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는 산술 연산 시, 연산의 OverflowUnderflow 애러 검사를 하지 않고 코드를 실행시켜줍니다. 때문에 애러 검사에 필요한 가스비가 발생하지 않습니다.

> 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;
        }
    }
}

 

 

(1) function JustAdd 실행 가스 비
(1) function UncheckedAdd 실행 가스 비

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

 

GitHub - imelon2/My-Solidity-Playground

Contribute to imelon2/My-Solidity-Playground development by creating an account on GitHub.

github.com

 

반응형

댓글