종합 실습: 에러 처리 통합하기
지금까지 배운 require, 커스텀 에러, try / catch 를 한 컨트랙트에서 함께 사용해봅니다.
관리자만 입금할 수 있고, 잔액보다 많이 출금하면 커스텀 에러로 되돌리는 금고를 완성하세요.
실전 컨트랙트는 한 가지 에러 도구만 쓰지 않습니다. 각 도구를 역할에 맞게 나눠 씁니다.
- 접근 제어(관리자만 호출):
modifier안에서require로 권한을 검사합니다. - 잔액·한도 검증: 가스를 아끼고 진단값을 함께 전달하기 위해 커스텀 에러(
revert Name(...))를 씁니다. - 두 검증은 함수의 가장 앞에서 통과시키고, 그 뒤에 상태를 변경합니다(체크 먼저, 변경 나중).
떠올릴 패턴
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
error Overdraw(uint256 requested, uint256 available);
contract Example {
address public owner = msg.sender;
uint256 public balance;
modifier onlyOwner() {
require(msg.sender == owner, "not owner");
_;
}
function take(uint256 amount) public onlyOwner {
if (amount > balance) revert Overdraw(amount, balance);
balance -= amount;
}
}해야 할 일:
SafeVault컨트랙트를 선언하세요.owner라는public address상태 변수를 두고, 생성자에서msg.sender로 초기화하세요.balance라는public uint256상태 변수를 두세요.Overdraw(uint256 requested, uint256 available)커스텀 에러를 선언하세요.onlyOwner라는 modifier 를 만들어, 호출자가owner가 아니면require로 되돌리세요.deposit(uint256 amount)함수:onlyOwner를 적용하고balance에amount를 더하세요.withdraw(uint256 amount)함수:onlyOwner를 적용하고,amount가balance보다 크면revert Overdraw(amount, balance), 아니면 차감하세요.
접근 제어는 modifier + require, 잔액 검증은 커스텀 에러. 각 도구를 역할에 맞게 나눠 쓰세요.
완성 후 Run 을 눌러 컴파일하고 모든 조건을 통과하는지 확인하세요.