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 가 조금 더 듭니다. "검색 기준이 되는 값에만"
선택적으로 붙이는 습관을 들이세요.