Solidity의 정수 오버플로 및 언더플로

오버플로와 언더플로는 무엇을 의미합니까?



간단히 말해서 오버플로는 uint(부호 없는 정수)가 바이트 크기에 도달하는 상황입니다. 그런 다음 추가된 다음 요소는 첫 번째 변수 요소를 반환합니다.

8비트만 가질 수 있는 uint8이 있다고 가정해 보겠습니다. 즉, 우리가 저장할 수 있는 가장 큰 숫자는 이진수 11111111(십진수로 2^8 - 1 = 255)입니다.

아래 코드를 보세요.

uint8 balance = 255;
balance++;


위의 코드를 실행하면 "잔액"은 0이 됩니다. 이것은 오버플로의 간단한 예입니다. 이진수 11111111에 1을 더하면 다시 00000000으로 재설정됩니다.

Underflow의 경우 0인 uint8에서 1을 빼면 255로 값이 변경됩니다.

이제 Solidity에서 언더플로를 간단하게 구현하는 방법을 보여드리겠습니다.
"ChangeBalance.sol"이라는 간단한 스마트 계약을 만들어 봅시다. 이 예제에서는 Solidity 0.8이 확보되었으므로 Solidity 0.7을 사용하겠습니다.

pragma solidity 0.7.0;

contract ChangeBalance {
    uint8 public balance;

    function decrease() public {
        balance--;
    }

    function increase() public {
        balance++;
    }
}




스마트 계약을 컴파일하고 배포해 봅시다. 보시다시피 초기 잔액은 0입니다.



"감소"버튼을 누르면 "잔액"이 1씩 감소합니다. 다음에 무슨 일이 일어나는지 봅시다.



보시다시피 업데이트된 잔액은 이제 255입니다.

Solidity에서 오버플로와 언더플로를 피하는 방법은 무엇입니까?



가장 쉬운 방법은 최소 0.8 버전의 Solidity 컴파일러를 사용하는 것입니다. Solidity 0.8에서는 컴파일러가 자동으로 오버플로 및 언더플로 검사를 처리합니다.

실제로 어떻게 작동하는지 보여 드리겠습니다. 이를 위해 컴파일러 버전을 변경하고 새 계약을 배포합니다.

pragma solidity 0.8.0;

contract ChangeBalance {
    uint8 public balance;

    function decrease() public {
        balance--;
    }

    function increase() public {
        balance++;
    }
}


초기 잔액은 동일합니다. 즉, 0입니다.



"감소"를 눌렀을 때 무슨 일이 일어났는지 봅시다. 이제 Remix 콘솔에 오류가 표시됩니다.

좋은 웹페이지 즐겨찾기