Files
khadhroony-bot3/ks-wallet/USAGE.md
2026-08-10 14:09:39 +02:00

7.0 KiB

Utilisation de ks-wallet

Statut

En 0.5.2-pre.001, cette page décrit l'API runtime actuelle. La cible multi-wallet/password/.kswallet est planifiée mais n'est pas encore implémentée.

Valider un alias

let alias = match ks_wallet::WalletAlias::parse(
    "devnet-operator",
) {
    std::result::Result::Ok(value) => value,
    std::result::Result::Err(error) => {
        return std::result::Result::Err(error);
    },
};

assert_eq!(alias.as_str(), "devnet-operator");

Un alias doit contenir entre 1 et 64 octets, commencer par un caractère alphanumérique ASCII et ne contenir ensuite que des caractères alphanumériques, _ ou -.

Générer un wallet temporaire en mémoire

let alias = match ks_wallet::WalletAlias::parse(
    "ephemeral",
) {
    std::result::Result::Ok(value) => value,
    std::result::Result::Err(error) => {
        return std::result::Result::Err(error);
    },
};

let wallet = ks_wallet::TemporaryWallet::generate(alias);
let summary = wallet.summary();

assert!(summary.storage_path.is_none());
println!("public key={}", summary.public_key);

Cette capacité est durable : 0.5.2 doit continuer à permettre des wallets temporaires/jetables pour tests, démonstrations et scénarios sans imposer une persistance ou un mot de passe.

Signer un message

let signature = match wallet.sign_message(
    b"khadhroony demo authorization",
) {
    std::result::Result::Ok(value) => value,
    std::result::Result::Err(error) => {
        return std::result::Result::Err(error);
    },
};

println!("signature={signature}");

as_signer() retourne une référence au trait Solana Signer sans exposer les octets du keypair.

Pour une API async qui conserve la référence au travers d'un await et impose un futur Send, as_sync_signer() préserve explicitement le marqueur Sync du keypair concret.

Cette frontière de signature doit rester disponible après restructuration : les consommateurs ne doivent pas connaître le format persistant.

Stockage legacy actuel

let store = match ks_wallet::TemporaryWalletStore::new(
    "./data/wallets",
) {
    std::result::Result::Ok(value) => value,
    std::result::Result::Err(error) => {
        return std::result::Result::Err(error);
    },
};

Le store actuel persiste un keypair au format Solana JSON dans :

<alias>.json

Ce format est legacy pour 0.5.2.

Créer un wallet legacy persistant

let alias = match ks_wallet::WalletAlias::parse(
    "devnet-payer",
) {
    std::result::Result::Ok(value) => value,
    std::result::Result::Err(error) => {
        return std::result::Result::Err(error);
    },
};

let wallet = match store.create(alias).await {
    std::result::Result::Ok(value) => value,
    std::result::Result::Err(error) => {
        return std::result::Result::Err(error);
    },
};

let summary = wallet.summary();
assert!(summary.storage_path.is_some());

create refuse d'écraser un fichier existant.

Charger ou créer sans écrasement

let alias = match ks_wallet::WalletAlias::parse(
    "shared-devnet",
) {
    std::result::Result::Ok(value) => value,
    std::result::Result::Err(error) => {
        return std::result::Result::Err(error);
    },
};

let wallet = match store.load_or_create(alias).await {
    std::result::Result::Ok(value) => value,
    std::result::Result::Err(error) => {
        return std::result::Result::Err(error);
    },
};

println!("wallet={}", wallet.public_key());

load_or_create utilise une création exclusive et reprend la lecture lorsqu'une création concurrente a déjà réservé le même alias.

Le contenu legacy est toutefois écrit directement dans le chemin final. La publication n'est pas encore crash-safe/atomique par fichier temporaire + renommage.

Cible persistante 0.5.2

Le nouveau stockage natif doit utiliser :

<alias>.kswallet

Le fichier .kswallet sera un conteneur binaire versionné protégé par le mot de passe propre au wallet.

L'API cible doit permettre conceptuellement :

create persistent(alias, password)
open/unlock(alias, password)
change password(alias, old password, new password)
scan/discover <alias>.kswallet
list identities
lookup by alias
sign without exposing private bytes

Le store découvrira les wallets persistants en scannant son répertoire résolu (racine KS_WALLETS_DIRECTORY, wallets par défaut, puis éventuel sous-répertoire configuré) pour les <alias>.kswallet valides. Le scan ne doit pas faire confiance au seul nom du fichier.

Le changement de mot de passe rechiffre la même keypair. Il n'existe pas de rotation normale du secret Ed25519 conservant la même pubkey : une nouvelle clé secrète signifie une nouvelle identité Solana.

Les noms Rust définitifs et le modèle runtime exact seront décidés dans les prereleases d'implémentation.

Import/export cible

ks-wallet doit obligatoirement importer et exporter le format keypair JSON standard des binaires Solana, en plus de son import legacy qui correspond actuellement à ce même wire format. Il doit aussi pouvoir convertir vers/depuis les autres formats explicitement supportés.

Un export public peut exposer les données autorisées telles que l'alias et la pubkey.

Tout export contenant ou permettant de reconstruire la clé privée doit obligatoirement demander et valider le mot de passe du wallet.

L'export vers Solana CLI utilise son tableau JSON de 64 octets. Pour Phantom, Solflare, Backpack, Trust Wallet, Coinbase/Base et les autres wallets examinés, une matrice de compatibilité doit d'abord confirmer le contrat exact depuis des sources officielles. Un seul adaptateur wallet tiers sera implémenté dans 0.5.2 à titre d'exemple ; les autres formats techniquement faisables seront reportés au TODO. Aucun format universel externe n'est supposé, et une recovery phrase ne doit jamais être synthétisée en prétendant représenter une keypair arbitraire si la seed/mnemonic d'origine n'est pas disponible.

Invariants

  • les octets secrets ne sont pas exposés par l'API publique par commodité ;
  • aucun mot de passe ni secret n'est projeté vers Tauri ;
  • ks-config ne stocke pas les mots de passe ;
  • les résumés publics ne doivent pas exposer inutilement les chemins locaux ;
  • un fichier existant n'est pas écrasé silencieusement ;
  • les liens symboliques et fichiers non réguliers sont refusés ;
  • sur Unix, les permissions privées sont vérifiées ;
  • les buffers secrets temporaires sont effacés lorsque possible ;
  • cette crate ne décide pas si une transaction est autorisée.

Tests de référence actuels

  • validation des alias ;
  • génération et signature sans persistance ;
  • création exclusive, chargement et load_or_create ;
  • refus d'écrasement ;
  • rejet des keypairs corrompus ;
  • vérification des permissions Unix privées.

La matrice 0.5.2 ajoutera notamment : legacy externalisé, .kswallet, password/changement de password, multi-wallet, migration, import/export, atomicité et canaris de non-divulgation.