v0.2.3-pre.008
This commit is contained in:
@@ -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 :
|
||||
|
||||
@@ -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.
|
||||
|
||||
137
docs/validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md
Normal file
137
docs/validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md
Normal 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`.
|
||||
Reference in New Issue
Block a user