실습: 커스텀 에러 선언하기
이번 실습에서는 잔액이 부족할 때 매개변수가 있는 커스텀 에러 로 거래를 되돌리는 출금 컨트랙트를 완성합니다.
require(amount <= balance, "insufficient balance") 처럼 문자열로 검증할 수도 있지만, 문자열은 바이트코드에 저장되어 배포·실행 gas 를 늘립니다. 커스텀 에러(error)는 같은 의미를 4바이트 선택자로 압축하는 데다, requested·available 같은 실제 값까지 함께 실어 보낼 수 있어 디버깅에도 유리합니다. 커스텀 에러는 revert 와 함께 발생시킨다는 점을 기억하세요.
떠올릴 패턴
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
error TooMuch(uint256 requested, uint256 available);
contract Example {
uint256 public pot;
function take(uint256 amount) public {
if (amount > pot) revert TooMuch(amount, pot);
pot -= amount;
}
}해야 할 일:
InsufficientBalance라는 커스텀 에러를 선언하세요. 매개변수는uint256 requested,uint256 available두 개입니다.Bank컨트랙트 안에balance라는public uint256상태 변수를 두세요.withdraw(uint256 amount)함수를 구현하세요.- 요청 금액
amount가balance보다 크면revert InsufficientBalance(amount, balance)로 되돌리세요. - 그렇지 않으면
balance에서amount를 차감하세요.
- 요청 금액
커스텀 에러는 error 이름(타입 인자, ...); 형태로 선언하고, revert 이름(값, ...) 로
발생시킵니다.
완성 후 Run 을 눌러 컴파일하고 모든 조건을 통과하는지 확인하세요.