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로 기록해 외부에서 추적할 수 있게 합니다.
해야 할 일:
Balances라이브러리에sub(uint256 a, uint256 b)함수를 만드세요. (internal pure,a - b반환)IBank인터페이스에는balanceOf(address)와withdraw(uint256)가 약속되어 있습니다.Bank컨트랙트가IBank를 상속(is) 하도록 만드세요.balanceOf라는public mapping(address => uint256)상태 변수를 선언하세요. (인터페이스의 getter 와 매칭)Withdrawn(address user, uint256 amount)이벤트를 선언하세요.withdraw(uint256 amount)함수를 구현하세요. (external override)Balances.sub를 사용해 호출자(msg.sender)의 잔액을 줄이세요.Withdrawn이벤트를 emit 하세요.
public mapping 은 balanceOf(address) 형태의 getter 를 자동 생성하므로 인터페이스 요구를 그대로
충족합니다.