Session Ğ1

Appel à tous, j’aimerai bien tester plus largement Session dans un groupe d’au moins une dizaine de personne qui échangent en live.

Voici mon ID session: 05b2479b5f3d81875d25d23c08da5f6ad02002f4f7a7d3b30b20f1d6fda1d00449

Pour l’instant on a un groupe avec juste Syoul, Boris, Attilax et moi.

Par rapport à ce que je disais, voici ce que m’indique mon session desktop:

C’est le parcours que fait 1 message entre toi et moi même si tu te trouve à 2m de moi.

Pour installer Session: Download - Session Private Messenger

Parceque j’aimerai vraiment qu’on test à fond ce genre d’outil en plus de lire les whitepaper.

Le mnemonic eux ils appellent ça la phrase de récupération.

1 Like

SyoulAnuanua

ID:
052d223b197156b7e8ae12c92aa03b92f7faf605bd07bdb2403f4f7f6c40c9a55f

Je suis en train de lire le code, c’est vraiment un fork de signal encore rattaché à son dépôt mère.

C’est du beau TypeScript, agréable à lire.

Aaaahh les batards, faut qu’on fork juste pour ça!

C’est abusé, leur mnemonic fait 13 mots ! Juste pour faire chier quoi


Alors en fait c’est 12 mots + un mot checksum:

export async function generateMnemonic() {
  // Note: 4 bytes are converted into 3 seed words, so length 12 seed words
  // (13 - 1 checksum) are generated using 12 * 4 / 3 = 16 bytes.
  const seedSize = 16;
  const seed = (await getSodiumRenderer()).randombytes_buf(seedSize);
  const hex = toHex(seed);
  return mnEncode(hex);
}

export function mnEncode(str: string, wordsetName: string = MN_DEFAULT_WORDSET): string {
  const wordset = mnWords[wordsetName];
  let out = [] as Array<any>;
  const n = wordset.words.length;
  let strCopy = str;
  for (let j = 0; j < strCopy.length; j += 8) {
    strCopy =
      strCopy.slice(0, j) + mn_swap_endian_4byte(strCopy.slice(j, j + 8)) + strCopy.slice(j + 8);
  }
  for (let i = 0; i < strCopy.length; i += 8) {
    const x = parseInt(strCopy.substr(i, 8), 16);
    const w1 = x % n;
    const w2 = (Math.floor(x / n) + w1) % n;
    const w3 = (Math.floor(Math.floor(x / n) / n) + w2) % n;
    out = out.concat([wordset.words[w1], wordset.words[w2], wordset.words[w3]]);
  }
  if (wordset.prefixLen > 0) {
    out.push(out[mn_get_checksum_index(out, wordset.prefixLen)]);
  }
  return out.join(' ');
}

  // Verify checksum
  if (wordset.prefixLen > 0) {
    const index = mn_get_checksum_index(wlist, wordset.prefixLen);
    const expectedChecksumWord = wlist[index];
    if (
      expectedChecksumWord.slice(0, wordset.prefixLen) !== checksumWord.slice(0, wordset.prefixLen)
    ) {
      throw new VerificationError();
    }
  }

function mn_get_checksum_index(words: Array<string>, prefixLen: number) {
  let trimmedWords = '';

  for (let i = 0; i < words.length; i++) {
    trimmedWords += words[i].slice(0, prefixLen);
  }
  const checksum = crc32.unsigned(trimmedWords as any);
  const index = checksum % words.length;
  return index;
}

Trop bizarre.

Bon voilà j’ai craqué j’ai commencé le fork, j’ai remplacé toute la partie crypto custom par le standard BIP32: clients / session-g1 · GitLab

Tous est consigné dans un seul et unique commit, donc dites moi si vous voyez des raisons à ce qui avait été fait en custom.

Il n’y avait pas juste l’ajout d’un mot checksum, toute la crypto n’était n’était pas compatible duniter, ils utilisaient des groupes de 3 mots pour générer le mnemonic de 12 mots, trop bizarre, j’ai tout dégagé, là je suis capable d’importer mon mnemonic gdev!

Je bouge les dernier messages dans un nouveau topic pour pas polluer celui ci

5 Likes

Mon ID : 050de4df0e28612bd75077abfac4667f65426be44044582d1052ca33db8e90270d

1 Like

Histoire d’aller au bout de ma démarche, voici une release 1.15.0 pour desktop linux uniquement: 1.15.0 · clients / session-g1 · GitLab

Les changements sont:

  • Génération de compte à partir de mnemonic compatibles Duniter
  • Connection à partir de mnemonic compatibles duniter
  • Affichage des ID en format ss58 prefix 42 partout dans l’app
  • Capable de recherche un nouveau contact à partir de soit un ID session legacy, soit ss58 au choix.

Le seul soucis est que vous ne verrez pas la même address ss58 entre votre wallet duniter et session g1 car les noeuds Session ne reconnaissent que les signature de clés ed25519, et non sr25519. J’ai donc été obligé de générer des keypair ed25519.

Pour aller plus loin il faudrait débrancher le réseau Oxen pour brancher Duniter, mais c’est une autre paire de manche, et du coup on perd tout l’intéret de la résilience du réseau Oxen (en cours de migration vers Session token).
Et il faudrait modifier duniter pour ça, pour permettre le stockage de messages temporaire. Il faut étudier plus en profondeur le protocole Session pour en savoir plus.

Je me demande donc si au final ce n’est pas plus simple de créer notre propre système de messagerie adapté à notre stack comme le propose @tuxmain , mais je pense que ça vaut vraiment le coup de se pencher sur les choix qu’on fait l’équipe de Session pour leur protocole et pourquoi ces choix.

3 Likes

Super comme débroussaillage déjà !

Il faut voir comment le protocole se sert de la blockchain. Pour l’instant ils utilisent leur fork de Monero, et n’ont pas encore dévoilé (ou je ne l’ai pas trouvé) le code du futur Session Token, basé sur Arbitrum, basé sur Ethereum.

Tout ça repose sur de la proof of stake, donc en principe on devrait pouvoir remplacer le staking par la TdC mais comme ce n’est pas du Substrate il faudra réécrire plein de choses. À voir s’il vaut mieux forker leur serveur pour le connecter à Duniter, ou réimplémenter leur protocole.

4 Likes