궁금한 주제를 찾아보세요

비트코인, 스테이블코인, 온체인 데이터처럼 주제로 검색하세요.

다시 읽을 이야기

저장한 글은 이 브라우저에만 보관됩니다.

해설기술·생태계

이더리움 영수증과 logs bloom은 이벤트 검색을 어떻게 돕나

거래 실행 영수증의 status·cumulative gas·logs와 블록 bloom이 후보 블록을 빠르게 거르고도 실제 로그 확인이 필요한 이유를 설명합니다.

난이도 중급주제 카테고리와 개념 밀도 기준검토 정보AI 보조 초안 · 출처 목록 제공 · 주장별 대조 진행 중
이벤트 영수증의 주소·주제 표지가 필터를 지나 후보 기록 상자로 나뉘는 logs bloom 개념도
주제의 이해를 돕기 위해 imagegen으로 제작한 AI 생성 개념 일러스트
먼저 읽는 핵심

Receipt는 실행 결과와 실제 logs를 담고 block bloom은 후보 검색을 돕습니다.
Bloom 일치는 거짓 양성이 가능하지만 불일치는 빠른 제외 근거입니다.
Indexer는 block hash와 log index를 보관하고 reorg 때 되돌려야 합니다.

Transaction receipt는 거래 실행 뒤 status, cumulative gas used, 생성된 logs와 이 로그들로 만든 2048비트 bloom을 담습니다. 각 log는 emitting contract address, 최대 네 개 topics와 data로 구성되며 event signature는 보통 topic0에 들어갑니다. Bloom은 주소와 각 topic의 해시에서 선택한 bit들을 세워 후보에 없다는 사실은 빠르게 판정하지만, 필요한 bit가 모두 켜져 있어도 다른 값들의 충돌일 수 있는 거짓 양성이 있습니다. 따라서 block header의 logsBloom으로 후보 block을 거른 뒤 receipt의 실제 address·topics를 다시 비교해야 이벤트 존재가 확정됩니다.

거래 결과는 영수증에 따로 남습니다

Ethereum transaction 본문에는 실행 뒤 생성될 event가 미리 들어 있지 않습니다. 실행 client는 transaction별 receipt에 success status, cumulativeGasUsed, logsBloom과 logs 목록을 기록합니다. Contract creation이면 contractAddress 같은 RPC 파생 필드도 볼 수 있지만 consensus receipt encoding과 JSON-RPC 응답 필드를 구분해야 합니다.

Status 1은 EVM 실행이 성공했다는 뜻이지 애플리케이션이 기대한 event가 반드시 발생했다는 보장은 아닙니다. Status 0인 실패 거래는 state changes와 logs가 revert됩니다. 내부 CALL이 실패했지만 바깥 코드가 이를 처리하고 계속했다면 전체 receipt는 성공일 수 있어 trace와 계약 로직을 함께 봅니다.

Bloom은 이벤트를 찾아 주는 색인이 아니라, 이 블록에는 찾는 주소나 topic이 없다는 후보 제외를 빠르게 해 주는 확률적 표지입니다.

JOBCOIN 해설

VISUAL GUIDE프로토콜 실행의 기본 구조
입력이 실행 규칙을 통과할 때 상태가 바뀌는 프로토콜 개념도
그림과 함께 짚어볼 본문 내용

그림은 이 주제의 공통 개념을 단순화한 설명입니다. 아래 항목에서 이 글의 구체적인 조건과 예외를 함께 읽어보세요.

  1. 거래 결과는 영수증에 따로 남습니다

    Ethereum transaction 본문에는 실행 뒤 생성될 event가 미리 들어 있지 않습니다.

  2. Log의 주소·topics·data는 역할이 다릅니다

    LOG0부터 LOG4 opcode는 현재 실행 주소와 0~4개 topics, 임의 길이 data를 log entry로 만듭니다.

  3. Bloom은 세 쌍의 bit 위치를 검사합니다

    주소 또는 topic을 Keccak-256하고 정해진 세 11-bit 값을 0~2047 위치로 사용해 bloom bits를 설정합니다.

AI로 제작한 개념도 · 실제 가격·거래 내역·통계가 아닙니다.

Log의 주소·topics·data는 역할이 다릅니다

LOG0부터 LOG4 opcode는 현재 실행 주소와 0~4개 topics, 임의 길이 data를 log entry로 만듭니다. Solidity event의 canonical signature hash가 보통 첫 topic이고 indexed 인수들이 뒤 topics에 들어갑니다. Indexed dynamic 값은 원문 대신 hash가 저장되므로 receipt만으로 문자열 원문을 복원할 수 없습니다.

Non-indexed 인수는 ABI encoding되어 data에 들어갑니다. Anonymous event는 signature topic을 생략할 수 있고 서로 다른 ABI가 같은 raw log를 다른 의미로 해석할 수 있습니다. Decoder는 address와 배포 시점의 code·ABI version을 고정하고 topic0 하나만으로 계약을 신뢰하지 않습니다.

로그 검색 단계와 확정 범위
자료 포함 정보 판정 한계
Block header logsBloom 블록 내 주소·topic bit 합집합 거짓 양성 가능
Receipt logsBloom 한 거래 로그 bit 합집합 실제 log 위치는 모름
Log address emit한 실행 주소 코드 의미는 ABI 필요
Topics 검색 가능한 indexed 값 dynamic 원문은 hash
Data non-indexed ABI bytes 필터 topic 검색 대상 아님

Bloom은 세 쌍의 bit 위치를 검사합니다

주소 또는 topic을 Keccak-256하고 정해진 세 11-bit 값을 0~2047 위치로 사용해 bloom bits를 설정합니다. 여러 logs의 값은 OR로 합쳐집니다. 검색 값의 세 bit 중 하나라도 0이면 그 scope에는 값이 확실히 없지만 모두 1이어도 다른 여러 값이 우연히 같은 bits를 세웠을 수 있습니다.

예를 들어 인기 ERC-20 Transfer signature와 여러 contract 주소를 가진 block은 많은 bits가 켜집니다. 특정 token address와 account topic 조합이 bloom을 통과해도 실제 receipt logs에서 같은 한 entry가 모든 조건을 만족하는지 확인해야 합니다. 각 조건이 서로 다른 logs에서 bit를 제공할 수도 있습니다.

  • Block hash·number와 receipt를 함께 저장합니다.
  • Address와 topic filters로 bloom 후보를 좁힙니다.
  • 후보 receipt의 실제 log entry를 다시 비교합니다.
  • ABI version으로 indexed·data를 디코딩합니다.
  • Reorg 시 removed block의 파생 상태를 역적용합니다.

개별 transaction gas used

Receipt의 cumulativeGasUsed는 해당 block에서 그 transaction까지 누적 사용량입니다. 개별 transaction gas used는 현재 receipt 누적값에서 직전 receipt 누적값을 빼거나 RPC가 제공하는 gasUsed 필드를 사용합니다. Gas limit 또는 effectiveGasPrice와도 다른 값입니다.

Typed transaction 이후 receipt도 type envelope에 들어갈 수 있습니다. Client API가 effectiveGasPrice, blob 관련 사용량 같은 확장 필드를 추가하더라도 모든 fork·chain에서 동일하다고 가정하지 않습니다. Raw receipt와 RPC schema의 client version을 기록합니다.

Reorg는 Chain reorganization으로 block이 빠지면

Latest block의 receipt는 canonical chain 후보에 포함됐다는 현재 관찰입니다. Chain reorganization으로 block이 빠지면 그 receipt와 logs도 canonical history에서 제거됩니다. Subscription API의 removed 표시를 처리하거나 저장한 block hash를 새 canonical hash와 대조해야 합니다.

입금이나 NFT 상태를 log 하나로 갱신할 때 transactionHash만 unique key로 쓰면 같은 transaction의 여러 logs를 덮어씁니다. chain id, block hash, transaction hash, log index를 식별자로 두고 safe·finalized 정책에 맞춰 provisional과 확정 상태를 분리합니다.

자주 묻는 질문

Logs bloom이 일치하면 이벤트가 반드시 있나요?

아닙니다. Hash bit 충돌로 거짓 양성이 가능해 실제 receipt의 address와 topics를 확인해야 합니다.

실패한 거래의 event도 receipt에 남나요?

Revert된 호출 frame의 logs는 폐기됩니다. 바깥 호출이 실패를 처리해 전체 성공한 경우에는 성공한 frame의 logs가 남을 수 있습니다.

Indexed string을 topic에서 원문으로 복원할 수 있나요?

Topic에는 dynamic 값의 hash가 들어가므로 원문 후보를 알고 검증할 수는 있어도 hash만으로 일반 복원할 수 없습니다.

더 깊이 읽기

본문에서 다룬 개념과 확인 절차를 다음 글에서 이어서 살펴보세요.

참고한 원문 자료

자료 확인 기준일 2026.09.27
  1. Ethereum Execution APIs — eth_getTransactionReceiptethereum.github.io
  2. Ethereum Yellow Paperethereum.github.io
자료 대조 기록과 확인 범위
출처 수집
원문 링크 2개 제공
핵심 주장 대조
완료 근거가 아직 기록되지 않았습니다.
분야 전문가 검수
별도 완료 기록이 없습니다.

원문 링크와 자료 확인일은 글 전체의 주장 대조나 전문가 검수 완료를 뜻하지 않습니다. 별도 확인이 필요한 절차는 원문의 적용 대상과 최신 안내를 함께 확인해 주세요.

AI 활용 안내

이 글은 초안 구성과 자료 정리에 AI를 활용했습니다. 글에 표시된 출처와 기준일을 함께 확인해 주세요. 별도 검토 정보가 없다면 전문가 검수를 뜻하지 않습니다.

이해를 위한 정보 콘텐츠

이 글은 특정 자산의 매수·매도 또는 수익을 권유하지 않습니다. 자료의 발표 시점과 이후 변경 사항을 함께 확인해 주세요.

편집 원칙 보기 →이 기사 정정 제보 →