v0.2.3-pre.008

This commit is contained in:
2026-08-18 16:47:54 +02:00
parent 704110d509
commit c9a0f7fd37
6 changed files with 300 additions and 5 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md -->
<!-- version: 6 -->
<!-- version: 7 -->
# Plan `0.2.3` — HTTP Transactions
@@ -629,6 +629,16 @@ Une prerelease intermédiaire peut être ajoutée si le volume réel d'une tranc
tranche de clôture en remédiation fonctionnelle tardive. La dernière prerelease reste une tranche de clôture documentaire/validation et ne doit pas
devenir une implémentation massive tardive.
## Résultat de `pre.008` — réaudit rétroactif `KSP-TRANSPORT-007`
Le réaudit rétroactif a été exécuté sur les **37 wrappers HTTP typés courants** livrés par `0.2.1`, `0.2.2` et `0.2.3-pre.007` : 4 foundation, 22 Accounts/Tokens/Cluster et 11 Transactions. La matrice durable est conservée dans `docs/validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md`.
Le contrôle croise la documentation HTTP Solana courante avec Agave `v4.2.1`, génération recommandée pour adoption générale Mainnet-beta le 10 août 2026 et dont les activations Mainnet-beta ont commencé le 17 août 2026. `master` est déjà en `4.3.0-alpha`, mais n'est pas retenu comme contrat stable de cette release.
Verdict : **aucune possibilité RPC supportée n'est manquante dans les 37 wrappers audités**. Les extensions runtime déjà prises en charge par KSP (`binary`, `sortResults`, `tokenAccountState`, `clientId`, `inflationRewardsCommissionBps`, `recentBlockhash`, champs riches de simulation, `transactionIndex`, etc.) sont conservées même lorsqu'elles ne sont pas toutes détaillées dans la page publique Solana. Les syntaxes strictement équivalentes peuvent rester canonicalisées conformément à `KSP-TRANSPORT-007`.
Aucune remédiation fonctionnelle artificielle n'est donc introduite en `pre.008`. La tranche ajoute une preuve durable et une canarie nommée couvrant exactement les 37 descriptors courants de `0.2.1` à `0.2.3`, tout en préservant la forme legacy dépréciée de `getTransaction`. La clôture reste déplacée à `pre.009`.
## Critères de clôture de `0.2.3`
La release ne peut être candidate stable que si :

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/000-README.md -->
<!-- version: 6 -->
<!-- version: 7 -->
# Validations KSP
@@ -13,3 +13,4 @@ Documents :
- [`002-V0_2_0_SERIES_PLANNING.md`](002-V0_2_0_SERIES_PLANNING.md) — matrice finale de la release stable `0.2.0`, avec audit de cohérence et preuves opérateur de `pre.003`.
- [`003-V0_2_1_ONCHAIN_HTTP.md`](003-V0_2_1_ONCHAIN_HTTP.md) — matrice de clôture de `0.2.1 — HTTP Solana foundation`, registry 52+14, résilience, Config -> Transport, quatre canaris et smoke Devnet opt-in.
- [`004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md`](004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md) — matrice finale validée de `0.2.2`, 22 wrappers Accounts/Tokens/Cluster, canaries 52+14, graphes Cargo, smoke Devnet Transport pur, smoke historique Config -> Transport et préparation de `0.2.3`.
- [`005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md`](005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md) — réaudit rétroactif de complétude `KSP-TRANSPORT-007` des 37 wrappers HTTP typés livrés de `0.2.1` à `0.2.3-pre.007`, avec preuves Solana/Agave et verdict méthode par méthode.

View File

@@ -0,0 +1,137 @@
<!-- file: docs/validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md -->
<!-- version: 2 -->
# Réaudit rétroactif `KSP-TRANSPORT-007` — HTTP `0.2.1` à `0.2.3`
## Objet
Cette matrice est la preuve durable du réaudit rétroactif demandé par `0.2.3-pre.008`. Elle applique explicitement `KSP-TRANSPORT-007` aux **37 wrappers HTTP typés courants** livrés entre `0.2.1` et `0.2.3-pre.007` :
```text
0.2.1 4 wrappers Foundation
0.2.2 5 Accounts + 5 Tokens + 12 Cluster = 22 wrappers
0.2.3 11 Transactions
Total 37 wrappers courants typés
```
Le contrôle porte sur : paramètres obligatoires et optionnels, champs de configuration, overloads/variantes courants, formes legacy encore supportées, contraintes déterministes connues, formes de réponse, `null`/omissions significatives et extensions runtime retenues.
## Sources normatives retenues
Audit effectué le **18 août 2026**.
Sources principales :
- documentation HTTP Solana courante : <https://solana.com/docs/rpc/http> ;
- Agave `v4.2.1`, `rpc/src/rpc.rs` : <https://github.com/anza-xyz/agave/blob/v4.2.1/rpc/src/rpc.rs> ;
- Agave `v4.2.1`, `rpc-client-types/src/config.rs` : <https://github.com/anza-xyz/agave/blob/v4.2.1/rpc-client-types/src/config.rs> ;
- Agave `v4.2.1`, `rpc-client-types/src/response.rs` : <https://github.com/anza-xyz/agave/blob/v4.2.1/rpc-client-types/src/response.rs> ;
- Agave `v4.2.1`, `transaction-status-client-types/src/lib.rs` : <https://github.com/anza-xyz/agave/blob/v4.2.1/transaction-status-client-types/src/lib.rs>.
Le choix de `v4.2.1` est volontaire : la branche `v4.2` est la génération recommandée pour adoption générale Mainnet-beta depuis le 10 août 2026 et ses activations Mainnet-beta ont commencé le 17 août 2026. Le `master` Agave est déjà en `4.3.0-alpha` et n'est pas retenu comme contrat stable pour cette release.
La documentation publique n'énumère pas toujours toutes les extensions runtime. Lorsqu'Agave `v4.2.1` expose une possibilité supplémentaire supportée, KSP la conserve conformément à `KSP-TRANSPORT-007`.
## Verdict global
**Conforme sans remédiation fonctionnelle.** Aucun paramètre, champ de config, overload, forme legacy encore supportée ou variante de réponse pertinente n'est manquant dans les 37 wrappers audités.
Les extensions runtime déjà présentes dans KSP restent nécessaires, notamment :
- `binary` pour les formes Account/Transaction legacy encore comprises par Agave ;
- `sortResults` sur les configs runtime concernées ;
- filtre `tokenAccountState` de `getProgramAccounts` ;
- `clientId` et endpoints étendus de `getClusterNodes` ;
- `inflationRewardsCommissionBps` de `getVoteAccounts` ;
- `transactionIndex` pour signatures/transaction confirmée ;
- `recentBlockhash` de `requestAirdrop` ;
- résultat riche de `simulateTransaction`, y compris balances, token balances, fee et loaded addresses.
Les syntaxes strictement équivalentes restent canonicalisées lorsque cela ne retire aucune capacité. Exemple : l'absence de config et un objet config vide ne nécessitent pas deux APIs publiques distinctes lorsqu'elles ont le même effet RPC. La forme bare encoding dépréciée de `getTransaction`, qui n'est pas strictement équivalente du point de vue du contrat historique, reste au contraire exposée séparément et marquée deprecated.
## Matrice méthode par méthode
| Release | Méthode | Requête auditée / points sensibles | Réponse auditée / points sensibles | Verdict |
|---------|-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|----------|
| 0.2.1 | `getBalance` | pubkey + `commitment/minContextSlot` | contexte + `u64` | Conforme |
| 0.2.1 | `getGenesisHash` | aucun paramètre | hash string | Conforme |
| 0.2.1 | `getHealth` | aucun paramètre | `ok` ou erreur RPC de santé | Conforme |
| 0.2.1 | `getVersion` | aucun paramètre | `solana-core`, `feature-set` | Conforme |
| 0.2.2 | `getAccountInfo` | pubkey + encoding/dataSlice/commitment/minContextSlot ; encodings docs + legacy runtime | `Account` ou `null`, data tuple/jsonParsed, `space` | Conforme |
| 0.2.2 | `getLargestAccounts` | commitment/filter + extension runtime `sortResults` | contexte + liste address/lamports | Conforme |
| 0.2.2 | `getMinimumBalanceForRentExemption` | data length + commitment | `u64` | Conforme |
| 0.2.2 | `getMultipleAccounts` | jusqu'à 100 pubkeys + config Account complète | ordre conservé + `null` positionnels + Account complet | Conforme |
| 0.2.2 | `getProgramAccounts` | config Account + filters dataSize/memcmp/tokenAccountState + withContext + sortResults | array nu ou contexte selon `withContext` | Conforme |
| 0.2.2 | `getTokenAccountBalance` | token account + commitment | contexte + amount/decimals/uiAmount/uiAmountString | Conforme |
| 0.2.2 | `getTokenAccountsByDelegate` | delegate + selector exclusif mint/programId + config Account complète | contexte + keyed accounts | Conforme |
| 0.2.2 | `getTokenAccountsByOwner` | owner + selector exclusif mint/programId + config Account complète | contexte + keyed accounts | Conforme |
| 0.2.2 | `getTokenLargestAccounts` | mint + commitment | contexte + ordered token account balances | Conforme |
| 0.2.2 | `getTokenSupply` | mint + commitment | contexte + token amount complet | Conforme |
| 0.2.2 | `getClusterNodes` | aucun paramètre | champs documentés + extensions runtime optionnelles : gossip/rpc/pubsub/tpu/tvu/repair/quic/forwards/vote/version/featureSet/clientId | Conforme |
| 0.2.2 | `getEpochInfo` | commitment/minContextSlot | absoluteSlot/blockHeight/epoch/slotIndex/slotsInEpoch/transactionCount nullable | Conforme |
| 0.2.2 | `getEpochSchedule` | aucun paramètre | cinq champs schedule | Conforme |
| 0.2.2 | `getHighestSnapshotSlot` | aucun paramètre | full + incremental nullable ; erreur RPC absence snapshot | Conforme |
| 0.2.2 | `getIdentity` | aucun paramètre | pubkey identité | Conforme |
| 0.2.2 | `getLeaderSchedule` | current epoch ou slot ; config identity/commitment ; overload config-only/slot+config canonicalisé explicitement | map identité -> indices ou `null` | Conforme |
| 0.2.2 | `getMaxRetransmitSlot` | aucun paramètre | `u64` | Conforme |
| 0.2.2 | `getMaxShredInsertSlot` | aucun paramètre | `u64` | Conforme |
| 0.2.2 | `getSlot` | commitment/minContextSlot | `u64` | Conforme |
| 0.2.2 | `getSlotLeader` | commitment/minContextSlot | pubkey | Conforme |
| 0.2.2 | `getSlotLeaders` | start slot + limit `1..=5000` | ordered pubkeys | Conforme |
| 0.2.2 | `getVoteAccounts` | commitment/votePubkey/keepUnstakedDelinquents/delinquentSlotDistance | current+delinquent, epochCredits, commission + inflationRewardsCommissionBps optionnel | Conforme |
| 0.2.3 | `getFeeForMessage` | message base64 opaque + commitment/minContextSlot | contexte + fee `u64` ou `null` | Conforme |
| 0.2.3 | `getLatestBlockhash` | commitment/minContextSlot | contexte + blockhash/lastValidBlockHeight | Conforme |
| 0.2.3 | `getRecentPrioritizationFees` | liste optionnelle de comptes, max 128 | liste ordonnée slot/prioritizationFee | Conforme |
| 0.2.3 | `getSignaturesForAddress` | address + before/until/limit `1..=1000`/commitment/minContextSlot | newest-first ; err/memo/blockTime/confirmationStatus/transactionIndex optionnels | Conforme |
| 0.2.3 | `getSignatureStatuses` | jusqu'à 256 signatures + searchTransactionHistory ; liste vide acceptée runtime | contexte + `null` positionnels + status legacy/current | Conforme |
| 0.2.3 | `getTransaction` | forme objet moderne complète + bare encoding legacy deprecated ; encodings binary/base58/base64/json/jsonParsed ; confirmed/finalized ; maxSupportedTransactionVersion | `null` ou transaction binaire/JSON/jsonParsed ; meta/version/transactionIndex conservés losslessly | Conforme |
| 0.2.3 | `getTransactionCount` | commitment/minContextSlot | `u64` | Conforme |
| 0.2.3 | `isBlockhashValid` | blockhash opaque + commitment/minContextSlot | contexte + bool | Conforme |
| 0.2.3 | `requestAirdrop` | recipient + lamports + commitment + extension runtime recentBlockhash | signature string | Conforme |
| 0.2.3 | `sendTransaction` | transaction opaque base58/base64 + skipPreflight/preflightCommitment/maxRetries/minContextSlot | signature string ; no-resend KSP après dispatch ambigu | Conforme |
| 0.2.3 | `simulateTransaction` | base58/base64 + commitment/replaceRecentBlockhash/sigVerify/minContextSlot/innerInstructions/accounts ; encodings comptes supportés ; invariant sigVerify/replace | contexte + résultat riche complet et états null/omitted | Conforme |
## Contrôles transverses
### Encodings Account
KSP expose `binary`, `base58`, `base64`, `jsonParsed` et `base64+zstd`. Les pages Solana courantes mettent surtout en avant `base58/base64/base64+zstd/jsonParsed`, mais Agave conserve la variante `Binary` pour compatibilité. La sous-config `accounts` de `simulateTransaction` rejette spécifiquement `binary/base58`; KSP applique cette contrainte avant I/O tout en conservant les autres encodings supportés.
### Overloads et formes legacy
- `getLeaderSchedule` conserve les formes current epoch, slot, config et slot+config via un enum de requête non ambigu ;
- `getTransaction` conserve la forme moderne et le bare encoding legacy séparé, explicitement deprecated ;
- les configs vides/absentes strictement équivalentes sont canonicalisées sans perte de capacité.
### Cardinalités
Les bornes déterministes connues et testables sans décodage métier sont déjà appliquées avant I/O :
```text
getMultipleAccounts <= 100
getProgramAccounts filters <= 4
memcmp raw bytes <= 128 bytes
getSlotLeaders 1..=5000
getRecentPrioritizationFees <= 128 comptes
getSignaturesForAddress.limit 1..=1000
getSignatureStatuses <= 256 signatures
```
La limite de `simulateTransaction.accounts.addresses` dépend du nombre de comptes de la transaction sérialisée et reste donc une validation runtime : Transport ne décode pas la transaction uniquement pour reproduire cette vérification.
### Résilience
Les 37 descriptors restent `Supported`. Les lectures et la simulation restent `RetrySafe`. `requestAirdrop` et `sendTransaction` restent `WriteSubmission / NeverAfterDispatch`, avec retry autorisé uniquement si Transport prouve `NotDispatched`.
## Remédiations de `pre.008`
Aucune remédiation fonctionnelle n'est requise par cet audit. Ajouter artificiellement des variantes ou des DTOs aurait au contraire créé des doublons sans possibilité RPC supplémentaire.
`pre.008` ajoute donc uniquement :
- cette matrice de preuve durable ;
- une canarie release explicitement nommée `KSP-TRANSPORT-007` couvrant les 37 descriptors `0.2.1``0.2.3` et leurs classes de retry ;
- la synchronisation du plan `0.2.3` ;
- l'incrément technique `0.2.3-pre.8`, car la canarie Rust participe au build/test.
La tranche suivante reste `pre.009`, réservée à la clôture finale, la documentation utilisateur, les canaries/smokes pertinents, la validation complète et le prompt de démarrage `0.2.4`.