Retour au blog
StreamingFast

Les sinks Substreams sont désormais intégrés : Uniswap V4 indexé en moins de 8 minutes

Nous avons intégré substreams-sink-sql à la CLI Substreams, tout en améliorant considérablement sa vitesse et ses performances. Vous lancez désormais directement substreams sink postgres ou substreams sink clickhouse, sans binaire séparé à installer et sans choix à faire entre run et from-proto. Passez un package et le mode est détecté automatiquement.

Ce changement va bien au-delà du simple rangement. Le nouveau sink ajoute un spool sur disque, reporte les contraintes Postgres jusqu'à l'arrivée en tête de chaîne, et décode le protobuf avec un unmarshaller bien plus rapide. Dans un benchmark Uniswap V4 mené par BuildersDAO, de The Graph, un backfill complet d'Uniswap V4 sur Ethereum est passé de 23 heures avec un subgraph à seulement 7 minutes 36 secondes avec Substreams, grâce à un abonnement Pro Plan. Soit 182x plus rapide !

Le benchmark

BuildersDAO voulait une comparaison à armes égales entre les subgraphs et Substreams pour l'indexation d'Uniswap V4. Mêmes événements, même base Postgres, mêmes plages de blocs : de 21 688 328 à 23 535 547 sur Ethereum (environ 1,8 M de blocs) et de 25 350 987 à 36 712 209 sur Base (environ 11,4 M de blocs). Ils ont retraité chaque plage avec un subgraph, puis avec Substreams à cache froid et avec différents nombres de workers, en utilisant Substreams v1.22.0 pour les dernières exécutions.

Graphique en barres comparant les temps de backfill d'Uniswap V4. Sur Ethereum, un subgraph met 23 heures contre 7 minutes 36 secondes avec Substreams, soit 182x plus rapide. Sur Base, 94 heures 19 minutes contre 2 heures 6 minutes, soit 45x plus rapide. Graphique en barres comparant les temps de backfill d'Uniswap V4. Sur Ethereum, un subgraph met 23 heures contre 7 minutes 36 secondes avec Substreams, soit 182x plus rapide. Sur Base, 94 heures 19 minutes contre 2 heures 6 minutes, soit 45x plus rapide.
RéseauSubgraphSubstreams, 75 workersGain
Ethereum23 h 00 min7 min 36 s182x
Base94 h 19 min2 h 06 min45x

Environnement du benchmark : Ubuntu 24.04, PostgreSQL 16.14, disque de 1,8 To, package d'événements Uniswap V4, endpoints StreamingFast pour Ethereum et Base mainnet.

Plus de workers, plus de vitesse

Substreams parallélise le traitement de l'historique, et vous contrôlez jusqu'où avec un seul en-tête, X-Substreams-Parallel-Workers. Voici la courbe de montée en charge complète des exécutions en v1.22.0 :

WorkersRéseau Ethereum (durée)vs subgraphRéseau Base (durée)vs subgraph
18 h 12 min2,8x28 h 41 min3,3x
51 h 37 min14x26 h 51 min3,5x
1536 min38x9 h 10 min10x
757 min 36 s182x2 h 06 min45x
3007 min 30 s*184x56 min 38 s100x

Benchmark BuildersDAO · Substreams v1.22.0 · cache froid.

*Les gains d'Ethereum plafonnent autour de 75 workers, alors que Base a bien plus de données à traiter et continue donc de progresser de 75 à 300. Plus le backfill est long, plus les workers supplémentaires paient.

Graphique en courbes du temps de backfill d'Uniswap V4 en fonction du nombre de workers parallèles, en échelle logarithmique. Ethereum passe de 8 heures 12 minutes avec un worker à 7 minutes 36 secondes avec 75 workers, puis se stabilise. Base passe de 28 heures 41 minutes à 56 minutes 38 secondes avec 300 workers. Les lignes pointillées indiquent la référence subgraph de chaque chaîne. Graphique en courbes du temps de backfill d'Uniswap V4 en fonction du nombre de workers parallèles, en échelle logarithmique. Ethereum passe de 8 heures 12 minutes avec un worker à 7 minutes 36 secondes avec 75 workers, puis se stabilise. Base passe de 28 heures 41 minutes à 56 minutes 38 secondes avec 300 workers. Les lignes pointillées indiquent la référence subgraph de chaque chaîne.

Échelle logarithmique sur l'axe du temps ; les lignes pointillées indiquent la référence subgraph de chaque chaîne.

Avec 300 workers, le débit a atteint 4 103 blocs/s sur Ethereum et 3 343 blocs/s sur Base, de bout en bout jusque dans Postgres.

Ce qui a changé dans le sink

Les premières exécutions de BuildersDAO nous ont indiqué les goulots d'étranglement. Trois changements expliquent l'essentiel de l'amélioration depuis :

  • Un spool sur disque. Les données sont téléchargées dans un spool local (8 GiB par défaut) et validées dans la base de manière asynchrone, si bien qu'une base lente ne bloque plus le flux. Cela seul apporte jusqu'à 10x sur le débit du sink Postgres. Veillez à ce que l'hôte du sink dispose de suffisamment d'espace disque pour le spool.
  • Contraintes appliquées en tête de chaîne. Les contraintes Postgres ne sont plus créées au début d'un backfill. Elles sont appliquées lorsque vous atteignez les blocs en direct, ou à la demande avec substreams sink postgres constraints apply, et elles peuvent être construites en parallèle. C'est la même astuce que de charger Postgres sans index puis de les construire ensuite.
  • Un unmarshaller protobuf plus rapide. Nous avons remplacé dynamicpb par hyperpb, soit un décodage 18x plus rapide et une seule arène mémoire par bloc au lieu de milliers d'allocations.

BuildersDAO a aussi partagé un conseil pratique : ingérez d'abord les tables brutes jusqu'à la tête de chaîne, puis faites une pause et construisez vos vues matérialisées. Les vues matérialisées lourdes exécutées pendant le backfill étaient le goulot d'étranglement, et les désactiver a donné un gain immédiat.

Migration

Les bases de données existantes continuent de fonctionner. Les tables de curseur et les schémas sont inchangés : vous pouvez donc mettre un sink en pause, mettre à jour la CLI et reprendre depuis votre curseur sans retraitement. Les principales différences :

AvantMaintenant
substreams-sink-sql run $DSN manifest.yaml 100:200substreams sink postgres manifest.yaml -s 100 -t 200 --dsn $DSN
substreams-sink-sql from-proto ...Détecté automatiquement d'après le type du module de sortie
substreams-sink-sql setup $DSN manifest.yamlsubstreams sink postgres setup manifest.yaml --dsn $DSN
DSN en argument positionnel, ou PG_DSN / CLICKHOUSE_DSNOption --dsn ou SUBSTREAMS_SINK_DSN
--metrics-listen-addr--prometheus-addr

Le guide de migration couvre chaque option et chaque changement Docker. Le dépôt substreams-sink-sql est en cours de dépréciation, et les nouveaux dialectes SQL se trouvent désormais dans le dépôt substreams, sous sink/sql.

Le skill Substreams est lui aussi mis à jour

Le skill Substreams pour les agents de code IA enseigne désormais les commandes intégrées substreams sink postgres et substreams sink clickhouse, afin que des agents comme Claude Code génèrent la syntaxe actuelle plutôt que celle du binaire déprécié.

Pour installer le skill, suivez la présentation des skills, ou récupérez les neuf depuis le dépôt GitHub pour devenir un expert Substreams.

À vous de jouer

Mettez à jour la CLI Substreams (v1.22.0 ou ultérieure), pointez substreams sink postgres ou substreams sink clickhouse vers votre package, et définissez votre nombre de workers.

Un grand merci à l'équipe BuildersDAO d'avoir mené ce benchmark et de nous avoir poussés à examiner de plus près ce qui ralentissait la synchronisation. Leurs retours ont façonné plusieurs de ces changements.

Vous avez vos propres résultats ? Venez nous les partager sur Discord.