Ğ1cli 0.7.0-g1 - Nouveau nom de package et de commande `g1cli`, améliorations `vault vanity` et runtime `g1`

Edit j’ai remplacé le contenu par la release 0.7.0 et renommé le post

Je viens de faire une “release” de g1cli 0.7.0.

En résumé en français, ce qui change (les détails sont en anglais plus bas):

  • Nouveau nom de package et de commande g1cli
    • La configuration et la base de donnée du vault ne sont plus dans le même répertoire, possibilité de copier les données de l’ancien gcli si nécessaires (voir détails plus bas)
  • Améliorations vault vanity
    • Affichage de la probabilité de trouver une adresse correspondant au pattern (peut être incorrect; surtout pour les regex)
    • Affichage du nombe de clés générées et nombre moyen de clés générées par seconde
    • Modifications des paramètres (voir détails plus bas)
    • Support de recherche basée sur une expression régulière
    • Un exemple d’usage est donné dans les détails plus bas
  • Configuration du runtime g1 (devrait être la version finale)

Question pour les personnes sous MacOS; est-ce que quelqu’un pourrait vérifier si le Homebrew Formula qui a été déployé est bien correct (premier test depuis le changement de nom de package !)


[0.7.0] - 2026-03-02

Added / Changed

  • The project gcli has now been renamed to g1cli so that it could be registered as an official package in Debian and Homebrew.
    • This means the package and the command have been renamed to g1cli
    • Also, the configuration and vault database from old gcli is not migrated with this change, because the new package names means new folders as well
      • ~/.config/g1cli/ containing the configuration in file default-config.toml
      • ~/.local/share/g1cli/ containing the vault database in file g1cli.sqlite
    • If for some reason you want to retrieve data from old installation, you can find the files at this location (you can copy/move them to the new path & name if you want)
      • /.config/gcli/default-config.toml
      • ~/.local/share/gcli/gcli.sqlite
      • One command to retrieve config & vault database from gcli to g1cli (:warning: overrides what you may have already added in g1cli :warning:):
        cp ~/.config/gcli/default-config.toml ~/.config/g1cli/default-config.toml
        cp ~/.local/share/gcli/gcli.sqlite ~/.local/share/g1cli/g1cli.sqlite
        
  • Several changes for vault vanity command
    • Added display of
      • estimated probability of finding a key matching the pattern (still experimental and can be very inaccurate for now, especially for regex patterns)
      • elapsed time, number of keys generated, average number of keys/s and EstimatedTime to find a match (refreshed every 5 seconds)
      • shows the actual Time/match at the end of the search (unless stopped manually)
    • Adapted the parameter names and shortcuts to be more consistent
      • --pattern (shortcut -p instead of old -m)
      • --match-mode (shortcut -m) instead of old --position (shortcut -o)
        • Adapted the possible values for this argument to be more consistent:
          • startswith instead of old start
          • contains instead of old any
          • endswith instead of old end
          • new regex to allow providing a Regular Expression pattern where position is expressed within the regex itself (e.g. ^g1..Ni for start, Ni$ for end, Ni for any)
    • Example — case-insensitive regex search for “nico” in an SS58 address: use the (?i) inline modifier at the start of the pattern to make the regex case-insensitive.
      # Ongoing search:
      g1cli vault vanity -p "(?i)nico" -m regex -s 5 -t 8
      Running search with 8 threads
      Estimated probability: ~1 in 65,793 attempts (approximate)
      - execute prize shove rotate two extend naive grit north suffer gift vibrant  (address: g1LWzN4pdrtKe3Xby4nicoaztUfLvxoLjBiH1okiH9N9twNYx)
      - market region student patient impose grocery glass below blossom laptop police bronze  (address: g1Q3NvKGzniCoR3QdV1h523pGZsiYQTYYVQULJFPfskeERL3H)
      Elapsed: 5.0s  |  Keys generated: 40,802  |  avg: 8159 keys/s  |  ET/match: ~8.1s (approx)
        
      # When search is completed, showing actual Time/match:
      g1cli vault vanity -p "(?i)nico" -m regex -s 5 -t 8
      Running search with 8 threads
      Estimated probability: ~1 in 65,793 attempts (approximate)
      - execute prize shove rotate two extend naive grit north suffer gift vibrant  (address: g1LWzN4pdrtKe3Xby4nicoaztUfLvxoLjBiH1okiH9N9twNYx)
      - market region student patient impose grocery glass below blossom laptop police bronze  (address: g1Q3NvKGzniCoR3QdV1h523pGZsiYQTYYVQULJFPfskeERL3H)
      - mistake proud luxury surface valley tragic pair learn fun love regular tiger  (address: g1PeKZ7kQ9S4z4BkDRxj4maCPupGnicoydA7U4ks75y5oMcBa)
      - double anchor trouble broken bridge mammal feel twenty estate vast cabbage bracket  (address: g1PwnRdmpfNiCoSAkzjvB1sJhuzssV54zA7f16nTP1UGqYJTN)
      - eye light napkin panda vote issue energy riot awful cart save between  (address: g1QJ65iy7DE66GcxW7bMP5d28Nicom22DXvC9dFh29ibp92Yo)
      Elapsed: 38.0s  | Keys generated: 303,204  |  avg: 7978 keys/s  |  Time/match: 7.6s
      
    • If you build g1cli yourself, make sure you build in “release” mode and optionally with the proper rustflags for best performance when using this command.

Fixed

  • None

Deprecated

  • None

Removed

  • Two commands that were deprecated have been removed:
    • vault list-files
    • vault migrate

CI/CD

  • Added g1 feature to the parallel test matrix.

Lien vers la release:

2 Likes

Yes je me suis fait avoir aujourd’hui :slight_smile: je modifiais le code pour supporter les dérivations de clé avec passphrase en français et mes modifs ne semblaient rien faire ! Tu m’étonnes …

1 Like

Du coup je vais peut-être déjà merger ce changement sur master (histoire d’éviter des soucis de merge plus tard avec tes changements :slight_smile: ).

Pour la release “finale” il faudra encore adapter le g1_metadata.scale; changer la version dans cargo.toml vers 0.7.0 et refaire une release avec tag 0.7.0-g1 (doit terminer par “-g1” pour que le build homebrew fonctionne).


Edit: c’est mergé sur master :slight_smile:

Je viens de mettre à jour le post original avec le build de release 0.7.0

Question pour les personnes sous MacOS; est-ce que quelqu’un pourrait vérifier si le Homebrew Formula qui a été déployé est bien correct :red_question_mark: (premier test depuis le changement de nom de package)

Pour le metadata.scale, tu devrais proposer une commande qui le met à jour en local. Comme un cache que l’on pourrait mettre à jour.

Ainsi si une erreur survient faute d’avoir un metadata non à jour, tu proposes à l’utilisateur de lancer la commande de mise à jour des metadatas. Lorsque tu fais cela, tu compare la version local avec la version en ligne (tags de version) et tu mets à jour si besoin. Sinon tu affiche un message précisant que les metadonnées sont à jour.

Il n’est pas souhaitable que le bon fonctionnement de g1cli dépende du fait que tu sois obligé de surveiller les mises à jour pour le faire à la main. Je dis ça pour ta tranquillité. :wink:

1 Like

Il sert à quoi ce fichier ? Vous vous en servez pour faire quoi dans vos apps ?

La lib Rust utilisée par g1cli, nommée « subxt », a besoin de connaître les métadonnées du runtime à la compilation afin de générer les types Rust correspondant à ceux définis dans les métadonnées du runtime. Cela permet de vérifier à la compilation, que le code manipule les données dans les bons formats.

3 Likes

Je ne connais pas bien les détails derrière cette génération des classes par subxt à partir du fichier de scale; aucune idée s’il y aurait moyen de permettre la mise à jour sans re-compilation…

Pas super clair non plus pour moi quelles opérations peuvent réellement êtres impactées par le runtime choisit (genre si on utilise g1cli compilé avec le runtime “gdev” mais pour “g1”; ou l’inverse)

Peut-être qu’@elois ou @HugoTrentesaux pourraient mieux répondre à la question :slight_smile:

1 Like

Ça ne fonctionne pas comme ça. Pense les metadata comme un fichier de définition d’une API (par exemple un schéma graphql). Si on change le schéma, soit c’est non cassant et donc il n’y a pas besoin de mettre à jour, soit c’est cassant et donc de toute façon il faut bien écrire le code qui tient compte des changements et donc mettre à jour.

Pour être un peu plus concret, il contient par exemple la numérotation des pallets et la numérotation des calls. Par exemple pour renouveler une certification, c’est le call 3 de la pallet 43 (Duniter | Runtime calls). Je ne vois pas comment tu peux développer une application (y compris silkaj 2) sans l’utiliser.

Juste pour clarifier, SCALE, c’est un format de sérialisation (comme json par exemple, mais binaire). Ça veut dire “Simple Concatenated Aggregate Little-Endian”. On trouve les sources du codec Rust ici GitHub - paritytech/parity-scale-codec: Lightweight, efficient, binary serialization and deserialization codec.

C’était plus clair quand tous les runtimes n’étaient pas identiques. Par exemple, quand on ajoute ou supprime des calls, ça casse tout ! Il y a eu plusieurs exemples de mise à jour de runtime qui changeaient des choses comme celui là : update to runtime 800 (6f36165f) · Commits · clients / Rust / Ğ1cli · GitLab.

2 Likes

Tu as tout à fait raison sur le fait qu’il faut revoir son code si les métadonnées ont changé.

Mais quand on a le cul entre deux chaises, je fais en sorte que mon code s’adapte aux deux runtimes en cours (gdev/gtest, plus tard g1/gtest) en testant la présence/syntaxe des commandes selon la version. Tika, avec mon propre client substrate, détecte automatiquement si les metadata ont changé et stocke en locale toutes les versions qu’il détecte. Il peut alors basculer entre deux, et utiliser alors le bon fichier metadata pour chaque runtime, avec un code compatible pour les deux.

Cela fonctionne parfaitement. Je n’ai plus de dé-synchro entre mon client python et le nœud connecté en terme de metadata. Et ce, quelque soit la version de runtime auquel Tikka est connecté.

Les changements cassants ont été formateurs. Il faudra bien communiquer les prochains aux devs de clients pour anticiper.

@Moul le client python py-substrate-interface récupère une version de metadata par défaut sur le net, de mémoire (avec des risques d’incompatibilités pour Duniter). Sinon, tu peux lui fournir celui du runtime de Duniter, mais charge à toi de le récupérer du nœud pour lui fournir.

3 Likes

Alors, oui mais ça propose d’installer gcli plutôt que g1cli :

$ brew install --formula https://git.duniter.org/clients/rust/homebrew-g1cli/-/raw/main/Formula/g1cli.rb
To install gcli, run:
  brew install gcli

$ brew install gcli
==> Fetching downloads for: gcli
✔︎ Bottle Manifest gcli (2.10.0)                                                                                                                                                            Downloaded   16.6KB/ 16.6KB
✔︎ Bottle Manifest lowdown (2.0.4)                                                                                                                                                          Downloaded    7.7KB/  7.7KB
✔︎ Bottle lowdown (2.0.4)                                                                                                                                                                   Downloaded  757.2KB/757.2KB
✔︎ Bottle gcli (2.10.0)                                                                                                                                                                     Downloaded  170.3KB/170.3KB
==> Installing gcli dependency: lowdown
==> Pouring lowdown--2.0.4.arm64_sequoia.bottle.1.tar.gz
🍺  /opt/homebrew/Cellar/lowdown/2.0.4: 52 files, 2.4MB
==> Pouring gcli--2.10.0.arm64_sequoia.bottle.tar.gz
🍺  /opt/homebrew/Cellar/gcli/2.10.0: 25 files, 534KB
==> Running `brew cleanup gcli`...
Disable this behaviour by setting `HOMEBREW_NO_INSTALL_CLEANUP=1`.
Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).

$ which gcli                                                                                                                                                                           Mar  3 mar 09:56:37 2026
/opt/homebrew/bin/gcli

$ gcli --version                                                                                                                                                                           Mar  3 mar 09:56:40 2026
gcli 2.10.0 (arm64-apple-darwin24.6.0)

Du coup ça n’installe pas du tout le bon binaire.

2 Likes

@cgeek La commande suggérée est incorrecte effectivement, mais est-ce qu’il a bien prit en compte la formule ?

Et si tu fais l’ajout d’un “tap” lié au repo git et puis la commande ‘brew install g1cli’ ?

$ brew tap duniter/g1cli https://git.duniter.org/clients/rust/homebrew-g1cli                                                                                                 
==> Tapping duniter/g1cli
Cloning into '/opt/homebrew/Library/Taps/duniter/homebrew-g1cli'...
warning: redirecting to https://git.duniter.org/clients/rust/homebrew-g1cli.git/
remote: Enumerating objects: 40, done.
remote: Counting objects: 100% (37/37), done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 40 (delta 9), reused 0 (delta 0), pack-reused 3 (from 1)
Receiving objects: 100% (40/40), 9.08 KiB | 4.54 MiB/s, done.
Resolving deltas: 100% (9/9), done.
Tapped 1 formula (14 files, 21.6KB).

$ brew install g1cli                                                                                                                                                             
==> Fetching downloads for: g1cli
✘ Formula g1cli (0.7.0-g1)                                                                                                                                                                 Verifying     9.7MB/  9.7MB
Error: Formula reports different checksum:  e5296d974d29220083484301e531690e6e720ab97ba9167081b4504b61ebcc3e
       SHA-256 checksum of downloaded file: 2992ec66dda8e2abaa563860705cde730e4d916d84e6869df7353499b4bd734d
2 Likes

Est-ce que quelqu’un maîtrise la partie Homebrew pour g1cli pour trouver le soucis ?