v0.2.2-pre.001-fix.001

This commit is contained in:
2026-08-18 06:46:59 +02:00
parent 9059a2dc45
commit bffb4f9a31
2 changed files with 260 additions and 22 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md -->
<!-- version: 2 -->
<!-- version: 3 -->
# Plan `0.2.2` — HTTP Accounts + Tokens + Cluster
@@ -13,7 +13,7 @@ registry des méthodes, exécution HTTP générique, adapter Config -> Transport
Cette release ne reconstruit aucun transport par famille. Elle complète uniquement la surface typée des 22 méthodes déjà attribuées à
`HttpRpcCoverageRelease::V0_2_2`.
## Sources normatives réauditées le 2026-08-17
## Sources normatives réauditées les 2026-08-17 et 2026-08-18
Source documentaire principale :
@@ -25,15 +25,19 @@ Références complémentaires officielles utilisées pour les formes wire commun
```text
https://solana.com/docs/rpc/json-structures
https://github.com/anza-xyz/agave/blob/v3.1.8/rpc/src/rpc.rs
https://github.com/anza-xyz/agave/blob/v3.1.8/rpc-client-types/src/config.rs
https://github.com/anza-xyz/agave/blob/v3.1.8/rpc-client-types/src/filter.rs
https://github.com/anza-xyz/agave/blob/v3.1.8/rpc-client-types/src/request.rs
https://github.com/anza-xyz/agave/blob/v3.1.8/rpc-client-types/src/response.rs
https://github.com/anza-xyz/agave/blob/v4.2.1/rpc/src/rpc.rs
https://github.com/anza-xyz/agave/blob/v4.2.1/rpc-client-types/src/config.rs
https://github.com/anza-xyz/agave/blob/v4.2.1/rpc-client-types/src/filter.rs
https://github.com/anza-xyz/agave/blob/v4.2.1/rpc-client-types/src/request.rs
https://github.com/anza-xyz/agave/blob/v4.2.1/rpc-client-types/src/response.rs
```
Les liens `Source` des pages RPC Solana consultées pointent actuellement vers Agave `v3.1.8`. KSP ne prend pas de dépendance sur ces crates :
leur source sert seulement à lever les ambiguïtés de la documentation HTTP lorsque nécessaire.
Les liens `Source` actuellement exposés par les pages RPC Solana consultées pointent encore vers Agave `v3.1.8`. Ce constat documentaire ne
signifie pas que `v3.1.8` soit la source Agave la plus récente à auditer. Le 2026-08-18, KSP recoupe donc ces pages avec le tag Agave `v4.2.1`,
dont le workspace déclare lui-même la version `4.2.1`, afin de détecter les évolutions wire plus récentes que les liens du site Solana.
KSP ne prend pas de dépendance sur ces crates : leurs sources servent seulement à lever les ambiguïtés de la documentation HTTP et à préserver
les champs optionnels/versionnés réellement exposés par Agave `v4.2.1`, plus récent que le snapshot `v3.1.8` encore lié par le site Solana.
## Résultat de l'audit global
@@ -135,7 +139,7 @@ true -> RpcResponse<Vec<KeyedAccount>>
Le contrat public doit refléter cette union au lieu de supprimer le contexte ou d'inventer un contexte lorsque le serveur n'en renvoie pas.
Les filtres KSP doivent distinguer les trois variantes acceptées par la source primaire Agave actuelle :
Les filtres KSP doivent distinguer les trois variantes acceptées par la source primaire Agave `v4.2.1` :
```text
DataSize(u64)
@@ -215,11 +219,16 @@ tpuQuic Option<String>
tpuVote Option<String>
tvu Option<String>
version Option<String>
clientId Option<String>
```
Même si Agave utilise actuellement `SocketAddr` en interne pour plusieurs endpoints, le DTO public Transport ne doit pas imposer davantage que
Même si Agave `v4.2.1` utilise `SocketAddr` en interne pour plusieurs endpoints, le DTO public Transport ne doit pas imposer davantage que
le contrat JSON. Les adresses réseau restent donc des chaînes wire optionnelles à moins qu'un invariant officiel plus strict soit nécessaire.
La page Solana courante ne liste pas encore `clientId`, mais Agave `v4.2.1` expose `client_id: Option<String>` dans `RpcContactInfo`. KSP doit donc
accepter et préserver ce champ optionnel sans le rendre obligatoire, afin de rester compatible avec les noeuds/providers qui l'émettent comme
avec ceux qui suivent encore la forme documentée sans ce champ.
### `EpochInfo` et `EpochSchedule`
`EpochInfo` conserve :
@@ -276,20 +285,25 @@ delinquentSlotDistance
Chaque record conserve au minimum :
```text
votePubkey Pubkey
nodePubkey Pubkey
activatedStake u64
commission u8
epochVoteAccount bool
epochCredits Vec<(epoch u64, credits u64, previousCredits u64)>
lastVote u64
rootSlot u64
votePubkey Pubkey
nodePubkey Pubkey
activatedStake u64
commission u8
inflationRewardsCommissionBps Option<u16>
epochVoteAccount bool
epochCredits Vec<(epoch u64, credits u64, previousCredits u64)>
lastVote u64
rootSlot u64
```
Un petit DTO nommé pour une entrée `epochCredits` est préférable à exposer un tuple public opaque, tout en conservant la forme tableau du wire
au décodage. La source Agave courante limite la réponse à cinq entrées d'historique `epochCredits` par validator; KSP ne doit pas supposer que
au décodage. La source Agave `v4.2.1` limite la réponse à cinq entrées d'historique `epochCredits` par validator; KSP ne doit pas supposer que
l'historique complet d'un vote account est exposé par cette méthode RPC.
Agave `v4.2.1` ajoute également `inflationRewardsCommissionBps`, sérialisé comme champ optionnel. La source précise que ce champ vaut `None` pour
un noeud antérieur à son introduction. Le DTO KSP doit donc le conserver en `Option<u16>` et ne jamais le déduire artificiellement de
`commission`.
## DTOs communs et organisation prévue
`pre.002` doit introduire des types partagés ciblés, pas un « mega DTO ». Le découpage prévu est conceptuellement :
@@ -405,11 +419,11 @@ Cas transversaux prioritaires :
- `getAccountInfo` et `getMultipleAccounts` avec comptes absents ;
- `getProgramAccounts` bare vs `withContext` ;
- `TokenAmount.uiAmount: null` ;
- fields optionnels de `getClusterNodes` ;
- fields optionnels de `getClusterNodes`, dont présence/absence de `clientId` ;
- `EpochInfo.transactionCount: null` ;
- `SnapshotSlotInfo.incremental: null` et erreur NoSnapshot ;
- `getLeaderSchedule: null` + overloads ;
- `getVoteAccounts` current/delinquent et epoch credits ;
- `getVoteAccounts` current/delinquent, epoch credits et présence/absence de `inflationRewardsCommissionBps` ;
- limites 100, 4 filtres Program Accounts et 5000; variantes/encodages `memcmp`.
Les canaries de release doivent maintenir :