Files
khadhroony-solana-project/deltas/0.2.5/pre.008.md
2026-08-19 18:47:06 +02:00

224 lines
6.7 KiB
Markdown

<!-- file: deltas/0.2.5/pre.008.md -->
<!-- version: 1 -->
# Delta `0.2.5-pre.008` — import/export Solana CLI JSON + keypair Base58
## Base
```text
0.2.5-pre.7.fix.1
```
Le checkpoint opérateur de cette base a validé `cargo fmt --all`, `cargo check --workspace`, `cargo clippy --workspace --all-targets`, `cargo test -p ksp-wallet-lib` et `cargo test --workspace` sans warning.
Version workspace cible :
```text
0.2.5-pre.8
```
## Objectif
Cette tranche matérialise les premiers adapters explicites d'import/export de keypair Solana autour du format natif `.kspwallet` V1 :
```text
Solana CLI JSON : tableau JSON de 64 octets
Solana keypair Base58 : Base58 canonique de la keypair complète de 64 octets
```
Elle ne crée aucun format Wallet alternatif, ne migre aucun ancien format KSP/bot2/bot3 et ne modifie pas `format_version = 1`.
## Audit upstream `solana-keypair 3.1.2`
Le réaudit de la source officielle actuelle confirme :
- `Keypair::to_bytes()` retourne exactement 64 octets ;
- `Keypair::try_from(&[u8])` exige 64 octets et vérifie que la moitié publique correspond bien à la clé dérivée du secret ;
- `Keypair::try_from_base58_string` décode la représentation Base58 de 64 octets puis passe par cette validation stricte ;
- `Keypair::to_base58_string` encode la keypair complète de 64 octets ;
- `read_keypair` / `write_keypair` matérialisent le format JSON Solana sous forme de 64 valeurs octet.
KSP réutilise donc `solana-keypair` déjà possédée par Wallet et n'ajoute pas de dépendance directe `bs58`.
## API de transfert
Nouveaux contrats publics :
```text
WalletTransferFormat
WalletTransferInspection
inspect_wallet_transfer
inspect_wallet_transfer_file
import_wallet_transfer_v1
import_wallet_transfer_file_v1
WalletOwner::export_transfer
WalletOwner::export_transfer_file
```
`WalletTransferFormat` distingue explicitement :
```text
solana_cli_json
solana_keypair_base58
```
Le terme Base58 désigne ici la **keypair complète de 64 octets**, jamais un seed 32 octets ambigu.
## Inspection sûre
L'inspection exige un format explicite, valide réellement la keypair et ne retourne que :
```text
Pubkey KSP Core
format de transfert reconnu
```
Aucun secret, seed, keypair brute ou contenu source n'est exposé par `WalletTransferInspection` ou son `Debug`.
Bornes pré-parser :
```text
Solana CLI JSON : 1024 octets
Base58 : 128 octets
```
Pour les APIs fichier, Wallet ouvre d'abord la source puis vérifie les metadata du fichier réellement ouvert avant la lecture bornée à `maximum + 1`.
## Import
Tout import :
```text
valide la keypair externe
conserve exactement l'identité/keypair Solana importée
crée de nouveaux admin key/content keys/salts/nonces/key slots KSP
applique les metadata KSP fournies par le caller
crée éventuellement le slot VIEW demandé
sérialise un nouveau `.kspwallet` V1
publie avec la sémantique native no-clobber
```
Une destination existante retourne `wallet.destination_exists`. Un import ne remplace jamais un `.kspwallet` existant. L'import depuis fichier ne modifie pas le fichier source.
## Export OWNER-only
Seule `WalletOwner` expose l'export secret. `WalletView` ne possède aucune méthode équivalente.
L'export en mémoire retourne un buffer contenant le secret au caller ; sa documentation exige d'en minimiser la durée de vie et de le zeroizer quand approprié.
L'export fichier :
```text
temp file same-directory
write
sync temp
persist_noclobber
sync fichier publié
parent-directory sync best-effort sur Unix
```
Une destination existante n'est jamais écrasée. Sur Unix, Wallet tente `0600` comme hygiène filesystem ; cette permission n'est pas transformée en garantie cryptographique du format V1.
## Canari externe déterministe
Un vecteur indépendant du code Rust Wallet est figé pour le seed Ed25519 `[7; 32]` :
```text
Pubkey Base58
GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB
Keypair complète Base58
99eUso3aSbE9tqGSTXzo3TLfKb9RkMTURrHKQ1K7Zh3StnzFNUx8FKCPPPPpR479qsw5zv2WNBKmgiz7WqgAJfM
```
Le test fixe aussi les 64 octets exacts et vérifie que les adapters JSON/Base58 produisent la même identité publique. Ce canari évite de valider les adapters uniquement par un round-trip circulaire interne à `solana-keypair`.
## Tests/canaris ajoutés
La tranche couvre notamment :
```text
inventaire stable des deux formats + codes/labels/extensions
inspection JSON + Base58 sans exposition du secret
vecteur externe déterministe seed [7; 32]
rejet JSON court
rejet keypair 64 octets dont la moitié publique est incohérente
rejet Base58 invalide/non canonique/avec whitespace périphérique
import JSON -> nouveau `.kspwallet` + identité/metadata conservées
second import même destination -> wallet.destination_exists
import fichier non destructif + source surdimensionnée rejetée
export OWNER JSON et Base58 -> mêmes 64 octets importés
export fichier OWNER no-clobber
permission 0600 vérifiée sur Unix
canari API publique pre.008
canari de frontière interdisant une dépendance directe `bs58`
```
## Dépendances
Aucune nouvelle dépendance tierce.
La tranche réutilise exclusivement les dépendances Wallet déjà acquises, notamment `solana-keypair 3.1.2`, `serde_json`, `tempfile` et `zeroize`.
Les frontières restent :
```text
Wallet -X-> Config
Wallet -X-> Transport
Wallet -X-> ExecutionPolicy
Wallet -X-> Store
Wallet -X-> Tauri
Wallet -X-> tracing direct
Wallet -X-> solana-pubkey direct
Wallet -X-> bs58 direct
```
`Pubkey` reste exposée par `ksp-core-lib`; la keypair secrète reste encapsulée dans `ksp-wallet-lib`.
## Documentation
Mise à jour :
```text
docs/formats/KSPWALLET_V1.md
docs/plans/000-README.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md
docs/IDEAS.md
ROADMAP.md
```
`pre.009` devient la prochaine tranche : sécurité/interoperabilité/compliance finale et audits de dépendances/arbres.
## Validation statique de préparation
Le sandbox de préparation ne possède pas Cargo/Rust. Les contrôles statiques ont vérifié :
- pas de nouveau `unwrap`/`expect`/`panic`/`?` dans les chemins production ajoutés ;
- seuls des traits nécessaires sont importés avec `use` ;
- aucun accès Config/Transport/Tauri/env/`tracing` direct/`solana-pubkey` direct ;
- aucune dépendance `bs58` ajoutée ;
- incréments de versions de fichiers cohérents ;
- liens Markdown locaux des documents modifiés résolus ;
- archive delta limitée aux fichiers ajoutés/modifiés.
## Validation opérateur requise
```bash
cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-wallet-lib
cargo test --workspace
cargo tree -p ksp-wallet-lib
cargo tree -p ksp-wallet-lib -d
cargo tree -i solana-keypair@3.1.2
```
## Commit attendu
```text
v0.2.5-pre.008
```