Files
khadhroony-bot3/kb-wallet/USAGE.md
2026-08-08 22:28:17 +02:00

4.8 KiB
Raw Blame History

Utilisation de kb-wallet

Objectif

La crate fournit des wallets temporaires en mémoire ou persistés localement pour les démonstrations et tests dintégration.

Valider un alias

let alias = match kb_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 en mémoire

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

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

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

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 dun await et impose un futur Send, as_sync_signer() préserve explicitement le marqueur Sync du keypair concret. Cette vue ne change ni la clé utilisée ni les règles dautorisation de la couche dexécution.

Créer un stockage local

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

println!(
    "wallet directory={}",
    store.directory().display()
);

Créer un wallet persistant

let alias = match kb_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 atomiquement

let alias = match kb_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());

Vérifier lexistence et le chemin

let path = store.wallet_path(&alias);
let exists = match store.exists(&alias).await {
    std::result::Result::Ok(value) => value,
    std::result::Result::Err(error) => {
        return std::result::Result::Err(error);
    },
};

println!("path={}, exists={exists}", path.display());

Politique non secrète

let policy = kb_wallet::WalletPolicy {
    signing_enabled: true,
    lamport_spend_limit: std::option::Option::Some(
        1_000_000,
    ),
};

assert!(policy.signing_enabled);

WalletPolicy transporte une intention de politique. Son application effective appartient à la couche dexécution.

Erreurs et invariants

  • les octets secrets ne sont jamais exposés par lAPI publique ;
  • les résumés ne contiennent que lalias, la clé publique et le chemin ;
  • un fichier existant nest pas écrasé ;
  • 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 ;
  • cette crate ne décide pas si une transaction est autorisée.

Tests de référence

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

Limites durables

  • le format persistant actuel est le tableau JSON standard du keypair Solana ;
  • la crate ne signe pas automatiquement une transaction ;
  • elle ne transmet aucun secret à une interface frontend.