TL;DR: Blockchain-indexering is het proces waarbij ruwe gegevens uit een blockchain worden gehaald, omgezet in een gestructureerd formaat en opgeslagen in een database die is geoptimaliseerd voor snelle zoekopdrachten. Blockchains zijn ontworpen met het oog op veiligheid en onveranderlijkheid, niet om erin te zoeken. Zonder indexering vereist het beantwoorden van zelfs eenvoudige vragen als „toon me alle overboekingen vanuit deze wallet” het doorzoeken van elk blok vanaf het begin, wat op grote schaal onpraktisch is. Indexers lossen dit op door doorzoekbare databases te creëren die on-chain gegevens in realtime toegankelijk maken voor applicaties.
De eenvoudige uitleg
Blockchains zijn grootboeken waaraan alleen gegevens kunnen worden toegevoegd. Ze zijn uitstekend geschikt om transacties in een fraudebestendige volgorde vast te leggen, maar ze zijn volstrekt ongeschikt om vragen over die transacties te beantwoorden. Er is geen ingebouwde "zoekfunctie". Er zijn geen SQL-query’s. Het is onmogelijk om alleen met standaard RPC-methoden te zeggen: "zoek alle ERC-20-overboekingen waarbij dit adres de afgelopen 30 dagen betrokken was".
De basisfuncties die via RPC-eindpunten beschikbaar zijn, zijn per definitie primitief. Je kunt een specifiek blok opnummer opvragen. Je kunt een specifieke transactie op hash opvragen. Je kunt het saldo van een account in een specifiek blok opvragen. Maar je kunt niet over meerdere blokken heen zoeken, op criteria filteren, gegevens samenvoegen of informatie uit verschillende delen van de keten combineren. Om alle transacties van een specifieke wallet te vinden, zou je elk blok dat ooit is geproduceerd moeten ophalen, elke transactie uit elk blok moeten extraheren, controleren of de afzender of ontvanger overeenkomt met je doeladres, en de overeenkomsten verzamelen. Op Ethereum betekent dat het doorzoeken van meer dan 20 miljoen blokken. Op Solana betekent het het doorzoeken van miljarden slots. Zonder indexering is dit niet alleen traag. Het is onmogelijk binnen een redelijke tijdspanne.
Blockchain-indexering lost dit op door een proces uit te voeren dat voortdurend nieuwe blokken van een knooppunt leest, de ruwe gegevens (transacties, gebeurtenislogboeken, statuswijzigingen, traces) decodeert, deze omzet in gestructureerde records en die records naar een database met de juiste indexen schrijft. Zodra de gegevens in een database staan, kan je applicatie deze opvragen met behulp van vertrouwde tools zoals SQL of GraphQL, met responstijden van minder dan een seconde.
Hoe indexering werkt
De indexeringspijplijn volgt een Extract, Transform, Load (ETL)-patroon. In de extractiefase maakt de indexeerder verbinding met een blockchain-knooppunt en leest hij ruwe blokgegevens in. Dit omvat blokheaders, transacties, transactiebewijzen (die gebeurtenislogboeken bevatten) en, optioneel, traceergegevens (die interne oproepen tussen contracten vastleggen). De indexeerder verwerkt blokken achtereenvolgens, beginnend bij een geconfigureerd startblok en zich vervolgens voortbewegend door de geschiedenis van de keten.
In de transformatiefase decodeert de indexer de ruwe gegevens tot betekenisvolle structuren. Ruwe gebeurtenislogboeken worden bijvoorbeeld gecodeerd als hex-strings met topic-hashes en gegevensvelden. De indexer gebruikt de ABI (Application Binary Interface) van het smart contract om deze te decoderen tot voor mensen leesbare gebeurtenissen met benoemde parameters en de juiste gegevenstypen. Een onbewerkte Transfer-gebeurtenislog wordt een gestructureerd record met een „van“-adres, een „naar“-adres, een tokenbedrag en een contractadres. De transformatiefase kan ook afgeleide gegevens berekenen, zoals het berekenen van USD-waarden op het moment van de overdracht, het aggregeren van het volume per token of het bijhouden van lopende saldi.
Tijdens de laadfase worden de gestructureerde records naar een database geschreven, of dat nu PostgreSQL, MongoDB, Snowflake, Elasticsearch of een ander opslagsysteem is. De database maakt indexen aan voor de velden waarop applicaties zoekopdrachten zullen uitvoeren (zoals walletadressen, tokencontracten, tijdstempels en bloknummers), waardoor snelle zoekopdrachten en complexe query’s over de gehele dataset mogelijk worden.
Zodra de indexer het uiteinde van de keten heeft ingehaald, schakelt hij over op realtime mode, waarbij elk nieuw blok direct na het aanmaken wordt verwerkt en de resulterende records onmiddellijk worden ingevoegd. Hierdoor blijft de database actueel en sluit deze aan bij de live-status van de keten.
Het reorganisatieprobleem
Een van de grootste uitdagingen bij het indexeren van blockchains is het omgaan met reorganisaties van de keten. Een reorganisatie vindt plaats wanneer de canonieke keten van de blockchain verandert, meestal doordat er concurrerende blokken op dezelfde hoogte zijn geproduceerd en het netwerk uiteindelijk uitkomt op een andere vertakking dan degene die je indexer aanvankelijk had verwerkt. Wanneer dit gebeurt, zijn de blokken die je indexer al heeft verwerkt niet langer canonieke blokken, en zijn alle records die uit die blokken zijn afgeleid onjuist.
Een robuuste indexer moet reorganisaties detecteren, de betrokken records terugdraaien en de juiste blokken opnieuw verwerken. Als reorganisaties niet correct worden afgehandeld, leidt dit tot het verschijnen van ‘fantoomtransacties’ in uw database (transacties die wel in de oude vertakking voorkwamen, maar niet in de nieuwe), ontbrekende transacties (transacties in de nieuwe vertakking die niet in de oude vertakking waren opgenomen) en een onjuiste status. Voor financiële toepassingen is dit soort gegevenscorruptie onaanvaardbaar.
Het afhandelen van reorganisaties maakt de indexeringspijplijn aanzienlijk complexer. De indexeerder moet bijhouden welke blokken al zijn verwerkt, de keten die hij ziet vergelijken met wat hij al heeft opgeslagen, afwijkingen opsporen en rollbacks netjes uitvoeren. Dit is een van de belangrijkste redenen waarom teams de voorkeur geven aan beheerde indexeringsoplossingen boven het helemaal zelf bouwen van indexeerders.
Benaderingen voor indexering
The Graph is het meest gebruikte gedecentraliseerde indexeringsprotocol. Ontwikkelaars maken ‘subgraphs’ aan: dit zijn configuratiebestanden waarin wordt vastgelegd welke smart contracts moeten worden gemonitord, naar welke gebeurtenissen moet worden geluisterd en hoe gebeurtenisgegevens moeten worden omgezet in een doorzoekbaar schema. Onafhankelijke knooppuntbeheerders, zogenaamde ‘indexers’, beheren de verwerkingsinfrastructuur en verwerken zoekopdrachten via GraphQL-eindpunten. The Graph werkt goed voor standaardtoepassingen zoals het opvragen van gegevens van DeFi-protocollen, de eigendomsgeschiedenis van NFT’s en DAO-governanceactiviteiten. Beperkingen zijn onder meer latentie (updates van subgraphs vinden niet altijd in realtime plaats), een inflexibel schema (het wijzigen van je schema vereist vaak herimplementatie en hersynchronisatie) en afhankelijkheid van de beschikbaarheid van het gedecentraliseerde netwerk.
Aangepaste indexers geven teams volledige controle over hun datapijplijn, maar vergen een aanzienlijke investering op technisch gebied. Het bouwen van een aangepaste indexer die geschikt is voor productieomgevingen houdt in dat er logica voor het invoeren van blokken moet worden geschreven, evenementen moeten worden gedecodeerd, een databaseschema moet worden ontworpen, herorganisaties moeten worden afgehandeld, fouten moeten worden hersteld, monitoring moet worden ingesteld en de infrastructuur moet worden geschaald. Voor grootschalige toepassingen met unieke gegevensvereisten kan deze investering de moeite waard zijn, maar voor de meeste teams betekent dit maanden aan technische inspanning die beter aan hun kernproduct zou kunnen worden besteed.
Push-gebaseerde streaming is een nieuwere aanpak die het indexeren vereenvoudigt door gefilterde blockchain-gegevens rechtstreeks naar uw opslagsysteem te sturen, waardoor u niet langer zelf een extractielaag hoeft op te zetten en te onderhouden. In plaats van dat uw indexer gegevens van een knooppunt ophaalt, stuurt een streamingdienst precies de gegevens die u nodig hebt naar uw database, webhook of datawarehouse.
Hoe ' Quicknode ' blockchain-indexering mogelijk maakt
Quicknode Streams is speciaal ontwikkeld voor het indexeren van blockchaingegevens. Streams biedt een op push gebaseerde gegevenspijplijn die onbewerkte of gefilterde blockchaingegevens rechtstreeks naar de bestemming van uw keuze verzendt, waaronder PostgreSQL, Snowflake, Amazon S3, Azure Storage en webhooks. In plaats van een RPC-polling-infrastructuur op te zetten en te onderhouden om gegevens uit de blockchain te halen, configureert u een Stream met het gewenste netwerk, de gewenste dataset (blokken, transacties, ontvangstbewijzen, traces) en optionele JavaScript-filters, waarna Quicknode de rest voor zijn rekening neemt.
Streams levert gegevens in definitieve volgorde met een ‘exactly-once’-leveringsgarantie, wat betekent dat uw database consistent blijft met de canonieke keten zonder dat uw code de volgorde van blokken of het verwijderen van dubbele gegevens hoeft te beheren. De ingebouwde reorg-verwerking detecteert automatisch reorganisaties van de keten en verstuurt correctiepakketten, zodat uw geïndexeerde gegevens altijd de werkelijke toestand van de keten weerspiegelen. Voor historische gegevens kunt u met de 'backfill'-functie van Streams uw database vullen met elk willekeurig bereik van eerdere blokken, waarbij de synchronisatie tot zeven keer sneller verloopt dan bij traditionele, op RPC gebaseerde indexeringspijplijnen, met dezelfde filter- en leveringsgaranties als bij realtime streaming.
Quicknode publiceert tevens een stapsgewijze handleiding voor het bouwen van een blockchain-indexer via Streams, waarin wordt gedemonstreerd hoe je een complete ERC-20-overdrachtsindexer kunt maken, ondersteund door PostgreSQL en met een REST-API, van configuratie tot het uitvoeren van zoekopdrachten. Voor teams die behoefte hebben aan nog geavanceerdere gegevensverwerking, kan Streams worden geïntegreerd met Quicknode Functions om serverloze transformaties, verrijking en automatisering mogelijk te maken bovenop de streaming-gegevenspijplijn.
Wat is het verschil tussen indexering en ‘raw RPC’?
Raw RPC en indexering bieden antwoord op verschillende soorten vragen. RPC is bedoeld voor het opzoeken en schrijven van specifieke gegevens: haal dit blok op, lees dit saldo, verstuur deze transactie. Indexering is bedoeld voor zoekopdrachten en analyses: alle overschrijvingen voor een wallet, het totale volume per token, de eigendomsgeschiedenis van een collectie. In de onderstaande tabel worden de twee met elkaar vergeleken, zodat u voor elke taak het juiste hulpmiddel kunt kiezen.
Afmeting | Raw RPC | Geïndexeerde database |
|---|---|---|
Het beste in | Het uitlezen van punten en het indienen van transacties | Zoeken, filteren en samenvoegen |
Querytaal | JSON-RPC-methoden | SQL of GraphQL |
Historische scans | Langzaam, blok voor blok | Snel, voorbewerkt en geïndexeerd |
Zie ‘RPC versus indexering’ voor een gerichte vergelijking tussen beide, en zie ‘Hoe RPC-verzoeken werken’ om inzicht te krijgen in het onderliggende verzoekmodel.
Welke soorten zoekopdrachten worden door indexering mogelijk gemaakt?
Zodra gegevens in een gestructureerde database zijn geïndexeerd, worden vragen die met onbewerkte RPC onmogelijk zijn, een fluitje van een cent. Je kunt alle transacties voor een adres weergeven, de volledige eigendomsgeschiedenis van een NFT traceren, het handelsvolume per token per dag samenvoegen, wallets rangschikken op basis van hun bezit, of gebeurtenissen uit meerdere contracten met elkaar koppelen. Dit zijn precies de zoekopdrachten die de basis vormen voor dashboards, explorers en analyseproducten. Waarom deze zoekopdrachten zonder indexering zo moeilijk zijn, lees je in het artikel ‘Zoeken in blockchain-gegevens’.
Hoe werken indexering en streaming samen?
Streaming en indexering zijn elkaar aanvullende lagen. Streaming is het leveringsmechanisme dat nieuwe blokken en gebeurtenissen naar je infrastructuur stuurt zodra ze plaatsvinden, terwijl indexering ervoor zorgt dat die binnenkomende gegevens worden georganiseerd in een doorzoekbare opslagplaats. In een gangbare moderne architectuur wordt een streamingpijplijn gebruikt om records in een geïndexeerde database in te voeren, waardoor de kwetsbare pollinglaag volledig wordt verwijderd. Lees ‘Wat is blockchain-datastreaming’ en ‘Polling versus streaming’ om te zien hoe gegevens in de eerste plaats bij de indexeerder terechtkomen.
Hoe vullen indexeerders historische gegevens aan?
Backfilling is het proces waarbij je database wordt gevuld met historische blokken voordat je overschakelt naar live gegevens. Een goede pijplijn begint bij een gekozen historisch blok, verwerkt de keten in voorwaartse richting en schakelt vervolgens naadloos over naar realtime zodra het einde van de keten is bereikt, zodat historische en live records één schema delen. Als het goed wordt uitgevoerd, is backfilling veel sneller dan het opnieuw scannen van de keten via onbewerkte RPC. Bekijk hoe u toegang krijgt tot historische blockchain-gegevens en vergelijk realtime- met historische blockchain-gegevens om de bijbehorende afwegingen te zien.
Veelgestelde vragen
Waarom kan ik niet gewoon RPC gebruiken in plaats van indexeren?
RPC is uitstekend geschikt voor het ophalen van een specifiek blok, een specifieke transactie of een specifiek saldo, maar biedt geen mogelijkheid om binnen de blockchain te zoeken, te filteren of gegevens samen te voegen. Om via RPC een vraag als „alle overschrijvingen vanuit deze wallet” te beantwoorden, moeten miljoenen blokken één voor één worden doorzocht, wat onpraktisch is. Bij indexering worden die gegevens vooraf in een database verwerkt, zodat dezelfde vraag met één enkele query kan worden beantwoord.
Wat is een subgrafiek?
Een subgrafiek is een door The Graph gebruikte configuratie die bepaalt welke contracten en gebeurtenissen moeten worden geïndexeerd en hoe deze moeten worden omgezet in een doorzoekbaar GraphQL-schema. Het is een populaire manier om een index op te bouwen, die zeer geschikt is voor standaard DeFi-, NFT- en governance-gegevens, hoewel er in vergelijking met op maat gemaakte of op streaming gebaseerde pijplijnen een afweging kan zijn tussen realtime latentie en schemaflexibiliteit.
Hoe gaan indexers om met reorganisaties van de blockchain?
Een robuuste indexer detecteert wanneer de canonieke keten verandert, draait records die zijn afgeleid van de verweesde blokken terug en verwerkt de juiste records opnieuw. Zonder dit ontstaan er in je database spooktransacties of ontbrekende transacties. Beheerde pijplijnen verwerken reorganisaties automatisch door correctiegegevens te verzenden. Zie voor meer achtergrondinformatie: wat is een blockchain-reorganisatie?
Moet ik mijn eigen indexer bouwen of gebruikmaken van een beheerde dienst?
Het bouwen van een aangepaste indexer biedt volledige controle, maar vereist het schrijven van code voor het invoeren, decoderen, ontwerpen van schema’s, afhandelen van reorganisaties, monitoren en schalen, wat vaak maanden werk kost. Een beheerde pijplijn regelt de extractie, sortering, reorganisaties en levering voor je, zodat de meeste teams sneller in productie kunnen gaan door een service te configureren en hun technische inspanningen te richten op hun kernproduct.
In welke databases kunnen geïndexeerde blockchain-gegevens worden opgeslagen?
Geïndexeerde gegevens worden doorgaans opgeslagen in PostgreSQL, MongoDB, Snowflake, Elasticsearch of objectopslag zoals Amazon S3, afhankelijk van of je transactionele query’s, full-text-zoekopdrachten of analyses op grote schaal nodig hebt. Een streamingpijplijn kan records rechtstreeks naar deze bestemmingen sturen. Voor stapsgewijze handleidingen biedt de Builders Guide een overzicht van veelvoorkomende indexeringspatronen.
Aanvullende literatuur
Een blockchain-indexer bouwen met Streams - Quicknode -handleiding
Aan de slag met Streams - Quicknode -documentatie
Blockchain-gegevens aanvullen - Quicknode -documentatie
Web3-gegevens onder de knie krijgen met blockchain-ETL - Quicknode -blog