실습: 돼지저금통 컨트랙트
이번 차시에서 배운 조각들을 하나로 모아 봅시다. payable 입금, address.balance 잔액 조회,
이벤트(event), call 송금, 그리고 접근 제어(require) 까지 지금까지 배운 개념을 한
컨트랙트 안에서 모두 쓰는 실전 예제입니다. 만들 것은 돼지저금통(PiggyBank) 입니다. 누구나
자유롭게 입금할 수 있지만, 주인(owner)만 전액을 인출할 수 있는 구조입니다.
설계의 핵심은 "권한의 분리"입니다. 입금(deposit)은 누구에게나 열려 있어야 하므로 제한이 없고,
인출(withdraw)은 자금을 가져가는 민감한 동작이므로 require(msg.sender == owner, ...) 로
주인만 호출하도록 막습니다. 주인은 컨트랙트가 생성되는 순간의 호출자(msg.sender)로 한 번만
정해 두면 됩니다.
해야 할 일:
PiggyBank컨트랙트를 선언하세요.owner라는publicaddress상태 변수를 선언하고, 생성자에서msg.sender로 설정하세요.Deposited라는 이벤트를 선언하세요(보낸 사람과 금액을 담아도 좋습니다).depositpayable함수에서 입금받고Deposited이벤트를 발생(emit)시키세요.withdraw함수에서require(msg.sender == owner, ...)로 주인만 호출하게 하고, 컨트랙트 전액을 owner 에게call로 보내세요.
컨트랙트 전액은 address(this).balance 로 읽을 수 있습니다. 주인 주소는 payable(owner) 로
변환해야 call 로 Ether 를 보낼 수 있습니다.
인출은 자금을 외부로 내보내는 위험한 동작입니다. call 의 성공 여부를 require 로 반드시
확인하고, 실무에서는 재진입 방지를 위해 Checks-Effects-Interactions 패턴도 함께 적용합니다.
완성 후 Run 을 눌러 모든 조건을 통과하는지 확인하세요.