Solidity에서 예외 처리를 위해 주로 사용되는 함수는 require()와 revert()입니다. 이 두 함수는 조건이 충족되지 않을 경우 트랜잭션을 되돌리고 상태 변경을 취소하는 데 사용됩니다. 그러나 사용 목적과 상황에 따라 차이가 있습니다.
require() 함수:
- 용도: 주로 입력 값 검증, 함수 전제 조건 확인, 외부 계약 호출의 반환 값 검증 등에 사용됩니다. 예를 들어, 함수가 실행되기 전에 특정 조건이 만족되는지 확인할 때 사용합니다.
- 동작: 조건이
false일 경우, 트랜잭션을 되돌리고 남은 가스를 호출자에게 반환합니다. 또한, 오류 메시지를 제공하여 문제의 원인을 설명할 수 있습니다. - 예시:
function transfer(address recipient, uint amount) public {
require(balance[msg.sender] >= amount, "Insufficient balance");
balance[msg.sender] -= amount;
balance[recipient] += amount;
}
위 코드에서 require는 송신자의 잔액이 전송하려는 금액보다 크거나 같은지 확인합니다. 조건이 만족되지 않으면 트랜잭션이 되돌려집니다.
revert() 함수:
- 용도: 보다 복잡한 조건을 처리하거나 특정 분기에서 트랜잭션을 명시적으로 되돌리고자 할 때 사용됩니다.
if문과 함께 사용되어 특정 조건에서 트랜잭션을 중단시킬 수 있습니다. - 동작:
revert()가 호출되면, 트랜잭션이 즉시 되돌려지고 남은 가스는 호출자에게 반환됩니다. 또한, 오류 메시지를 포함시켜 문제의 원인을 전달할 수 있습니다. - 예시:
function withdraw(uint amount) public {
if (balance[msg.sender] < amount) {
revert("Insufficient balance to withdraw");
}
balance[msg.sender] -= amount;
payable(msg.sender).transfer(amount);
}
위 코드에서 revert는 조건이 만족되지 않을 경우 트랜잭션을 되돌리고 오류 메시지를 제공합니다.
require()와 revert()의 비교:
- 사용 시점:
require()는 주로 함수의 초반에 전제 조건을 확인할 때 사용되며,revert()는 함수 실행 중 특정 조건에서 트랜잭션을 중단시킬 때 사용됩니다. - 가스 반환: 두 함수 모두 조건이 만족되지 않을 경우 트랜잭션을 되돌리고 남은 가스를 호출자에게 반환합니다.
- 오류 메시지: 두 함수 모두 오류 메시지를 제공할 수 있지만,
require()는 간단한 조건 검증에,revert()는 보다 복잡한 로직이나 조건에 적합합니다.
요약하면, require()는 함수 실행 전에 입력 값이나 상태를 검증하는 데 사용되며, revert()는 함수 실행 중 특정 조건에서 트랜잭션을 명시적으로 되돌리고자 할 때 사용됩니다. 적절한 상황에 맞게 이들 함수를 활용하여 스마트 컨트랙트의 안정성과 신뢰성을 높일 수 있습니다.
'Solidity' 카테고리의 다른 글
| 함수 인자, 변수의 저장위치 설정 : memory vs. calldata (0) | 2025.03.19 |
|---|---|
| Ether 전송 : transfer() vs call() (0) | 2025.03.19 |
| Over/UnderFlow 검사의 의도적 비활성화 - unchecked (0) | 2025.02.21 |
| 재진입공격 방지기법-nonReentrant (0) | 2025.02.21 |
| Solidity 에서 메모리 읽기 - mload() 와 add() (0) | 2025.02.20 |