블록체인 학습
0 XP

종합 실습: 에러 처리 통합하기

지금까지 배운 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;
    }
}

해야 할 일:

  1. SafeVault 컨트랙트를 선언하세요.
  2. owner 라는 public address 상태 변수를 두고, 생성자에서 msg.sender 로 초기화하세요.
  3. balance 라는 public uint256 상태 변수를 두세요.
  4. Overdraw(uint256 requested, uint256 available) 커스텀 에러를 선언하세요.
  5. onlyOwner 라는 modifier 를 만들어, 호출자가 owner 가 아니면 require 로 되돌리세요.
  6. deposit(uint256 amount) 함수: onlyOwner 를 적용하고 balance 에 amount 를 더하세요.
  7. withdraw(uint256 amount) 함수: onlyOwner 를 적용하고, amount 가 balance 보다 크면 revert Overdraw(amount, balance), 아니면 차감하세요.

접근 제어는 modifier + require, 잔액 검증은 커스텀 에러. 각 도구를 역할에 맞게 나눠 쓰세요.

완성 후 Run 을 눌러 컴파일하고 모든 조건을 통과하는지 확인하세요.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.