Comment remplir un historique de données blockchain (backfill) ?
Mis à jour en août 2026
Spécifiez un bloc de départ et exécutez votre module Substreams via un sink. L'historique est découpé en segments et traité en parallèle plutôt que séquentiellement, et lorsque le pipeline atteint la tête de chaîne, il bascule automatiquement en diffusion en direct.
Il n'y a pas de tâche de backfill séparée à écrire, ni de transition entre le chemin historique et le chemin en direct.
Pourquoi les backfills sont-ils généralement si pénibles ?
Parce que la plupart des indexeurs traitent l'historique de la même façon que les données en direct — un bloc après l'autre. C'est correct, mais lent : synchroniser des années d'une chaîne active peut prendre des jours, voire des semaines, période pendant laquelle vous n'avez aucune donnée exploitable.
Pire, cela se répète. Changez votre schéma, ajoutez un champ, corrigez un bug de décodage, et vous recommencez. Les équipes finissent par traiter tout changement à la logique historique comme un projet de plusieurs semaines, ce qui décourage discrètement de corriger les choses.
Qu'est-ce qui rend le traitement parallèle possible ?
Deux propriétés qui travaillent ensemble.
Les données sont déjà extraites. Firehose a déjà écrit le registre d'exécution de la chaîne dans des flat files. Lire le bloc 5 000 000 ne nécessite pas de rejouer tout ce qui précède — le fichier est simplement là.
Les modules sont structurés pour l'indépendance. Les modules Substreams sont définis de façon à ce que les segments historiques puissent être calculés séparément puis fusionnés. C'est pourquoi le modèle de programmation impose des types de modules map et store plutôt que de vous laisser écrire du code à état arbitraire.
Résultat : le débit est limité par la capacité de parallélisation, pas par le temps de bloc.
Comment planifier un backfill ?
Choisissez un véritable bloc de départ. Pas le genesis par réflexe — plutôt le bloc de déploiement de votre contrat, ou la date la plus ancienne dont votre application a réellement besoin. C'est le levier le plus important sur la durée du backfill.
Testez d'abord sur une plage restreinte. Exécutez quelques milliers de blocs, inspectez la sortie, vérifiez-la face à un explorateur de blocs ou une requête existante. Découvrir une erreur de décodage après avoir traité cinq ans de données est évitable.
Ajustez la taille des lots pour le backfill. Les valeurs par défaut de la diffusion en direct sont prudentes. Des lots plus grands améliorent nettement le débit d'ingestion, et peuvent être réduits une fois que vous suivez le direct.
Envisagez une table de staging. Pour de gros chargements dans une table déjà utilisée par des requêtes, écrivez dans une table de staging puis basculez.
Comment savoir si c'est correct ?
Vérifiez de manière indépendante. Choisissez un ensemble de blocs, comparez votre sortie à un explorateur de blocs ou à une requête connue pour être correcte, et confirmez que les comptes et les valeurs correspondent. Faites-le avant l'exécution complète, pas après.
Attention à l'échec qui n'est pas évident : les transactions internes et les changements d'état n'apparaissent jamais dans les logs d'événements, donc si vos attentes ont été formées par un outil basé sur les logs, une extraction complète peut légitimement produire plus d'enregistrements que prévu. C'est généralement correct, pas un bug.
Que se passe-t-il à la fin ?
Rien que vous ayez à faire. Le pipeline atteint la tête de chaîne et bascule en diffusion en direct avec le même module et le même sink. Le curseur se poursuit, donc il n'y a ni rupture ni rien à réconcilier.
Questions fréquentes
Puis-je faire un backfill dans une base de données qui sert déjà des données en direct ? Oui, même si une table de staging et un basculement sont plus sûrs pour les gros chargements.
Que se passe-t-il si le backfill échoue à mi-chemin ? Le sink reprend depuis son dernier curseur validé plutôt que de repartir de zéro.
Ai-je besoin d'un archive node ? Non — voir ai-je besoin d'un archive node ?
Obtenez une clé API sur thegraph.market — aucune information personnelle requise.
Voir aussi : Puis-je obtenir l'historique complet et les données en temps réel depuis une seule source ? · Ai-je besoin d'un archive node pour obtenir des données historiques ? · Comment diffuser des données onchain vers une base de données ?