블록체인 학습
0 XP

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)이 훨씬 저렴합니다. 대신 컨트랙트 코드 안에서는 자신이 남긴 로그 를 다시 읽을 수 없습니다.

이벤트는 외부에 알리고 검색하기 위한 기록입니다. 컨트랙트 로직이 다시 참조해야 하는 값이라면 이벤트가 아니라 상태 변수 에 저장해야 합니다.

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

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