블록체인 학습
0 XP

실습: 이벤트 종합 - 입출금 은행

이번 종합 실습에서는 이 차시에서 배운 이벤트 선언, emit 발행, indexed 매개변수, 그리고 상태 변수(매핑) 를 모두 활용해 간단한 은행 컨트랙트를 완성합니다.

은행의 잔액(balances)은 컨트랙트가 입출금할 때마다 다시 읽고 갱신해야 하므로 상태 변수(매핑)에 저장합니다. 반면 "입금이 일어났다", "출금이 일어났다"는 사건은 외부 앱이 알아야 하니 이벤트로 발행합니다. 이렇게 역할을 나누는 것이 실무의 기본 구조입니다.

Deposit 과 Withdraw 이벤트의 account 에 indexed 를 붙이면, 그 값이 topic 으로 저장되어 "특정 사용자의 입출금 내역만" 빠르게 필터링할 수 있습니다. 금액(amount)은 검색 기준이 아니므로 일반 인자로 둡니다.

해야 할 일:

  1. EventBank 컨트랙트를 만드세요.
  2. balances 라는 public 매핑(address => uint256)을 선언하세요.
  3. Deposit 이벤트를 선언하세요. 매개변수는 address indexed account 와 uint256 amount 입니다.
  4. Withdraw 이벤트를 선언하세요. 매개변수는 address indexed account 와 uint256 amount 입니다.
  5. deposit(uint256 amount) 함수: balances[msg.sender] 를 늘리고 Deposit 이벤트를 발행하세요.
  6. withdraw(uint256 amount) 함수: 잔액이 충분한지 require 로 확인하고, 잔액을 줄인 뒤 Withdraw 이벤트를 발행하세요.

withdraw 에서 require 를 통과하지 못해 revert 되면, 그 트랜잭션에서 발행하려던 이벤트도 함께 취소됩니다. 그래서 검증 → 갱신 → emit 순서가 안전합니다.

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

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

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