쿠쿠더님의 블로그

Solidity 스마트 컨트랙트 이벤트 본문

blockchain(solidity)

Solidity 스마트 컨트랙트 이벤트

쿠쿠더 2025. 7. 31. 16:39
  1. 이벤트란?
  2. 이벤트의 목적
  3. 이벤트와 상태변수의 차이
  4. 이벤트 작성 및 사용 방법
  5. Web2에서 이벤트 조회

1. 이벤트란?

Solidity의 이벤트는 스마트 컨트랙트 내부에서 특정 동작이 발생했을 때 블록에 로그 형태로 기록하는 기능이다.
트랜잭션이 처리되는 과정에서 emit 키워드로 호출되며, 로그 트라이(log trie)에 저장된다.


2. 이벤트의 목적

1. 외부 시스템(Web2)과 연결

프론트엔드에서 컨트랙트의 상태변화를 실시간으로 감지하고 처리하기 위해 사용된다.
별도의 상태변수를 호출하지 않고도 프론트에서는 블록체인의 로그를 구독하거나 요청해서 필요한 정보를 받아올 수 있다.

2. 가스비 절감

단순히 기록용인 데이터를 상태변수에 저장하면 높은 가스비가 발생하지만, 이벤트 로그는 저장이 아닌 기록이기 때문에 훨씬 저렴하다.

3. 검증 가능한 기록

이벤트는 트랜잭션 로그에 기록되므로, 이후 누가 어떤 동작을 했는지 영구적으로 추적 가능하다.
데이터 변경 목적이 아닌, 행위에 대한 이력 기록으로 유용하다.


3. 이벤트와 상태변수의 차이

항목이벤트 (Event)상태변수 (State Variable)
저장 위치 로그 트라이 (log trie) 상태 트라이 (state trie)
가스비 저렴 상대적으로 비쌈
용도 기록, 트리거, 알림 데이터 보존, 상태 추적
검증 가능성 트랜잭션 로그로 검증 가능 스토리지 상태로 검증 가능
접근 방식 emit, getPastEvents() 함수 호출 또는 public 변수로 조회
 

4. 이벤트 작성 및 사용 방법

선언

event MyEvent(address indexed user, uint amount);

event 키워드로 선언
indexed 키워드는 검색 필터링을 위한 인덱스 설정 (최대 3개 가능)

 

 

 

실행

emit MyEvent(msg.sender, amount);

상태 변경 로직이 끝난 뒤 emit 키워드로 호출

해당 트랜잭션 로그에 기록됨

 

 

5. Web2에서 이벤트 조회

이벤트는 프론트엔드(Web2)에서 다음과 같이 조회할 수 있다.

contract.getPastEvents("MyEvent", {
  fromBlock: 0,
  toBlock: "latest"
}).then(console.log);

getPastEvents("이벤트이름")으로 블록체인 로그에서 해당 이벤트 기록을 모두 가져올 수 있다.

indexed 키워드를 사용했다면 특정 사용자, 특정 조건 등으로 필터링 가능