블록체인 학습
0 XP

실습: 투표 이벤트 추가

컨트랙트의 핵심 기능은 모두 갖췄습니다. 이제 바깥에 알리는 event 를 더할 차례입니다. 투표가 일어날 때마다 이벤트를 발행하면, 블록체인 밖의 애플리케이션(웹 프런트엔드, 인덱서, 알림 서비스 등)이 그 로그를 구독해 실시간으로 투표 현황을 추적할 수 있습니다.

득표 수가 저장되는데도 이벤트가 필요한 이유

상태 변수(candidates)에 득표 수가 이미 저장되는데 왜 이벤트가 또 필요할까요? 상태를 읽으려면 누군가 능동적으로 조회해야 하지만, 이벤트는 트랜잭션이 일어나는 순간 로그로 기록 되어 외부 앱이 "방금 누가 어디에 투표했다" 는 사실을 즉시 알 수 있습니다. 게다가 이벤트 로그는 상태 저장보다 가스가 저렴해, 변화 알림 용도로 효율적입니다.

indexed 매개변수

이벤트 매개변수에 indexed 를 붙이면, 나중에 그 값을 필터 키 로 써서 특정 로그만 골라낼 수 있습니다. 예컨대 투표자 주소에 indexed 를 붙이면 "특정 주소가 던진 모든 표" 를 빠르게 검색할 수 있습니다. 한 이벤트에 indexed 는 최대 3개까지 붙일 수 있습니다.

event Voted(address indexed voter, uint256 index);

발행할 때는 선언된 이벤트 앞에 emit 키워드를 붙입니다.

emit Voted(msg.sender, index);

해야 할 일:

  1. 앞 강의의 투표 컨트랙트 구조(hasVoted 매핑, notVotedYet modifier, 조회 함수 getVoteCount · getCandidateCount 포함)를 그대로 유지하세요.
  2. Voted(address indexed voter, uint256 index) 이벤트를 선언하세요.
  3. vote 함수 안에서 득표 수를 늘린 뒤 emit Voted(msg.sender, index); 로 이벤트를 발행하세요.

이벤트는 컨트랙트 내부에서는 읽을 수 없습니다. 오직 블록체인 밖(클라이언트, 로그 조회)에서만 꺼내 쓰는 외부용 알림 수단입니다.

완성 후 Run 으로 조건을 확인하세요.

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

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