Ethereum-Solidity 퀴즈 Q29: Overflow/Underflow란?
Source: Dev.to
오버플로우와 언더플로우
오버플로우와 언더플로우는 계산 결과가 변수 데이터 타입의 고정 범위를 벗어날 때 발생하는 산술 오류입니다.
| 용어 | 발생 상황 | 예시 (uint8: 범위 0–255) |
|---|---|---|
| Overflow | 최대값을 초과하면 숫자가 “처음으로” 돌아갑니다. | 255 + 1 --> 0 |
| Underflow | 최소값 이하로 내려가면 숫자가 “맨 위로” 점프합니다. | 0 - 1 --> 255 |
Solidity 0.8.0 이전 버전
버전 0.8.0 이전에는 Solidity가 이러한 오류를 검사하지 않았습니다. 개발자는 SafeMath와 같은 라이브러리를 사용해 오버플로우와 언더플로우를 방지해야 했습니다.
Solidity 0.8.0 이후
Solidity 0.8.0부터는 컴파일러에 내장된 검사가 포함됩니다. 오버플로우나 언더플로우가 발생하면 트랜잭션이 자동으로 Panic 오류와 함께 되돌아갑니다.
unchecked 블록
계산이 안전하다고 확신하고 가스 절감을 위해 검사를 건너뛰고 싶다면, 코드를 unchecked 블록으로 감쌀 수 있습니다:
// This will NOT revert; it will wrap around to 0
unchecked {
uint8 x = 255;
x++;
}
타입 캐스팅 주의
Solidity 0.8.0+에서도 큰 타입을 작은 타입으로 캐스팅할 때(예: uint256 → uint8) 되돌아가지 않고 조용히 래핑될 수 있습니다. 캐스팅하기 전에 값이 대상 타입의 범위에 들어가는지 반드시 확인하세요.
권장 사항: uint256 사용
특별한 이유(예: 데이터를 하나의 32바이트 저장 슬롯에 맞추는 경우)가 아니라면 uint256을 사용하는 것이 좋습니다. 그 방대한 범위(2^256 - 1) 덕분에 일반적인 금융 애플리케이션에서는 오버플로우가 사실상 불가능합니다.