블록체인 학습
0 XP

indexed 매개변수

이벤트 매개변수에 indexed 키워드를 붙이면 해당 값이 로그 의 topic(토픽) 으로 저장됩니다. topic 으로 저장된 값은 외부에서 빠르게 검색·필터링 할 수 있습니다. 예를 들어 "특정 주소가 보낸 Transfer 이벤트만" 골라 보거나, "이 사용자가 받은 입금 내역만" 추려낼 수 있습니다.

topic이란?

EVM의 로그 는 topic 배열과 데이터(data) 영역, 두 부분으로 나뉩니다.

  • indexed 인자 → topic 으로 저장되어 인덱싱·필터링 대상이 됩니다.
  • 일반 인자 → 데이터(data) 영역에 저장되며, 검색 기준으로는 쓸 수 없습니다.

EVM 로그의 topic 은 어느 경우든 총 4개 가 상한입니다. 일반 이벤트는 이벤트 시그니처(이름+타입) 해시가 첫 번째 topic 을 차지하므로, 직접 지정할 수 있는 indexed 는 최대 3개 이고 4개 이상 붙이면 컴파일 오류가 납니다. 시그니처 해시를 넣지 않는 anonymous 이벤트만 예외로 4개까지 쓸 수 있습니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Token {
    // from, to 는 indexed → 주소 기준으로 필터링 가능
    // value 는 일반 인자 → 데이터 영역에 저장
    event Transfer(address indexed from, address indexed to, uint256 value);
 
    function send(address to, uint256 value) public {
        emit Transfer(msg.sender, to, value);
    }
}

언제 indexed를 쓰는가?

  • 주소나 ID처럼 나중에 검색 기준이 될 값 에 붙입니다(from, to, tokenId 등).
  • 단순히 화면에 표시만 할 값(예: 금액)은 굳이 indexed 를 붙이지 않아도 됩니다.
  • string, bytes, 배열에 indexed 를 붙이면 값 자체가 아니라 그 해시(keccak256) 가 topic 으로 저장됩니다. 따라서 원본 문자열로는 검색할 수 없습니다.

indexed 는 검색을 빠르게 해 주는 대신 발행 gas 가 조금 더 듭니다. "검색 기준이 되는 값에만" 선택적으로 붙이는 습관을 들이세요.

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

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