요약: 블록체인 인덱싱이란 블록체인에서 원시 데이터를 추출하여 구조화된 형식으로 변환한 뒤, 빠른 쿼리 처리에 최적화된 데이터베이스에 저장하는 과정을 말합니다. 블록체인은 보안과 불변성을 위해 설계되었지, 검색을 위해 만들어진 것이 아닙니다. 인덱싱이 없다면 “이 지갑에서 이루어진 모든 송금 내역을 보여줘”와 같은 간단한 질문에도 제네시스 블록부터 모든 블록을 일일이 스캔해야 하므로, 대규모 환경에서는 실용적이지 않습니다. 인덱서는 온체인 데이터에 애플리케이션이 실시간으로 접근할 수 있도록 쿼리 가능한 데이터베이스를 생성함으로써 이 문제를 해결합니다.
간단한 설명
블록체인은 추가 전용 원장입니다. 블록체인은 거래를 변조 불가능한 순서대로 기록하는 데는 탁월하지만, 해당 거래에 대한 질문에 답하는 데는 매우 취약합니다. 내장된 ‘검색’ 기능이 없으며, SQL 쿼리도 지원하지 않습니다. 표준 RPC 메서드만으로는 “지난 30일 동안 이 주소가 관련된 모든 ERC-20 전송 내역을 찾아라”라고 요청할 방법이 없습니다.
RPC 엔드포인트를 통해 사용할 수 있는 기본 도구는 설계상 매우 기초적인 수준입니다. 블록 번호로 특정 블록을 조회할 수 있고, 해시로 특정 거래를 조회할 수 있으며, 특정 블록 시점의 계정 잔액을 확인할 수 있습니다. 하지만 여러 블록을 가로질러 검색하거나, 조건에 따라 필터링하거나, 데이터를 집계하거나, 체인의 서로 다른 부분에 있는 정보를 결합할 수는 없습니다. 특정 지갑의 모든 거래를 찾으려면, 생성된 모든 블록을 가져오고, 각 블록에서 모든 거래를 추출한 다음, 발신자나 수신자가 대상 주소와 일치하는지 확인하여 일치하는 항목을 수집해야 합니다. Ethereum 에서는 2,000만 개 이상의 블록을 스캔해야 합니다. Solana 에서는 수십억 개의 슬롯을 스캔해야 합니다. 인덱싱이 없다면, 이는 단순히 느린 정도가 아닙니다. 합리적인 시간 내에 수행하는 것은 불가능합니다.
블록체인 인덱싱은 노드에서 새로운 블록을 지속적으로 읽어오고, 원시 데이터(트랜잭션, 이벤트 로그, 상태 변경, 추적 정보)를 디코딩하여 구조화된 레코드로 변환한 뒤, 적절한 인덱스가 적용된 데이터베이스에 해당 레코드를 기록하는 프로세스를 통해 이 문제를 해결합니다. 데이터가 데이터베이스에 저장되면, 애플리케이션은 SQL이나 GraphQL과 같은 익숙한 도구를 사용하여 1초 미만의 응답 시간으로 데이터를 조회할 수 있습니다.
인덱싱 파이프라인은 추출, 변환, 로드(ETL) 패턴을 따릅니다. 추출 단계에서 인덱서는 블록체인 노드에 연결하여 원시 블록 데이터를 읽어들입니다. 여기에는 블록 헤더, 트랜잭션, 트랜잭션 영수증(이벤트 로그가 포함된), 그리고 선택적으로 추적 데이터(계약 간 내부 호출을 캡처한)가 포함됩니다. 인덱서는 구성된 시작 블록부터 시작하여 체인의 이력을 따라 순차적으로 블록을 처리합니다.
변환 단계에서 인덱서는 원시 데이터를 의미 있는 구조로 변환합니다. 예를 들어, 원시 이벤트 로그는 토픽 해시와 데이터 필드가 포함된 16진수 문자열로 인코딩되어 있습니다. 인덱서는 스마트 계약의 ABI(애플리케이션 바이너리 인터페이스)를 사용하여 이를 명명된 매개변수와 적절한 데이터 유형을 가진, 사람이 읽을 수 있는 이벤트로 변환합니다. 원시 전송(Transfer) 이벤트 로그는 “발신” 주소, “수신” 주소, 토큰 수량, 계약 주소가 포함된 구조화된 레코드로 변환됩니다. 또한 변환 단계에서는 전송 시점의 USD 가치 계산, 토큰별 거래량 집계, 잔액 추적과 같은 파생 데이터를 산출할 수도 있습니다.
로드 단계에서는 구조화된 레코드가 PostgreSQL, MongoDB, Snowflake, Elasticsearch 또는 기타 스토리지 시스템 등 데이터베이스에 기록됩니다. 데이터베이스는 애플리케이션이 쿼리할 필드(예: 지갑 주소, 토큰 계약, 타임스탬프, 블록 번호 등)에 인덱스를 생성하여, 전체 데이터셋에 걸쳐 빠른 조회와 복잡한 쿼리가 가능하도록 합니다.
인덱서가 체인의 끝부분까지 따라잡으면, 실시간 mode 모드로 전환되어 새로운 블록이 생성되는 즉시 이를 처리하고, 그 결과로 생성된 레코드를 즉시 삽입합니다. 이를 통해 데이터베이스는 체인의 실시간 상태를 항상 최신 상태로 유지합니다.
조직 개편 문제
블록체인 인덱싱에서 가장 까다로운 부분 중 하나는 체인 재구성(reorg)을 처리하는 것입니다. 재구성은 블록체인의 정식 체인이 변경될 때 발생하며, 이는 대개 동일한 높이에서 경쟁하는 블록들이 생성되어 네트워크가 결국 인덱서가 처음 처리했던 포크와는 다른 포크로 수렴하기 때문입니다. 이런 상황이 발생하면 인덱서가 이미 처리한 블록들은 더 이상 정식 체인이 아니게 되며, 해당 블록들에서 파생된 모든 기록은 부정확해집니다.
견고한 인덱서는 리오르그를 감지하고, 영향을 받은 레코드를 롤백하며, 올바른 블록을 재처리해야 합니다. 리오르그를 제대로 처리하지 못하면 데이터베이스에 팬텀 트랜잭션(이전 포크에는 있었지만 새로운 포크에는 없는 트랜잭션), 누락된 트랜잭션(새로운 포크에는 있지만 이전 포크에는 포함되지 않은 트랜잭션)이 발생하고, 상태가 부정확해집니다. 금융 애플리케이션의 경우, 이러한 종류의 데이터 손상은 용납될 수 없습니다.
리오그 처리는 인덱싱 파이프라인을 상당히 복잡하게 만듭니다. 인덱서는 어떤 블록이 처리되었는지 추적하고, 현재 확인 중인 체인을 이미 저장된 내용과 비교하며, 불일치를 감지하고, 롤백을 원활하게 실행해야 합니다. 이것이 바로 팀들이 맞춤형 인덱서를 처음부터 직접 구축하는 대신 관리형 인덱싱 솔루션을 선택하는 주된 이유 중 하나입니다.
색인 생성 방법
The Graph는 가장 널리 채택된 탈중앙화 인덱싱 프로토콜입니다. 개발자들은 “서브그래프(subgraphs)”를 생성하는데, 이는 모니터링할 스마트 계약, 수신할 이벤트, 그리고 이벤트 데이터를 쿼리 가능한 스키마로 매핑하는 방법을 정의하는 구성 파일입니다. 인덱서(Indexers)라고 불리는 독립적인 노드 운영자들이 처리 인프라를 운영하며, GraphQL 엔드포인트를 통해 쿼리를 처리합니다. The Graph는 DeFi 프로토콜 데이터 조회, NFT 소유권 이력, DAO 거버넌스 활동과 같은 표준 사용 사례에 효과적입니다. 이 프로토콜의 한계로는 지연 시간(서브그래프 업데이트가 항상 실시간으로 이루어지지는 않음), 스키마의 유연성 부족(스키마를 변경하려면 종종 재배포 및 재동기화가 필요함), 그리고 분산형 네트워크의 가용성에 대한 의존성 등이 있습니다.
맞춤형 인덱서는 팀이 데이터 파이프라인을 완전히 제어할 수 있게 해주지만, 상당한 엔지니어링 투자가 필요합니다. 프로덕션급 맞춤형 인덱서를 구축하려면 블록 수집 로직, 이벤트 디코딩, 데이터베이스 스키마 설계, 재구성 처리, 오류 복구, 모니터링 및 인프라 확장 등을 구현해야 합니다. 고유한 데이터 요구 사항을 가진 대규모 애플리케이션의 경우 이러한 투자가 가치가 있을 수 있지만, 대부분의 팀에게는 핵심 제품 개발에 할애할 수 있는 수개월에 달하는 엔지니어링 시간을 소모하게 됩니다.
푸시 기반 스트리밍은 필터링된 블록체인 데이터를 스토리지 시스템으로 직접 전달함으로써 인덱싱 과정을 간소화하는 새로운 접근 방식으로, 사용자가 직접 추출 계층을 구축하고 유지 관리할 필요가 없습니다. 인덱서가 노드에서 데이터를 가져오는 대신, 스트리밍 서비스가 사용자에게 필요한 데이터를 정확히 데이터베이스, 웹훅 또는 데이터 웨어하우스로 푸시합니다.
Quicknode 가 블록체인 인덱싱을 어떻게 지원하는가
Quicknode Streams 블록체인 데이터 인덱싱을 위해 특별히 설계되었습니다. Streams 는 푸시 방식의 데이터 파이프라인을 제공하여, 원시 또는 필터링된 블록체인 데이터를 PostgreSQL, Snowflake, Amazon S3, Azure Storage, webhooks 등 사용자가 선호하는 저장소로 직접 전송합니다. 체인에서 데이터를 추출하기 위해 RPC 폴링 인프라를 구축하고 유지 관리할 필요 없이, 원하는 네트워크, 데이터 세트(블록, 트랜잭션, 리시트, 트레이스) 및 선택적 JavaScript 필터를 사용하여 스트림을 구성하기만 하면, Quicknode 가 나머지 작업을 처리합니다.
Streams 이 서비스는 ‘정확히 한 번(exactly-once)’ 전달을 보장하며 최종 확정 순서대로 데이터를 전달하므로, 코드가 블록 순서나 중복 제거를 관리할 필요 없이 데이터베이스가 표준 체인과 일관성을 유지할 수 있습니다. 내장된 재구성 처리 기능은 체인 재구성을 자동으로 감지하고 수정 페이로드를 전송하므로, 인덱싱된 데이터는 항상 체인의 실제 상태를 반영합니다. 과거 데이터의 경우, Streams 의 '백필(backfill)' 기능을 통해 과거 블록의 임의 범위를 데이터베이스에 채울 수 있으며, 기존 RPC 기반 인덱싱 파이프라인보다 최대 7배 더 빠르게 동기화되면서도 실시간 스트리밍과 동일한 필터링 및 전달 보장을 제공합니다.
Quicknode 또한 Streams 를 통해 블록체인 인덱서를 구축하는 단계별 가이드를 제공하며, 구성부터 쿼리 실행에 이르기까지 PostgreSQL을 기반으로 한 REST API를 갖춘 완전한 ERC-20 전송 인덱서를 만드는 방법을 보여줍니다. 더욱 정교한 데이터 처리가 필요한 팀을 위해, Streams 는 Quicknode Functions와 연동되어 스트리밍 데이터 파이프라인 위에서 서버리스 변환, 데이터 보강 및 자동화를 지원합니다.
인덱싱과 원시 RPC의 차이점은 무엇인가요?
일반 RPC와 인덱싱은 서로 다른 유형의 질문에 답합니다. RPC는 특정 항목 조회 및 쓰기 작업을 위해 설계되었습니다(예: 이 블록 가져오기, 이 잔액 읽기, 이 트랜잭션 전송). 인덱싱은 검색 및 분석 작업을 위해 설계되었습니다(예: 특정 지갑의 모든 전송 내역, 토큰별 총 거래량, 컬렉션의 소유권 이력). 아래 표에서는 이 두 가지를 비교하여, 각 작업에 적합한 도구를 선택할 수 있도록 했습니다.
데이터가 구조화된 데이터베이스에 인덱싱되면, 원시 RPC로는 처리할 수 없었던 쿼리들도 아주 간단해집니다. 특정 주소의 모든 거래를 나열하거나, NFT의 전체 소유권 이력을 추적하거나, 토큰별 일일 거래량을 집계하거나, 보유량 기준으로 지갑을 순위 매기거나, 여러 계약에 걸친 이벤트를 조인할 수 있습니다. 바로 이러한 쿼리들이 대시보드, 익스플로러, 분석 제품의 핵심 동력이 됩니다. 인덱싱 없이는 이러한 쿼리를 수행하는 것이 왜 그렇게 어려운지에 대해서는 ‘블록체인 데이터 쿼리’를 참고하시기 바랍니다.
인덱싱과 스트리밍은 어떻게 연동되나요?
스트리밍과 인덱싱은 상호 보완적인 계층입니다. 스트리밍은 새로운 블록과 이벤트가 발생하자마자 이를 인프라로 전송하는 전달 메커니즘인 반면, 인덱싱은 들어오는 데이터를 쿼리 가능한 저장소로 정리하는 과정입니다. 일반적인 최신 아키텍처는 스트리밍 파이프라인을 사용하여 레코드를 인덱싱된 데이터베이스로 전송함으로써, 불안정한 폴링 계층을 완전히 제거합니다. 데이터가 처음에 인덱서로 어떻게 전달되는지에 대해서는 ‘블록체인 데이터 스트리밍이란 무엇인가’ 및 ‘폴링 대 스트리밍’문서를 참고하시기 바랍니다.
인덱서는 과거 데이터를 어떻게 소급 반영하나요?
백필링(Backfilling)이란 실시간 데이터로 전환하기 전에 데이터베이스에 과거 블록 데이터를 채워 넣는 과정을 말합니다. 잘 구성된 파이프라인은 선택한 과거 블록에서 시작하여 체인을 따라 순차적으로 처리한 후, 체인의 최첨단에 도달하면 실시간으로 매끄럽게 전환되므로, 과거 기록과 실시간 기록이 하나의 스키마를 공유하게 됩니다. 제대로 수행될 경우, 백필링은 원시 RPC를 통해 체인을 다시 스캔하는 것보다 훨씬 빠릅니다. 관련 장단점에 대해서는‘과거 블록체인 데이터에 액세스하는 방법’ 및 ‘실시간 블록체인 데이터와 과거 블록체인 데이터의 비교’를 참조하십시오.
자주 묻는 질문
색인 생성 대신 그냥 RPC를 사용하면 안 되는 이유는 무엇인가요?
RPC는 특정 블록, 트랜잭션 또는 잔액을 조회하는 데는 탁월하지만, 체인 전체를 대상으로 검색, 필터링 또는 집계 기능을 제공하지는 않습니다. RPC를 통해 “이 지갑에서 이루어진 모든 송금”과 같은 질문에 답하려면 수백만 개의 블록을 하나씩 훑어봐야 하므로, 이는 비실용적입니다. 인덱싱은 해당 데이터를 데이터베이스에 미리 처리해 두어, 동일한 질문에 대해 단 한 번의 쿼리로 결과를 반환할 수 있게 해줍니다.
부분그래프란 무엇인가요?
서브그래프(subgraph)는 The Graph에서 사용하는 구성으로, 어떤 계약과 이벤트를 색인화할지, 그리고 이를 쿼리 가능한 GraphQL 스키마로 어떻게 매핑할지를 정의합니다. 이는 색인을 구축하는 널리 사용되는 방법 중 하나로, 표준 DeFi, NFT 및 거버넌스 데이터에 매우 적합하지만, 사용자 정의 또는 스트리밍 기반 파이프라인에 비해 실시간 지연 시간과 스키마 유연성 측면에서 타협이 필요할 수 있습니다.
인덱서는 체인 재구성을 어떻게 처리하나요?
견고한 인덱서는 캐노니컬 체인이 변경되는 시점을 감지하고, 고아 블록에서 파생된 레코드를 롤백한 뒤 올바른 레코드를 다시 처리합니다. 이 기능이 없다면 데이터베이스에 팬텀 트랜잭션이나 누락된 트랜잭션이 누적됩니다. 관리형 파이프라인은 수정 페이로드를 전송하여 리오그를 자동으로 처리합니다. 관련 배경 지식은 ‘블록체인 리오그란 무엇인가’를 참조하십시오.
직접 인덱서를 구축해야 할까요, 아니면 관리형 서비스를 이용해야 할까요?
맞춤형 인덱서를 구축하면 모든 과정을 완전히 제어할 수 있지만, 데이터 수집, 디코딩, 스키마 설계, 재구성 처리, 모니터링 및 확장 작업을 직접 수행해야 하므로 대개 수개월의 작업 기간이 소요됩니다. 관리형 파이프라인은 데이터 추출, 정렬, 재구성 및 전달을 자동으로 처리해 주므로, 대부분의 팀은 서비스를 구성하고 엔지니어링 자원을 핵심 제품에 집중함으로써 더 빠르게本番 환경에 적용할 수 있습니다.
인덱싱된 블록체인 데이터는 어떤 데이터베이스에 저장할 수 있나요?
인덱싱된 데이터는 트랜잭션 쿼리, 전체 텍스트 검색, 대규모 분석 중 어떤 기능이 필요한지에 따라 일반적으로 PostgreSQL, MongoDB, Snowflake, Elasticsearch 또는 Amazon S3와 같은 객체 스토리지로 전송됩니다. 스트리밍 파이프라인을 사용하면 레코드를 이러한 대상에 직접 전달할 수 있습니다. 종단 간 튜토리얼을 보려면 ‘빌더 가이드 ( Builders Guide) ’에서 일반적인 인덱싱 패턴을 단계별로 확인할 수 있습니다.