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 콘솔에 오류가 표시됩니다.
Reference
이 문제에 관하여(Solidity의 정수 오버플로 및 언더플로), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kamilpolak/integer-overflow-and-underflow-in-solidity-3j7h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)