require 와 assert 는 Solidity 에서 조건을 확인하고 예외를 처리하기 위해 사용되며, 용도와 작동 방식에서 큰 차이를 가집니다.
require
용도
- 사용자 입력 검증: 함수의 입력 값이 적합한지 확인
- 상태 검증: 실행 전에 계약 상태가 적절한지 확인
- 외부 호출 성공 여부 확인: 외부 컨트랙트 호출이 성공했는지 확인
작동방식
- 조건이 false 인 경우, 예외를 발생시키고, 현재 실행 중인 트랜잭션을 되돌립니다.
- 모든 변경된 상태는 롤백되며, 사용된 가스는 소비되지 않은 부분이 환불됩니다.
사용 예
function transfer(uint256 amount) public {
require(amount > 0, "Amount must be greater than 0");
}
assert
용도
- 논리적 불변성 검사: 절대 변하지 않아야 할 상태르 ㄹ확인
- 개발자 실수 방지: 코드의 논리적 오류를 확인
작동방식
- 조건이 false 인 경우, 예외를 발생시키고 트랜잭션을 되돌립니다.
- 상태를 롤백하지만, 사용된 가스는 환불되지 않습니다.
- assert의 실패는 코드에 치명적인 버그가 있음을 나타냅니다.
- Solidity 0.8.0 부터는 언더플로우 및 오버플로우 검사에도 사용됩니다.
function calculate(uint256 x, uint256 y) public pure returns (uint256) {
uint256 result = x + y;
assert(result >= x); //오버플로우 확인
return result;
}
사용시 주의점
- require 는 사용자이 잘못된 입력 또는 외부 호출 오류에 대응하기 위해 사용됩니다. 예를 들어, 잘못된 토큰 송금 요청을 처리할 때 적합합니다.
- assert 는 절대적으로 보장되어야 하는 논리를 확인하기 위해 사용됩니다. 개발자의 논리적 실수 또는 코드의 중요한 결함이 발생했을 때 사용합니다.
- 가스 처리 차이를 이해하고, 사용자 입력 검증에는 반드시 require 를 사용해야 합니다.
레퍼런스
• Solidity 공식 문서 - Error Handling
'Solidity' 카테고리의 다른 글
| Ethereum 에서 사용할 수 있는 주요 오라클 서비스 (2) | 2025.01.03 |
|---|---|
| 외부 오라클을 사용한 난수 생성 방법 (5) | 2025.01.03 |
| delegate call 이란? (1) | 2025.01.03 |
| OpenZeppelin PullPayment 의 사용 사례 (0) | 2025.01.02 |
| 스마트 컨트랙트 개발 시의 보안 취약점 (1) | 2025.01.02 |