블록체인 학습
0 XP

Chapter 12 마무리 테스트

지금까지 배운 payable, msg.value, address.balance, 이벤트, call 송금, 그리고 접근 제어를 모두 한자리에 모아 간단한 기부함(DonationBox) 컨트랙트를 완성하세요. 돼지저금통 실습과 닮았지만, 이번에는 누적 기부액을 따로 기록하는 회계 로직이 추가됩니다.

여기서 꼭 구분해야 할 두 가지 숫자가 있습니다. totalDonated 는 "지금까지 들어온 총 기부액의 기록"이고, getBalance(즉 address(this).balance)는 "현재 컨트랙트에 남아 있는 잔액" 입니다. 인출이 일어나면 잔액은 줄지만 누적 기부 기록은 그대로 남으므로, 두 값은 시간이 지나며 달라집니다. 이 둘을 함께 관리하는 것이 이번 테스트의 핵심입니다.

해야 할 일:

  1. DonationBox 컨트랙트를 선언하세요.
  2. owner 라는 public address 상태 변수를 두고, 생성자에서 msg.sender 로 설정하세요.
  3. totalDonated 라는 public uint256 상태 변수로 누적 기부액을 추적하세요.
  4. Donated 이벤트를 선언하세요.
  5. donate payable 함수에서 msg.value 를 totalDonated 에 더하고 Donated 이벤트를 emit 하세요.
  6. getBalance 함수로 컨트랙트 잔액(uint256)을 반환하세요.
  7. withdraw 함수에서 owner 만 전액을 call 로 인출하게 하세요.

totalDonated 는 입금 때마다 msg.value 만큼 더해 나가는 누적 기록이고, getBalance 는 그때그때 address(this).balance 를 읽어 현재 잔액을 돌려줍니다. 인출 후 두 값이 달라지는 이유를 곱씹어 보세요.

withdraw 는 require(msg.sender == owner, ...) 로 주인만 호출하게 막고, call 의 성공 여부를 반드시 검증하세요. 자금을 다루는 함수일수록 접근 제어와 결과 확인이 중요합니다.

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

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

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