블록체인 학습
0 XP

Chapter 15 마무리 테스트

커스텀 에러, modifier 기반 접근 제어, 외부 호출을 감싸는 try / catch 까지 떠올리며 자산을 안전하게 다루는 컨트랙트를 완성하세요.

이 장에서 배운 것

  • require / revert / assert 의 역할 구분: 입력 검증 / 흐름 제어형 되돌리기 / 내부 불변식 검사.
  • 커스텀 에러(error): 문자열 메시지 대신 4바이트 선택자로 인코딩되어 gas 를 아끼고, 진단값을 함께 전달합니다. revert Name(...) 로 발생시킵니다.
  • 접근 제어: modifier 안에서 require 로 권한을 검사해 함수 진입을 막습니다.
  • 이벤트: 성공한 상태 변경을 온체인에 기록해 추적 가능하게 합니다.
  • try / catch: 외부 호출과 컨트랙트 생성의 실패를 격리할 때 씁니다. 이번 과제는 단일 컨트랙트라 직접 쓰지는 않습니다.

떠올릴 구조

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
error NotEnough(uint256 requested, uint256 available);
 
contract Example {
    address public owner;
    uint256 public funds;
    event Spent(uint256 amount);
 
    constructor() { owner = msg.sender; }
 
    modifier onlyOwner() {
        require(msg.sender == owner, "not owner");
        _;
    }
}

해야 할 일:

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

접근 제어(modifier + require), 잔액 검증(커스텀 에러), 기록(event). 각 도구의 역할을 떠올리며 작성하세요.

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

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

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