Suite aux discussions récentes sur le fil Duniter-squid - #41 by poka et à la MR !16, je pense qu’il est bon de prendre un peu de recul sur les raisons des choix de stack.
Le premier indexeur duniter-indexer
réalisé par @ManUtopiK et aujourd’hui archivé est né alors que squid n’était pas du tout mature, notamment suite à une discussion (2022-02-22) qui a suivi un ticket subsquid :
discussion que j’ai illustrée ainsi :
Cette preuve de concept étant le premier indexeur disponible pour Duniter-v2, il a naturellement été intégré aux clients Ğecko et Ğcli.
Plus tard, motivé par les mêmes besoins qu’elois d’avoir un indexeur substrate générique
j’ai tenté de reprendre l’indexeur Hydra que j’utilisais aussi, mais comme ça ne marchait pas et qu’entre temps Hydra était devenu Subsquid, je me suis lancé dans un indexeur subsquid (sans voir le dépôt de elois)
- 2023-11-20 je crée un dépôt d’après le tutoriel squid
- 2023-11-22 j’ajoute les composants de “giant squid” pour avoir accès à une indexation générique
- à ce stade, j’avais ce qu’il me fallait : de quoi débugger la blockchain avec une indexation de tous les blocs, extrinsics, calls et événements, mais j’ai décidé de pousser l’expérience un peu plus loin pour voir où ça me mènerait
- 2023-11-26 en quelques jours de travail, j’arrive à un indexeur aussi complet que duniter-indexer et
- sans les bugs de duniter-indexer
- avec des types typescript entièrement dérivés des metadata du runtime
- avec la gestion des blocs non finalisés et du rewind des forks BABE
- avec de bien meilleures perspectives de développement (notamment runtime upgrades)
- mais avec quelques limitations liés à des choix discutables de subsquid
- un bug de typeorm qui empêche de checker la null safety #228 (légèrement gênant mais on peut vivre avec)
- l’impossibilité de choisir des primary key qui ne soient pas des string (légèrement gênant également, mais pas dramatique)
Il m’est donc apparu clairement que squid était la direction à prendre, et je suis encore entièrement de cet avis. Entre temps, @poka s’est fait la main sur squid (janvier 2024) et a entrepris d’implémenter des fonctionnalités plus ambitieuses (février 2024) avec une fonction SQL pour les DU par membre. Ce faisant, il a découvert des limites de squid :
- l’absence de sécurité par défaut contre des requêtes graphql malicieuses (aspirer la base de données entière ou des récursions infinies) dans le processeur graphql (alors que Hasura a ça par défaut)
- la prise en charge limitée des requêtes SQL custom dans l’overlay graphql (alors que Hasura fait ça par défaut)
- les fonction de paginations moins avancés que l’API relay de Hasura (beta)
- (à completer si j’ai oublié quelque chose, mais il me semble que c’est les deux plus gros points)
Et donc tout feu tout flamme (en même temps c’est poka
), il s’est lancé dans l’intégration de Hasura à duniter-squid pour obtenir le meilleur des deux mondes (21-22-23 février). (je vois ça en direct parce que poka bosse chez moi en ce moment).
Mais là on se frotte à deux logiques contraires :
- d’une part squid part d’un schéma annoté et en déduit les types orm et la structure de la base de données
- d’autre part Hasura part de la structure de la base de données et en déduit un schéma graphql
Il n’est donc pas évident de savoir qui doit gérer les migrations de la base de données, et comment profiter du meilleur des deux mondes sans subir de conflits. Pour réfléchir à cette question, voici les points qui me semblent importants :
- garder le contrôle sur le schéma sans que cela soit trop complexe (confort des devs de clients)
- conserver une définition de la base de données sans action manuelle (charge de travail et homogénéité)
- pouvoir remplir la base de données avec des typeorm, donc sans sql (confort et vitesse de développement)
- se passer de l’écriture du résolveur graphql pour les requêtes sql custom (complexité et source de bugs)
- profiter d’une sécurisation par défaut sans action manuelle (l’API principale ne doit pas être fragile)
Trouver la bonne architecture pour répondre à ces contraintes peut prendre un peu de temps, donc je pense qu’il faut éviter de se lancer tête la première dans l’intégration de Hasura coûte que coûte de manière prématurée.
J’invite les développeurs de clients à se fier au schéma actuel, que l’on doit encore compléter et stabiliser. De mon côté je vais essayer de trouver une autre approche pour intégrer Hasura à duniter-squid qui permette de conserver le contrôle sur le schéma. @poka il faut qu’on discute des priorités sur duniter-squid et les datapods, à mon avis intégrer Hasura de cette façon est un peu prématuré, conceptuellement on pourrait même le faire après la migration sans trop de problème.
Bon, c’est pas clair, on va peut-être trouver la solution plus vite que prévu.