이벤트 로그란?
이벤트 로그는 EVM 컨트랙트가 LOG0–LOG4 옵코드(Solidity의 emit)를 실행할 때 기록하는 레코드입니다. 각 항목에는 이벤트를 발생시킨 컨트랙트의 주소, 최대 네 개의 32바이트 topics, 임의 길이의 data 필드가 들어 있습니다. 로그 디코딩이란 topics[0]을 이벤트 시그니처와 매칭하고, 나머지 topics에서 indexed 매개변수를 읽고, data에서 indexed가 아닌 매개변수를 ABI 디코딩하는 것입니다. 익스플로러는 검증된 소스 코드로 이 작업을 하지만, 이 페이지는 40개 이상의 일반적인 이벤트에 대해서는 시그니처만으로, 그 외에는 붙여넣은 ABI로 디코딩합니다.
로그의 인코딩 방식
| 필드 | 내용 | 예시 (ERC-20 Transfer) |
|---|---|---|
| address | 이벤트를 발생시킨 컨트랙트 | 0xdAC17F958D2ee523a2206206994597C13D831ec7 (USDT) |
| topics[0] | 정규 시그니처의 keccak256 | 0xddf252ad… = keccak256("Transfer(address,address,uint256)") |
| topics[1] | 첫 번째 indexed 매개변수, 32바이트로 왼쪽 패딩 | from 주소 |
| topics[2] | 두 번째 indexed 매개변수 | to 주소 |
| data | indexed가 아닌 모든 매개변수의 ABI 인코딩 | 32바이트 value |
정적 타입(address, 정수, bool, bytes1–32)의 indexed 매개변수는 topic에 그대로 저장됩니다. 동적 타입(string, bytes, 배열, 구조체)의 indexed 매개변수는 Solidity ABI 명세의 이벤트 섹션에 설명된 대로 인코딩 결과의 Keccak-256 해시로 대체되며, 디코더는 이를 해시값으로 표시합니다.
예시: USDT 전송
위의 "ERC-20 Transfer"를 클릭하세요. topics[0]이 Transfer 시그니처와 일치하고, topics가 정확히 세 개이므로 ERC-721 레이아웃(indexed 세 개) 대신 ERC-20 레이아웃(indexed 주소 두 개)이 선택됩니다. topics[1]은 from = 0xd8dA6BF2…96045, topics[2]는 to = 0x1111…1111로 디코딩되고, 하나뿐인 data 워드 0x17d7840은 value = 25000000이며, USDT의 소수점 6자리로 환산하면 25 USDT입니다. 같은 방식으로 Uniswap V2 Swap(indexed 주소 두 개, data에 수량 네 개)이나, data 필드에 오프셋과 길이를 가진 동적 배열 두 개가 들어 있는 ERC-1155 TransferBatch도 디코딩합니다.
ABI 없이 인식되는 이벤트
아래 표는 디코더가 사용하는 것과 같은 시그니처 목록으로 페이지에서 생성되므로, 각 topics[0] 값은 Keccak 구현의 자체 테스트 역할도 합니다. ERC-20 및 ERC-721 Transfer와 Approval, ApprovalForAll, ERC-1155 TransferSingle, TransferBatch, URI, WETH Deposit과 Withdrawal, Uniswap V2 Swap, Sync, Mint, Burn, PairCreated, Uniswap V3 Swap, Mint, Burn, Collect, PoolCreated, OwnershipTransferred, EIP-1967 Upgraded, AdminChanged, BeaconUpgraded, Initializable, Pausable, AccessControl 이벤트, Permit2 Approval, Permit, NonceInvalidation, Lockdown, ERC-4626 Deposit과 Withdraw, 그리고 Safe ExecutionSuccess, ExecutionFailure, SafeMultiSigTransaction, owner 및 threshold 변경, SafeSetup, ProxyCreation을 포함합니다.
지원하는 입력
- 익스플로러, viem, ethers, web3.py에서 복사한 단일 로그 객체
{"address","topics","data"}. - 로그 배열,
eth_getLogs의result, 또는 전체 JSON-RPC 응답. - 트랜잭션 영수증:
logs배열의 모든 항목을 순서대로 디코딩하며, 블록 번호, 로그 인덱스, 트랜잭션 해시를 함께 표시합니다. - 트레이스나 디버거에서 복사한 로그용으로, 한 줄에 하나씩 붙여넣은 topics와 data hex. "topics[1]:" 같은 라벨은 무시됩니다.
- 선택적 ABI: 프래그먼트의 JSON 배열,
abi키를 가진 객체(Hardhat 및 Foundry 아티팩트), 또는 사람이 읽을 수 있는event …줄. ABI의 이벤트가 내장 테이블보다 우선합니다.
관련 도구: 시그니처에서 topic 해시를 계산하려면 셀렉터 및 토픽 계산기를, 트랜잭션의 calldata를 디코딩하려면 ABI 디코더를, 원시 트랜잭션을 살펴보려면 이더리움 트랜잭션 디코더를 이용하세요.