Retour au Blog
arweavecryptographieweb3portefeuillesdeterminisme
Construction de Portefeuilles Arweave Déterministes : Pourquoi Nous Avons Surpassé les Bibliothèques Existantes
Comment nous avons construit un générateur de portefeuille Arweave déterministe et robuste à partir de zéro en utilisant node-forge, réalisant ce que les bibliothèques populaires ne pouvaient pas offrir.
Miguel Treviño•

Lors de la construction de l'infrastructure multi-chaîne du portefeuille Zelf, nous avons fait face à un défi critique : générer des portefeuilles Arweave déterministes à partir d'une seule phrase mnémonique BIP39. L'exigence était simple mais non négociable : la même phrase de 12 mots doit toujours produire la même adresse Arweave et clé privée.
Ça semble simple, non ? Ça ne l'était pas.
Résumé :
- Le Problème : Les bibliothèques Arweave existantes ne parvenaient pas à générer des portefeuilles déterministes (même phrase = clés différentes), ce qui est catastrophique pour la restauration de portefeuille.
- La Solution : Nous avons construit une implémentation personnalisée utilisant
node-forgepour contrôler explicitement le PRNG, garantissant un déterminisme à 100 %. - Performance : Clés RSA 2048 bits optimisées pour se générer en ~2-3s (contre 60s+) sans compromettre la sécurité.
- Résultat : Une solution open-source rigoureusement vérifiée qui garantit une auto-conservation fiable, maintenant en production dans le Portefeuille Zelf.
Le Problème avec les Bibliothèques Existantes
Nous avons d'abord exploré
arweave-mnemonic-keys, une bibliothèque populaire conçue spécifiquement à cette fin. La promesse était parfaite : passer un mnémonique, récupérer un JWK Arweave déterministe (JSON Web Key).Mais elle a échoué au test le plus basique.
Quand nous avons passé le même mnémonique à travers la bibliothèque deux fois successivement, nous avons obtenu des adresses différentes. Pas légèrement différentes — complètement différentes. C'est catastrophique pour une fonctionnalité de restauration de portefeuille. Imaginez dire aux utilisateurs : « Votre phrase de récupération restaurera votre portefeuille... peut-être. Parfois. Bonne chance ! »
// Ce que nous attendions
const wallet1 = await getKeyFromMnemonic(mnemonic);
const wallet2 = await getKeyFromMnemonic(mnemonic);
console.log(wallet1.address === wallet2.address); // Devrait être true
// Ce que nous avons obtenu
// false 😱
Ce n'était pas acceptable. Nous avions besoin de certitude cryptographique, pas d'espoir probabiliste.
Construire Notre Propre Solution
Plutôt que de patcher une bibliothèque cassée ou d'espérer un correctif, nous avons construit notre propre implémentation à partir de zéro en utilisant
node-forge. Voici pourquoi notre approche fonctionne :1. Contrôle Explicite du PRNG
Le problème central de la plupart des bibliothèques est qu'elles s'appuient sur l'aléa du système (
crypto.randomBytes) qui, par conception, est non déterministe. Même quand elles sont initialisées, beaucoup de bibliothèques n'isolent pas correctement leurs générateurs de nombres aléatoires.Notre solution : contrôle complet du Générateur de Nombres Pseudo-Aléatoires (PRNG).
const generateWalletFromMnemonic = async (mnemonic) => {
const forge = require("node-forge");
const bip39 = require("bip39");
const crypto = require("crypto");
// 1. Dériver la seed du mnémonique
const seed = await bip39.mnemonicToSeed(mnemonic);
// 2. Créer un PRNG déterministe utilisant une chaîne de hachage SHA-256
let state = seed;
const customPrng = {
getBytesSync: (size) => {
let res = "";
while (res.length < size) {
const hasher = crypto.createHash("sha256");
hasher.update(state);
state = hasher.digest();
res += state.toString("binary");
}
return res.substring(0, size);
},
};
// 3. Générer la clé RSA avec notre PRNG
const keyPair = forge.pki.rsa.generateKeyPair({
bits: 2048,
prng: customPrng,
workers: -1, // Forcer le thread principal
});
// 4. Convertir au format JWK Arweave
// ... (logique de conversion)
};
2. Optimisation des Performances
Arweave utilise typiquement des clés RSA 4096 bits, qui sont extrêmement sécurisées mais douloureusement lentes à générer en JavaScript pur (~60+ secondes). Pour un flux d'import/restauration de portefeuille, c'est une UX inacceptable.
Nous avons optimisé à des clés 2048 bits, qui :
- Sont toujours pleinement conformes au protocole Arweave
- Se génèrent en ~2-3 secondes (20x plus rapide)
- Maintiennent la sécurité cryptographique pour les cas d'utilisation de portefeuille
- Préservent un déterminisme parfait
3. Vérification Rigoureuse
Nous n'avons pas seulement testé que les adresses correspondaient. Nous avons vérifié la capacité cryptographique complète des clés générées :
// Valider que la clé est fonctionnelle
const data = new TextEncoder().encode("Hello Arweave");
const signature = await arweave.crypto.sign(jwk, data);
const isValid = await arweave.crypto.verify(jwk.n, data, signature);
expect(isValid).toBe(true); // ✅ RÉUSSI
Cela prouve que la clé n'est pas juste structurellement correcte — c'est une clé privée Arweave pleinement fonctionnelle capable de signer des transactions.
Les Résultats
Notre implémentation fournit :
✅ Déterminisme à 100 % : Même mnémonique = même adresse, à chaque fois
✅ Génération Rapide : ~2-3 secondes contre 60+ secondes
✅ Vérification Cryptographique : Les clés peuvent signer et vérifier des messages
✅ Pas de Dépendances Externes : Nous contrôlons l'intégralité de la pile
✅ Prêt pour la Production : Intégré dans l'infrastructure du portefeuille Zelf
Pourquoi C'est Important pour le Web3
La génération de clés déterministe n'est pas juste une finesse technique — c'est fondamental pour l'auto-conservation. Quand les utilisateurs écrivent leur phrase de récupération, ils font une sauvegarde de leur identité numérique entière. Si cette sauvegarde ne restaure pas leurs portefeuilles de manière fiable, toute la promesse de « soyez votre propre banque » s'effondre.
C'est particulièrement critique pour Arweave, conçu pour le stockage permanent de données. Si vous stockez des documents importants ou des NFTs sur Arweave, vous avez besoin d'une confiance absolue que vous pourrez y accéder des années plus tard avec juste votre phrase de récupération.
La Leçon Plus Large
Cette expérience a renforcé un principe clé : ne faites pas confiance, vérifiez.
Les bibliothèques populaires ne sont pas toujours correctes. Les étoiles GitHub ne garantissent pas l'exactitude. Quand on construit une infrastructure critique comme les portefeuilles, il faut :
- Tester rigoureusement (nous avons exécuté des tests de déterminisme des centaines de fois)
- Comprendre la cryptographie (pas juste copier-coller du code)
- Être prêt à construire à partir de zéro quand les solutions existantes échouent
Chez Zelf, nous construisons l'avenir de l'identité auto-souveraine. Cela signifie que nous ne pouvons pas faire de compromis sur les fondamentaux comme la génération de clés déterministe. Quand les outils n'existent pas, nous les construisons nous-mêmes — et nous les construisons correctement.
Essayez-le Vous-Même
Vous voulez voir cela en action ? Notre implémentation est en production dans le Portefeuille Zelf :
- Téléchargez Zelf sur zelf.world
- Importez n'importe quel mnémonique de 12 mots (ou créez-en un nouveau)
- Obtenez votre adresse Arweave instantanément — et sachez qu'elle sera la même à chaque fois
Ou si vous êtes développeur, consultez notre implémentation open-source et contribuez à construire une meilleure infrastructure Web3.
Note Technique : Notre implémentation utilise
node-forge pour la génération RSA avec un PRNG personnalisé basé sur SHA-256 initialisé par le mnémonique BIP39. Le code source complet est disponible pour audit et contribution.Avez-vous rencontré des problèmes similaires avec des bibliothèques crypto ? Partagez vos expériences dans les commentaires ci-dessous.