블록체인 학습
0 XP

Chapter 14 마무리 테스트

인터페이스와 라이브러리를 함께 사용해 작은 토큰 잔액 관리 컨트랙트를 완성하세요. 이번 장에서 배운 개념(interface·library·event·자동 getter)을 한 컨트랙트에 녹여내는 종합 문제입니다.

이번 과제에는 abstract 컨트랙트가 등장하지 않습니다. 미구현 함수를 남긴 반쯤 완성된 부모가 필요한 상황이 아니기 때문입니다. abstract 의 쓰임새는 4~6 강에서 다룬 내용을 복습하세요.

만들 컨트랙트

간단한 은행(Bank) 컨트랙트입니다. 사용자별 잔액을 mapping 으로 관리하고, 출금 시 잔액 계산 라이브러리(Balances.sub)로 잔액을 줄인 뒤 event 를 발행해 출금 기록을 로그로 남깁니다.

Solidity 0.8.0 부터는 오버플로·언더플로를 컴파일러가 자동으로 검사해 Panic 으로 되돌리므로, 예전에 쓰던 SafeMath 같은 라이브러리는 더 이상 필요하지 않습니다. 여기서 뺄셈을 라이브러리로 분리하는 이유는 "안전성 추가"가 아니라 재사용과 가독성 입니다.

세 가지를 어떻게 엮는가

  • public mapping(address => uint256) balanceOf 는 balanceOf(address) 형태의 getter 를 자동 생성하므로, IBank 인터페이스의 balanceOf 약속을 그대로 충족합니다.
  • 잔액 차감은 library 의 internal pure 함수로 분리해 재사용성과 가독성을 높입니다.
  • 상태 변화(출금)는 반드시 event 로 기록해 외부에서 추적할 수 있게 합니다.

해야 할 일:

  1. Balances 라이브러리에 sub(uint256 a, uint256 b) 함수를 만드세요. (internal pure, a - b 반환)
  2. IBank 인터페이스에는 balanceOf(address) 와 withdraw(uint256) 가 약속되어 있습니다.
  3. Bank 컨트랙트가 IBank 를 상속(is) 하도록 만드세요.
  4. balanceOf 라는 public mapping(address => uint256) 상태 변수를 선언하세요. (인터페이스의 getter 와 매칭)
  5. Withdrawn(address user, uint256 amount) 이벤트를 선언하세요.
  6. withdraw(uint256 amount) 함수를 구현하세요. (external override)
    • Balances.sub 를 사용해 호출자(msg.sender)의 잔액을 줄이세요.
    • Withdrawn 이벤트를 emit 하세요.

public mapping 은 balanceOf(address) 형태의 getter 를 자동 생성하므로 인터페이스 요구를 그대로 충족합니다.

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

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