Duniter-squid

Oui le schéma graphql a évolué indépendamment de l’intégration de Hasura pour simplifier les champs memberships de identity, et ajouter les historiques d’événements memberships.

Voilà une requête qui réuni certifs émisent et reçus par adresses:

query CertsByAaddress {
  identity(where: {account_id: {_eq: "5CQ8T4qpbYJq7uVsxGPQ5q2df7x3Wa4aRY6HUWMBYjfLZhnn"}}) {
    certsByIssuerId_aggregate(limit: 10, offset: 0) {
      aggregate {
        count
      }
      nodes {
        created_on
        expire_on
        identity {
          account_id
          name
        }
      }
    }
    certs_aggregate(limit: 10, offset: 0) {
      aggregate {
        count
      }
      nodes {
        created_on
        expire_on
        identityByIssuerId {
          account_id
          name
        }
      }
    }
  }
}

Comme vue au téléphone, avec pagination par offset malheureusement (issue Hasura API relay).
Mais je vois que la valeur du count vaut la valeur du limit de la page et non de l’ensemble de la liste malheuresement.

Une requête équivalent sans aggregate:

query CertsByAaddress {
  identity(where: {account_id: {_eq: "5CQ8T4qpbYJq7uVsxGPQ5q2df7x3Wa4aRY6HUWMBYjfLZhnn"}}) {
    certsByIssuerId(limit: 10, offset: 0) {
      identity {
        account_id
        name
      }
      created_on
      expire_on
    }
  }

erratum
On regarde avec Hugo le schéma Hasura actuel, il reste des soucis, des noms de fields qui ne sont pas bon (enfin qui ne sont pas parlant), qu’on va devoir modifier, et des champs manquant sur les certs.

Donc ne touche pas à cette partie dans Cesium pour le moment, ça va encore bouger, désolé.

2 Likes

Au passage, peut-être est-ce possible d’avoir des noms d’attributs en camelCase, plutôt qu’en snake_case ? :slight_smile:

Edit : a priori on peut changer la convention de nommage : Postgres: Naming Conventions | Hasura GraphQL Docs

Question secondaire : hasura est-il bien un logiciel libre ?

Dans duniter-squid sans hasura, on a choisi le schéma avec soin pour que ce soit compréhensible et facile à utiliser. Pour l’instant avec hasura le schéma est dérivé de manière un peu brute, il nous reste encore à en prendre le contrôle plus finement. Donc pour l’instant mieux vaut rester sur mon instance https://subsquid.gdev.coinduf.eu/graphql qui est à jour sur une version plus stable.
Hasura a comme GitLab une CE et une EE. La CE en version 2 est déjà très puissante et nous facilite la vie, mais je ne sais pas bien ce qu’ils ont prévu pour le futur avec la version 3. Pour camelCase c’est le cas dans squid, on va essayer de coller à ça, je trouve aussi que c’est plus approprié que la snake_case.

PS : voici les langages utilisés dans Hasura, le “λ” du logo vient du Haskell :

image

1 Like

Et la V3 (dispo en alpha) est écrite en Rust :slight_smile:

2 Likes

J’en parlais justement sur mastodon :smile_cat: Hugo Trentesaux ⏚: "Apparemment #Hasura (v2 en #Haskell) réécrit son …" - Mastodon.zaclys.com (n’hésitez pas à me suivre là bas, j’y suis très actif)

J’ai un peu de mal à suivre vos discussions. Aujourd’hui, si on veut configurer un indexeur fonctionnel est-il nécessaire d’ajouter Hasura ? Car je ne vois rien de tel dans le docker-compose.yml du dépôt duniter-squid.

Merci pour vos lumières :slight_smile:

Non, aujourd’hui la doc est à jour (je crois). Mais dans la branche de poka tu peux voir qu’il y a un Dockerfile intégrant Hasura : Dockerfile.Hasura · hasura-graphql · nodes / duniter-squid · GitLab. Et nos discussions sont au sujet du remplacement éventuel du moteur graphql de squid par Hasura. Et “éventuel”, on peut le prendre au sens “possible” ou “prochain”, c’est au choix ><

1 Like

C’est du pur postgresQL. Hasura comprend les computed fields et l’ajoute dans les champs graphQL. Pas besoin d’Hasura pour utiliser des computed fields. Hasura comprend aussi les views et les materialized views.

La version community est sous MIT.
Dans la version libre, il n’y a pas de rate limiter ni de depth limit dans les requêtes gql.

Ç’a peut-être changé. Ça fait un bout de temps que je n’ai plus touché à Hasura…

@poka Tu as regardé les connecteurs ? Il y en a un pour deno : GitHub - hasura/ndc-typescript-deno: Instant Hasura Native Data Connector by writing Typescript Functions. Je ne sais pas si ça peut être utile…

Faut que je regarde ce que tu as fait…

2 Likes

Oui, c’est en cours :wink:

3 Likes

@kimamila je pense qu’on approche d’une version stable du schema graphql.

Voici un exemple pour la requête de certifications que tu demandais:

query CertsByAaddress {
  identity(where: {name: {_eq: "poka"}}) {
    certIssued(where: {isActive: {_eq: true}}) {
      receiver {
        name
        createdOn
        expireOn
        createdIn {
          block {
            timestamp
          }
        }
      }
    }
    certReceived(where: {isActive: {_eq: true}}, orderBy: {createdOn: DESC}) {
      issuer {
        name
        createdOn
        expireOn
        createdIn {
          block {
            timestamp
          }
        }
      }
    }
  }
}

En fait la seule différence par rapport à avant Hasura, c’est la pagination que se fait désormais par offset malheureusement.

Cette instance est à jour: https://gdev-squid.axiom-team.fr
mdp: my_hasura_password
endpoint: https://gdev-squid.axiom-team.fr/v1/graphql

Dis moi ce que tu en pense, si il manque des choses ?


@ManUtopiK il n’y a en effet pas de rate limier pour le moment, mais au moins, le server GraphQL ne crash pas si on requête trop de ligne, ça va juste mouliner côté client.

Et je vois la possibilité de limiter le nombre de row par table, ce que tu avais d’ailleurs set pour ton indexer:


Désormais, les metadata hasura sont générés à partir du schema.graphql, lui même également utilisé pour générer le model TS via typeORM par subsquid.

Voici le script qui se charge de ça: src/generateHasuraMetadata.ts · 5b7534548a7837ef7b8e0b2bdb365d484afeba11 · nodes / duniter-squid · GitLab

Des commandes sqd simplifient la gestion de tout ça (le readme sur ma branche est à jour, et sqd --help nous montre tout. En gros c’est aussi simple qu’avant à manipuler, mais on a Hasura en plus.
C’est un peu un hybride entre ton indexer et la stack squid :slight_smile:
Sauf qu’on ne créer jamais rien via la console admin de Hasura, on génère les metadata à partir du schema.graphql.

# after modifying schema.graphql
sqd db:update

Cette commande réuni plusieurs commandes:

sqd codegen
sqd migration:generate
sqd migration:apply
sqd hasura:generate
sqd hasura:apply

Toutes les commandes sont listés dans commands.json

On peut également toujours lancer le moteur graphql de subsquid avec sqd serve si nécessaire, pour comparer l’API graphql par exemple.

Nous n’utilisons plus les migration Hasura, mais uniquement les migrations de squid, ce qui simplifie la stack (Merci @HugoTrentesaux pour ces réflexions et ce peer programming, sans quoi je partais dans une toute autre direction…).

4 Likes

Woah, ça a l’air terrible tout ça !

Pour le rate et depth limit, on peut passer par un proxy qui gère ça, genre GitHub - narrative-bi/traefik-graphql-limits.

1 Like

Cool, je regarde ça dans la journée. Beau travail !!

Salut @ManUtopiK, est-ce que tu seras là au RML18 ? On aimerait travailler sur les clients notamment le jeudi.
Je penses que ton analyse serait bien utile. Et puis ce serait l’occasion de te rencontrer. :slight_smile:

Belle journée a vous

3 Likes

Oui, c’est bon je me suis arrangé !
Je viens de remplir le formulaire. Je serai là du Lundi au Vendredi :slight_smile:

4 Likes

Extra ! Je vais enfin de serrer la pince :slight_smile:
Merci !

3 Likes

Wow, tu as liké en moins de 10s ! :slight_smile:
Oui, cool, ça va faire du bien de monter en Bretagne un peu !

3 Likes

Je viens de publier une nouvelle image docker de squid.

Une instance à jour: https://gdev-squid.axiom-team.fr

Les nouveautés sont:

  • Ajout de tous les blocks G1 en négatif. Sur la GDev runtime 801, le premier block étant le block -700936:
{
  "node": {
    "height": -2,
    "timestamp": "2024-02-04T13:37:01+00:00",
    "hash": "\\x7b2230223a302c2231223a302c2232223a302c2233223a302c2234223a33322c2235223a3131312c2236223a3135352c2237223a39362c2238223a3232392c2239223a3230382c223130223a3233382c223131223a302c223132223a302c223133223a302c223134223a302c223135223a302c223136223a302c223137223a302c223138223a302c223139223a302c223230223a302c223231223a302c223232223a302c223233223a302c223234223a302c223235223a302c223236223a302c223237223a302c223238223a302c223239223a302c223330223a302c223331223a307d"
  }
},
{
  "node": {
    "height": -1,
    "timestamp": "2024-02-04T13:41:09+00:00",
    "hash": "\\x7b2230223a302c2231223a302c2232223a302c2233223a302c2234223a31372c2235223a33322c2236223a32392c2237223a35372c2238223a3136322c2239223a3233332c223130223a3232302c223131223a302c223132223a302c223133223a302c223134223a302c223135223a302c223136223a302c223137223a302c223138223a302c223139223a302c223230223a302c223231223a302c223232223a302c223233223a302c223234223a302c223235223a302c223236223a302c223237223a302c223238223a302c223239223a302c223330223a302c223331223a307d"
  }
},
{
  "node": {
    "height": 0,
    "timestamp": "2024-02-04T17:20:42.002+00:00",
    "hash": "\\xc184c4ccde8e771483bba7a01533d007a3e19a66d3537c7fd59c5d9e3550b6c3"
  }
},
{
  "node": {
    "height": 1,
    "timestamp": "2024-02-04T17:20:48.002+00:00",
    "hash": "\\x1efdffd1f89515174e56a074693f8775e3e89c88e19ae09db05c34cc595184ba"
  }
},
{
  "node": {
    "height": 2,
    "timestamp": "2024-02-04T17:20:54.003+00:00",
    "hash": "\\x951cbc858bb5330cb89f48c234489bfb2d7f0d1aea647ead482104f1a78a8e0a"
  }
}
  • Les dates de certifications d’avant la migration sont correctes, ainsi que l’historique de leurs changements.
    Voici mes certifications envoyées par exemple:
{
  "data": {
    "identityConnection": {
      "edges": [
        {
          "node": {
            "certIssued": [
              {
                "receiver": {
                  "name": "14572"
                },
                "createdOn": 56765,
                "updatedOn": 56765,
                "createdIn": {
                  "block": {
                    "timestamp": "2024-02-08T15:59:36+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2024-02-08T15:59:36+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": 56765,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "Paola"
                },
                "createdOn": -81091,
                "updatedOn": -81091,
                "createdIn": {
                  "block": {
                    "timestamp": "2023-04-20T16:03:06+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2023-04-20T16:03:06+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -81091,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "JulyduCausse"
                },
                "createdOn": -90336,
                "updatedOn": -90336,
                "createdIn": {
                  "block": {
                    "timestamp": "2023-03-18T18:06:32+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2023-03-18T18:06:32+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -90336,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "Yvv"
                },
                "createdOn": -92860,
                "updatedOn": -92860,
                "createdIn": {
                  "block": {
                    "timestamp": "2023-03-09T19:06:49+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2023-03-09T19:06:49+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -92860,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "atlasan"
                },
                "createdOn": -94253,
                "updatedOn": -94253,
                "createdIn": {
                  "block": {
                    "timestamp": "2023-03-04T18:57:56+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2023-03-04T18:57:56+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -94253,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "Pier56"
                },
                "createdOn": -116776,
                "updatedOn": -116776,
                "createdIn": {
                  "block": {
                    "timestamp": "2022-12-13T17:44:40+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2022-12-13T17:44:40+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -116776,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "LEZARD"
                },
                "createdOn": -120952,
                "updatedOn": -120952,
                "createdIn": {
                  "block": {
                    "timestamp": "2022-11-28T17:27:47+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2022-11-28T17:27:47+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -120952,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "JorgHoche"
                },
                "createdOn": -122338,
                "updatedOn": -122338,
                "createdIn": {
                  "block": {
                    "timestamp": "2022-11-23T17:21:52+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2022-11-23T17:21:52+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -122338,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "LeBrice"
                },
                "createdOn": -129107,
                "updatedOn": -129107,
                "createdIn": {
                  "block": {
                    "timestamp": "2022-10-30T08:24:41+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2022-10-30T08:24:41+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -129107,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "Helios"
                },
                "createdOn": -158762,
                "updatedOn": -158762,
                "createdIn": {
                  "block": {
                    "timestamp": "2022-07-15T12:37:25+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2022-07-15T12:37:25+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -158762,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "Damery"
                },
                "createdOn": -509286,
                "updatedOn": -160192,
                "createdIn": {
                  "block": {
                    "timestamp": "2019-01-28T20:28:33+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2022-07-10T12:28:16+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -160192,
                    "eventType": "RENEWAL"
                  },
                  {
                    "blockNumber": -509286,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "PiNguyen"
                },
                "createdOn": -528022,
                "updatedOn": -135347,
                "createdIn": {
                  "block": {
                    "timestamp": "2018-11-22T09:02:43+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2022-10-07T22:52:57+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -135347,
                    "eventType": "RENEWAL"
                  },
                  {
                    "blockNumber": -330062,
                    "eventType": "RENEWAL"
                  },
                  {
                    "blockNumber": -528022,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "MamieCrypto"
                },
                "createdOn": -589359,
                "updatedOn": -127720,
                "createdIn": {
                  "block": {
                    "timestamp": "2018-04-15T10:39:16+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2022-11-04T08:41:18+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -127720,
                    "eventType": "RENEWAL"
                  },
                  {
                    "blockNumber": -379850,
                    "eventType": "RENEWAL"
                  },
                  {
                    "blockNumber": -589359,
                    "eventType": "CREATION"
                  }
                ]
              },
              {
                "receiver": {
                  "name": "Paulart"
                },
                "createdOn": -698308,
                "updatedOn": -20619,
                "createdIn": {
                  "block": {
                    "timestamp": "2017-03-17T22:07:31+00:00"
                  }
                },
                "updatedIn": {
                  "block": {
                    "timestamp": "2023-11-22T19:17:04+00:00"
                  }
                },
                "certHistory": [
                  {
                    "blockNumber": -20619,
                    "eventType": "RENEWAL"
                  },
                  {
                    "blockNumber": -510684,
                    "eventType": "RENEWAL"
                  },
                  {
                    "blockNumber": -698308,
                    "eventType": "CREATION"
                  }
                ]
              }
            ]
          }
        }
      ]
    }
  }
}
  • De nouveaux champs updatedOn et updatedIn pour chaque certification en plus des createdOn et createdIn.

Les conséquences de ces changements sont:

  • Un temps de première synchronisation sensiblement plus long (environ 15 minutes).
  • Nécessite 4Go de RAM disponible au moment de la synchronisation uniquement, puis seulement une centaine de Mo sont utilisés pendant le cycle de vie standard.
  • Vous devez supprimer les données de votre indexer pour les mettre à jour:
docker compose pull
docker compose down -v
docker compose up -d

Pour rappel pour lancer votre indexer:

4 Likes

J’ai mis à jour mon indexeur, l’adresse est https://hasura.gdev.coinduf.eu/, j’ai mis à jour la liste des endpoints dans About the ĞDev category.

2 Likes

J’ai mis en ligne une nouvelle version qui prend en entrée les fichiers d’historique publiés par la nouvelle version de py-g1-migrator exécutée par la CI de Duniter (encore non fusionné). Ces données sont plus complètes avec notamment l’ajout des expirations de certification. De plus, le temps d’indexation du genesis a été réduit à 4 minutes, même s’il faut environ 40 minutes pour rattraper le reste de la blockchain.

L’image docker est h30x/duniter-squid et le docker-compose.yml a été mis à jour avec de nouvelles variables d’environnement.

De plus, cette version corrige les hash des blocs v1 qui étaient cassés.

On se rapproche petit à petit d’un indexeur squid capable de présenter toutes les données v1. Il manque encore certaines informations comme les événements d’adhésion (expiration, révocation…).

Indexeur à jour : https://hasura.gdev.coinduf.eu/v1/graphql. La différence devrait se voir dans Cesium v2 sur l’affichage de l’historique des certifications.

3 Likes

J’ai changé mon endpoint squid, c’est maintenant https://squid.gdev.coinduf.eu/. Il fait tourner une version non fusionnée qui gère les commentaires de transaction de manière préliminaire. Le docker-compose a changé et est toujours disponible sur le dépôt nodes / duniter-squid · GitLab.

2 Likes

https://gdev.1000i100.fr/indexer/v1/graphql
est désormais disponible :slight_smile:

3 Likes