event란?
이벤트(event) 는 스마트 컨트랙트가 블록체인에 "무슨 일이 일어났다"고 로그 를 남기는 수단입니다. 이벤트는 트랜잭션 영수증(receipt)의 로그(log) 영역에 저장되고, 컨트랙트 바깥의 프론트엔드·백엔드·블록 익스플로러가 이를 구독(subscribe) 해 상태 변화를 실시간으로 감지합니다. 컨트랙트가 외부 세계와 소통하는 가장 표준적인 통로인 셈입니다.
왜 이벤트가 필요한가?
블록체인에는 누구나 트랜잭션을 보낼 수 있지만, 그 결과를 화면에 보여주려면 "어떤 일이 벌어졌는지"를 외부 앱이 알아야 합니다. 그런데 함수가 반환하는 값(return)은 트랜잭션을 보낸 직후에 받아볼 수 없습니다. 트랜잭션이 블록에 포함되어 처리되기까지 시간이 걸리기 때문입니다.
그래서 "입금됨", "토큰 전송됨" 같은 사건은 event 로 발행하고, dApp이 이 로그 를 듣고 UI를 갱신합니다.
알림, 저렴한 기록, 검색
- 알림: 토큰 전송, 입금 같은 사건을 외부 앱에 즉시 알릴 수 있습니다.
- 저렴한 기록:
상태 변수로 영구 보관할 필요 없는 이력을로그로 값싸게 남깁니다. - 검색:
indexed매개변수를 쓰면 특정 주소가 보낸 이벤트만 빠르게 필터링할 수 있습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Logger {
// "메시지가 저장됐다"는 사실을 외부에 알리는 이벤트
event MessageStored(address indexed who, string message);
function store(string calldata message) external {
emit MessageStored(msg.sender, message); // 로그에 기록
}
}이벤트 로그 는 컨트랙트의 상태 변수 보다 저장 비용(gas)이 훨씬 저렴합니다. 대신 컨트랙트
코드 안에서는 자신이 남긴 로그 를 다시 읽을 수 없습니다.
이벤트는 외부에 알리고 검색하기 위한 기록입니다. 컨트랙트 로직이 다시 참조해야 하는 값이라면 이벤트가 아니라 상태 변수 에 저장해야 합니다.