실습: 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)
해야 할 일:
MiniToken컨트랙트를 선언하세요.- 주소 → 잔액(
uint256)을 연결하는publicmappingbalances를 선언하세요. - owner → (spender → 금액) 형태의 중첩
publicmappingallowance를 선언하세요. Transfer(address from, address to, uint256 value)이벤트를 선언하세요.mint(uint256 amount)함수:msg.sender의 잔액을amount만큼 늘립니다.approve(address spender, uint256 amount)함수:allowance[msg.sender][spender]를amount로 설정합니다.transfer(address to, uint256 amount)함수:msg.sender잔액에서amount를 빼to에게 더하고,Transfer이벤트를 발생시킵니다.
잔액이 부족하면 안 되므로 require(balances[msg.sender] >= amount, "insufficient balance"); 으로 먼저 확인하세요.
잔액을 옮길 때는 보내는 쪽에서 먼저 빼고(-=) 받는 쪽에 더하는(+=) 순서를 지키세요. mapping
의 기본값이 0 이므로, 처음 받는 주소도 0 + amount 로 자연스럽게 처리됩니다.