Ğecko: Nouveau client de paiements Ḡ1 sur mobile en cours de développement (Dart/Flutter)

Chaque chose en son temps, c’est long tout ça mine de rien derrière.

Je préfère itérer plusieurs build régulièrement pour tester le rendu, avoir des retours.

Je vais déjà me focus sur la partie Enregistrement de wallet, que ce soit clair, intuitif, c’est important.

2 Likes

Pas de souci… c’est déjà énorme :wink:

1 Like

Et tu as fait attention aux daltonien.ne.s, peut-être sans t’en rendre compte ! Merci pour elleux. :
quand le PIN est faux, il y a couleur + mouvement ; quand le pin est juste, il y a juste couleur (et affichage de la clef pub)

2 Likes

La version d’Android ne me semble pas être le meilleur critère.

Il vaudrait mieux se baser sur la quantité de RAM de l’appareil, car c’est ça qui va permettre de choisir un paramètre N plus grand pour scrypt.

1 Like

En fait je suis daltonien (Deutéranomalie), mais je ne m’en suis pas vraiment rendu compte lol (je veux dire je me suis pas rendu compte que l’action de faire bouger le PIN faux était bénéfique pour moi ^^).
En fait j’ai justement pris un vert et un rouge bien flashy pour pouvoir les distingué, et inconsciemment c’est vrai que je me disais “De toute façon il bouge si c’est faux…” ^^

Oui ça me parait limpide.

Si ta pas de RAM, utilise ta mémoire.

@poka voici une MR qui intègre de nombreux changement dans le binding rust pour Ğecko :

J’ai modifié la génération du code secret pour qu’il ne contienne que des lettres.
Je t’ai également rajouté un paramètre permettant de choisir le type de code secret (chiffres ou lettres).

La longueur du code secret est choisie automatiquement en fonction du type de code secret, à savoir 6 lettres ou 8 chiffres, les paramètres de scrypt n’ayant pas encore été modifiés.

J’en ai profité pour faire une refonte totale du code Rust :

  • Mieux modularisé en différents fichiers
  • Simplification du traitement des erreurs
  • Optimisation des grosses fonctions genWalletFromMnemonic et changeDewifPin
  • Mise à jour de la doc dans le README

La prochaine étape, ça sera de passer à DEWIF v3 pour adapter les param de scrypt au runtime, mais je voulais pas faire trop de changements d’un coup (effet tunnel, tout ça), donc ce sera pour une prochaine MR :slight_smile:

Alors voici mes retours sur l’UX, si j’enfonce des portes ouvertes tant mieux :smiley:

1. Harmoniser la langue.

Remplace «wallet» par «portefeuille» pour que tout soit en français :slight_smile:

2. Renommer «code pin» par «code secret»

Tout le monde ne sait pas ce que signifie «pin», et ça n’implique pas clairement que ce code doit rester secret. Les banques traditionnelles parlent bien de «code secret» pour le code de la CB.

Utiliser le terme «secret» pour le code permet de s’assurer que l’utilisateur comprenne bien qu’il doit… rester secret :slight_smile:

3. Le terme « phrase secrète » n’est pas adapté.

Si on utilise déjà le terme secret pour le code ça fait doublon.

J’avais proposé « phrase de sécurité ». On pourrait la nommer aussi « phrase de restauration ».En tous les cas il faut un rond avec un «?» dedans à côté de cette phrase avec un tooltip qui explique ce que c’est.

Indiquer par exemple dans le tooltip que cette phrase permet d’importer son portefeuille sur un autre appareil où de restaurer son portefeuille en cas de perte de données.

4. Associer un nom à chaque portefeuille.

Ce nom peut être stocké dans le nom du fichier trousseau. Puis tu stockes tous les fichiers trousseau dans un dossier.

Ça permettrait d’afficher la liste des portefeuilles dans la vue «Mes portefeuilles» plutôt que de demander un code directement (important pour le point suivant).

Ça permettrait également de pouvoir choisir quel portefeuille déverrouiller en cas de présence de plusieurs portefeuilles sur le téléphone (puisque la clé publique ne peut pas être affichée sans déverrouiller le portefeuille).

Tu peux préremplir le champ nom par un nom par défaut, par exemple «compte courant».

5. Simplifier le menu en bas

Il est inutile de proposer à la fois les options «Générer un portefeuille» et «Mes portefeuilles».

Je suggérerai de proposer uniquement l’option «Mes portefeuilles», puis d’adapter la vue «Mes portefeuilles» selon qu’un fichier trousseau existe ou non sur le disque.

Si aucun fichier trousseau:

Afficher au centre «Ce téléphone ne contient aucun portefeuille. », avec deux gros bouton rectangulaires juste en dessous «créer un portefeuille» où «importer un portefeuille».

Si un où plusieurs fichiers trousseau existent :

Afficher le nom de chaque portefeuille et demander le code secret si on clique sur ce nom.

Dans la vue «Mes portefeuilles», tu peux ajouter un bouton «+» en bas à droite permettant d’en générer un nouveau.
Il faudrait aussi une icône pour importer un portefeuille, mais je ne sais pas où la placer pour que ça n’alourdisse pas la vue, à réfléchir.

Voila pour mes retours :slight_smile:

Remarque concernant le multi-compte et les HD wallet

Je peux assez facilement ajouter les HD wallet dans le binding Rust. Ça permettrait de générer plusieurs comptes (jusqu’à 2 milliards !) à partir d’un seul fichier trousseau, donc un seul mnemonic et un seul code secret pour tous ses portefeuilles.

Si j’implémente ça, cela aurait des incidences fortes en termes d’UX sur la vue «Mes portefeuilles», c’est donc le bon moment pour y réfléchir :slight_smile:

Je pense même que le plus simple serait que Ğecko sois uniquement HD wallet.

Dans cette éventualité, le code secret serait demandé dès le clic sur «Mes portefeuilles» comme c’est le cas actuellement.
Si le code secret est valide, on peut alors calculer et afficher tous les comptes portefeuilles dérivés du trousseau.

Chaque dérivation nécessite un nombre entier. Il faut donc stocker sur le téléphone une map associant un nombre entier à chaque nom de portefeuilles. Par exemple :

{
  "Compte courant": 0,
  "Compte gchange": 1,
  "Projet bidule": 2,
  "gmix 1": 3,
   ...
}

“Projet bidule” pouvant être par exemple un compte pour un crowfunding pour le projet «bidule».

Il doit rester possible de modifier où supprimer des portefeuilles dans la vue «Mes portefeuilles».
Une modif étant juste un changement de nom, et une suppression étant juste une suppression de l’entrée dans la map. (Afficher une popup de confirmation pour la suppression, avec un avertissement spécial et une couleur plus violente si le compte supprimé à un solde non null).

Dans ce cas-là aussi je suggérerai un bouton «+» en bas à droite pour ajouter un portefeuille.
Par contre il n’y aurait pas d’import dans cette vue.
L’import de trousseau ne serait proposé que si aucun trousseau n’est présent sur le Téléphone.

Le cas «importer un trousseau» alors qu’il y a déjà un trousseau sur le téléphone serait un cas extrêmement rare en mode HD wallet. En termes d’UX ça implique de cacher cette option dans un menu déroulant «paramètres» où «options avancées».

3 Likes

Merci pour ces retours @elois
Beaucoup de choses dans ce que tu dis :slight_smile:

  1. Oui

  2. Oui

  3. Ok pour “Phrase de restauration”.
    Pour le toolip, je vais y réfléchir, là j’ai écrit 3 phrases d’explications au dessus du bouton “Enregistrer ce wallet” qui sont:

    Notez bien votre phrase secrète sur un papier ou imprimez le, ainsi que votre code PIN, que vous devrez retenir.
    Pour payer ou manipuler votre wallet, seul votre code PIN vous sera nécessaire.
    Votre phrase secrète quant à elle, vous permet de restaurer votre wallet sur un autre appareil.
    Gardez la précieusement.

    Mais c’est déjà beaucoup trop, ça ne va pas, en effet c’est mieux de séparer déjà le transfert de cette information en 2, via un genre de tooltip au niveau du mnemonic, et une info concernant le code secret juste au dessus du bouton “Enregistrer ce wallet”.

  4. Oui alors j’avais pensé enregistrer la clé publique dans une mini db sur le téléphone pour chaque wallets. Je me suis dit que tu ferais la gueule pour des soucis de sécurité, ne pas qu’un pirate ayant récupéré ton DEWIF ne sache forcément la clé publique associé, ce qui faciliterait le brute force…
    Mais ainsi, les gens n’auraient qu’a cliqué sur le portefeuille qu’ils souhaite pour voir les options, et activer celui qu’ils veulent pour les paiements.
    J’avais pensé à attribuer un nom aussi. A vrai dire, j’ai même pensé utiliser les pods ES Cesium+ pour stocker ces noms de portefeuilles, de manière à ce qu’ils soient visibles sur Cesium (cc @kimamila).
    Mais je sais que ça va faire débat, je comptais le faire sournoisement pour tester. Je vais voir :stuck_out_tongue_winking_eye:
    Mais sinon oui, des noms des portefeuilles stockés localement comme tu le dit, me semble une bonne idée.

  5. Oui j’y pensais :wink:
    Je n’étais pas sûr, 2 ou 3 onglets, tout en préférent en avoir 2, j’en ai fait 3 pour tester, et faciliter mon workflow le temps de dev, mais je crois que ta raison, ya moyen de faire un UX clair et simple juste avec un onglet “Mes portefeuilles”. Je pars là dessus.

  6. Pour les HD Wallets, oui je t’avais soumis l’idée il y a quelque semaines, tu me disais que c’était possible, j’en suis très content.
    Maintenant, concernant Ḡecko, franchement, je ne sais pas, je suis pas sûr.
    Comme tu l’a dit, en terme d’UX, c’est l’un ou l’autre, sinon on permet de générer des seeds + dériver chacune en HD wallets, ce sera beaucoup trop dense, pas bon.
    Et franchement, je vois aussi l’intéret de pouvoir générer des wallets différents, de pouvoir importer des wallets autant qu’on veut, et même d’importer des wallets salt+password Cesium en fait.

    Je sais que c’est la porte ouverte à ce que les utilisateurs d’aujourd’hui qui sont tous sur Cesium, préfèrent importer leurs wallets ainsi, en le stockant en DEWIF avec PIN. Et aussi, que ça permet de facilement ajouter son portefeuille membre dans Ḡecko, ce que je n’aime pas trop, mais en même temps, je pense que pour le stade où en est l’écosystème Ḡ1, ça peut être une option pratique. On peut débattre de ce point oralement sur un talk si tu veux.
    Donc je dirais pour le moment, pas de HD wallets, je garde les générations de wallets et vais ajouter les imports.

  7. Ah non y’en a pas ^^


Je vais déjà tester les nouveautés de ton binding Rust, je te dirais si ça roule :slight_smile:
Beaucoup de taf varié en perspective ^^

Il faut qu’on s’harmonise là dessus.
Moi, j’ai suivi le forum et même si “wallet” signifie “portefeuille” en anglais, j’ai remarqué qu’on utilise “trousseau” pour parler d’un fichier physique contenant les accès au compte. Et ça me plaît bien.

Pour résumer :

  • Compte : c’est notre coffre-fort, comme un compte bancaire. Il peut être “membre” ou simple “portefeuille” (notez que portefeuille est déjà pris depuis trois ans par ce distinguo).
  • Portefeuille : un “compte” non membre, qui ne crée pas de monnaie.
  • Trousseau : un fichier sur disque contenant les clefs d’accès au “compte”.
  • Identifiants/Phrase de passe/Mot de passe : codes d’accès au “compte”, mémorisés ou notés quelque part.

C’est la nomenclature que j’utilise pour Tikka.

Dites moi si vous pensez à une autre nomenclature pour qu’on utilise tous le même langage. Abla Duniter ? :wink:

1 Like

Hum, peut-être qu’il faudrait deux «modes» différents. Un mode «legacy» et un mode «moderne». Afin que l’UX soit simple et cohérente dans chaque mode.

En tout cas on est d’accord que mélanger les deux en même temps imposerai une UX trop complexe et illisible.

On pourrait choisir son mode au démarrage de l’application, avec un mode «legacy» permettant d’utiliser des comptes normaux (y compris des comptes importés depuis format Cesium) et un mode «moderne» permettant de créer autant de comptes qu’on veut à partir d’un seul trousseau :slight_smile:

Ok je vais te faire une fonction d’import que je vais nommer « importLegacyWallet » :wink:

Oui tu as tout compris :slight_smile:

Tant que la sauvegarde des clés publiques est ure fonctionnalité optionnelle, qui informe correctement l’utilisateur sur les risques encourus, ça me va.

Tout ce qui affaibli la sécurité mais qui donne plus de confort devrait être des fonctionnalités nécessitant un opt-in de l’utilisateur, avec une popup de confirmation l’informant convenablement des risques.

Cela permet:

  1. D’avoir un client qui reste robuste niveau sécurité pour les utilisateurs qui le souhaitent
  2. De ne pas entamer la confiance en la monnaie en cas de vol de monnaie. En cas de vol, La responsabilité pourra être incombée aux fonctionnalités risquées activés par l’utilisateur et non à une «faille» dans la monnaie.

Il faudrait juste adapter la longueur du code secret selon que le compte est membre ou non. Je peux t’exposer un paramètre booléen isMember.
Je peux même faire la requête graphql coté Rust pour avoir l’info., il me faut juste savoir sur quel endpoint GVA me baser.

Alors de mon point de vue, s’inspirer du vocabulaire qu’on utilise usuellement sur le forum Duniter, qui est un forum technique, est ure très mauvaise idée quand on parle d’UX.

Le terme «trousseau» est un terme technique. C’est trop confusant pour l’utilisateur final qui ne fait l’expérience que d’une seule clé (celle que est publique) et qui ne comprend pas pourquoi on lui parle de trousseau de clés alors qu’il ne voit qu’une seule clé.

Le terme «compte» ne me semble pas adapté non plus. Car trop de sites utilisent déjà ce terme, pouvant faire penser à l’utilisateur qui découvre l’application qu’on s’y inscrit comme on s’inscrit sur n’importe-quel site.

Je pense que nous devons utiliser des termes non-confusant, dont la définition est raccord avec ce que perçoit l’utilisateur dans son expérience, mais à la fois pas trop vagues et pas trop déjà utilisées afin d’éviter que l’utilisateur ne découvre l’appli en mode pilote automatique.

Je propose donc d’utiliser les termes «portefeuille» et «portefeuille membre» :slight_smile:

1 Like

Pour ces mêmes raisons je pense que nous devrions bannir les termes «Identifiants» et «Mot de passe ».

Quant au terme «phrase de passe», ce n’est pas suffisamment clair, une phrase qui passe quoi ?

Il est plus clair de parler de «phrase de récupération» où «phrase de restauration».
Afin que le nom indique clairement à quoi ça sert pour l’utilisateur final.

Merci pour le tacle, on est habitué…Merci. Pfff.
Deux post d’affilé pour marteler une opinion montre une certaine frustration.

Je ne suis évidemment pas du tout d’accord avec tes propositions et tes critiques.

Bon je crée un sujet pour ne pas polluer, et j’attends plus les remarques de @kimamila et @poka.

Super ! :slight_smile:

Je songeais à faire cette vérification moi même au moment de l’import. SI tu vois un workflow valide côté Rust et que ait une certaine logique, ça me va :slight_smile:

Mais pour le endpoint, il y aura bien entendu un truc chiadé un terme au démarrage de gecko pour choisir un bon endpoint, donc je me baserais là dessus.
Pour le moment y’en a que 1 et c’est le tient ^^

Nouveau build 0.0.0+9

Détail de la version 0.0.0+9

Plusieurs améliorations ont été faites (voir détails), mais cette version a un bug: Vous ne pourrez pas voir vos wallets censés s’afficher dans votre liste de wallets après création. C’est simplement dû à l’UI qui ne se rafraîchie pas correctement, et aussi aux noms de wallets qui ne sont pas encore très bien identifiés (oui ça cumule 2 bugs lol).

Je l’ai tout de même publié car pour la prochaine release, j’ai décidé de refonder l’app pour améliorer le système de changement d’état de mes widgets Flutter (pour ceux que ça intéresse je vais passer aux paradigmes par provider, pour tout un tas de raisons, et de ne plus utiliser de Stateful widgets).

Ça me permettra de:

  • Extraire toute la partie logique de la partie vue (étonnant d’avoir une partie de la logique dans la vue, mais c’est le paradigme historique et par défaut d’une app Flutter) dans différents models
  • Gérer plus finement et beaucoup plus facilement les changements d’états de chaque élément UI.
  • Partir sur une codebase scalable, où je vais pouvoir construire tous le reste de l’app plus sereinement.

C’est juste que ça va me prendre un peu de temps, c’est nouveau pour moi, je vais devoir pas mal expérimenter avant, et devoir changer déjà énormément de choses dans Ḡecko.

Nouveau build 0.0.0+10

Détail de la version 0.0.0+10

Bon oubliez ce que je viens de dire dans mon poste précédent concernant le bug … C’est corrigé, je pouvais pas laisser un bug comme ça trainer, j’ai donc amélioré plusieurs choses.

Vous pouvez gérer votre wallet, des sécurités on aussi été apportés.
A part la vue mes portefeuille à refresh avec le petit bouton, je n’ai pas trouvé de bugs, dites moi si vous en trouvez.

Voilà peux me focus sur ma refonte par provider sereinement ^^

Je ne trouve plus le bouton pour générer un wallet (il est ni dans accueil ni dans Mes portefeuilles) :thinking:

Peux tu essayer cette version ?

effacé

Si tu as toujours des soucis, peux-tu m’envoyer un screenshot de ta page Mes portefeuilles stp ?

Laisse tomber je viens de me rendre compte d’un bug …

1 Like

Merci pour ton test, je n’aurais pas vue ce bug sinon.
Quand l’app est toute fraiche, le dossier wallet n’était pas créé, ce qui générait un crash de l’écran Mes portefeuille… C’est réparé normalement ici, tu peux me dire ?

Le bouton « Importer un portefeuille existant » ne fonctionne pas encore.
Le bouton changer de code secret dans les options de wallets une fois qu’il est créé ne fonctionne pas non plus, c’est normal.

A part tout est censé fonctionner.


Retenez bien vos codes secret vous en aurez besoin pour supprimer votre wallet désormais ^^

Sinon il faut erase les data de l’app dans les paramètres android.
Pour remédier à ce problème, je songe à proposer un bouton « Code secret oublié ? » qui permet de regénérer un dewif avec code secret à partir de la phrase de restauration.
Et sur cette page un autre bouton « Vous avez perdu votre phrase de restauration » qui balance un gros « Shame on You ! » …

Non je déconne, le dernier bouton proposerait de supprimer le portefeuille, en testant le solde, car il n’y a pas d’autre choix …

Sinon @elois, selon toi quels seraient les impacts en terme de sécurité si on décide que chaque wallet généré auraient le même code secret ? C’est à dire que le code secret serait un code master, paramétré au début et changeable, mais pour tout les wallets générés sur l’appareil ?


Vous pouvez créer autant de wallet que vous voulez, je fixerai une limite plus tard.


Astuce: Le temps de l’alpha/beta, j’ai caché une triche lors de la génération de wallet:

Lorsqu’il vous demande le mot de votre phrase de restauration, les bonnes réponses sont soit le mot demandé, soit « triche » lol.

C’est juste pour faciliter le debug …

Oui c’est bon…
par contre bouton “importer un portefeuille existant” ne fait rien, c’est normal ?

Oui c’est normal j’ai oublié de le préciser ^^

J’édite.

1 Like