# Prototype de GVA

**URL:** https://forum.duniter.org/t/prototype-de-gva/7688
**Category:** Duniter-v1
**Tags:** gva
**Created:** [18 October 2020 14:40 UTC](https://forum.duniter.org/t/prototype-de-gva/7688 "2020-10-18T14:40:53Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [18 October 2020 14:40 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/1 "2020-10-18T14:40:53Z")

</div>

J’ai réalisé un prototype de GVA permettant de faire un paiement !

Prototype réalisé en Rust async avec [**async-graphql**](https://github.com/async-graphql/async-graphql) et [**warp**](https://github.com/seanmonstar/warp) (framework web utilisé également par le projet Deno).

Pour le moment ce prototype permet de :

- Consulter l’historique des transactions d’un compte
- Consulter les sources de monnaie d’un compte (UTXOs uniquement)
- **Envoyer une transaction**
- Souscrire à l’événement «&nbsp;réception d’une transaction par le serveur&nbsp;»

Attention peinture fraîche, c’est une version de dev (pre-alpha), accessible ici : [https://g1.librelois.fr/gva](https://g1.librelois.fr/gva)

J’ai réalisé une petite présentation vidéo dans laquelle je fais un paiement «&nbsp;à la main&nbsp;» :

> **[Duniter/Ğ1: présentation prototype GVA et réalisation d'un paiement via GVA](https://tube.p2p.legal/videos/watch/fdf99ccc-4c89-405a-8125-6fc574d78ee9)**
>
> Duniter/Ğ1: présentation prototype GVA et réalisation d'un paiement via GVA

Réaliser ce prototype m’a permis d’explorer techniquement beaucoup de choses qui vont être un fondement pour la suite. Cela à nécessité notamment la migration de la DB SQLite des transactions (qui contenait à la fois les transactions en mempool et l’historique des transactions).

J’ai dû créer deux nouvelles DB :

- txs\_mp\_v2 : Une base de donnée contenant les transactions en mempool
- gva\_v1 : une base de donnée dédiée à GVA contenant pour le moment l’historique des transactions ainsi qu’une indexation des UTXOs optimisée pour les clients (càd par compte plutôt que par identifier).

Le code source est disponible sur la branche [gva-proto](https://git.duniter.org/nodes/typescript/duniter/-/tree/gva-proto).

La prochaine étape est bien sûr l’indexation des dividendes universel, c’est plus compliqué car cela demande d’indexer au préalable la liste des comptes membres. J’ai déjà conçu les collections nécessaires dans la DB, reste à les remplir.

Concernant la pagination, je propose d’utiliser les [**spécifications officielles de graphql**](https://relay.dev/graphql/connections.htm), c’est ce que j’ai mis en place pour la consultation des UTXOs.

Le schéma va bien évidemment être modifié selon les retours des dev des clients, c’est juste un 1ᵉʳ jet 🙂

---

<div class="post-metadata">

### Author: ![kimamila](https://forum.duniter.org/user_avatar/forum.duniter.org/kimamila/32/185_2.png) [@kimamila](https://forum.duniter.org/u/kimamila)
#### Post date: [19 October 2020 08:45 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/2 "2020-10-19T08:45:03Z")

</div>

Wahou !! Je suis comme un petit enfants depuis le sapins de Noël !  
Voila du concret pour me motiver à avancer sur Cesium2 !

Merci pour ce travail 🙂

> [@elois](#):
>
> Le schéma va bien évidemment être modifié selon les retours des dev des clients, c’est juste un 1ᵉʳ jet

Yes, je regarde ca aussi vite que je peux.  
A ce propos un petit graphiql intégré à ton proto serait utile. Est-ce possible ? 🙂  
Ca rend les tests plus accessible, je trouve.

> [@elois](#):
>
> Concernant la pagination, je propose d’utiliser les [**spécifications officielles de graphql**](https://relay.dev/graphql/connections.htm)

Aucun problème pour moi.

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [19 October 2020 17:58 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/3 "2020-10-19T17:58:30Z")

</div>

Ton nœud donne une erreur 502, du coup j’ai essayé de compiler cette branche chez moi, mais la commande `cargo xtask build` ne marche pas&nbsp;:

```auto
    Finished dev [unoptimized + debuginfo] target(s) in 0.06s
     Running `target/debug/xtask build`
rustc 1.49.0-nightly (e160e5cb8 2020-10-14)
cargo 1.48.0-nightly (9d1a4863a 2020-10-05)
Check node version …
Install node v10.22.1 …
Install nvm v0.35.3 …
bash: #!/usr/bin/env bash
# ... ici il y a un long script bash qui semble devoir installer nvm ...
: Nom de fichier trop long

```

Je vais essayer d’intégrer GVA dans ĞMixer, les possibilités d’avoir la date d’une source et de souscrire aux transactions m’intéressent. 🙂

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [10 November 2020 14:06 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/4 "2020-11-10T14:06:01Z")

</div>

Bonjour à tous, je vous prie de m’excuser pour ma longue absence, un drame familial m’a demandé toute mon attention pendant plusieurs semaines, ce n’ai d’ailleurs pas fini, mais je commence enfin à pouvoir me poser un peu, pour tout vous dire il s’agit du décès de ma Maman (elle était d’ailleurs membre de la Ğ1 sous le username SylvieAude).

Depuis ce week-end j’ai retravaillé sur GVA et j’ai ajouté les sources de type Dividende Universel 🙂

Je vous laisse découvrir le nouveau schéma toujours à la même adresse : [https://g1.librelois.fr/gva](https://g1.librelois.fr/gva)

> [@kimamila](#):
>
> Wahou !! Je suis comme un petit enfants depuis le sapins de Noël !  
> Voila du concret pour me motiver à avancer sur Cesium2 !
> 
> Merci pour ce travail

Merci pour ton enthousiasme, ton soutien est important pour moi, c’est ce qui me motive à avancer 🙂

> [@kimamila](#):
>
> À ce propos un petit graphiql intégré à ton proto serait utile. Est-ce possible ? 🙂  
> Ca rend les tests plus accessibles, je trouve.

C’est déjà intégré sauf que j’utilise Graphql playground, un fork de graphiql que je trouve mieux fait, c’est accessible par le même endpoint, clique donc sur ce lien : [https://g1.librelois.fr/gva](https://g1.librelois.fr/gva)

> [@tuxmain](#):
>
> Ton nœud donne une erreur 502

Oui c’est une version de dev donc encore instable, et comme je n’avais plus le temps de le surveiller… c’est rétabli maintenant 🙂

> [@tuxmain](#):
>
> mais la commande `cargo xtask build` ne marche pas :

Ok alors tu peux faire à l’ancienne façon, installer node 10 via nvm puis compiler avec la commande `npm install`. Tu peux aussi m’aider à comprendre pourquoi mon script Rust ne fonctionne pas comme attendu sur ta distrib 🙂

---

<div class="post-metadata">

### Author: ![vit](https://forum.duniter.org/user_avatar/forum.duniter.org/vit/32/2775_2.png) [@vit](https://forum.duniter.org/u/vit)
#### Post date: [10 November 2020 14:43 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/5 "2020-11-10T14:43:19Z")

</div>

J’ai moi aussi été touché cette année par la perte de mon père début mars. Toute mes condoléances…

Merci pour ton travail.

Je vais vérifier que ma branche client graphQL de DuniterPy fonctionne avec ton prototype et si oui on sortira une nouvelle version avec des exemples basés sur ton schema !

Keep up the good job ! 👍

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [10 November 2020 15:06 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/6 "2020-11-10T15:06:50Z")

</div>

3 messages ont été scindés en un nouveau sujet : [Duniter: manual compilation with command xtask](https://forum.duniter.org/t/duniter-manual-compilation-with-command-xtask/7753)

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [10 November 2020 15:59 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/7 "2020-11-10T15:59:28Z")

</div>

Toutes mes condoléances Éloïs encore une fois. Dur période.

Je confirme que je dialogue bien avec GVA en curl:

```auto
curl -s -X POST https://g1.librelois.fr/gva \
    -H "Content-Type: application/json" \
    --data '{ "query": "{currentUd {amount}}" }' \
    | jq .data.currentUd.amount

```

–\> `1023`

---

<div class="post-metadata">

### Author: ![vit](https://forum.duniter.org/user_avatar/forum.duniter.org/vit/32/2775_2.png) [@vit](https://forum.duniter.org/u/vit)
#### Post date: [10 November 2020 17:02 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/8 "2020-11-10T17:02:22Z")

</div>

Ben c’est parti !

J’essaie d’envoyer une requête, mais j’ai erreur 400 Bad Request en réponse…  
Peux-tu regarder si tu me vois me vautrer à ta porte de serveur et me dire ce qui cloche dans ma requête ? 😉

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [10 November 2020 17:12 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/9 "2020-11-10T17:12:16Z")

</div>

> [@vit](#):
>
> J’essaie d’envoyer une requête, mais j’ai erreur 400 Bad Request en réponse…

A tu testé préalablement ta requête sur le playground puis avec curl ?

Je te vois dans les log de nginx mais pas dans les log de Duniter. Nginx bloque tes requêtes, peut être parce qu’il manque un body ? Essaye une requete (par exemple le montant du DU):

```
*.*.*.219 - - [10/Nov/2020:16:44:32 +0000] "POST //gva HTTP/1.1" 500 21 "-" "Python/3.6 aiohttp/3.7.2"
*.*.*.219 - - [10/Nov/2020:16:44:59 +0000] "POST /gva HTTP/1.1" 400 54 "-" "Python/3.6 aiohttp/3.7.2"
*.*.*.219 - - [10/Nov/2020:16:48:17 +0000] "POST /gva HTTP/1.1" 200 38 "-" "curl/7.58.0"
*.*.*.219 - - [10/Nov/2020:16:48:24 +0000] "POST /gva HTTP/1.1" 200 38 "-" "curl/7.58.0"
*.*.*.219 - - [10/Nov/2020:16:53:14 +0000] "POST /gva HTTP/1.1" 400 56 "-" "curl/7.58.0"
*.*.*.219 - - [10/Nov/2020:17:00:06 +0000] "POST /gva HTTP/1.1" 400 56 "-" "Python/3.6 aiohttp/3.7.2"

```

---

<div class="post-metadata">

### Author: ![vit](https://forum.duniter.org/user_avatar/forum.duniter.org/vit/32/2775_2.png) [@vit](https://forum.duniter.org/u/vit)
#### Post date: [10 November 2020 19:09 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/10 "2020-11-10T19:09:41Z")

</div>

Bon, je réussi maintenant à faire des requêtes graphQL sur swapi (la base de données Star Wars) comme avant.

Je reviens donc sur ton serveur et là j’ai un 500 INTERNAL\_SERVER\_ERROR !

On progresse… Je pense que j’ai passé ngynx et que je tape Rust maintenant !

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [10 November 2020 19:20 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/11 "2020-11-10T19:20:06Z")

</div>

> [@vit](#):
>
> Je reviens donc sur ton serveur et là j’ai un 500 INTERNAL\_SERVER\_ERROR !

```
*.*.*.219 - - [10/Nov/2020:19:06:10 +0000] "POST //gva HTTP/1.1" 500 21 "-" "Python/3.6 aiohttp/3.7.2"
*.*.*.219 - - [10/Nov/2020:19:06:36 +0000] "POST //gva HTTP/1.1" 500 21 "-" "Python/3.6 aiohttp/3.7.2"

```

@vit c’est parce que tu contacte un endpoint invalide, le path doit être `/gva` et pas `//gva`, peut-être un problème d’échappement de string

---

<div class="post-metadata">

### Author: ![vit](https://forum.duniter.org/user_avatar/forum.duniter.org/vit/32/2775_2.png) [@vit](https://forum.duniter.org/u/vit)
#### Post date: [10 November 2020 20:54 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/12 "2020-11-10T20:54:33Z")

</div>

Ah merci ! Oui, un petit bug dans DuniterPy avec le path…

Maintenant ton serveur ne comprend pas mon content-type on dirait :

Unknown content-type «&nbsp;application/json; charset=utf-8&nbsp;»

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [10 November 2020 21:03 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/13 "2020-11-10T21:03:31Z")

</div>

> [@vit](#):
>
> Unknown content-type « application/json; charset=utf-8 »

Utilise «application/json» uniquement 🙂

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [11 November 2020 20:45 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/14 "2020-11-11T20:45:10Z")

</div>

Aujourd’hui j’ai travaillé sur :

- La configurabilité de GVA (uniquement via le fichier `conf.json` pour le moment)
- La création de la [**doc de configuration de gva**](https://git.duniter.org/nodes/typescript/duniter/-/blob/dev/doc/use/configure.md#configuring-gva)
- La génération des endpoint GVA et leur ajout dans la fiche de peer
- La récupération de la fiche de peer du nœud via GVA:

 ![image](https://forum.duniter.org/uploads/default/original/2X/c/cae4b18ba2a746c8016f492522f263766abc90ef.png)

J’ai gardé les mêmes conventions que pour les autres types d’endpoint à une différence près : la couche TLS est explicitée par un `S`. Cela permettra à ceux qui le souhaitent de pouvoir fournir un endpoint sécurisé sur un autre port que 443 (via l’option `remoteTls`, voir doc).

Maintenant j’aurais besoin qu’un ou deux d’entre vous essayent de mettre en place un serveur GVA, voici comment faire :

1. [**Compilez manuellement**](https://git.duniter.org/nodes/typescript/duniter/-/blob/gva-proto-2/doc/use/manual_compilation.md) Duniter sur la branche `gva-proto-2`
2. Indexez la db de GVA, 2 méthodes possibles :  
A. Avec la commande `dex migrate` (nécessite de compiler [**le binaire dex**](https://forum.duniter.org/t/dex-duniter-dbs-explorer/7589) au préalable). L’indexation prend environ 2 minutes ce qui est bien plus rapide que de resynchroniser Duniter, donc même en comptant le temps de compilation de dex cette méthode devrait rester plus rapide.  
B. Vous pouvez aussi resynchroniser Duniter avec l’option `--gva` (`duniter sync --gva g1.duniter.org`) mais cette méthode est plus longue forcément
3. Configurez GVA en modifiant directement le fichier conf.json, voici ma conf par exemple :

```json
{
  ...,
  "gva": {
    "host": "localhost",
    "port": 30901,
    "path": "gva",
    "subscriptionsPath": "gva-sub",
    "remoteHost": "g1.librelois.fr",
    "remotePort": 443
  }
}

```

1. Lancez votre nœud duniter avec l’option `--gva` (nécessaire car gva est encore désactivée par défaut) : `duniter start --gva`
2. Ouvrez l’url `http://localhost:30901/gva` dans votre navigateur (ou l’url adaptée a votre configuration le cas échéant).
3. Faite moi un retour

Merci 🙂

---

<div class="post-metadata">

### Author: ![kimamila](https://forum.duniter.org/user_avatar/forum.duniter.org/kimamila/32/185_2.png) [@kimamila](https://forum.duniter.org/u/kimamila)
#### Post date: [12 November 2020 06:52 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/15 "2020-11-12T06:52:26Z")

</div>

De mon côté je suis charette sur des fins de projet pour mon boulot. Donc pas eu le temps d’avancer sur Cesium2…  
Ne t’excuses pas @elois :-).  
Concernant la mauvaise nouvelle que tu annonce, je ne sais pas trop quoi te dire…  
Saches en tous cas que cela me touche pour toi. La vie est vraiment quelque chose de fragile… et reste pour moi un mystère.

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [12 November 2020 12:01 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/16 "2020-11-12T12:01:31Z")

</div>

Du coup j’ai pu le compiler, j’ai bien accès à l’interface web GVA, mais&nbsp;:

- `dex migrate` a pris environ 10 minutes après avoir affiché le dernier message «&nbsp;Apply chunk&nbsp;» sans rien dire, à écrire à 16 Mo/s dans le disque. Ça serait bien d’ajouter un message pour qu’on ne se dise pas que ça a planté. (oui j’avais oublié de le copier dans la RAM)
- L’option `--home PATH` place le dossier de duniter à `~/.config/duniter/PATH` apparemment, donc j’ai mis longtemps à comprendre pourquoi avec `--home /dev/shm/duniter` rien ne marchait (sauf l’interface web GVA, mais les requêtes renvoyaient des résultats vides), jusqu’à voir que tout était dans `~/.config/duniter/dev/shm/duniter`…

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [12 November 2020 12:47 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/17 "2020-11-12T12:47:03Z")

</div>

> [@tuxmain](#):
>
> `dex migrate` a pris environ 10 minutes après avoir affiché le dernier message « Apply chunk » sans rien dire, à écrire à 16 Mo/s dans le disque. Ça serait bien d’ajouter un message pour qu’on ne se dise pas que ça a planté. (oui j’avais oublié de le copier dans la RAM)

Chez moi ça prend 1m39s en tout, et que quelques secondes après le log du dernier chunk.  
Tu es le premier à tester sled sur HDD (je n’ai que des SSD depuis des années, donc je ne pouvais pas tester).  
sled est optimisé pour les SSD, mais je ne pensais pas que les perfs seraient si mauvaises sur HDD, je suis en train de regarder du côté de RocksDb mais c’est aussi optimisé pour SSD donc ce sera peut-être pareil, on verra à l’expérience. En vrai je pense que quel que soit le sgdb choisi les HDD sont de toute façon beaucoup trop lent pour le type de traitement que Duniter doit faire (indexation en particulier).

Il y a déjà un message de succès à la fin. Je viens d’ajouter un message intermédiaire pour le flush.

> [@tuxmain](#):
>
> L’option `--home PATH` place le dossier de duniter à `~/.config/duniter/PATH` apparemment, donc j’ai mis longtemps à comprendre pourquoi avec `--home /dev/shm/duniter` rien ne marchait (sauf l’interface web GVA, mais les requêtes renvoyaient des résultats vides), jusqu’à voir que tout était dans `~/.config/duniter/dev/shm/duniter`…

~~Ça ce n’est pas normal, je viens de vérifier dans le code et l’option --home est codée pour se comporter comme un home absolu, c’est avec le binaire dex ou duniter que tu as eu ce souci ? Que j’essaye de reproduire !~~ EDIT: bug trouvé et corrigé 🙂

Et du coup ça y ai ton playground GVA fonctionne ? Une screen ?

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [12 November 2020 15:44 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/18 "2020-11-12T15:44:54Z")

</div>

Yes ça marche maintenant !

Par contre la commande logs ne sort rien, mais le fichier duniter.log est bien alimenté.

 ![image](https://forum.duniter.org/uploads/default/original/2X/0/0d02f653eeeeef548ed357a2d179c41ee9ba7995.png)

---

<div class="post-metadata">

### Author: ![vit](https://forum.duniter.org/user_avatar/forum.duniter.org/vit/32/2775_2.png) [@vit](https://forum.duniter.org/u/vit)
#### Post date: [19 November 2020 11:47 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/19 "2020-11-19T11:47:31Z")

</div>

Penses-tu que je puisse implémenter le endpoint GVA au format définit dans WS2P v2 ou bien tu vas faire un ajout à WS2P V1 ?

Bref j’ai besoin du format du endpoint GVA genre «&nbsp;`GVA hostname ipv4 ipv6 path`&nbsp;» pour DuniterPy… si tu l’as…

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [19 November 2020 12:00 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/20 "2020-11-19T12:00:41Z")

</div>

> [@vit](#):
>
> Penses-tu que je puisse implémenter le endpoint GVA au format définit dans WS2P v2 ou bien tu vas faire un ajout à WS2P V1 ?

Le endpoint GVA est normalement déjà ajouté à la fiche de peer relayée par WS2Pv1, d’ailleurs si tu regardes les fiches de peer sur le réseau tu vois les 3 nœuds GVA : [https://g1.elo.tf/network/peers](https://g1.elo.tf/network/peers)

> [@vit](#):
>
> Bref j’ai besoin du format du endpoint GVA genre « `GVA hostname ipv4 ipv6 path` » pour DuniterPy… si tu l’as…

Je l’ai déjà indiqué dans le message [#14](https://forum.duniter.org/t/prototype-de-gva-permettant-de-faire-un-paiement/7688/14) que tu à lu puisse que tu l’a liké 😉

[Next page](https://forum.duniter.org/t/prototype-de-gva/7688.md?page=2)
