v0.2.9-pre.001-fix.001
This commit is contained in:
15
ROADMAP.md
15
ROADMAP.md
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: ROADMAP.md -->
|
<!-- file: ROADMAP.md -->
|
||||||
<!-- version: 83 -->
|
<!-- version: 84 -->
|
||||||
|
|
||||||
# Roadmap KSP
|
# Roadmap KSP
|
||||||
|
|
||||||
@@ -53,11 +53,14 @@ Le roadmap décrit les objectifs à atteindre et les grandes étapes prévues. U
|
|||||||
- [X] `0.2.6` — `ksp-app-wallet-desk` + `.kspwallet` V2 stables : composition Config/Wallet/HTTP/Logging, lifecycle VIEW/OWNER, balance, administration/import/export, wire binaire V2, APIs multi-version, migration V1 -> V2 explicite et runtime Tauri packagé user-writable validés ; bundles Linux `.deb`/`.rpm`/`.AppImage` produits avant publication. Plan clôturé : `docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md`.
|
- [X] `0.2.6` — `ksp-app-wallet-desk` + `.kspwallet` V2 stables : composition Config/Wallet/HTTP/Logging, lifecycle VIEW/OWNER, balance, administration/import/export, wire binaire V2, APIs multi-version, migration V1 -> V2 explicite et runtime Tauri packagé user-writable validés ; bundles Linux `.deb`/`.rpm`/`.AppImage` produits avant publication. Plan clôturé : `docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md`.
|
||||||
- [X] `0.2.7` — WebSocket Solana standard stable : 9 familles subscribe/unsubscribe typées (18/18 opérations), sessions physiques multiples explicites, subscriptions logiques typées, lifecycle/reconnect/resubscribe/backpressure/shutdown bornés, Config V2, non-régression HTTP 52+14, compliance finale, smoke WebSocket Devnet et audit de dépendances validés ; publication `rel.001` et prompt `0.2.8` prêts.
|
- [X] `0.2.7` — WebSocket Solana standard stable : 9 familles subscribe/unsubscribe typées (18/18 opérations), sessions physiques multiples explicites, subscriptions logiques typées, lifecycle/reconnect/resubscribe/backpressure/shutdown bornés, Config V2, non-régression HTTP 52+14, compliance finale, smoke WebSocket Devnet et audit de dépendances validés ; publication `rel.001` et prompt `0.2.8` prêts.
|
||||||
- [X] `0.2.8` — Helius LaserStream WebSocket stable : façade provider dédiée sur l’actor WebSocket partagé, sept familles standard réutilisées (`account/logs/program/root/signature/slot/slotsUpdates`) + `transactionSubscribe`/`transactionUnsubscribe`, `block/vote` absents, heartbeat Ping 60 s Helius-only, Config V2/secrets redacted, lifecycle adversarial, compliance HTTP 52+14 / Standard WS 18/18 et graphes Cargo finaux validés ; prompt `0.2.9` prêt.
|
- [X] `0.2.8` — Helius LaserStream WebSocket stable : façade provider dédiée sur l’actor WebSocket partagé, sept familles standard réutilisées (`account/logs/program/root/signature/slot/slotsUpdates`) + `transactionSubscribe`/`transactionUnsubscribe`, `block/vote` absents, heartbeat Ping 60 s Helius-only, Config V2/secrets redacted, lifecycle adversarial, compliance HTTP 52+14 / Standard WS 18/18 et graphes Cargo finaux validés ; prompt `0.2.9` prêt.
|
||||||
- [ ] `0.2.9` — Ajouter une première fondation Yellowstone gRPC standard/provider-neutral ; dimensionner la surface exacte à `pre.001` selon la documentation normative actuelle.
|
- [ ] `0.2.9` — Construire le moteur client Yellowstone gRPC partagé, exposer la surface Solana Yellowstone standard et réaliser la première intégration provider PublicNode Mainnet/Testnet sans dupliquer le moteur.
|
||||||
- [ ] `0.2.10` — Introduire `ksp-offchain-transport-lib` avec un premier lecteur de prix, au minimum SOL/USD et SOL/EUR.
|
- [ ] `0.2.10` — Ajouter l’intégration Yellowstone gRPC OrbitFlare sur le moteur/standard acquis, avec auth/capabilities provider auditées et Devnet comme cible gratuite prioritaire.
|
||||||
- [ ] `0.2.11` — Introduire une petite application desk de visualisation/validation des prix offchain, puis intégrer cette capacité dans `ksp-app-wallet-desk` sans dupliquer la logique de récupération/normalisation possédée par le composant spécialisé.
|
- [ ] `0.2.11` — Ajouter l’intégration Helius LaserStream gRPC sur le moteur Yellowstone partagé, sans confondre cette surface avec LaserStream WebSocket.
|
||||||
- [ ] `0.2.12` — Introduire la première surface de `ksp-interface-lib`, comprenant une API wire publique utilisable par les implémentations officielles et externes.
|
- [ ] `0.2.12` — Auditer puis, si l’accès et le delta provider le justifient, ajouter l’intégration eRPC Yellowstone gRPC ; ne pas créer une façade vide si seule l’URL diffère.
|
||||||
- [ ] `0.2.13` — Introduire `ksp-program-api` comme premier contrat Program extensible, sans imposer encore `ksp-program-lib` complet.
|
- [ ] `0.2.13` — Introduire `ksp-offchain-transport-lib` avec un premier lecteur de prix, au minimum SOL/USD et SOL/EUR.
|
||||||
|
- [ ] `0.2.14` — Introduire une petite application desk de visualisation/validation des prix offchain, puis intégrer cette capacité dans `ksp-app-wallet-desk` sans dupliquer la logique de récupération/normalisation possédée par le composant spécialisé.
|
||||||
|
- [ ] `0.2.15` — Introduire la première surface de `ksp-interface-lib`, comprenant une API wire publique utilisable par les implémentations officielles et externes.
|
||||||
|
- [ ] `0.2.16` — Introduire `ksp-program-api` comme premier contrat Program extensible, sans imposer encore `ksp-program-lib` complet.
|
||||||
|
|
||||||
### Règles Transport pour toute la série
|
### Règles Transport pour toute la série
|
||||||
|
|
||||||
|
|||||||
139
deltas/0.2.9/pre.001-fix.001.md
Normal file
139
deltas/0.2.9/pre.001-fix.001.md
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
<!-- file: deltas/0.2.9/pre.001-fix.001.md -->
|
||||||
|
<!-- version: 1 -->
|
||||||
|
|
||||||
|
# Delta `0.2.9-pre.001-fix.001` — sizing/session + architecture provider Yellowstone
|
||||||
|
|
||||||
|
## 1. Base requise
|
||||||
|
|
||||||
|
```text
|
||||||
|
0.2.9-pre.001
|
||||||
|
workspace.package.version = 0.2.9-pre.1
|
||||||
|
```
|
||||||
|
|
||||||
|
Ce correctif est **documentaire uniquement**. Conformément à `VER-ID-008`, il ne modifie pas `workspace.package.version`.
|
||||||
|
|
||||||
|
## 2. Motif du correctif
|
||||||
|
|
||||||
|
La première livraison `pre.001` contenait bien une mention générale du budget `15–20 minutes`, mais elle ne rendait pas assez visible le contrat normatif complet de `PROMPT_STRUCTURE.md` :
|
||||||
|
|
||||||
|
```text
|
||||||
|
une prerelease estimée > 15–20 min doit être scindée
|
||||||
|
une release concrète doit rester ouvrable et clôturable dans une seule session de chat
|
||||||
|
```
|
||||||
|
|
||||||
|
Elle traitait aussi PublicNode et OrbitFlare principalement comme des environnements de smoke derrière un seul backend Yellowstone provider-neutral. Cette représentation ne reprenait pas suffisamment la séparation déjà validée pour WebSocket entre moteur partagé, protocole standard et adaptation provider.
|
||||||
|
|
||||||
|
## 3. Décisions corrigées
|
||||||
|
|
||||||
|
### 3.1 Dimensionnement
|
||||||
|
|
||||||
|
Le forecast `0.2.9` affiche désormais explicitement pour **chaque prerelease** :
|
||||||
|
|
||||||
|
```text
|
||||||
|
budget nominal = 15–20 minutes maximum de travail effectif
|
||||||
|
```
|
||||||
|
|
||||||
|
et le gate global :
|
||||||
|
|
||||||
|
```text
|
||||||
|
0.2.9 complète <= une session de chat
|
||||||
|
```
|
||||||
|
|
||||||
|
Si une tranche dépasse ce budget ou si la clôture de la release dans la session devient incertaine, le scope est scindé avant implémentation lourde supplémentaire.
|
||||||
|
|
||||||
|
Le forecast est recalibré à **11 prereleases prévues** avant `rel.001`, soit environ `165–220 minutes` de travail effectif nominal hors temps d'attente des commandes.
|
||||||
|
|
||||||
|
### 3.2 Architecture Yellowstone
|
||||||
|
|
||||||
|
`0.2.9` distingue désormais trois niveaux dans `ksp-onchain-transport-lib` :
|
||||||
|
|
||||||
|
```text
|
||||||
|
N1 moteur client Yellowstone gRPC partagé
|
||||||
|
N2 façade Solana Yellowstone standard
|
||||||
|
N3 première intégration provider PublicNode / Allnodes-backed
|
||||||
|
```
|
||||||
|
|
||||||
|
Le moteur reste Yellowstone-specific ; KSP ne crée pas une abstraction gRPC universelle ni un serveur/plugin Geyser.
|
||||||
|
|
||||||
|
La règle provider est :
|
||||||
|
|
||||||
|
```text
|
||||||
|
aucun second actor/channel/stream par provider
|
||||||
|
aucune façade spécialisée vide
|
||||||
|
façade/type provider public uniquement si une différence réelle de contrat le justifie
|
||||||
|
```
|
||||||
|
|
||||||
|
PublicNode devient donc la **première intégration concrète** de `0.2.9`, avec Mainnet et Testnet comme cibles live opt-in. Il réutilise le moteur et le wire standard.
|
||||||
|
|
||||||
|
### 3.3 Releases providers suivantes
|
||||||
|
|
||||||
|
La séquence fonctionnelle est recalibrée :
|
||||||
|
|
||||||
|
```text
|
||||||
|
0.2.9 moteur Yellowstone + Solana standard + PublicNode
|
||||||
|
0.2.10 OrbitFlare Yellowstone gRPC
|
||||||
|
0.2.11 Helius LaserStream gRPC
|
||||||
|
0.2.12 eRPC Yellowstone gRPC, conditionnel après réaudit accès/capabilities
|
||||||
|
0.2.13 off-chain price transport
|
||||||
|
0.2.14 Price Desk + intégration prix Wallet Desk
|
||||||
|
0.2.15 interface/wire foundation
|
||||||
|
0.2.16 program-api foundation
|
||||||
|
```
|
||||||
|
|
||||||
|
Chaque future release provider réutilise `0.2.9`. Si le gate d'un provider montre qu'il ne diffère que par une URL interchangeable, il ne doit pas provoquer une façade artificielle ; son scope peut être réduit/fusionné avant implémentation.
|
||||||
|
|
||||||
|
### 3.4 Rust/toolchain
|
||||||
|
|
||||||
|
Les numéros de versions Rust upstream/MSRV ne sont plus suivis comme information de planification ordinaire.
|
||||||
|
|
||||||
|
KSP utilise la **Rust stable courante de l'opérateur**. Le seul gate utile est que les dépendances sélectionnées compilent avec cette stable. Un minimum Rust d'une dépendance n'est documenté que s'il devient un blocage réel.
|
||||||
|
|
||||||
|
## 4. Fichiers modifiés
|
||||||
|
|
||||||
|
```text
|
||||||
|
docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md
|
||||||
|
docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md
|
||||||
|
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
|
||||||
|
ROADMAP.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. Fichier ajouté
|
||||||
|
|
||||||
|
```text
|
||||||
|
deltas/0.2.9/pre.001-fix.001.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. Fichiers non modifiés intentionnellement
|
||||||
|
|
||||||
|
```text
|
||||||
|
Cargo.toml
|
||||||
|
prompts/014-V0_2_9_START_PROMPT.md
|
||||||
|
crates/**
|
||||||
|
config/**
|
||||||
|
.env.example
|
||||||
|
```
|
||||||
|
|
||||||
|
Le prompt `014` reste l'autorité historique ayant ouvert `pre.001`; le présent fix trace le recalibrage résultant du gate et devient l'état de planification courant.
|
||||||
|
|
||||||
|
## 7. Validation
|
||||||
|
|
||||||
|
À exécuter pour le correctif documentaire :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 scripts/audit_rust_workspace_rules.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Aucun `cargo check/clippy/test` supplémentaire n'est requis par le contenu du fix puisqu'aucun artefact code/build/runtime/config n'est modifié ; la baseline technique reste celle enregistrée par `pre.001`.
|
||||||
|
|
||||||
|
## 8. État de sortie
|
||||||
|
|
||||||
|
```text
|
||||||
|
forecast visible et conforme à PROMPT_STRUCTURE.md
|
||||||
|
15–20 min max par prerelease explicités
|
||||||
|
release <= une session explicitée
|
||||||
|
moteur Yellowstone séparé de la façade standard
|
||||||
|
PublicNode promu de smoke à première intégration provider
|
||||||
|
OrbitFlare/Helius/eRPC reportés dans des releases dédiées
|
||||||
|
séquence prix/interface/program décalée en conséquence
|
||||||
|
aucun changement runtime/dependency
|
||||||
|
```
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md -->
|
<!-- file: docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md -->
|
||||||
<!-- version: 86 -->
|
<!-- version: 87 -->
|
||||||
|
|
||||||
# Séquence des releases fonctionnelles KSP
|
# Séquence des releases fonctionnelles KSP
|
||||||
|
|
||||||
@@ -363,11 +363,14 @@ Par défaut :
|
|||||||
0.2.6 Wallet Desk
|
0.2.6 Wallet Desk
|
||||||
0.2.7 standard Solana WebSocket
|
0.2.7 standard Solana WebSocket
|
||||||
0.2.8 Helius LaserStream WebSocket
|
0.2.8 Helius LaserStream WebSocket
|
||||||
0.2.9 Yellowstone gRPC standard foundation
|
0.2.9 Yellowstone gRPC engine + Solana standard + PublicNode
|
||||||
0.2.10 off-chain price transport
|
0.2.10 OrbitFlare Yellowstone gRPC
|
||||||
0.2.11 price visualization desk + intégration prix dans Wallet Desk
|
0.2.11 Helius LaserStream gRPC
|
||||||
0.2.12 interface/wire foundation
|
0.2.12 eRPC Yellowstone gRPC (conditionnel après réaudit accès/capabilities)
|
||||||
0.2.13 program-api foundation
|
0.2.13 off-chain price transport
|
||||||
|
0.2.14 price visualization desk + intégration prix dans Wallet Desk
|
||||||
|
0.2.15 interface/wire foundation
|
||||||
|
0.2.16 program-api foundation
|
||||||
```
|
```
|
||||||
|
|
||||||
`0.2.1-pre.001` a appliqué le gate de sizing et refusé le scope HTTP monolithique initial : l'inventaire du 2026-08-17 contient 52 méthodes courantes et 14 méthodes Deprecated historiques. Ce premier delta avait réparti la couverture typée sur `0.2.1`–`0.2.6`. `0.2.1-pre.001-fix.001` recalibre ensuite les 48 méthodes restantes sur trois releases complémentaires `0.2.2`–`0.2.4`, soit trois sessions nominales au maximum si chaque release utilise sa session complète. Si une release se clôt plus vite que prévu, la même session peut enchaîner la suivante après clôture complète de la précédente et nouveau gate de sizing positif. Un Wallet Desk utile doit pouvoir lire le solde du wallet : `getBalance` fait donc partie des quatre canaris de la foundation `0.2.1`, avant Wallet. Les transports live arrivent ensuite ; Interface/Program restent préparés avant les couches de données décodées.
|
`0.2.1-pre.001` a appliqué le gate de sizing et refusé le scope HTTP monolithique initial : l'inventaire du 2026-08-17 contient 52 méthodes courantes et 14 méthodes Deprecated historiques. Ce premier delta avait réparti la couverture typée sur `0.2.1`–`0.2.6`. `0.2.1-pre.001-fix.001` recalibre ensuite les 48 méthodes restantes sur trois releases complémentaires `0.2.2`–`0.2.4`, soit trois sessions nominales au maximum si chaque release utilise sa session complète. Si une release se clôt plus vite que prévu, la même session peut enchaîner la suivante après clôture complète de la précédente et nouveau gate de sizing positif. Un Wallet Desk utile doit pouvoir lire le solde du wallet : `getBalance` fait donc partie des quatre canaris de la foundation `0.2.1`, avant Wallet. Les transports live arrivent ensuite ; Interface/Program restent préparés avant les couches de données décodées.
|
||||||
@@ -471,31 +474,39 @@ Le réaudit final Helius du 23 août 2026 retient `helius_laserstream` comme pro
|
|||||||
|
|
||||||
`pre.010` ferme README/USAGE, la stratégie smoke live architecture-safe et les graphes Cargo finaux ; `pre.011` ferme la candidate documentaire et prépare [`../../prompts/014-V0_2_9_START_PROMPT.md`](../../prompts/014-V0_2_9_START_PROMPT.md). `0.2.8-rel.001` publie ensuite cette surface stable sans nouvelle capacité runtime. Aucun SDK Helius, aucune dépendance gRPC et aucun replay historique WebSocket ne sont introduits.
|
`pre.010` ferme README/USAGE, la stratégie smoke live architecture-safe et les graphes Cargo finaux ; `pre.011` ferme la candidate documentaire et prépare [`../../prompts/014-V0_2_9_START_PROMPT.md`](../../prompts/014-V0_2_9_START_PROMPT.md). `0.2.8-rel.001` publie ensuite cette surface stable sans nouvelle capacité runtime. Aucun SDK Helius, aucune dépendance gRPC et aucun replay historique WebSocket ne sont introduits.
|
||||||
|
|
||||||
### `0.2.9` — Yellowstone gRPC standard
|
### `0.2.9` — Yellowstone gRPC engine + standard Solana + PublicNode
|
||||||
|
|
||||||
Mission active : introduire un backend Yellowstone standard/provider-neutral dans `ksp-onchain-transport-lib`, distinct de HTTP et WebSocket. Le gate `pre.001` est conservé dans [`016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md`](016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md) et sa matrice dans [`../validation/012-V0_2_9_YELLOWSTONE_GRPC.md`](../validation/012-V0_2_9_YELLOWSTONE_GRPC.md).
|
Mission : construire un moteur client Yellowstone gRPC partagé dans `ksp-onchain-transport-lib`, exposer la façade Solana Yellowstone standard puis valider une première intégration concrète PublicNode Mainnet/Testnet sans recopier le moteur.
|
||||||
|
|
||||||
Le réaudit du 23 août 2026 corrige le snapshot du prompt : la release GitHub courante observée est `v15.1.2+solana.4.2.0`, tandis que les crates publiées restent `yellowstone-grpc-client 13.3.0` et `yellowstone-grpc-proto 12.6.0`. `0.2.9` retient la stratégie `yellowstone-grpc-proto` Apache-2.0 + client/lifecycle KSP autour de Tonic, et couvre `Subscribe`, les sept RPC unary standard retenus, les filtres Cuckoo/token actuels et les neuf variantes `SubscribeUpdate`. `SubscribeDeshred` reste hors scope comme extension Triton/pré-exécution.
|
Le `pre.001` est un gate de sizing : chaque prerelease vise 15–20 minutes de travail effectif et la release complète doit rester clôturable dans une seule session. Si cette clôture devient incertaine, `0.2.9` est scindée avant implémentation lourde supplémentaire.
|
||||||
|
|
||||||
La Config cible une V3 séparant `grpc_endpoints` de HTTP/WS tout en conservant V1/V2 backward-readable. PublicNode/Allnodes-backed entre dans la release comme premier environnement live standard gratuit Mainnet/Testnet ; OrbitFlare suit comme smoke Devnet gratuit authentifié. Aucun adapter public provider-specific n'est créé pour eux. Tatum reste un fallback opérateur Mainnet à quota lifetime ; les offres gRPC payantes Helius/Shyft/Alchemy/NodeFlare ne deviennent pas des dépendances de validation.
|
La séparation cible reprend le modèle WebSocket : moteur physique partagé -> protocole standard -> adaptations provider. PublicNode est la première intégration provider ; une façade spécialisée n'est créée que si une différence réelle de capabilities/wire/lifecycle le justifie.
|
||||||
|
|
||||||
Forecast recalibré : `pre.002` deps/settings, `pre.003` TLS/metadata+unary, `pre.004` Subscribe commun, `pre.005` accounts/slots, `pre.006` transactions, `pre.007` blocks/meta/entry, `pre.008` lifecycle/backpressure, `pre.009` reconnect/replay, `pre.010` Config V3, `pre.011` live/compliance, `pre.012` clôture candidate/prompt suivant. Chaque tranche reste nominalement 15–20 minutes et peut être scindée si le wire transaction/block, le replay ou le graphe de dépendances l'exige.
|
### `0.2.10`–`0.2.12` — providers Yellowstone
|
||||||
|
|
||||||
### `0.2.10` / `0.2.11` — Off-chain price + app
|
```text
|
||||||
|
0.2.10 OrbitFlare Yellowstone gRPC
|
||||||
|
0.2.11 Helius LaserStream gRPC
|
||||||
|
0.2.12 eRPC Yellowstone gRPC, conditionné à un accès exploitable et à un delta provider réel
|
||||||
|
```
|
||||||
|
|
||||||
`0.2.10` introduit `ksp-offchain-transport-lib` avec au minimum SOL/USD et SOL/EUR via une abstraction indépendante du premier provider.
|
Chaque release réutilise le moteur et le standard de `0.2.9`. Un provider qui ne diffère finalement que par son URL/configuration ne justifie ni second actor ni façade vide ; son gate peut réduire/fusionner le scope avant implémentation.
|
||||||
|
|
||||||
`0.2.11` ajoute une petite application desk de visualisation/validation. Après stabilisation de cette application spécialisée, la même release doit intégrer la capacité de prix offchain dans `ksp-app-wallet-desk` sans dupliquer la récupération/normalisation appartenant au composant spécialisé.
|
### `0.2.13` / `0.2.14` — Off-chain price + app
|
||||||
|
|
||||||
|
`0.2.13` introduit `ksp-offchain-transport-lib` avec au minimum SOL/USD et SOL/EUR via une abstraction indépendante du premier provider.
|
||||||
|
|
||||||
|
`0.2.14` ajoute une petite application desk de visualisation/validation. Après stabilisation de cette application spécialisée, la même release doit intégrer la capacité de prix offchain dans `ksp-app-wallet-desk` sans dupliquer la récupération/normalisation appartenant au composant spécialisé.
|
||||||
|
|
||||||
Metadata HTTP/IPFS/Arweave viendra au premier besoin Metadata réel.
|
Metadata HTTP/IPFS/Arweave viendra au premier besoin Metadata réel.
|
||||||
|
|
||||||
### `0.2.12` — Interface foundation
|
### `0.2.15` — Interface foundation
|
||||||
|
|
||||||
`ksp-interface-lib` devient la façade wire officielle et expose une API publique wire utilisable par les implementations officielles et externes.
|
`ksp-interface-lib` devient la façade wire officielle et expose une API publique wire utilisable par les implementations officielles et externes.
|
||||||
|
|
||||||
Aucune `ksp-interface-api` séparée n'est retenue pour l'instant.
|
Aucune `ksp-interface-api` séparée n'est retenue pour l'instant.
|
||||||
|
|
||||||
### `0.2.13` — Program API foundation
|
### `0.2.16` — Program API foundation
|
||||||
|
|
||||||
Introduire `ksp-program-api`, sans suffixe `-lib`, comme contrat d'extension Program.
|
Introduire `ksp-program-api`, sans suffixe `-lib`, comme contrat d'extension Program.
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<!-- file: docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md -->
|
<!-- file: docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md -->
|
||||||
<!-- version: 1 -->
|
<!-- version: 3 -->
|
||||||
|
|
||||||
# Plan `0.2.9` — Yellowstone gRPC standard/provider-neutral
|
# Plan `0.2.9` — moteur Yellowstone gRPC + standard Solana + PublicNode
|
||||||
|
|
||||||
> **Statut : `0.2.9-pre.001` — gate audit/sizing positif. Aucune implémentation gRPC lourde ni dépendance Yellowstone/Tonic n'est introduite dans cette tranche. La stratégie cible est `yellowstone-grpc-proto` publié + client/lifecycle KSP autour de Tonic, avec PublicNode comme premier smoke live Mainnet/Testnet et OrbitFlare comme second smoke Devnet authentifié.**
|
> **Statut : `0.2.9-pre.001-fix.001` — gate audit/sizing corrigé. `0.2.9` est bornée à un moteur client Yellowstone partagé, une façade Solana Yellowstone standard et une première intégration concrète PublicNode. Les autres providers Yellowstone sont sortis de la release et planifiés séparément. Chaque prerelease vise 15–20 minutes de travail effectif et la release complète doit rester clôturable dans une seule session de chat.**
|
||||||
|
|
||||||
## 1. Objet, base et état d'ouverture
|
## 1. Objet, base et état d'ouverture
|
||||||
|
|
||||||
@@ -45,30 +45,32 @@ Transport -> Config interdit
|
|||||||
|
|
||||||
Le gate est **positif avec scope borné**.
|
Le gate est **positif avec scope borné**.
|
||||||
|
|
||||||
`0.2.9` peut raisonnablement porter :
|
`0.2.9` peut raisonnablement porter **trois niveaux distincts dans la même crate Transport** :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
backend Yellowstone gRPC séparé
|
N1 moteur client Yellowstone gRPC partagé
|
||||||
settings/runtime bounds gRPC
|
channel/TLS/metadata, stream bidi, bounds, backpressure, shutdown, reconnect/replay observables
|
||||||
TLS + metadata générique et redacted
|
|
||||||
7 RPC unary du service Geyser courant hors SubscribeDeshred
|
N2 façade protocolaire Solana Yellowstone standard
|
||||||
Subscribe bidirectionnel standard
|
7 unary retenus + Subscribe standard + filters/updates typed provider-neutral
|
||||||
7 familles de filtres top-level
|
|
||||||
9 variantes SubscribeUpdate
|
N3 première intégration provider : PublicNode / Allnodes-backed
|
||||||
DTOs KSP provider-neutral
|
Mainnet + Testnet, capabilities/profile/config + smokes live opt-in
|
||||||
backpressure/half-close/shutdown bornés
|
sans duplication du moteur ni du wire standard
|
||||||
reconnect/resubscribe KSP-owned
|
|
||||||
from_slot + SubscribeReplayInfo avec observabilité gap/duplicate/equivocation
|
|
||||||
Config V3 dédiée gRPC, tout en lisant V1/V2
|
|
||||||
smokes live opt-in PublicNode puis OrbitFlare
|
|
||||||
compliance HTTP/WS/Helius non régressée
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Sont explicitement exclus :
|
Le moteur est **Yellowstone-specific**, pas une abstraction gRPC universelle. Le serveur/plugin Geyser reste hors de KSP ; KSP implémente le client du protocole Yellowstone exposé par les providers.
|
||||||
|
|
||||||
|
La première intégration PublicNode peut rester volontairement mince si le provider n'ajoute aucun wire ou lifecycle propriétaire : l'objectif est de matérialiser la frontière provider, les capabilities et la validation live, pas de créer artificiellement un second actor/session. Un type/facade provider-specific public n'est justifié que si PublicNode impose une différence réelle de contrat.
|
||||||
|
|
||||||
|
Sont explicitement exclus de `0.2.9` :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
SubscribeDeshred et pré-exécution/deshred
|
SubscribeDeshred et pré-exécution/deshred
|
||||||
adapters publics PublicNode/Allnodes/OrbitFlare/Tatum/Helius/Triton/etc.
|
OrbitFlare provider integration
|
||||||
|
Helius LaserStream gRPC provider integration
|
||||||
|
eRPC provider integration
|
||||||
|
Tatum/Triton/Chainstack/Shyft/autres providers
|
||||||
client autoreconnect upstream comme contrat public KSP
|
client autoreconnect upstream comme contrat public KSP
|
||||||
pool/scheduler automatique complexe de sessions gRPC
|
pool/scheduler automatique complexe de sessions gRPC
|
||||||
exactly-once / lossless / ordre global garanti
|
exactly-once / lossless / ordre global garanti
|
||||||
@@ -76,7 +78,7 @@ serveur Geyser/plugin validator
|
|||||||
Store/workers/backfill historique
|
Store/workers/backfill historique
|
||||||
```
|
```
|
||||||
|
|
||||||
La présence de PublicNode et OrbitFlare **ne nécessite donc pas une couche provider-specific publique**. Ils entrent dans la release comme environnements d'interopérabilité et profils Config derrière le même backend Yellowstone standard.
|
Les providers suivants sont **des releases ultérieures**, comme Helius LaserStream WebSocket l'a été après le moteur WebSocket standard. Ils réutiliseront N1/N2 et n'ajouteront une façade spécialisée que lorsqu'une différence d'authentification, de capabilities, de wire, de keepalive, de replay ou de lifecycle le nécessite.
|
||||||
|
|
||||||
## 3. Sources internes relues
|
## 3. Sources internes relues
|
||||||
|
|
||||||
@@ -282,36 +284,35 @@ https://github.com/rpcpool/yellowstone-grpc/blob/master/LICENSING.md
|
|||||||
https://docs.rs/crate/yellowstone-grpc-proto/latest
|
https://docs.rs/crate/yellowstone-grpc-proto/latest
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5.4 MSRV / build
|
### 5.4 Compatibilité toolchain / build
|
||||||
|
|
||||||
Observations pertinentes :
|
KSP suit la **Rust stable courante de l'opérateur** et ne documente pas de numéro Rust upstream comme objectif de projet. Le seul gate utile est opérationnel : les dépendances finalement retenues doivent compiler avec la stable courante utilisée par le workspace.
|
||||||
|
|
||||||
|
Éléments build à vérifier en `pre.002` :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
plugin release 15.1.2 Rust 1.96.1
|
proto crate crate publiée/pré-générée ; pas de vendoring de .proto KSP
|
||||||
tonic 0.14.6 rust-version 1.88
|
client KSP autour de Tonic features client/TLS minimales
|
||||||
prost 0.14.x MSRV publié actuellement 1.85
|
protoc/build.rs aucun outil système ajouté sauf besoin démontré
|
||||||
proto crate 12.6.0 génération incluse dans la crate publiée
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Le build de `yellowstone-grpc-proto` utilise une chaîne de génération avec `protoc` vendored côté crate publiée ; KSP n'a donc pas à ajouter son propre `build.rs` ni à exiger un `protoc` système pour la stratégie B.
|
Un minimum Rust déclaré par une dépendance n'est enregistré que s'il devient un **blocage réel** lors de la compilation ; il n'est pas suivi comme métrique de release.
|
||||||
|
|
||||||
Le MSRV du **plugin Geyser** n'est pas le MSRV automatique du client KSP. Le gate technique final reste la toolchain réellement utilisée par le workspace et la compilation des dépendances choisies en `pre.002`.
|
|
||||||
|
|
||||||
## 6. Matrice du service `Geyser` courant
|
## 6. Matrice du service `Geyser` courant
|
||||||
|
|
||||||
Le proto publié `yellowstone-grpc-proto 12.6.0` et le proto master exposent le même inventaire de service observé pendant le gate :
|
Le proto publié `yellowstone-grpc-proto 12.6.0` et le proto master exposent le même inventaire de service observé pendant le gate :
|
||||||
|
|
||||||
| RPC | Forme | Statut | Cible `0.2.9` | Décision |
|
| RPC | Forme | Statut | Cible `0.2.9` | Décision |
|
||||||
| --- | --- | --- | --- | --- |
|
|-----------------------|-------------|----------------------------------------------------------------|---------------|----------------------------------------------|
|
||||||
| `Subscribe` | bidi stream | standard Yellowstone | **oui** | fondation principale |
|
| `Subscribe` | bidi stream | standard Yellowstone | **oui** | fondation principale |
|
||||||
| `SubscribeDeshred` | bidi stream | présent dans proto, trajectoire Triton extension/pré-exécution | **non** | report explicite |
|
| `SubscribeDeshred` | bidi stream | présent dans proto, trajectoire Triton extension/pré-exécution | **non** | report explicite |
|
||||||
| `SubscribeReplayInfo` | unary | standard | **oui** | information de replay, pas garantie lossless |
|
| `SubscribeReplayInfo` | unary | standard | **oui** | information de replay, pas garantie lossless |
|
||||||
| `Ping` | unary | standard | **oui** | canari/liveness unary |
|
| `Ping` | unary | standard | **oui** | canari/liveness unary |
|
||||||
| `GetLatestBlockhash` | unary | standard | **oui** | canari typed |
|
| `GetLatestBlockhash` | unary | standard | **oui** | canari typed |
|
||||||
| `GetBlockHeight` | unary | standard | **oui** | canari typed |
|
| `GetBlockHeight` | unary | standard | **oui** | canari typed |
|
||||||
| `GetSlot` | unary | standard | **oui** | canari typed |
|
| `GetSlot` | unary | standard | **oui** | canari typed |
|
||||||
| `IsBlockhashValid` | unary | standard | **oui** | canari typed |
|
| `IsBlockhashValid` | unary | standard | **oui** | canari typed |
|
||||||
| `GetVersion` | unary | standard | **oui** | canari typed |
|
| `GetVersion` | unary | standard | **oui** | canari typed |
|
||||||
|
|
||||||
`SubscribeDeshred` est techniquement publié dans le proto, mais le changelog upstream le rattache explicitement aux **Triton Extension Patches** et décrit la réception de transactions avant exécution. Il reste donc hors fondation provider-neutral `0.2.9`.
|
`SubscribeDeshred` est techniquement publié dans le proto, mais le changelog upstream le rattache explicitement aux **Triton Extension Patches** et décrit la réception de transactions avant exécution. Il reste donc hors fondation provider-neutral `0.2.9`.
|
||||||
|
|
||||||
@@ -319,19 +320,19 @@ Le proto publié `yellowstone-grpc-proto 12.6.0` et le proto master exposent le
|
|||||||
|
|
||||||
Surface standard retenue intégralement :
|
Surface standard retenue intégralement :
|
||||||
|
|
||||||
| Champ | Type / sémantique | `0.2.9` |
|
| Champ | Type / sémantique | `0.2.9` |
|
||||||
| --- | --- | --- |
|
|-----------------------|-------------------------------------------------|--------------------------|
|
||||||
| `accounts` | map nom -> `SubscribeRequestFilterAccounts` | oui |
|
| `accounts` | map nom -> `SubscribeRequestFilterAccounts` | oui |
|
||||||
| `slots` | map nom -> `SubscribeRequestFilterSlots` | oui |
|
| `slots` | map nom -> `SubscribeRequestFilterSlots` | oui |
|
||||||
| `transactions` | map nom -> `SubscribeRequestFilterTransactions` | oui |
|
| `transactions` | map nom -> `SubscribeRequestFilterTransactions` | oui |
|
||||||
| `transactions_status` | même famille de filtre transaction | oui |
|
| `transactions_status` | même famille de filtre transaction | oui |
|
||||||
| `blocks` | map nom -> `SubscribeRequestFilterBlocks` | oui |
|
| `blocks` | map nom -> `SubscribeRequestFilterBlocks` | oui |
|
||||||
| `blocks_meta` | map nom -> filtre vide | oui |
|
| `blocks_meta` | map nom -> filtre vide | oui |
|
||||||
| `entry` | map nom -> filtre vide | oui |
|
| `entry` | map nom -> filtre vide | oui |
|
||||||
| `commitment` | optional Processed/Confirmed/Finalized | oui |
|
| `commitment` | optional Processed/Confirmed/Finalized | oui |
|
||||||
| `accounts_data_slice` | repeated offset/length | oui |
|
| `accounts_data_slice` | repeated offset/length | oui |
|
||||||
| `ping` | optional request ping/id | oui |
|
| `ping` | optional request ping/id | oui |
|
||||||
| `from_slot` | optional u64 | oui, sémantique prudente |
|
| `from_slot` | optional u64 | oui, sémantique prudente |
|
||||||
|
|
||||||
### 7.1 Accounts
|
### 7.1 Accounts
|
||||||
|
|
||||||
@@ -417,17 +418,17 @@ KSP appliquera des bornes déterministes avant I/O sur les noms, cardinalités,
|
|||||||
|
|
||||||
Le `oneof update_oneof` standard contient exactement neuf variantes observées :
|
Le `oneof update_oneof` standard contient exactement neuf variantes observées :
|
||||||
|
|
||||||
| Variante | Champs structurants à préserver |
|
| Variante | Champs structurants à préserver |
|
||||||
| --- | --- |
|
|----------------------|-----------------------------------------------------------------------------|
|
||||||
| `account` | account info + slot + `is_startup` |
|
| `account` | account info + slot + `is_startup` |
|
||||||
| `slot` | slot + optional parent + status + optional dead_error |
|
| `slot` | slot + optional parent + status + optional dead_error |
|
||||||
| `transaction` | signature/is_vote/transaction/meta/index + slot |
|
| `transaction` | signature/is_vote/transaction/meta/index + slot |
|
||||||
| `transaction_status` | slot/signature/is_vote/index/error |
|
| `transaction_status` | slot/signature/is_vote/index/error |
|
||||||
| `block` | slot/hash/rewards/time/height/parent/counts + transactions/accounts/entries |
|
| `block` | slot/hash/rewards/time/height/parent/counts + transactions/accounts/entries |
|
||||||
| `ping` | marker server ping |
|
| `ping` | marker server ping |
|
||||||
| `pong` | id |
|
| `pong` | id |
|
||||||
| `block_meta` | block metadata/counts sans tableaux complets |
|
| `block_meta` | block metadata/counts sans tableaux complets |
|
||||||
| `entry` | slot/index/num_hashes/hash/transaction counts/index |
|
| `entry` | slot/index/num_hashes/hash/transaction counts/index |
|
||||||
|
|
||||||
Le top-level contient aussi :
|
Le top-level contient aussi :
|
||||||
|
|
||||||
@@ -440,15 +441,15 @@ Les types imbriqués `solana-storage.proto` nécessaires aux transactions/blocs
|
|||||||
|
|
||||||
## 9. RPCs unary retenus
|
## 9. RPCs unary retenus
|
||||||
|
|
||||||
| RPC | Request | Response | Notes |
|
| RPC | Request | Response | Notes |
|
||||||
| --- | --- | --- | --- |
|
|-----------------------|---------------------------|------------------------------------------|----------------------------------------|
|
||||||
| `SubscribeReplayInfo` | vide | `first_available?` | information de disponibilité seulement |
|
| `SubscribeReplayInfo` | vide | `first_available?` | information de disponibilité seulement |
|
||||||
| `Ping` | `count` | `count` | exact echo attendu |
|
| `Ping` | `count` | `count` | exact echo attendu |
|
||||||
| `GetLatestBlockhash` | `commitment?` | slot, blockhash, last_valid_block_height | typed |
|
| `GetLatestBlockhash` | `commitment?` | slot, blockhash, last_valid_block_height | typed |
|
||||||
| `GetBlockHeight` | `commitment?` | block_height | typed |
|
| `GetBlockHeight` | `commitment?` | block_height | typed |
|
||||||
| `GetSlot` | `commitment?` | slot | typed |
|
| `GetSlot` | `commitment?` | slot | typed |
|
||||||
| `IsBlockhashValid` | blockhash + `commitment?` | slot + valid | typed |
|
| `IsBlockhashValid` | blockhash + `commitment?` | slot + valid | typed |
|
||||||
| `GetVersion` | vide | version | opaque string bornée |
|
| `GetVersion` | vide | version | opaque string bornée |
|
||||||
|
|
||||||
Les unary ne remplacent pas les méthodes HTTP équivalentes : ce sont des capacités du backend Yellowstone et restent séparées des wrappers JSON-RPC HTTP existants.
|
Les unary ne remplacent pas les méthodes HTTP équivalentes : ce sont des capacités du backend Yellowstone et restent séparées des wrappers JSON-RPC HTTP existants.
|
||||||
|
|
||||||
@@ -539,14 +540,22 @@ Inconvénients : copie/licence/synchronisation du proto, `build.rs`, protoc et d
|
|||||||
|
|
||||||
## 12. Architecture publique cible
|
## 12. Architecture publique cible
|
||||||
|
|
||||||
### 12.1 Séparation des backends
|
### 12.1 Séparation des backends et des niveaux Yellowstone
|
||||||
|
|
||||||
```text
|
```text
|
||||||
HTTP TransportSettings / EndpointClient / pool HTTP existants
|
HTTP TransportSettings / EndpointClient / pool HTTP existants
|
||||||
WebSocket Ws* existants
|
WebSocket engine WsSession actor partagé
|
||||||
Yellowstone gRPC nouveaux Grpc*/Yellowstone* dédiés
|
Solana standard WS SolanaStandardWsSession
|
||||||
|
Helius LaserStream WS HeliusLaserStreamWsSession
|
||||||
|
|
||||||
|
Yellowstone gRPC engine nouveau runtime/session physique partagé
|
||||||
|
Solana Yellowstone standard façade typed standard sur ce moteur
|
||||||
|
PublicNode Yellowstone première intégration provider sur standard
|
||||||
|
future providers adapters/facades séparés seulement si différence réelle
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Cette structure reprend le principe validé par `0.2.7`/`0.2.8` : **le moteur physique n'est jamais recopié par provider**.
|
||||||
|
|
||||||
Interdictions :
|
Interdictions :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
@@ -554,6 +563,8 @@ pas de WsProtocolKind pour gRPC
|
|||||||
pas de WsEndpointSettings réutilisé
|
pas de WsEndpointSettings réutilisé
|
||||||
pas de WsSession déguisée
|
pas de WsSession déguisée
|
||||||
pas de client Tonic brut réexporté
|
pas de client Tonic brut réexporté
|
||||||
|
pas de second actor Yellowstone par provider
|
||||||
|
pas de façade provider vide uniquement pour renommer le même protocole
|
||||||
```
|
```
|
||||||
|
|
||||||
### 12.2 Noms et ownership
|
### 12.2 Noms et ownership
|
||||||
@@ -561,17 +572,26 @@ pas de client Tonic brut réexporté
|
|||||||
Noms cibles, affinables sans casser le principe :
|
Noms cibles, affinables sans casser le principe :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
|
# N1 — moteur Yellowstone
|
||||||
YellowstoneGrpcEndpointUrl
|
YellowstoneGrpcEndpointUrl
|
||||||
YellowstoneGrpcEndpointSettings
|
YellowstoneGrpcEndpointSettings
|
||||||
YellowstoneGrpcSessionSettings
|
YellowstoneGrpcSessionSettings
|
||||||
YellowstoneGrpcTransportSettings
|
YellowstoneGrpcTransportSettings
|
||||||
YellowstoneGrpcSession
|
YellowstoneGrpcSession
|
||||||
YellowstoneSubscriptionHandle<T>
|
YellowstoneSubscriptionHandle<T>
|
||||||
|
|
||||||
|
# N2 — standard Solana Yellowstone
|
||||||
|
SolanaYellowstoneGrpcSession # façade candidate, si le gate API confirme ce nom
|
||||||
YellowstoneSubscribeRequest / filters KSP
|
YellowstoneSubscribeRequest / filters KSP
|
||||||
YellowstoneUpdate / typed update projections
|
YellowstoneUpdate / typed update projections
|
||||||
|
|
||||||
|
# N3 — provider
|
||||||
|
provider descriptor/capabilities ouverts
|
||||||
|
PublicNode integration/profile/canaries
|
||||||
|
PublicNode-specific facade seulement si une différence réelle le justifie
|
||||||
```
|
```
|
||||||
|
|
||||||
Le backend wire Tonic/Prost reste privé. Tous les types publics nécessaires sont réexportés au crate root conformément aux règles KSP.
|
Le backend wire Tonic/Prost reste privé. Tous les types publics nécessaires sont réexportés au crate root conformément aux règles KSP. Le provider et le protocole restent deux axes distincts : `PublicNode` décrit **où/comment** on exécute Yellowstone standard, pas un nouveau protocole.
|
||||||
|
|
||||||
### 12.3 Metadata/auth provider-neutral
|
### 12.3 Metadata/auth provider-neutral
|
||||||
|
|
||||||
@@ -669,10 +689,13 @@ PublicNode est un service soutenu/opéré par Allnodes dans l'écosystème actue
|
|||||||
Décision `0.2.9` :
|
Décision `0.2.9` :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
pas de PublicNodeGrpcSession publique
|
PublicNode = première intégration provider concrète du moteur Yellowstone
|
||||||
pas de AllnodesGrpcSession publique
|
PublicNode Mainnet = premier environnement live opt-in sans secret
|
||||||
PublicNode Mainnet = premier smoke live opt-in sans secret
|
PublicNode Testnet = second cluster du même provider si endpoint exact confirmé live
|
||||||
PublicNode Testnet = second cluster du même smoke/provider si endpoint exact confirmé live
|
provider/capabilities/profile explicitement représentés
|
||||||
|
aucun second moteur/actor/session physique
|
||||||
|
façade PublicNode spécialisée seulement si une différence réelle est démontrée
|
||||||
|
Allnodes n'est pas modélisé comme un protocole distinct
|
||||||
```
|
```
|
||||||
|
|
||||||
La page officielle confirme l'existence de Testnet GRPC, mais le hostname exact n'est pas figé dans ce gate tant qu'il n'a pas été confirmé depuis la surface officielle/live. Il sera vérifié avant ajout d'un profil committé.
|
La page officielle confirme l'existence de Testnet GRPC, mais le hostname exact n'est pas figé dans ce gate tant qu'il n'a pas été confirmé depuis la surface officielle/live. Il sera vérifié avant ajout d'un profil committé.
|
||||||
@@ -766,7 +789,9 @@ Hiérarchie cible :
|
|||||||
```text
|
```text
|
||||||
1. Transport pur programmatic -> PublicNode Mainnet, sans secret
|
1. Transport pur programmatic -> PublicNode Mainnet, sans secret
|
||||||
2. Transport pur programmatic -> PublicNode Testnet, si endpoint exact confirmé
|
2. Transport pur programmatic -> PublicNode Testnet, si endpoint exact confirmé
|
||||||
3. composition Config V3 -> Transport -> OrbitFlare Devnet, secret résolu par Config
|
3. Config V3 -> Transport -> PublicNode profile, si Config est matérialisée dans 0.2.9
|
||||||
|
|
||||||
|
OrbitFlare et les providers authentifiés sont validés dans leurs releases dédiées.
|
||||||
4. Tatum Mainnet authentifié, opérateur-only si utile
|
4. Tatum Mainnet authentifié, opérateur-only si utile
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -845,69 +870,77 @@ TLS/certificate failure
|
|||||||
unary timeout
|
unary timeout
|
||||||
```
|
```
|
||||||
|
|
||||||
## 17. Forecast souple recalibré
|
## 17. Forecast souple recalibré — **15–20 min max par prerelease ; 1 release <= 1 session**
|
||||||
|
|
||||||
|
Règles de dimensionnement **obligatoires** :
|
||||||
|
|
||||||
|
```text
|
||||||
|
chaque prerelease = tranche nominale de 15–20 minutes de travail effectif maximum
|
||||||
|
si une tranche paraît dépasser 20 minutes -> la scinder avant implémentation
|
||||||
|
0.2.9 complète = doit rester ouvrable et clôturable dans une seule session de chat
|
||||||
|
si la clôture dans la session devient incertaine -> scinder la release avant dette lourde
|
||||||
|
le numéro final des prereleases n'est jamais une deadline
|
||||||
|
```
|
||||||
|
|
||||||
Prévision courante :
|
Prévision courante :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
pre.001 DONE — audit upstream/service/proto + providers gratuits + licences/deps + architecture + threat model + sizing
|
pre.001 DONE — audit upstream/service/proto + providers gratuits + licences/deps + architecture + threat model + sizing
|
||||||
preuve : plan + matrice + stratégie B + Config V3 décidée + forecast recalibré
|
budget : 15–20 min nominal ; preuve : plan + matrice + stratégie B + forecast recalibré
|
||||||
|
|
||||||
pre.002 proto/dependencies matérialisés + settings/errors/façade gRPC minimale provider-neutral
|
pre.002 moteur Yellowstone : proto/dependencies + settings/errors + channel minimal
|
||||||
preuve : features justifiées + compile/tests + redaction + cargo tree direct/duplicates
|
budget : 15–20 min ; preuve : features minimales + compile/tests + redaction + cargo tree
|
||||||
|
|
||||||
pre.003 channel/TLS/metadata générique + fixture serveur local + 7 unary RPCs
|
pre.003 moteur Yellowstone : TLS/metadata générique + fixture locale + 7 unary RPCs
|
||||||
preuve : connect/TLS/timeouts/Status safe + wire unary exact
|
budget : 15–20 min ; preuve : connect/TLS/timeouts/Status safe + wire unary exact
|
||||||
|
|
||||||
pre.004 Subscribe foundation : maps, commitment, ping, from_slot, data slices, Cuckoo/token controls, validations/bounds
|
pre.004 standard Solana : Subscribe foundation + maps/commitment/ping/from_slot/data slices/bounds
|
||||||
preuve : omitted/empty/oneof exact + rejects avant I/O
|
budget : 15–20 min ; preuve : omitted/empty/oneof exact + rejets avant I/O
|
||||||
|
|
||||||
pre.005 Accounts + Slots : filters + typed updates
|
pre.005 standard Solana : Accounts + Slots filters/updates
|
||||||
preuve : fixtures exactes + enum/optional/malformed/adversarial
|
budget : 15–20 min ; preuve : fixtures exactes + enum/optional/malformed/adversarial
|
||||||
|
|
||||||
pre.006 Transactions + transaction_status + solana-storage wire utile
|
pre.006 standard Solana : Transactions + transaction_status
|
||||||
preuve : include/exclude/required/Cuckoo/token expansion + tx/meta sans perte arbitraire
|
budget : 15–20 min ; preuve : include/exclude/required/Cuckoo/token expansion + tx/meta
|
||||||
|
|
||||||
pre.007 Blocks + block_meta + entry + rewards/storage nested types
|
pre.007 standard Solana : Blocks + block_meta + entry
|
||||||
preuve : counts/arrays/optional/oneof/payload bounds exacts
|
budget : 15–20 min ; preuve : counts/arrays/optional/oneof/payload bounds
|
||||||
|
|
||||||
pre.008 stream bidirectionnel : mutations, Ping/Pong, half-close, backpressure, shutdown
|
pre.008 moteur partagé : bidi mutation + Ping/Pong + half-close + backpressure + shutdown
|
||||||
preuve : actor/session local + bounded queues + cleanup déterministe
|
budget : 15–20 min ; preuve : actor/session local + bounded queues + cleanup déterministe
|
||||||
|
|
||||||
pre.009 reconnect/resubscribe + from_slot/ReplayInfo + gaps/duplicates/equivocation observability
|
pre.009 moteur partagé : reconnect/resubscribe + from_slot/ReplayInfo + gaps/duplicates
|
||||||
preuve : reconnect local déterministe + aucune promesse lossless implicite
|
budget : 15–20 min ; preuve : reconnect local déterministe + aucune promesse lossless
|
||||||
|
|
||||||
pre.010 Config Transport V3 : grpc_defaults/grpc_endpoints + public/secret metadata + backward V1/V2
|
pre.010 Config V3 + séparation protocol/provider + profils PublicNode Mainnet/Testnet
|
||||||
preuve : schema/fixtures/mapping/redaction + Config -> Transport uniquement
|
budget : 15–20 min ; preuve : V1/V2 backward + schema/mapping/redaction + Config -> Transport
|
||||||
|
|
||||||
pre.011 interop live + compliance : PublicNode Mainnet puis Testnet, OrbitFlare Devnet secondaire, Tatum optionnel
|
pre.011 intégration PublicNode + smokes live + compliance + docs finales + prompt 0.2.10 OrbitFlare
|
||||||
preuve : smokes opt-in architecture-safe + HTTP 52/14 + WS 18/18 + Helius + API/firewall + cargo graph final
|
budget : 15–20 min ; preuve : Mainnet/Testnet opt-in + HTTP 52/14 + WS 18/18 + Helius + cargo graphs + workspace final
|
||||||
|
|
||||||
pre.012 README/USAGE + matrice finale + workspace final + indexes + prompt 0.2.10
|
|
||||||
preuve : workspace final vert + documentation version-neutral + prompt autonome
|
|
||||||
|
|
||||||
rel.001 publication stable stricte
|
rel.001 publication stable stricte
|
||||||
```
|
```
|
||||||
|
|
||||||
Chaque tranche vise nominalement **15–20 minutes** de travail effectif. Le forecast n'est pas une deadline.
|
Prévision : **11 prereleases**, soit environ **165–220 minutes de travail effectif nominal hors temps d'attente des commandes**, compatible avec une session complète. Si une tranche réelle excède son budget ou si `pre.011` ne peut pas raisonnablement fermer la release dans la session, on scinde avant de poursuivre au lieu de prolonger artificiellement `0.2.9`.
|
||||||
|
|
||||||
### Critères de split
|
### Critères de split
|
||||||
|
|
||||||
Scinder avant dette silencieuse si l'un de ces cas apparaît :
|
Scinder avant dette silencieuse si l'un de ces cas apparaît :
|
||||||
|
|
||||||
1. `yellowstone-grpc-proto + tonic` impose un conflit MSRV ou un doublon majeur de stack réseau impossible à justifier ;
|
1. `yellowstone-grpc-proto + tonic` impose une incompatibilité avec la Rust stable courante ou un doublon majeur de stack réseau impossible à justifier ;
|
||||||
2. les DTOs transactions/blocs exigent une réexposition massive des types upstream ou une réimplémentation disproportionnée ;
|
2. les DTOs transactions/blocs exigent une réexposition massive des types upstream ou une réimplémentation disproportionnée ;
|
||||||
3. l'upstream modifie encore matériellement le proto pendant la release ;
|
3. l'upstream modifie encore matériellement le proto pendant la release ;
|
||||||
4. le replay/reconnect devient un sous-système plus grand que la foundation ;
|
4. le replay/reconnect devient un sous-système plus grand que la foundation ;
|
||||||
5. les smokes provider nécessitent des comportements non standard qui contamineraient l'API publique.
|
5. PublicNode exige finalement un comportement provider-specific assez large pour dépasser la session ;
|
||||||
|
6. toute prerelease dépasse le budget nominal de 20 minutes sans frontière claire de split.
|
||||||
|
|
||||||
En cas de split, le noyau prioritaire à conserver dans `0.2.9` est :
|
En cas de split, le noyau prioritaire à conserver dans `0.2.9` est :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
connexion/TLS/metadata + unary + Subscribe standard canonique + lifecycle borné
|
moteur Yellowstone + façade Solana standard + première intégration PublicNode minimale
|
||||||
```
|
```
|
||||||
|
|
||||||
et le reste est replanifié explicitement dans la séquence ; aucune capacité n'est abandonnée silencieusement.
|
et le reste est replanifié explicitement ; aucune capacité n'est abandonnée silencieusement.
|
||||||
|
|
||||||
## 18. Fichiers attendus par tranche
|
## 18. Fichiers attendus par tranche
|
||||||
|
|
||||||
@@ -991,18 +1024,33 @@ metadata/secrets redacted
|
|||||||
resource bounds et backpressure testés
|
resource bounds et backpressure testés
|
||||||
reconnect/from_slot/replay documentés sans promesse lossless
|
reconnect/from_slot/replay documentés sans promesse lossless
|
||||||
Config V3 backward V1/V2 si Config intégrée
|
Config V3 backward V1/V2 si Config intégrée
|
||||||
|
PublicNode intégration provider matérialisée sans duplication du moteur
|
||||||
PublicNode interop Mainnet validée opt-in ou impossibilité externe documentée
|
PublicNode interop Mainnet validée opt-in ou impossibilité externe documentée
|
||||||
OrbitFlare Devnet validé si credential opérateur disponible, sinon procédure documentée
|
PublicNode Testnet validé si endpoint live confirmé, sinon raison documentée
|
||||||
|
OrbitFlare/Helius/eRPC absents du runtime 0.2.9 hors documentation de séquence
|
||||||
HTTP 52+14 non régressé
|
HTTP 52+14 non régressé
|
||||||
standard WS 18/18 non régressé
|
standard WS 18/18 non régressé
|
||||||
Helius WS non régressé
|
Helius WS non régressé
|
||||||
cargo graphs inspectés
|
cargo graphs inspectés
|
||||||
README/USAGE synchronisés
|
README/USAGE synchronisés
|
||||||
matrice `012` fermée
|
matrice `012` fermée
|
||||||
prompt 0.2.10 prêt
|
prompt 0.2.10 OrbitFlare prêt
|
||||||
workspace final vert
|
workspace final vert
|
||||||
```
|
```
|
||||||
|
|
||||||
## 21. Release suivante
|
## 21. Releases suivantes recalibrées
|
||||||
|
|
||||||
`0.2.10` reste dédiée à `ksp-offchain-transport-lib` et aux prix, sans être anticipée dans la stack Yellowstone.
|
Le gate `pre.001-fix.001` reprend la logique WebSocket : moteur/standard d'abord, providers ensuite, un provider par release lorsque son intégration apporte un delta réel.
|
||||||
|
|
||||||
|
```text
|
||||||
|
0.2.9 moteur Yellowstone + Solana standard + PublicNode
|
||||||
|
0.2.10 OrbitFlare Yellowstone gRPC
|
||||||
|
0.2.11 Helius LaserStream gRPC
|
||||||
|
0.2.12 eRPC Yellowstone gRPC, conditionné à un accès exploitable et à un delta provider réel
|
||||||
|
0.2.13 off-chain price transport
|
||||||
|
0.2.14 Price Desk + intégration prix Wallet Desk
|
||||||
|
0.2.15 interface/wire foundation
|
||||||
|
0.2.16 program-api foundation
|
||||||
|
```
|
||||||
|
|
||||||
|
La numérotation `0.2.10+` reste réauditable au gate de chaque release : un provider qui n'ajoute finalement qu'une URL interchangeable sans contrat propre ne doit pas provoquer une façade vide ni une release artificielle.
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<!-- file: docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md -->
|
<!-- file: docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md -->
|
||||||
<!-- version: 1 -->
|
<!-- version: 3 -->
|
||||||
|
|
||||||
# Validation `0.2.9` — Yellowstone gRPC standard/provider-neutral
|
# Validation `0.2.9` — moteur Yellowstone + standard Solana + PublicNode
|
||||||
|
|
||||||
> **Statut : matrice ouverte par `0.2.9-pre.001`. Les colonnes `DONE` ne seront cochées qu'après preuves réellement exécutées. Le gate d'ouverture a audité le proto/service, les licences, les dépendances et les fournisseurs live gratuits ; il n'a pas ajouté de client gRPC de production.**
|
> **Statut : matrice ouverte par `0.2.9-pre.001` et corrigée par `pre.001-fix.001`. Le scope distingue désormais moteur Yellowstone, façade Solana standard et première intégration PublicNode. OrbitFlare/Helius/eRPC sont reportés dans des releases provider dédiées.**
|
||||||
|
|
||||||
## 1. Autorités du gate
|
## 1. Autorités du gate
|
||||||
|
|
||||||
@@ -39,114 +39,114 @@ crate proto : 12.6.0
|
|||||||
|
|
||||||
## 2. Baseline stable
|
## 2. Baseline stable
|
||||||
|
|
||||||
| Gate | Preuve | État |
|
| Gate | Preuve | État |
|
||||||
| --- | --- | --- |
|
|-------------------------------------------|------------------------|------|
|
||||||
| `cargo fmt --all` | log opérateur `v0.2.8` | DONE |
|
| `cargo fmt --all` | log opérateur `v0.2.8` | DONE |
|
||||||
| audit Rust workspace | clean | DONE |
|
| audit Rust workspace | clean | DONE |
|
||||||
| `cargo check --workspace` | log opérateur | DONE |
|
| `cargo check --workspace` | log opérateur | DONE |
|
||||||
| `cargo clippy --workspace --all-targets` | log opérateur | DONE |
|
| `cargo clippy --workspace --all-targets` | log opérateur | DONE |
|
||||||
| `cargo test --workspace` | log opérateur | DONE |
|
| `cargo test --workspace` | log opérateur | DONE |
|
||||||
| Transport unit | 335 passed | DONE |
|
| Transport unit | 335 passed | DONE |
|
||||||
| Transport public API | 41 passed | DONE |
|
| Transport public API | 41 passed | DONE |
|
||||||
| Transport release completeness | 34 passed | DONE |
|
| Transport release completeness | 34 passed | DONE |
|
||||||
| Transport doctests | 4 passed | DONE |
|
| Transport doctests | 4 passed | DONE |
|
||||||
| `cargo tree -p ksp-onchain-transport-lib` | log opérateur | DONE |
|
| `cargo tree -p ksp-onchain-transport-lib` | log opérateur | DONE |
|
||||||
| `cargo tree --duplicates` | log opérateur | DONE |
|
| `cargo tree --duplicates` | log opérateur | DONE |
|
||||||
|
|
||||||
## 3. Matrice service `Geyser`
|
## 3. Matrice service `Geyser`
|
||||||
|
|
||||||
| RPC | Forme | Classification | Scope | Preuve cible | État |
|
| RPC | Forme | Classification | Scope | Preuve cible | État |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
|-----------------------|-------|------------------------------------------------------|-------|-----------------------|------|
|
||||||
| `Subscribe` | bidi | standard | IN | fixture locale + live | TODO |
|
| `Subscribe` | bidi | standard | IN | fixture locale + live | TODO |
|
||||||
| `SubscribeDeshred` | bidi | Triton extension/pré-exécution malgré présence proto | OUT | canari d'absence/API | TODO |
|
| `SubscribeDeshred` | bidi | Triton extension/pré-exécution malgré présence proto | OUT | canari d'absence/API | TODO |
|
||||||
| `SubscribeReplayInfo` | unary | standard | IN | fixture unary | TODO |
|
| `SubscribeReplayInfo` | unary | standard | IN | fixture unary | TODO |
|
||||||
| `Ping` | unary | standard | IN | fixture unary | TODO |
|
| `Ping` | unary | standard | IN | fixture unary | TODO |
|
||||||
| `GetLatestBlockhash` | unary | standard | IN | fixture unary | TODO |
|
| `GetLatestBlockhash` | unary | standard | IN | fixture unary | TODO |
|
||||||
| `GetBlockHeight` | unary | standard | IN | fixture unary | TODO |
|
| `GetBlockHeight` | unary | standard | IN | fixture unary | TODO |
|
||||||
| `GetSlot` | unary | standard | IN | fixture unary | TODO |
|
| `GetSlot` | unary | standard | IN | fixture unary | TODO |
|
||||||
| `IsBlockhashValid` | unary | standard | IN | fixture unary | TODO |
|
| `IsBlockhashValid` | unary | standard | IN | fixture unary | TODO |
|
||||||
| `GetVersion` | unary | standard | IN | fixture unary | TODO |
|
| `GetVersion` | unary | standard | IN | fixture unary | TODO |
|
||||||
|
|
||||||
## 4. `SubscribeRequest` — coverage normative
|
## 4. `SubscribeRequest` — coverage normative
|
||||||
|
|
||||||
### 4.1 Top-level
|
### 4.1 Top-level
|
||||||
|
|
||||||
| Champ | Sémantique | Scope | Preuve |
|
| Champ | Sémantique | Scope | Preuve |
|
||||||
| --- | --- | --- | --- |
|
|-----------------------|----------------------------------------|-------|--------------------------|
|
||||||
| `accounts` | map filter-name -> account filter | IN | exact wire + bounds |
|
| `accounts` | map filter-name -> account filter | IN | exact wire + bounds |
|
||||||
| `slots` | map -> slot filter | IN | exact wire |
|
| `slots` | map -> slot filter | IN | exact wire |
|
||||||
| `transactions` | map -> transaction filter | IN | exact wire + bounds |
|
| `transactions` | map -> transaction filter | IN | exact wire + bounds |
|
||||||
| `transactions_status` | map -> transaction filter | IN | exact wire + bounds |
|
| `transactions_status` | map -> transaction filter | IN | exact wire + bounds |
|
||||||
| `blocks` | map -> block filter | IN | exact wire + bounds |
|
| `blocks` | map -> block filter | IN | exact wire + bounds |
|
||||||
| `blocks_meta` | map -> empty filter | IN | presence/empty semantics |
|
| `blocks_meta` | map -> empty filter | IN | presence/empty semantics |
|
||||||
| `entry` | map -> empty filter | IN | presence/empty semantics |
|
| `entry` | map -> empty filter | IN | presence/empty semantics |
|
||||||
| `commitment` | optional Processed/Confirmed/Finalized | IN | omitted/value exact |
|
| `commitment` | optional Processed/Confirmed/Finalized | IN | omitted/value exact |
|
||||||
| `accounts_data_slice` | repeated offset/length | IN | order + bounds |
|
| `accounts_data_slice` | repeated offset/length | IN | order + bounds |
|
||||||
| `ping` | optional id | IN | Ping/Pong lifecycle |
|
| `ping` | optional id | IN | Ping/Pong lifecycle |
|
||||||
| `from_slot` | optional u64 | IN | reconnect/replay tests |
|
| `from_slot` | optional u64 | IN | reconnect/replay tests |
|
||||||
|
|
||||||
### 4.2 Accounts
|
### 4.2 Accounts
|
||||||
|
|
||||||
| Capacité | Scope | Preuve |
|
| Capacité | Scope | Preuve |
|
||||||
| --- | --- | --- |
|
|---------------------------|-------|--------------------------------------|
|
||||||
| `account[]` | IN | order/cardinality/address validation |
|
| `account[]` | IN | order/cardinality/address validation |
|
||||||
| `owner[]` | IN | order/cardinality/address validation |
|
| `owner[]` | IN | order/cardinality/address validation |
|
||||||
| `filters[]` | IN | AND semantics preserved structurally |
|
| `filters[]` | IN | AND semantics preserved structurally |
|
||||||
| `nonempty_txn_signature?` | IN | omitted/false/true |
|
| `nonempty_txn_signature?` | IN | omitted/false/true |
|
||||||
| `cuckoo_accounts_filter?` | IN | exact wire + dimension/data bounds |
|
| `cuckoo_accounts_filter?` | IN | exact wire + dimension/data bounds |
|
||||||
| memcmp bytes | IN | exact bytes + bounds |
|
| memcmp bytes | IN | exact bytes + bounds |
|
||||||
| memcmp base58 | IN | exact string + validation |
|
| memcmp base58 | IN | exact string + validation |
|
||||||
| memcmp base64 | IN | exact string + validation |
|
| memcmp base64 | IN | exact string + validation |
|
||||||
| `datasize` | IN | exact u64 |
|
| `datasize` | IN | exact u64 |
|
||||||
| `token_account_state` | IN | bool |
|
| `token_account_state` | IN | bool |
|
||||||
| lamports `eq/ne/lt/gt` | IN | oneof exact |
|
| lamports `eq/ne/lt/gt` | IN | oneof exact |
|
||||||
|
|
||||||
### 4.3 Slots
|
### 4.3 Slots
|
||||||
|
|
||||||
| Capacité | Scope | Preuve |
|
| Capacité | Scope | Preuve |
|
||||||
| --- | --- | --- |
|
|--------------------------------------------------|-------|--------------------------|
|
||||||
| `filter_by_commitment?` | IN | optional semantics |
|
| `filter_by_commitment?` | IN | optional semantics |
|
||||||
| `interslot_updates?` | IN | optional semantics |
|
| `interslot_updates?` | IN | optional semantics |
|
||||||
| processed/confirmed/finalized | IN | enum decode |
|
| processed/confirmed/finalized | IN | enum decode |
|
||||||
| first_shred_received/completed/created_bank/dead | IN | enum decode + dead_error |
|
| first_shred_received/completed/created_bank/dead | IN | enum decode + dead_error |
|
||||||
|
|
||||||
### 4.4 Transactions / transaction_status
|
### 4.4 Transactions / transaction_status
|
||||||
|
|
||||||
| Capacité | Scope | Preuve |
|
| Capacité | Scope | Preuve |
|
||||||
| --- | --- | --- |
|
|-------------------------------------|-------|---------------------|
|
||||||
| `vote?` | IN | optional semantics |
|
| `vote?` | IN | optional semantics |
|
||||||
| `failed?` | IN | optional semantics |
|
| `failed?` | IN | optional semantics |
|
||||||
| `signature?` | IN | exact/validated |
|
| `signature?` | IN | exact/validated |
|
||||||
| `account_include[]` | IN | order/bounds |
|
| `account_include[]` | IN | order/bounds |
|
||||||
| `account_exclude[]` | IN | order/bounds |
|
| `account_exclude[]` | IN | order/bounds |
|
||||||
| `account_required[]` | IN | order/bounds |
|
| `account_required[]` | IN | order/bounds |
|
||||||
| `cuckoo_account_include?` | IN | exact wire + bounds |
|
| `cuckoo_account_include?` | IN | exact wire + bounds |
|
||||||
| `token_accounts? = ALL` | IN | optional enum |
|
| `token_accounts? = ALL` | IN | optional enum |
|
||||||
| `token_accounts? = BALANCE_CHANGED` | IN | optional enum |
|
| `token_accounts? = BALANCE_CHANGED` | IN | optional enum |
|
||||||
|
|
||||||
### 4.5 Blocks
|
### 4.5 Blocks
|
||||||
|
|
||||||
| Capacité | Scope | Preuve |
|
| Capacité | Scope | Preuve |
|
||||||
| --- | --- | --- |
|
|---------------------------|-------|---------------------|
|
||||||
| `account_include[]` | IN | order/bounds |
|
| `account_include[]` | IN | order/bounds |
|
||||||
| `include_transactions?` | IN | optional semantics |
|
| `include_transactions?` | IN | optional semantics |
|
||||||
| `include_accounts?` | IN | optional semantics |
|
| `include_accounts?` | IN | optional semantics |
|
||||||
| `include_entries?` | IN | optional semantics |
|
| `include_entries?` | IN | optional semantics |
|
||||||
| `cuckoo_account_include?` | IN | exact wire + bounds |
|
| `cuckoo_account_include?` | IN | exact wire + bounds |
|
||||||
|
|
||||||
## 5. `SubscribeUpdate` — coverage normative
|
## 5. `SubscribeUpdate` — coverage normative
|
||||||
|
|
||||||
| Variante | Champs structurants | Scope | Preuve |
|
| Variante | Champs structurants | Scope | Preuve |
|
||||||
| --- | --- | --- | --- |
|
|----------------------|---------------------------------------------------------------|-------|-----------------------|
|
||||||
| `account` | account info, slot, is_startup | IN | exact decode |
|
| `account` | account info, slot, is_startup | IN | exact decode |
|
||||||
| `slot` | slot, parent?, status, dead_error? | IN | exact decode |
|
| `slot` | slot, parent?, status, dead_error? | IN | exact decode |
|
||||||
| `transaction` | signature, vote, transaction, meta, index, slot | IN | exact decode |
|
| `transaction` | signature, vote, transaction, meta, index, slot | IN | exact decode |
|
||||||
| `transaction_status` | slot, signature, vote, index, err | IN | exact decode |
|
| `transaction_status` | slot, signature, vote, index, err | IN | exact decode |
|
||||||
| `block` | hash/rewards/time/height/parents/counts + tx/accounts/entries | IN | exact decode + bounds |
|
| `block` | hash/rewards/time/height/parents/counts + tx/accounts/entries | IN | exact decode + bounds |
|
||||||
| `ping` | marker | IN | lifecycle |
|
| `ping` | marker | IN | lifecycle |
|
||||||
| `pong` | id | IN | lifecycle |
|
| `pong` | id | IN | lifecycle |
|
||||||
| `block_meta` | metadata/counts | IN | exact decode |
|
| `block_meta` | metadata/counts | IN | exact decode |
|
||||||
| `entry` | slot/index/hash/counts | IN | exact decode |
|
| `entry` | slot/index/hash/counts | IN | exact decode |
|
||||||
|
|
||||||
Top-level à préserver :
|
Top-level à préserver :
|
||||||
|
|
||||||
@@ -195,29 +195,29 @@ Preuve cible : fixtures issues du wire Protobuf + cas old/current + malformed/ov
|
|||||||
|
|
||||||
## 7. Unary RPC matrix
|
## 7. Unary RPC matrix
|
||||||
|
|
||||||
| RPC | Request exact | Response exact | État |
|
| RPC | Request exact | Response exact | État |
|
||||||
| --- | --- | --- | --- |
|
|------------------|---------------------------|-----------------------------|------|
|
||||||
| ReplayInfo | empty | `first_available?` | TODO |
|
| ReplayInfo | empty | `first_available?` | TODO |
|
||||||
| Ping | `count` | `count` | TODO |
|
| Ping | `count` | `count` | TODO |
|
||||||
| LatestBlockhash | `commitment?` | slot/hash/last_valid_height | TODO |
|
| LatestBlockhash | `commitment?` | slot/hash/last_valid_height | TODO |
|
||||||
| BlockHeight | `commitment?` | block_height | TODO |
|
| BlockHeight | `commitment?` | block_height | TODO |
|
||||||
| Slot | `commitment?` | slot | TODO |
|
| Slot | `commitment?` | slot | TODO |
|
||||||
| IsBlockhashValid | blockhash + `commitment?` | slot + bool | TODO |
|
| IsBlockhashValid | blockhash + `commitment?` | slot + bool | TODO |
|
||||||
| Version | empty | version | TODO |
|
| Version | empty | version | TODO |
|
||||||
|
|
||||||
## 8. Dépendances / licence
|
## 8. Dépendances / licence
|
||||||
|
|
||||||
| Gate | Décision `pre.001` | Preuve suivante |
|
| Gate | Décision `pre.001` | Preuve suivante |
|
||||||
| --- | --- | --- |
|
|-----------------------------|--------------------------------|-------------------------|
|
||||||
| repository default | AGPL-3.0-only | `LICENSING.md` |
|
| repository default | AGPL-3.0-only | `LICENSING.md` |
|
||||||
| client subtree | Apache-2.0 | `LICENSING.md` |
|
| client subtree | Apache-2.0 | `LICENSING.md` |
|
||||||
| proto subtree | Apache-2.0 | `LICENSING.md` |
|
| proto subtree | Apache-2.0 | `LICENSING.md` |
|
||||||
| strategy A client+proto | rejetée comme default | documenté |
|
| strategy A client+proto | rejetée comme default | documenté |
|
||||||
| strategy B proto+Tonic KSP | **retenue** | `pre.002` compile/tree |
|
| strategy B proto+Tonic KSP | **retenue** | `pre.002` compile/tree |
|
||||||
| strategy C vendored proto | fallback seulement | aucun vendoring pre.001 |
|
| strategy C vendored proto | fallback seulement | aucun vendoring pre.001 |
|
||||||
| system protoc | non attendu avec crate publiée | vérifier build réel |
|
| system protoc | non attendu avec crate publiée | vérifier build réel |
|
||||||
| raw upstream types public | interdit par défaut | public API canary |
|
| raw upstream types public | interdit par défaut | public API canary |
|
||||||
| executable Yellowstone deps | interdit | dependency firewall |
|
| executable Yellowstone deps | interdit | dependency firewall |
|
||||||
|
|
||||||
Versions observées :
|
Versions observées :
|
||||||
|
|
||||||
@@ -230,17 +230,20 @@ prost/prost-types 0.14.x (0.14.4 latest observé)
|
|||||||
|
|
||||||
## 9. Architecture / ownership
|
## 9. Architecture / ownership
|
||||||
|
|
||||||
| Invariant | Preuve cible | État |
|
| Invariant | Preuve cible | État |
|
||||||
| --- | --- | --- |
|
|--------------------------------------------------------------------------------|--------------------------|------|
|
||||||
| backend gRPC distinct HTTP/WS | source/API canary | TODO |
|
| backend gRPC distinct HTTP/WS | source/API canary | TODO |
|
||||||
| aucun `WsProtocolKind` gRPC | source scan | TODO |
|
| aucun `WsProtocolKind` gRPC | source scan | TODO |
|
||||||
| Transport owns gRPC | dependency graph | TODO |
|
| Transport owns gRPC | dependency graph | TODO |
|
||||||
| Config -> Transport seulement | ownership test | TODO |
|
| Config -> Transport seulement | ownership test | TODO |
|
||||||
| Transport -X-> Config | ownership test | TODO |
|
| Transport -X-> Config | ownership test | TODO |
|
||||||
| Transport -X-> std::env KSP_* | ownership test | TODO |
|
| Transport -X-> std::env KSP_* | ownership test | TODO |
|
||||||
| Logging façade KSP only | logging ownership | TODO |
|
| Logging façade KSP only | logging ownership | TODO |
|
||||||
| no raw Tonic client escape hatch | public API canary | TODO |
|
| no raw Tonic client escape hatch | public API canary | TODO |
|
||||||
| no provider-specific public types | public API/completeness | TODO |
|
| moteur Yellowstone partagé sans duplication provider | source/API canary | TODO |
|
||||||
|
| façade Solana Yellowstone standard distincte du moteur | public API canary | TODO |
|
||||||
|
| PublicNode représenté comme provider/capabilities, pas comme nouveau protocole | public API/config canary | TODO |
|
||||||
|
| façade provider spécialisée seulement si delta réel | completeness review | TODO |
|
||||||
|
|
||||||
## 10. Settings, bounds et redaction
|
## 10. Settings, bounds et redaction
|
||||||
|
|
||||||
@@ -275,25 +278,25 @@ snapshot sans endpoint secret ni remote internals inutiles
|
|||||||
|
|
||||||
## 11. Lifecycle / backpressure / replay
|
## 11. Lifecycle / backpressure / replay
|
||||||
|
|
||||||
| Cas | Attendu | État |
|
| Cas | Attendu | État |
|
||||||
| --- | --- | --- |
|
|--------------------------------------------|------------------------------------------|------|
|
||||||
| stream open | session bornée | TODO |
|
| stream open | session bornée | TODO |
|
||||||
| request mutation | ordre déterministe | TODO |
|
| request mutation | ordre déterministe | TODO |
|
||||||
| server Ping -> client request ping -> Pong | explicite | TODO |
|
| server Ping -> client request ping -> Pong | explicite | TODO |
|
||||||
| server half-close | terminal/reconnect selon policy | TODO |
|
| server half-close | terminal/reconnect selon policy | TODO |
|
||||||
| client close | cleanup borné | TODO |
|
| client close | cleanup borné | TODO |
|
||||||
| receiver drop | cleanup capacité | TODO |
|
| receiver drop | cleanup capacité | TODO |
|
||||||
| slow subscription | pas de queue infinie | TODO |
|
| slow subscription | pas de queue infinie | TODO |
|
||||||
| inbound oversized | rejet avant allocation excessive | TODO |
|
| inbound oversized | rejet avant allocation excessive | TODO |
|
||||||
| outbound oversized | rejet avant write | TODO |
|
| outbound oversized | rejet avant write | TODO |
|
||||||
| reconnect budget | borné | TODO |
|
| reconnect budget | borné | TODO |
|
||||||
| resubscribe order | déterministe | TODO |
|
| resubscribe order | déterministe | TODO |
|
||||||
| `from_slot` | utilisé sans promesse lossless | TODO |
|
| `from_slot` | utilisé sans promesse lossless | TODO |
|
||||||
| ReplayInfo | informatif | TODO |
|
| ReplayInfo | informatif | TODO |
|
||||||
| duplicates | observables | TODO |
|
| duplicates | observables | TODO |
|
||||||
| gaps | observables | TODO |
|
| gaps | observables | TODO |
|
||||||
| divergent node history | couverture documentée | TODO |
|
| divergent node history | couverture documentée | TODO |
|
||||||
| shutdown during reconnect | aucune nouvelle connexion après shutdown | TODO |
|
| shutdown during reconnect | aucune nouvelle connexion après shutdown | TODO |
|
||||||
|
|
||||||
Claims interdits sans nouvelle preuve :
|
Claims interdits sans nouvelle preuve :
|
||||||
|
|
||||||
@@ -325,54 +328,29 @@ endpoint.secret_metadata[] # Config-owned secret provenance
|
|||||||
|
|
||||||
Canaries :
|
Canaries :
|
||||||
|
|
||||||
| Gate | État |
|
| Gate | État |
|
||||||
| --- | --- |
|
|------------------------------------------|------|
|
||||||
| V1 backward readable | TODO |
|
| V1 backward readable | TODO |
|
||||||
| V2 backward readable | TODO |
|
| V2 backward readable | TODO |
|
||||||
| V3 schema strict | TODO |
|
| V3 schema strict | TODO |
|
||||||
| gRPC endpoint mapping | TODO |
|
| gRPC endpoint mapping | TODO |
|
||||||
| secret provenance enforced | TODO |
|
| secret provenance enforced | TODO |
|
||||||
| safe projection redacted | TODO |
|
| safe projection redacted | TODO |
|
||||||
| no Transport -> Config | TODO |
|
| no Transport -> Config | TODO |
|
||||||
| `.env.example` inventory if new env vars | TODO |
|
| `.env.example` inventory if new env vars | TODO |
|
||||||
|
|
||||||
## 13. Fournisseurs live gratuits / durables
|
## 13. Providers — validation et séquence
|
||||||
|
|
||||||
| Provider | Cluster gRPC gratuit confirmé | Nature | Priorité `0.2.9` | Verdict |
|
| Provider | Accès gratuit/durable observé | Rôle architectural | Release cible | Verdict |
|
||||||
| --- | --- | --- | --- | --- |
|
|----------------------------------|-------------------------------------------|-----------------------------------------------------|-------------------------|-----------------|
|
||||||
| **PublicNode / Allnodes-backed** | Mainnet + Testnet | endpoint public, pas de plan payant requis observé | 1 | **IN smoke** |
|
| **PublicNode / Allnodes-backed** | Mainnet + Testnet Yellowstone gRPC | première intégration concrète du standard | **0.2.9** | **IN provider** |
|
||||||
| **OrbitFlare** | Devnet | Free $0, 10 RPS/1 TPS, unlimited credits | 2 | **IN smoke secondaire** |
|
| **OrbitFlare** | Devnet Free | provider authentifié réutilisant standard | **0.2.10** | **REPORT** |
|
||||||
| Tatum | Mainnet | Free durable mais 100K lifetime credits, 5 subscriptions | 3 | opérateur optionnel |
|
| **Helius LaserStream gRPC** | accès dépendant du plan | compat Yellowstone + sémantiques provider à auditer | **0.2.11** | **REPORT** |
|
||||||
| Helius | aucun sur Free | Devnet Developer, Mainnet Business | — | OUT free |
|
| **eRPC** | gratuit durable non confirmé au gate | provider à réauditer | **0.2.12 conditionnel** | **REPORT** |
|
||||||
| Shyft | aucun sur Free | Free indique No gRPC Access | — | OUT free |
|
| Tatum | Free durable mais crédits lifetime bornés | candidat ultérieur | non réservé | REPORT |
|
||||||
| Alchemy | aucun sur Free | PAYG/Enterprise requis | — | OUT free |
|
| Triton/Chainstack/Shyft/autres | selon accès/capabilities | candidats ultérieurs | non réservé | REPORT |
|
||||||
| QuickNode | aucun sur Free | Scale/Business ou add-on payant | — | OUT free |
|
|
||||||
| Chainstack | aucun sur Free | add-on Yellowstone payant, Growth+ | — | OUT free |
|
|
||||||
| ERPC | aucun durable | plan Geyser payant, trial 1 jour | — | OUT free |
|
|
||||||
| NodeFlare | endpoint gRPC présent | plan Yellowstone mensuel payant | — | OUT free |
|
|
||||||
| Bitquery | pas Yellowstone standard | CoreCast custom, stream gratuit non garanti | — | OUT 0.2.9 |
|
|
||||||
| Solinfra | **non confirmé** | free tier + Yellowstone annoncés, entitlement gRPC free non explicite | recheck | CANDIDAT |
|
|
||||||
|
|
||||||
Sources provider :
|
### PublicNode `0.2.9`
|
||||||
|
|
||||||
```text
|
|
||||||
https://publicnode.com/
|
|
||||||
https://solana-yellowstone-grpc.publicnode.com/
|
|
||||||
https://orbitflare.com/pricing
|
|
||||||
https://docs.tatum.io/reference/solana-grpc
|
|
||||||
https://tatum.io/pricing
|
|
||||||
https://www.helius.dev/pricing
|
|
||||||
https://shyft.to/solana-rpc-grpc-pricing
|
|
||||||
https://www.alchemy.com/docs/reference/yellowstone-grpc-quickstart
|
|
||||||
https://www.quicknode.com/docs/solana/solana-grpc/overview
|
|
||||||
https://chainstack.com/pricing/
|
|
||||||
https://erpc.global/en/grpc/
|
|
||||||
https://nodeflare.app/solana
|
|
||||||
https://docs.bitquery.io/docs/grpc/solana/introduction/
|
|
||||||
https://solinfra.dev/
|
|
||||||
```
|
|
||||||
|
|
||||||
### Smoke PublicNode
|
|
||||||
|
|
||||||
Cible principale officiellement affichée :
|
Cible principale officiellement affichée :
|
||||||
|
|
||||||
@@ -380,67 +358,78 @@ Cible principale officiellement affichée :
|
|||||||
solana-yellowstone-grpc.publicnode.com:443
|
solana-yellowstone-grpc.publicnode.com:443
|
||||||
```
|
```
|
||||||
|
|
||||||
Testnet GRPC est officiellement listé. L'endpoint exact doit être confirmé avant commit d'un profil durable.
|
Gates :
|
||||||
|
|
||||||
### Smoke OrbitFlare
|
```text
|
||||||
|
utilise le moteur Yellowstone partagé
|
||||||
|
utilise la façade standard Solana
|
||||||
|
provider/capabilities/profile explicitement identifiables
|
||||||
|
aucune duplication actor/channel/stream
|
||||||
|
aucun wire PublicNode inventé si le provider reste standard
|
||||||
|
Mainnet smoke opt-in
|
||||||
|
Testnet smoke opt-in si endpoint exact confirmé
|
||||||
|
```
|
||||||
|
|
||||||
Credential : jamais versionné. La clé/header gRPC exacte doit être confirmée depuis la documentation/live au moment du smoke ; le contrat Transport reste generic secret metadata.
|
### Providers suivants
|
||||||
|
|
||||||
|
OrbitFlare, Helius et eRPC ne sont plus des smokes secondaires de `0.2.9`. Chacun est audité dans sa release dédiée et ne reçoit une façade/type spécialisé que si l'authentification, les capabilities, le wire, le keepalive, le replay ou le lifecycle diffèrent réellement du standard.
|
||||||
|
|
||||||
## 14. Non-régressions obligatoires
|
## 14. Non-régressions obligatoires
|
||||||
|
|
||||||
| Surface héritée | Attendu final | État |
|
| Surface héritée | Attendu final | État |
|
||||||
| --- | --- | --- |
|
|--------------------|----------------------------------------------------|------------|
|
||||||
| HTTP current | 52 typed | TODO final |
|
| HTTP current | 52 typed | TODO final |
|
||||||
| HTTP historical | 14 Deprecated/Removed | TODO final |
|
| HTTP historical | 14 Deprecated/Removed | TODO final |
|
||||||
| Standard WS | 18 opérations / 9 familles | TODO final |
|
| Standard WS | 18 opérations / 9 familles | TODO final |
|
||||||
| Helius WS | 7 standard + transaction | TODO final |
|
| Helius WS | 7 standard + transaction | TODO final |
|
||||||
| Helius heartbeat | Ping 60 s | TODO final |
|
| Helius heartbeat | Ping 60 s | TODO final |
|
||||||
| Config V1/V2 | backward read | TODO final |
|
| Config V1/V2 | backward read | TODO final |
|
||||||
| Wallet/Wallet Desk | aucune dépendance protocolaire Yellowstone directe | TODO final |
|
| Wallet/Wallet Desk | aucune dépendance protocolaire Yellowstone directe | TODO final |
|
||||||
|
|
||||||
## 15. Forecast / preuve par tranche
|
## 15. Forecast / preuve par tranche — **15–20 min max ; release <= une session**
|
||||||
|
|
||||||
```text
|
```text
|
||||||
pre.001 DONE audit + matrices + dependencies/license + providers + sizing
|
pre.001 DONE audit/sizing/architecture 15–20 min nominal
|
||||||
pre.002 TODO deps/settings/errors/facade + cargo tree
|
pre.002 TODO moteur: deps/settings/errors/channel 15–20 min
|
||||||
pre.003 TODO TLS/metadata + local fixture + 7 unary
|
pre.003 TODO moteur: TLS/metadata + fixture + 7 unary 15–20 min
|
||||||
pre.004 TODO Subscribe common + Cuckoo/token/from_slot/bounds
|
pre.004 TODO standard: Subscribe common/from_slot/bounds 15–20 min
|
||||||
pre.005 TODO accounts + slots
|
pre.005 TODO standard: accounts + slots 15–20 min
|
||||||
pre.006 TODO transactions + transaction_status
|
pre.006 TODO standard: transactions + transaction_status 15–20 min
|
||||||
pre.007 TODO blocks + block_meta + entry
|
pre.007 TODO standard: blocks + block_meta + entry 15–20 min
|
||||||
pre.008 TODO bidi lifecycle/backpressure/half-close/shutdown
|
pre.008 TODO moteur: bidi/backpressure/half-close/shutdown 15–20 min
|
||||||
pre.009 TODO reconnect/replay/gap/duplicate/equivocation
|
pre.009 TODO moteur: reconnect/replay/gap/duplicate 15–20 min
|
||||||
pre.010 TODO Config V3
|
pre.010 TODO Config V3 + protocol/provider + profils PublicNode 15–20 min
|
||||||
pre.011 TODO live PublicNode/OrbitFlare + compliance + final cargo graphs
|
pre.011 TODO PublicNode live + compliance + docs/prompt 0.2.10 15–20 min
|
||||||
pre.012 TODO docs/workspace final/prompt 0.2.10
|
|
||||||
rel.001 TODO stable
|
rel.001 TODO stable
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Gate de sizing : une prerelease estimée à plus de 20 minutes est scindée ; si `0.2.9` ne paraît plus clôturable dans la session courante, la release est scindée avant implémentation supplémentaire.
|
||||||
|
|
||||||
## 16. Gate `pre.001`
|
## 16. Gate `pre.001`
|
||||||
|
|
||||||
| Critère du prompt | Verdict |
|
| Critère du prompt | Verdict |
|
||||||
| --- | --- |
|
|------------------------------------------|--------------------------------|
|
||||||
| base stable `v0.2.8` confirmée | PASS |
|
| base stable `v0.2.8` confirmée | PASS |
|
||||||
| baseline opérateur enregistrée | PASS |
|
| baseline opérateur enregistrée | PASS |
|
||||||
| upstream courant relu | PASS |
|
| upstream courant relu | PASS |
|
||||||
| divergence snapshot/latest enregistrée | PASS |
|
| divergence snapshot/latest enregistrée | PASS |
|
||||||
| service/proto exhaustif inventorié | PASS |
|
| service/proto exhaustif inventorié | PASS |
|
||||||
| standard vs provider extension classifié | PASS |
|
| standard vs provider extension classifié | PASS |
|
||||||
| `SubscribeDeshred` classifié | PASS / OUT |
|
| `SubscribeDeshred` classifié | PASS / OUT |
|
||||||
| unary RPCs classifiés | PASS / 7 IN |
|
| unary RPCs classifiés | PASS / 7 IN |
|
||||||
| replay/from_slot audités | PASS |
|
| replay/from_slot audités | PASS |
|
||||||
| strategy dependency choisie | PASS / B |
|
| strategy dependency choisie | PASS / B |
|
||||||
| licence auditée avant ajout | PASS |
|
| licence auditée avant ajout | PASS |
|
||||||
| features/MSRV/transitifs audit initial | PASS / materialisation pre.002 |
|
| features/build/transitifs audit initial | PASS / matérialisation pre.002 |
|
||||||
| architecture distincte WS | PASS |
|
| architecture distincte WS | PASS |
|
||||||
| metadata/auth neutral | PASS |
|
| metadata/auth neutral | PASS |
|
||||||
| Config shape décidée | PASS / V3 |
|
| Config shape décidée | PASS / V3 |
|
||||||
| resource/backpressure policy décidée | PASS |
|
| resource/backpressure policy décidée | PASS |
|
||||||
| smoke ownership décidé | PASS |
|
| smoke ownership décidé | PASS |
|
||||||
| providers gratuits audités | PASS |
|
| providers gratuits audités | PASS |
|
||||||
| release dimensionnée | PASS |
|
| release dimensionnée | PASS |
|
||||||
| forecast recalibré | PASS |
|
| forecast recalibré | PASS |
|
||||||
| split criteria écrits | PASS |
|
| split criteria écrits | PASS |
|
||||||
| aucune implémentation lourde prématurée | PASS |
|
| aucune implémentation lourde prématurée | PASS |
|
||||||
|
|
||||||
**Verdict `pre.001` : gate positif ; `pre.002` peut matérialiser la stratégie B sous validation Cargo.**
|
**Verdict `pre.001` : gate positif ; `pre.002` peut matérialiser la stratégie B sous validation Cargo.**
|
||||||
|
|||||||
Reference in New Issue
Block a user