v0.1.0-pre.071

This commit is contained in:
2026-07-31 16:54:45 +02:00
parent d6bd91c305
commit c5327b0283
16 changed files with 938 additions and 37 deletions

18
kb-wallet/CHANGELOG.md Normal file
View File

@@ -0,0 +1,18 @@
<!-- file: kb-wallet/CHANGELOG.md -->
<!-- version: 1 -->
# CHANGELOG — kb-wallet
## 0.1.0-pre.071
- réécriture du README avec indication explicite du statut débauche ;
- ajout du TODO détaillant les fonctionnalités prévues pour `0.5.x` ;
- ajout du guide dutilisation et de plusieurs exemples publics ;
- clarification de la frontière entre signer, politique et exécution.
## 0.1.0-pre.062
- migration et renommage du wallet temporaire vers `kb-wallet` ;
- conservation des alias validés, keypairs temporaires et stockage local ;
- ajout des contrôles de permissions, type de fichier et effacement des buffers secrets ;
- adaptation aux normes Rust 2024 et Khadhroony bot3.

View File

@@ -1,18 +1,46 @@
<!-- file: kb-wallet/README.md -->
<!-- version: 1 -->
<!-- version: 2 -->
# kb-wallet
Frontière locale de portefeuille et de signature pour Khadhroony Bot3.
`kb-wallet` fournit actuellement une frontière locale minimale de portefeuille pour les démonstrations et tests dintégration.
La crate fournit :
## État actuel
- des alias de portefeuille validés et non secrets ;
- des portefeuilles temporaires en mémoire ;
- un stockage JSON Solana persistant pour le développement et les tests dintégration ;
- la signature de messages sans exposition des octets secrets ;
- des permissions Unix privées (`0700` pour le répertoire, `0600` pour les fichiers) ;
- le rejet des liens symboliques, fichiers non réguliers, permissions trop ouvertes et keypairs invalides ;
- leffacement explicite des buffers contenant des octets secrets via `zeroize`.
La crate est une ébauche fonctionnelle, pas un gestionnaire de wallets complet.
Cette crate ne décide pas si une transaction peut être envoyée. Les limites de dépense, la simulation et les politiques dexécution restent dans `kb-lib` et les couches dorchestration.
Elle fournit :
- alias validés ;
- wallet temporaire en mémoire ;
- stockage local JSON dun keypair Solana ;
- chargement ou création atomique ;
- résumé non secret ;
- accès au trait `Signer` sans exposition des octets ;
- signature de messages ;
- permissions Unix privées et contrôles de fichiers ;
- effacement des buffers secrets utilisés lors de la lecture ou écriture.
## Hors capacités actuelles
Les fonctions suivantes ne sont pas encore implémentées :
- chiffrement par mot de passe ;
- plusieurs wallets gérés comme collection ;
- sélection persistante du wallet actif ;
- import/export contrôlé ;
- changement de mot de passe ;
- verrouillage et déverrouillage ;
- sauvegarde et restauration ;
- politiques de sécurité complètes.
## Relations
`kb-wallet` fournit un signer. Les limites de dépense, la simulation, lautorisation opérateur et lenvoi sont gérés par `kb-lib`, `kb-pipeline-demo-scenarios` et les applications.
## Documentation
- [USAGE.md](USAGE.md)
- [TODO.md](TODO.md)
- [CHANGELOG.md](CHANGELOG.md)
- [ROADMAP général](../ROADMAP.md)

16
kb-wallet/TODO.md Normal file
View File

@@ -0,0 +1,16 @@
<!-- file: kb-wallet/TODO.md -->
<!-- version: 1 -->
# TODO — kb-wallet
- [ ] Fonctionnalité - gérer plusieurs wallets persistants.
- [ ] Fonctionnalité - ajouter la sélection et la persistance du wallet actif.
- [ ] Sécurité - ajouter le chiffrement et le déchiffrement protégés par mot de passe.
- [ ] Sécurité - ajouter le changement de mot de passe.
- [ ] Sécurité - ajouter le verrouillage et le déverrouillage explicites.
- [ ] Fonctionnalité - ajouter limport et lexport contrôlés de wallets.
- [ ] Fonctionnalité - ajouter la sauvegarde et la restauration.
- [ ] Sécurité - définir des politiques de stockage, de session et dautorisation de signature.
- [ ] Intégration - relier la sélection du wallet aux profils et signers des scénarios.
- [ ] Tests - ajouter les tests de corruption, concurrence et récupération pour les nouvelles fonctionnalités.
- [ ] Documentation - produire un guide de sécurité avant tout usage hors démonstration.

182
kb-wallet/USAGE.md Normal file
View File

@@ -0,0 +1,182 @@
<!-- file: kb-wallet/USAGE.md -->
<!-- version: 1 -->
# 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
```rust
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
```rust
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
```rust
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.
## Créer un stockage local
```rust
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
```rust
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
```rust
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
```rust
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
```rust
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.