285 lines
7.1 KiB
Markdown
285 lines
7.1 KiB
Markdown
<!-- file: deltas/0.1.1/pre.003.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# Delta `0.1.1-pre.003` — Pubkey + Program IDs
|
|
|
|
## Statut
|
|
|
|
Tranche fonctionnelle `0.1.1-pre.003` préparée après validation réussie par le user de `0.1.1-pre.002-fix.001`.
|
|
|
|
La base utilisateur observée avant ce delta utilise :
|
|
|
|
```text
|
|
workspace.package.version = "0.1.1-pre.2.fix.1"
|
|
```
|
|
|
|
Le présent delta ouvre :
|
|
|
|
```text
|
|
workspace.package.version = "0.1.1-pre.3"
|
|
```
|
|
|
|
## Validation de la base précédente
|
|
|
|
Le user a exécuté avec succès avant ce delta :
|
|
|
|
```bash
|
|
cargo fmt --all
|
|
cargo check --workspace
|
|
cargo clippy --workspace --all-targets
|
|
cargo test --workspace
|
|
```
|
|
|
|
Les six tests unitaires Error et le test d'intégration public Error passent sans warning dans cette validation.
|
|
|
|
## Audit Solana/Anza revérifié
|
|
|
|
Au 2026-08-14 :
|
|
|
|
- `solana-pubkey 4.3.0` est la version publiée courante observée sur crates.io ;
|
|
- son MSRV publié est Rust `1.89.0` ;
|
|
- la validation précédente du user expose une génération Clippy `rust-1.94.0`, donc la toolchain observée satisfait ce MSRV ;
|
|
- `Pubkey` reste la façade de compatibilité officielle sur l'`Address` Solana actuel ;
|
|
- `Pubkey::from_str_const` permet le décodage Base58 compile-time nécessaire à la macro KSP ;
|
|
- `solana-sdk-ids` est consulté uniquement comme source d'audit et n'entre pas dans le graphe Cargo KSP.
|
|
|
|
Sources externes revérifiées pendant cette tranche :
|
|
|
|
- crates.io / docs.rs pour `solana-pubkey 4.3.0` ;
|
|
- `anza-xyz/solana-sdk`, `sdk-ids/src/lib.rs`, pour les identifiants fondamentaux actuellement publiés ;
|
|
- SIMD-0204 et la documentation Anza pour le Slashing Program `S1ashing11111111111111111111111111111111111`.
|
|
|
|
## Dépendance Core
|
|
|
|
`crates/ksp-core-lib/Cargo.toml` ajoute uniquement :
|
|
|
|
```toml
|
|
solana-pubkey = { version = "4.3.0", default-features = false }
|
|
```
|
|
|
|
Aucun codec wire, client RPC, umbrella SDK ou registre `solana-sdk-ids` n'est ajouté.
|
|
|
|
`ksp_core_lib::Pubkey` réexporte `solana_pubkey::Pubkey` depuis la façade Core.
|
|
|
|
## Macro KSP de Program ID
|
|
|
|
La macro publique :
|
|
|
|
```text
|
|
ksp_core_lib::declare_program_id!
|
|
```
|
|
|
|
possède la chaîne Base58 une seule fois et produit simultanément :
|
|
|
|
```text
|
|
PRGID_* : &'static str
|
|
PRGIDPK_* : Pubkey
|
|
```
|
|
|
|
La représentation typée est construite avec `Pubkey::from_str_const`, sans parsing runtime, `unwrap`, `expect`, `panic` ni opérateur `?`.
|
|
|
|
La macro ne génère pas de symboles génériques `ID`, `id()` ou `check_id()` et peut donc être utilisée plusieurs fois dans une même crate/module.
|
|
|
|
## Première surface Program IDs Core
|
|
|
|
La tranche fixe le premier registre à 18 Program IDs.
|
|
|
|
Les 17 valeurs de la surface officielle actuelle Anza `solana-sdk-ids` sont possédées localement par KSP :
|
|
|
|
1. Address Lookup Table ;
|
|
2. BPF Loader historique v1 ;
|
|
3. BPF Loader v2 ;
|
|
4. BPF Loader Upgradeable ;
|
|
5. Compute Budget ;
|
|
6. Config ;
|
|
7. Ed25519 precompile ;
|
|
8. Feature ;
|
|
9. Loader v4 ;
|
|
10. Native Loader ;
|
|
11. Secp256k1 precompile ;
|
|
12. Secp256r1 precompile ;
|
|
13. Stake ;
|
|
14. System ;
|
|
15. Vote ;
|
|
16. ZK ElGamal Proof ;
|
|
17. ZK Token Proof.
|
|
|
|
Le dix-huitième identifiant est :
|
|
|
|
```text
|
|
PRGID_SOLANA_SLASHING = "S1ashing11111111111111111111111111111111111"
|
|
```
|
|
|
|
Son statut de programme enshrined et son adresse sont confirmés séparément par SIMD-0204/Anza ; sa présence ne dépend donc pas de l'ancien registre bot3.
|
|
|
|
Les sysvars, `StakeConfig`, l'incinerator et les autres well-known accounts restent exclus du registre Program IDs.
|
|
|
|
## Nomenclature publique
|
|
|
|
Chaque entrée possède une paire `PRGID_*` / `PRGIDPK_*` au crate-root.
|
|
|
|
Exemples :
|
|
|
|
```text
|
|
PRGID_SOLANA_SYSTEM
|
|
PRGIDPK_SOLANA_SYSTEM
|
|
|
|
PRGID_SOLANA_LOADER_BPF_V1
|
|
PRGIDPK_SOLANA_LOADER_BPF_V1
|
|
|
|
PRGID_SOLANA_PRECOMPILE_ED25519
|
|
PRGIDPK_SOLANA_PRECOMPILE_ED25519
|
|
|
|
PRGID_SOLANA_SLASHING
|
|
PRGIDPK_SOLANA_SLASHING
|
|
```
|
|
|
|
Le suffixe est strictement identique entre les deux représentations.
|
|
|
|
## Registre canonique
|
|
|
|
`ProgramIdEntry` porte :
|
|
|
|
```text
|
|
code
|
|
name
|
|
program_id
|
|
pubkey
|
|
domain
|
|
family
|
|
protocol
|
|
subfamily
|
|
program_version
|
|
kind
|
|
```
|
|
|
|
Les axes fonctionnels restent extensibles sous forme de chaînes. Aucun enum central fermé des domaines, familles ou protocoles futurs n'est créé.
|
|
|
|
`ProgramIdKind` est limité à la classification technique :
|
|
|
|
```text
|
|
Program
|
|
Loader
|
|
Precompile
|
|
EnshrinedProgram
|
|
```
|
|
|
|
La première taxonomie Core utilise :
|
|
|
|
```text
|
|
domain = solana
|
|
protocol = solana
|
|
|
|
family = runtime
|
|
family = consensus
|
|
family = loader
|
|
family = precompile
|
|
family = proof
|
|
```
|
|
|
|
`program_version` reste distinct de `subfamily`. Les BPF loaders v1/v2 et Loader v4 utilisent l'axe version ; la branche BPF utilise séparément `subfamily = bpf`.
|
|
|
|
## API de recherche et vues
|
|
|
|
La façade expose :
|
|
|
|
```text
|
|
entries()
|
|
program_ids(filter)
|
|
native_program_ids()
|
|
program_ids_by_domain(...)
|
|
program_ids_by_family(...)
|
|
program_ids_by_protocol(...)
|
|
find_program_id(...)
|
|
find_program_pubkey(...)
|
|
```
|
|
|
|
`ProgramIdFilter` peut combiner :
|
|
|
|
```text
|
|
domain
|
|
family
|
|
protocol
|
|
subfamily
|
|
program_version
|
|
kind
|
|
```
|
|
|
|
Toutes les vues sont construites à partir du registre canonique unique. Elles retournent des iterators paresseux sans dupliquer un tableau statique par catégorie.
|
|
|
|
Une future fonction `amm_program_ids()` pourra donc devenir une vue `family = amm` sans changement structurel de `ProgramIdEntry`.
|
|
|
|
## Tests ajoutés
|
|
|
|
`unit_tests/program_ids.rs` vérifie notamment :
|
|
|
|
- cohérence texte/`Pubkey` des déclarations ;
|
|
- présence exacte des 18 Program IDs Core ;
|
|
- unicité des codes, Base58 et `Pubkey` ;
|
|
- correspondance de chaque `Pubkey` avec la Base58 KSP ;
|
|
- intersection des six axes de filtre ;
|
|
- tailles attendues des familles Core actuelles ;
|
|
- recherche texte et `Pubkey` ;
|
|
- absence de l'incinerator, `StakeConfig` et du Clock sysvar.
|
|
|
|
`tests/public_api.rs` vérifie en consommateur externe :
|
|
|
|
- la macro `declare_program_id!` ;
|
|
- les constantes `PRGID_*` / `PRGIDPK_*` ;
|
|
- `Pubkey` ;
|
|
- les vues du registre ;
|
|
- les getters de `ProgramIdEntry` ;
|
|
- le filtrage public combiné.
|
|
|
|
## Documentation
|
|
|
|
`docs/plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md` passe en version documentaire 6 afin de :
|
|
|
|
- fixer l'inventaire Core à 18 IDs ;
|
|
- tracer la vérification du Slashing Program ;
|
|
- enregistrer `solana-pubkey 4.3.0` comme dépendance effectivement introduite ;
|
|
- fermer la question de MSRV de `pre.003` ;
|
|
- fixer `ProgramIdKind` et les retours iterator des vues ;
|
|
- compléter l'API publique réellement implémentée.
|
|
|
|
## Hors scope préservé
|
|
|
|
Cette tranche n'ajoute toujours pas :
|
|
|
|
- SPL Token/Token-2022/ATA/Memo ;
|
|
- Metaplex ou DEX ;
|
|
- well-known accounts ;
|
|
- codecs Borsh/Wincode ;
|
|
- decoder/executor/IDL ;
|
|
- RPC/WS ;
|
|
- Wallet ;
|
|
- Logging ;
|
|
- Config ;
|
|
- Store ;
|
|
- applications.
|
|
|
|
## Validations à exécuter sur le dépôt cible
|
|
|
|
Cette livraison ne déclare aucune validation Cargo non exécutée dans l'environnement de génération.
|
|
|
|
Après application :
|
|
|
|
```bash
|
|
cargo fmt --all
|
|
cargo check --workspace
|
|
cargo test --workspace
|
|
cargo clippy --workspace --all-targets
|
|
cargo tree -p ksp-core-lib
|
|
cargo tree -p ksp-core-lib -d
|
|
```
|
|
|
|
Les deux commandes `cargo tree` doivent notamment confirmer l'absence de `solana-sdk-ids` et permettre de contrôler le graphe/features réellement résolus.
|
|
|
|
## Suite
|
|
|
|
Si les validations sont propres, la tranche suivante reste :
|
|
|
|
```text
|
|
0.1.1-pre.004 — intégration Core + audits
|
|
```
|