Polkadot.js multilang mnemonic?

Does polkadot.js lib actually support multilang menmonic ?

I don’t find any information about it on internet…

@kimamila do you know ?

Fwiw Python substrateinterface supports a few languages for the mnemonic, so at least the principle exists in the ecosystem.

but i need it in polkadot.js

Bon j’ai fait une MR: add French mnemonic file by poka-IT · Pull Request #1689 · polkadot-js/common · GitHub

J’ai ajouté le fichier bip39 french au format exact qu’ils attendent, et ajouté l’import:

J’ai pas trouvé de branche dev donc j’ai MR sur master, ils me diront…

Si quelqu’un veut continuer à rendre cette lib multilang c’est avec plaisir, j’suis pas js à la base et j’ai pas mal de truc sur le feux ^^

En cado mon script python pour convertir la list bip39 aux format attendu par polkadotjs:

#!/usr/bin/env python3

import json
from urllib.request import urlopen

# utility

def load_json(data):
    get_data = open(data)
    return json.load(get_data)

# convert

mnemo_final = ''
mnemo_brut = load_json('french.json')

i=0
lenght=len(mnemo_brut)
for word in mnemo_brut:
    if (i == lenght-1):
        mnemo_final = mnemo_final + word
    else:
        mnemo_final = mnemo_final + word + '|'
    i=i+1

FINAL_DOC = '''// Adapted from the bitcoinjs/bip39 source
// https://github.com/bitcoinjs/bip39/blob/1d063b6a6aee4145b34d701037cd3e67f5446ff9/ts_src/

export default '%s'.split('|');
''' % (mnemo_final)

print(FINAL_DOC)

# dump file
doc_file = open('bip39-fr.ts', "w")
doc_file.write(FINAL_DOC)

Bon je sais très bien que ça va pas être aussi simple de rendre la lib multlang mais faut bien commencer quoi

This will actually not get used as coded in this PR. The reasons being -

  1. The WASM bip39 execution path is the one that gets executed in 99.9% of the cases (JS is only used as a fallback when WASM is not available in the environment)
  2. The actual JS code here only used the DEFAULT_WORDLIST import (I believe CI will actually complain about the unused import here)

So basically with this is won’t do anything. There is a way to do multiple languages, but it won’t be simple.

  1. The WASM environment needs to take a wordlist as input (the bonus is that this reduces bundle size, i.e. currently both the WASM and JS environment has a copy)
  2. Execution needs to use this list
  3. The same logic for specification should happen in the JS environment (it could be as simple as setWordlist(...) before execution happens)

Overall, since each list adds to the bundle sizes (which is a huge ongoing problem), it will therefore need to be up to the developer using it to specify, instead of “having all available always”.

Faut les scouer un peu là
J’ai envie de créer un fork de polkadotjs-common et de le rendre juste French uniquement lol
Le temps qu’ils rendent la lib multilang.

Comme ça Ğecko mobile beta proposera des mnemonic Français uniquement.
Bon ça doit pas être si simple faut toucher à certains trucs dont j’ai aucune idée…

2 Likes

Est-ce qu’il y a le même nombre de mots dans le dictionnaire de chaque langue, ou au moins, plus de mots en français qu’en anglais ? Si oui, tu peux utiliser les mnemonics anglais de polkadotjs et mapper les mots avec le dictionnaire français. Mais ça risque de ne pas être compatible avec d’autres clients.

1 Like

Je sais pas si c’est lié, mais j’ai trouvé ça, une doc de crate Rust de Bip39, y a que l’anglais… Ca s’en pas bon en effet… :sweat_smile:

The team is basically me for anything and everything in polkadot-js. It is certainly something I want to do since “injecting the wordlist” results in a nice footprint drop (I did get the Rust bip39 dev to make the required changes to his lib), but it has only been hovering with no action taken. The reality is that most probably unless there is a PR that comes in with all the moving parts, it will take “forever” to get to.

(It is also not even logged, i.e. it only exists in my mind, see Issues · polkadot-js/wasm · GitHub)

Ok le gars est tout seul à dev polkadotjs ??
C’est pas du bus factor ça ?

Les utilisateurs de cryptomonnaie sont tous des ingénieurs hipster barbus anglophones, et à quoi servent les autres langues finalement ? :grimacing:

Possibilités que je vois :

  1. tu fais une correspondance mot-à-mot anglais<->français
  2. une bibliothèque multilingue sauvage apparaît
  3. tu la codes en Dart
  4. un dev TS forke polkadotjs
  5. un dev Rust forke bip32 qui supporte le multilingue (donc il suffit d’ajouter les fichiers de dictionnaires, et pour la compatibilité avec tikka on peut utiliser les mêmes dictionnaires que substrateinterface), mais alors il faut faire un binding. (si c’est l’option choisie je veux bien essayer de le faire)

Note : subxt, la crate client Rust qu’on utilise pour Gcli, utilise sp_core, une crate cœur de substrate, qui utilise bip32 mais n’a pas prévu le support multilingue.

2 Likes

Ah mais c’est une super idée temporaire !!
Mais du coup j’ai besoin de faire que ces 3 points, je vois pas pk on devrait faire la suite.

Je laisse la lib gérer les mnemonic anglais comme elle sait faire, mais j’affiche à l’utilisateur les mot français correspondants à la volé.

Mais bon je sais pas si les mnemonic français que ça donnera au gens seront fonctionnels avec la lib french quand elle fonctionnera…

Je voulais dire qu’il suffisait de faire un des points.

Mais faire le (1) signifie qu’il faut dire aux utilisateurs de mnémoniques français qu’ils ne sont compatibles qu’avec Gecko, et seulement jusqu’à ce qu’un dictionnaire plus standard soit utilisé.

1 Like

Ok ça me parrait pas mal comme solution temporaire ça permet de:

  • Proposer dès maintenant des mnemonic Anglais/Français/Espagnol/Italiens/Portugais dans Ğecko
  • Expliquer aux gens que ce ne sont que des mnemonic de tests
  • Au moins les gens ne seront pas perdu, c’est dans leur langue, et en prod ce sera juste d’autres mots

Vous êtes OK avec ça ?

edit: je ne sais pas si je vais le faire hein, c’est quand même un peu de taf côté gecko (ptetre 4h) pour gérer tout ça en multilang mnemonic (déjà actuellement multilang tout court), alors qu’il ne me reste que 3 jours pour sortir une version stable (10 Décembre).

1 Like

Extrait des spec SLIP-0039 :

Localization

No localization is supported. This standard deals with a set of English words only. Previous attempts with arbitrary wordlists caused lots of confusion among users and decreased interoperability across various implementations.

Wordlist

The wordlist mandated by this SLIP is available here. Several criteria were applied in creation of the list:

  • The wordlist is alphabetically sorted.
  • No word is shorter than 4 letters.
  • No word is longer than 8 letters.
  • All words begin with a unique 4-letter prefix.
  • The wordlist contains only common English words (+ the word “satoshi”).
  • The minimum Damerau-Levenshtein distance between any two words is at least 2.
  • The similarity between the pronunciation of any two words has been minimized.

(see the test which checks whether these criteria are fulfilled).

Moi qui suis fan de parler français ou autre langue native des personnes à qui on s’adresse plutôt que d’avoir de l’anglais partout, sur le mnémonic, je suis plus sceptique :

  • c’est une suite de mot que l’on note quelque part et qu’on peut avoir à recopier occasionnellement, pas un élément d’interface qu’on manipule régulièrement.
  • c’est un outil de sécurité, donc la fiabilité, l’interopérabilité et la pérennité (compatibilité dans le temps) me semble essentielle (et primer sur le fait d’avoir ces termes dans sa propre langue)
  • traduire une liste de mot anglais risque de ne plus respecter les règles listées dans l’extrait ci-dessus
  • les traductions risque de varier d’un logiciel à l’autre et donc de ne pas assurer le rôle premier du mnémonic : reconstruire la clef privée à l’identique quel que soit le contexte ou ce mnémonic est fourni.
2 Likes

La liste de mots français bip39 officiel existe déjà (depuis 2018):

Et est utilisé dans pas mal d’outils déjà.


Pour le reste, je suis d’accords qu’il s’agit d’un élément de sécurité et non d’UX.
Je ne suis pas contre l’idée de n’utiliser que des mnemonic anglais si cela concerne une question de sécurité (et ça me fera moins de boulo lol).

1 Like

Malheureusement BIP39 ne permet pas de passer une même phrase d’une langue à une autre (alors qu’ils auraient pu associer un numéro à chaque mot, et hasher la suite de numéros) :

To create a binary seed from the mnemonic, we use the PBKDF2 function with a mnemonic sentence (in UTF-8 NFKD) used as the password and the string “mnemonic” + passphrase (again in UTF-8 NFKD) used as the salt. The iteration count is set to 2048 and HMAC-SHA512 is used as the pseudo-random function. The length of the derived key is 512 bits (= 64 bytes).
bips/bip-0039.mediawiki at master · bitcoin/bips · GitHub

Du coup un inconvénient de la phrase dans une langue à caractère spéciaux est que si on se retrouve face à un clavier auquel il manque des accents, on est embêté. Pour la plupart des langues à alphabet latin ça ne devrait pas gêner (si on peut deviner les mots en ignorant les accents), mais pour le chinois c’est un problème.

1 Like

Le SLIP 39 est une évolution du BIP 39 on dirait, mais même le BIP 39 décourage l’usage de mots non anglais :

Je fini par penser également que ce sera plus sécurisé et moins de boulot aussi !
Si on est tous d’accord pour suivre les recommandations des specs, j’enlèverai le support des langues de mnemonic dans Tikka.

2 Likes

The way to introduce this has been logged polkadot-js/wasm#452 - once available we can have this functionality.

2 Likes