블록체인 학습
0 XP

실습: 돼지저금통 컨트랙트

이번 차시에서 배운 조각들을 하나로 모아 봅시다. payable 입금, address.balance 잔액 조회, 이벤트(event), call 송금, 그리고 접근 제어(require) 까지 지금까지 배운 개념을 한 컨트랙트 안에서 모두 쓰는 실전 예제입니다. 만들 것은 돼지저금통(PiggyBank) 입니다. 누구나 자유롭게 입금할 수 있지만, 주인(owner)만 전액을 인출할 수 있는 구조입니다.

설계의 핵심은 "권한의 분리"입니다. 입금(deposit)은 누구에게나 열려 있어야 하므로 제한이 없고, 인출(withdraw)은 자금을 가져가는 민감한 동작이므로 require(msg.sender == owner, ...) 로 주인만 호출하도록 막습니다. 주인은 컨트랙트가 생성되는 순간의 호출자(msg.sender)로 한 번만 정해 두면 됩니다.

해야 할 일:

  1. PiggyBank 컨트랙트를 선언하세요.
  2. owner 라는 public address 상태 변수를 선언하고, 생성자에서 msg.sender 로 설정하세요.
  3. Deposited 라는 이벤트를 선언하세요(보낸 사람과 금액을 담아도 좋습니다).
  4. deposit payable 함수에서 입금받고 Deposited 이벤트를 발생(emit)시키세요.
  5. withdraw 함수에서 require(msg.sender == owner, ...) 로 주인만 호출하게 하고, 컨트랙트 전액을 owner 에게 call 로 보내세요.

컨트랙트 전액은 address(this).balance 로 읽을 수 있습니다. 주인 주소는 payable(owner) 로 변환해야 call 로 Ether 를 보낼 수 있습니다.

인출은 자금을 외부로 내보내는 위험한 동작입니다. call 의 성공 여부를 require 로 반드시 확인하고, 실무에서는 재진입 방지를 위해 Checks-Effects-Interactions 패턴도 함께 적용합니다.

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

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

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