이더리움 이벤트 로그 디코더

원시 로그 항목(address, topics, data)을 이름이 붙은 이벤트와 매개변수로 변환합니다. 40개 이상의 일반적인 이벤트를 자동으로 인식하며, 그 외에는 컨트랙트 ABI를 붙여넣으세요. 영수증의 모든 로그를 한 번에 디코딩합니다.

익스플로러의 "Logs" 탭, viem, ethers, JSON-RPC 응답 모두 지원하며, 영수증의 모든 로그를 디코딩합니다.
예시:

브라우저에서 JavaScript로 계산합니다. 주소는 절대 업로드되거나 저장되지 않습니다.

이벤트 로그란?

이벤트 로그는 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]정규 시그니처의 keccak2560xddf252ad… = keccak256("Transfer(address,address,uint256)")
topics[1]첫 번째 indexed 매개변수, 32바이트로 왼쪽 패딩from 주소
topics[2]두 번째 indexed 매개변수to 주소
dataindexed가 아닌 모든 매개변수의 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을 포함합니다.

지원하는 입력

관련 도구: 시그니처에서 topic 해시를 계산하려면 셀렉터 및 토픽 계산기를, 트랜잭션의 calldata를 디코딩하려면 ABI 디코더를, 원시 트랜잭션을 살펴보려면 이더리움 트랜잭션 디코더를 이용하세요.

자주 묻는 질문

이더리움 로그의 topics와 data는 무엇인가요?

로그에는 최대 네 개의 32바이트 topics와 가변 길이의 data 필드가 있습니다. topics[0]은 이벤트 시그니처의 Keccak-256 해시이고(익명 이벤트가 아닌 경우), topics[1..3]에는 indexed 매개변수가 topic당 하나씩 들어갑니다. indexed가 아닌 모든 매개변수는 함수 인수와 똑같이 선언 순서대로 data에 ABI 인코딩됩니다.

indexed string이나 bytes가 해시로 표시되는 이유는 무엇인가요?

EVM은 동적 값을 32바이트 topic에 담을 수 없으므로, Solidity는 대신 값의 keccak256을 저장합니다. 원래 문자열은 로그에서 복원할 수 없고, 후보 값을 해시해서 비교하는 것만 가능합니다. 주소, 정수, bool, bytesN은 전체가 저장되므로 정상적으로 디코딩됩니다.

ERC-20과 ERC-721 Transfer는 topics[0]이 같습니다. 어떻게 구분하나요?

둘 다 시그니처가 Transfer(address,address,uint256)이므로 topics[0]이 동일합니다. ERC-721은 tokenId도 indexed이므로 topics가 네 개이고 data는 비어 있습니다. ERC-20은 from과 to만 indexed이므로 topics가 세 개이고 data 필드는 32바이트입니다. 디코더는 indexed 개수가 로그와 일치하는 레이아웃을 선택합니다.

이벤트가 인식되지 않으면 어떻게 하나요?

로그는 topics[0]이 강조된 원시 형태로 표시됩니다. 컨트랙트의 ABI(이벤트만 있어도 충분)나 event Bid(address indexed bidder, uint256 amount) 같은 한 줄을 ABI 입력란에 붙여넣고 다시 디코딩하세요. 4byte.directory와 openchain.xyz 같은 시그니처 데이터베이스로 알 수 없는 topic 해시를 식별할 수도 있습니다.

익명 이벤트는 어떻게 동작하나요?

anonymous로 선언된 이벤트에는 시그니처 topic이 없으므로, 모든 topics가 indexed 매개변수이며 온체인에서 이를 식별할 정보가 없습니다. 디코더는 입력한 ABI의 익명 이벤트와 topic 개수로만 매칭할 수 있으며, 그렇다는 사실을 메모로 알려 줍니다.

수량이 토큰 단위로 변환되나요?

정수는 정확한 10진수로 표시됩니다. uint256 값에는 1018과 106으로 나눈 값이 힌트로 표시되며, ETH, 대부분의 ERC-20, USDC, USDT가 여기에 해당합니다. 다른 소수점 자릿수는 토큰 소수점 변환기를 사용하세요. 디코더는 각 토큰의 소수점 자릿수를 알지 못합니다.

업로드되는 것이 있나요?

아니요. 내장 테이블의 topic 해시는 페이지가 로드될 때 브라우저에서 Keccak-256으로 계산되며, 디코딩도 로컬에서 실행됩니다. 페이지는 로드된 후 네트워크 요청을 보내지 않습니다.