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");
_;
}
}해야 할 일:
Treasury컨트랙트를 선언하세요.owner라는public address상태 변수를 두고, 생성자에서msg.sender로 초기화하세요.funds라는public uint256상태 변수를 두세요.NotEnough(uint256 requested, uint256 available)커스텀 에러를 선언하세요.Spent(uint256 amount)이벤트를 선언하세요.onlyOwnermodifier 를 만들어 호출자가owner가 아니면require로 되돌리세요.addFunds(uint256 amount)함수:onlyOwner적용,funds에amount를 더하세요.spend(uint256 amount)함수:onlyOwner적용,amount가funds보다 크면revert NotEnough(amount, funds), 아니면funds에서 차감하고Spent(amount)이벤트를 발생시키세요.
접근 제어(modifier + require), 잔액 검증(커스텀 에러), 기록(event). 각 도구의 역할을 떠올리며 작성하세요.
완성 후 Run 을 눌러 컴파일하고 모든 조건을 통과하는지 확인하세요.