목적 및 범위
이 문서는 클라이언트가 블록체인 데이터를 효율적으로 쿼리하고, 새 블록·트랜잭션·로그에 대한 실시간 알림을 받을 수 있도록 설계된 이벤트 필터링 및 구독 시스템을 설명합니다.이 시스템은 전통적인 폴링 기반 필터와 WebSocket 기반 구독 방식을 모두 제공하여, 다양한 클라이언트 환경과 사용 패턴을 지원합니다. 일반 RPC API 구조 및 네임스페이스에 대한 정보는 API 서비스 및 네임스페이스을 참조하세요.
개요
필터링 및 구독 시스템을 통해 클라이언트는 다음 기능을 사용할 수 있습니다:- 특정 조건(컨트랙트 주소, 토픽, 블록 범위)에 일치하는 과거 로그 조회
- 새 블록, pending 트랜잭션, 로그에 대한 실시간 이벤트 수신
- 대규모 블록 범위 검색 시 Bloom 필터를 활용한 효율적인 로그 매칭
- 필터 ID를 이용한 변경 사항 폴링 방식 지원
- WebSocket을 통한 서버 푸시 기반 구독 지원
eth/filters 패키지에 위치하며, 블록체인의 이벤트 피드 시스템과 밀접하게 통합됩니다.
필터 API 메서드
FilterAPI는 필터 생성, 조회, 제거를 위한 RPC 엔드포인트를 제공합니다.이 API는 폴링 기반 필터와 WebSocket 구독 방식을 모두 지원합니다.
핵심 RPC 메서드
| Method | Description | Return Type |
|---|---|---|
eth_newFilter | 조건 기반 로그 필터 생성 | Filter ID |
eth_newBlockFilter | 새 블록 해시 필터 생성 | Filter ID |
eth_newPendingTransactionFilter | pending 트랜잭션 필터 생성 | Filter ID |
eth_getFilterChanges | 마지막 호출 이후 변경 사항 조회 | Logs / Hashes |
eth_getFilterLogs | 필터 조건에 맞는 전체 로그 조회 | Logs array |
eth_getLogs | 단발성 로그 조회 | Logs array |
eth_uninstallFilter | 필터 제거 | Boolean |
구독 메서드(WebSocket)
| Method | Description | Event Type |
|---|---|---|
eth_subscribe("newHeads") | 새 블록 헤더 구독 | Header |
eth_subscribe("logs", criteria) | 조건 기반 로그 구독 | Log |
eth_subscribe("newPendingTransactions") | pending 트랜잭션 구독 | Tx hash / object |
eth_unsubscribe | 구독 해지 | Boolean |
시스템 아키텍처
구성 요소 개요
이벤트 필터링 시스템은 크게FilterSystem과 EventSystem으로 구성됩니다.
FilterSystem
FilterSystem은 모든 필터 인스턴스가 공유하는 리소스를 관리하며, 필터 생성의 진입점 역할을 합니다.
주요 필드:
backend Backend– 블록체인 데이터 접근 인터페이스logsCache *lru.Cache[common.Hash, *logCacheElem]– 최근 블록 로그 캐시cfg *Config– 캐시 크기 및 타임아웃 설정
EventSystem
EventSystem은 활성화된 모든 구독을 관리하고, 블록체인 이벤트를 적절한 구독자로 전달하는 중앙 이벤트 디스패처입니다.여러 이벤트 피드에서 이벤트를 수신한 뒤, 구독 조건에 따라 필터링하여 전달합니다.
필터 타입 및 실행
로그 필터
로그 필터는 지정된 블록 범위 또는 특정 블록 내에서 조건과 일치하는 로그 이벤트를 검색합니다. FilterCriteria 구조:| Field | Type | Description |
|---|---|---|
FromBlock | *big.Int | 시작 블록(nil이면 latest) |
ToBlock | *big.Int | 종료 블록(nil이면 latest) |
BlockHash | *common.Hash | 단일 블록 지정 |
Addresses | []common.Address | 컨트랙트 주소 목록 |
Topics | [][]common.Hash | 토픽 필터 |
- 각 위치는 OR 조건으로 여러 토픽을 가질 수 있습니다
- 위치가 nil이면 해당 위치는 무조건 매칭됩니다
- 위치 간에는 AND 조건이 적용됩니다
- 최대 4개의 토픽 위치를 지원합니다
Bloom 필터 최적화
대규모 로그 검색 시 성능을 개선하기 위해 2단계 Bloom 필터링을 사용합니다.- 블록 헤더 Bloom – 각 블록 헤더에 포함된 2048비트 Bloom
- 섹션 Bloom 인덱스 – 블록을 섹션 단위로 묶어 비트 단위 검색 지원
구독 라이프사이클
폴링 기반 필터
WebSocket을 사용할 수 없는 환경에서는 서버가 필터 상태를 유지하고, 클라이언트는 주기적으로 변경 사항을 폴링합니다. 필터 타임아웃 관리:- 기본 타임아웃은 5분입니다
eth_getFilterChanges호출 시 타이머가 갱신됩니다- 일정 시간 활동이 없으면 필터는 자동으로 제거됩니다
이벤트 전달 및 필터링
체인 재구성 처리
체인 재구성이 발생하면 시스템은RemovedLogsEvent를 생성하여 구독자에게 전달합니다.
처리 흐름은 다음과 같습니다:
- 블록 삽입 중 체인 재구성 감지
- 제거된 블록의 로그와 함께 이벤트 생성
- 로그 객체에
Removed: true플래그 설정 - 클라이언트는 해당 로그를 기반으로 상태를 조정
백엔드와의 통합
필터 시스템은Backend 인터페이스를 통해 블록체인 데이터 접근을 추상화합니다.이를 통해 전체 노드 구현에 종속되지 않고 동일한 필터 로직을 재사용할 수 있습니다. 주요 백엔드 구현체는 다음 구성 요소에 위임합니다:
- 과거 블록 데이터 –
BlockChain - pending 트랜잭션 –
TxPool - pending 블록 구성 –
Miner - Bloom 비트 검색 –
BloomIndexer
오류 처리 및 엣지 케이스
| Error | Cause | Handling |
|---|---|---|
errInvalidBlockRange | 시작 블록이 종료 블록보다 큼 | 필터 생성 거부 |
errFilterNotFound | 존재하지 않는 필터 ID | 빈 결과 반환 |
errExceedMaxTopics | 토픽 위치 초과 | 필터 생성 거부 |
unknown block | 블록 해시 없음 | 오류 반환 |
| Context cancel | 연결 종료 | 쿼리 중단 |

