실습: 투표 이벤트 추가
컨트랙트의 핵심 기능은 모두 갖췄습니다. 이제 바깥에 알리는 event 를 더할 차례입니다.
투표가 일어날 때마다 이벤트를 발행하면, 블록체인 밖의 애플리케이션(웹 프런트엔드,
인덱서, 알림 서비스 등)이 그 로그를 구독해 실시간으로 투표 현황을 추적할 수 있습니다.
득표 수가 저장되는데도 이벤트가 필요한 이유
상태 변수(candidates)에 득표 수가 이미 저장되는데 왜 이벤트가 또 필요할까요?
상태를 읽으려면 누군가 능동적으로 조회해야 하지만, 이벤트는 트랜잭션이 일어나는 순간 로그로 기록 되어
외부 앱이 "방금 누가 어디에 투표했다" 는 사실을 즉시 알 수 있습니다. 게다가 이벤트 로그는 상태 저장보다
가스가 저렴해, 변화 알림 용도로 효율적입니다.
indexed 매개변수
이벤트 매개변수에 indexed 를 붙이면, 나중에 그 값을 필터 키 로 써서 특정 로그만 골라낼 수 있습니다.
예컨대 투표자 주소에 indexed 를 붙이면 "특정 주소가 던진 모든 표" 를 빠르게 검색할 수 있습니다.
한 이벤트에 indexed 는 최대 3개까지 붙일 수 있습니다.
event Voted(address indexed voter, uint256 index);발행할 때는 선언된 이벤트 앞에 emit 키워드를 붙입니다.
emit Voted(msg.sender, index);해야 할 일:
- 앞 강의의 투표 컨트랙트 구조(
hasVoted매핑,notVotedYetmodifier, 조회 함수getVoteCount·getCandidateCount포함)를 그대로 유지하세요. Voted(address indexed voter, uint256 index)이벤트를 선언하세요.vote함수 안에서 득표 수를 늘린 뒤emit Voted(msg.sender, index);로 이벤트를 발행하세요.
이벤트는 컨트랙트 내부에서는 읽을 수 없습니다. 오직 블록체인 밖(클라이언트, 로그 조회)에서만 꺼내 쓰는 외부용 알림 수단입니다.
완성 후 Run 으로 조건을 확인하세요.