블록체인 학습
0 XP

실습: mapping 종합 - 미니 토큰 잔액

지금까지 배운 mapping 과 중첩 mapping 을 한데 모아 간단한 토큰 잔액 컨트랙트를 만들어봅시다. ERC-20 토큰의 핵심 구조를 축소판으로 직접 구현해 보는 종합 과제입니다.

ERC-20 같은 토큰은 내부적으로 balances(주소 → 잔액)와 allowance(소유자 → 위임자 → 한도) 라는 두 mapping 으로 잔액과 권한을 관리합니다. 토큰 컨트랙트의 뼈대가 곧 이번 차시에서 배운 mapping 과 중첩 mapping 의 조합인 셈입니다.

실습에 등장하는 event 와 emit

이번 실습에는 아직 배우지 않은 event 가 하나 등장합니다. event 는 "이런 일이 일어났다" 는 사실을 블록체인 로그 에 남겨 외부 앱이 읽을 수 있게 하는 장치입니다. 컨트랙트 상단에 event 이름(타입 인자, ...); 로 선언 하고, 함수 안에서 emit 이름(값, ...); 으로 발행 합니다. 지금은 이 두 줄의 형태만 그대로 따라 써도 충분합니다. 원리와 활용법은 Chapter 10 에서 자세히 배웁니다.

event Transfer(address from, address to, uint256 value); // 선언
emit Transfer(msg.sender, to, amount);                   // 발행

핵심 문법 복습

  • 잔액 증가: balances[msg.sender] += amount
  • 위임 한도 설정: allowance[msg.sender][spender] = amount (key 두 개)
  • 이벤트 발생: emit Transfer(from, to, value)

해야 할 일:

  1. MiniToken 컨트랙트를 선언하세요.
  2. 주소 → 잔액(uint256)을 연결하는 public mapping balances 를 선언하세요.
  3. owner → (spender → 금액) 형태의 중첩 public mapping allowance 를 선언하세요.
  4. Transfer(address from, address to, uint256 value) 이벤트를 선언하세요.
  5. mint(uint256 amount) 함수: msg.sender 의 잔액을 amount 만큼 늘립니다.
  6. approve(address spender, uint256 amount) 함수: allowance[msg.sender][spender] 를 amount 로 설정합니다.
  7. transfer(address to, uint256 amount) 함수: msg.sender 잔액에서 amount 를 빼 to 에게 더하고, Transfer 이벤트를 발생시킵니다.

잔액이 부족하면 안 되므로 require(balances[msg.sender] >= amount, "insufficient balance"); 으로 먼저 확인하세요.

잔액을 옮길 때는 보내는 쪽에서 먼저 빼고(-=) 받는 쪽에 더하는(+=) 순서를 지키세요. mapping 의 기본값이 0 이므로, 처음 받는 주소도 0 + amount 로 자연스럽게 처리됩니다.

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

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