v0.2.10-pre.002-fix.001
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
<!-- file: docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md -->
|
||||
<!-- version: 2 -->
|
||||
<!-- version: 3 -->
|
||||
|
||||
# Validation `0.2.10` — OrbitFlare Yellowstone gRPC
|
||||
|
||||
**Statut courant : `0.2.10-pre.002` matérialise le profil Config V3 OrbitFlare Devnet et le smoke opt-in de caractérisation sur le standard Yellowstone KSP inchangé. Les preuves statiques sont fermées ; `connect`, `Subscribe`, `Slot` et `Ping` restent `PENDING` jusqu'au run live opérateur.**
|
||||
**Statut courant : `0.2.10-pre.002` est commité et son gate statique/workspace est vert. Son live sans metadata a atteint OrbitFlare mais `SubscribeOpen` a été rejeté `Unauthenticated`. `0.2.10-pre.002-fix.001` corrige l’auth en License Key `ORBIT-*` transmise comme secret `x-token`, sans modification N1/N2. Le rerun authentifié `Subscribe -> Slot + Ping` reste `PENDING OPERATOR`.**
|
||||
|
||||
## 1. Autorités
|
||||
|
||||
@@ -55,17 +55,17 @@ Toute modification de `grpc_stream.rs`, `grpc_channel.rs`, `grpc_settings.rs`, `
|
||||
|
||||
## 4. Pricing et réseau
|
||||
|
||||
| Point | Preuve actuelle | Verdict |
|
||||
|----------------------|------------------------------------------|-------------|
|
||||
| plan Solana Free | 0 USD par mois | **PASS** |
|
||||
| gRPC Free | Devnet only | **PASS** |
|
||||
| RPS Free | 10 | INFO |
|
||||
| TPS Free | 1 | INFO |
|
||||
| crédit | unlimited dans le RPS | INFO |
|
||||
| Devnet gRPC endpoint | `http://devnet.rpc.orbitflare.com:10000` | **PASS** |
|
||||
| Devnet live KSP | non encore exécuté | **PENDING** |
|
||||
| Mainnet gratuit | non documenté | **OUT** |
|
||||
| Testnet endpoint | non prouvé | **UNKNOWN** |
|
||||
| Point | Preuve actuelle | Verdict |
|
||||
|----------------------|------------------------------------------|---------------|
|
||||
| plan Solana Free | 0 USD par mois | **PASS** |
|
||||
| gRPC Free | Devnet only | **PASS** |
|
||||
| RPS Free | 10 | INFO |
|
||||
| TPS Free | 1 | INFO |
|
||||
| crédit | unlimited dans le RPS | INFO |
|
||||
| Devnet gRPC endpoint | `http://devnet.rpc.orbitflare.com:10000` | **PASS** |
|
||||
| Devnet live KSP | service atteint, Subscribe auth rejeté | **AUTH GATE** |
|
||||
| Mainnet gratuit | non documenté | **OUT** |
|
||||
| Testnet endpoint | non prouvé | **UNKNOWN** |
|
||||
|
||||
Sources :
|
||||
|
||||
@@ -88,18 +88,29 @@ KSP ne prétend pas qu'un canal gRPC plaintext bénéficie d'une sécurité TLS
|
||||
|
||||
## 6. Auth classification
|
||||
|
||||
| Élément | Usage prouvé | Verdict |
|
||||
|-----------------------------|--------------------------------|-----------------------|
|
||||
| `X-ORBIT-KEY` | Customer API | **CONTROL-PLANE** |
|
||||
| Bearer Customer API | Customer API v2 | **CONTROL-PLANE** |
|
||||
| RPC `api_key` | Solana HTTP RPC | **HTTP ONLY** |
|
||||
| API key compte opérateur | CLI/Customer API | **NOT GRPC PROOF** |
|
||||
| token gRPC Dashboard | quickstart Yellowstone | **ACCOUNT DEPENDENT** |
|
||||
| metadata upstream `x-token` | mécanisme Yellowstone standard | **POSSIBLE** |
|
||||
| aucune metadata gRPC | SDK Go OrbitFlare | **DOCUMENTED** |
|
||||
| auth Devnet Free réelle | smoke KSP à exécuter | **PENDING** |
|
||||
| Élément | Usage prouvé | Verdict |
|
||||
|-----------------------|-----------------------------|------------------------------|
|
||||
| `X-ORBIT-KEY` | Customer API | **CONTROL-PLANE** |
|
||||
| Bearer Device Flow | Customer API v2 | **CONTROL-PLANE** |
|
||||
| RPC `api_key` | Solana HTTP RPC | **HTTP ONLY** |
|
||||
| License Key `ORBIT-*` | produit Solana Free | **DATA-PLANE PROVIDER** |
|
||||
| metadata `x-token` | Yellowstone gRPC OrbitFlare | **REQUIRED / PROVEN DOC** |
|
||||
| sans metadata | live KSP `pre.002` | **REJECTED UNAUTHENTICATED** |
|
||||
| IP whitelist | autre mode produit | **NOT ACTIVE FOR OPERATOR** |
|
||||
|
||||
Aucun secret opérateur n’est demandé pour le premier smoke `pre.002` ; la tentative initiale est explicitement sans metadata.
|
||||
Preuve live `pre.002` :
|
||||
|
||||
```text
|
||||
grpc_operation = SubscribeOpen
|
||||
grpc_status = Unauthenticated
|
||||
grpc_code = The request does not have valid authentication credentials
|
||||
```
|
||||
|
||||
Preuve provider : la référence Yellowstone OrbitFlare construit le client avec `X_TOKEN = ORBITFLARE_LICENSE_KEY` et indique que le token est porté par la metadata gRPC `x-token`.
|
||||
|
||||
Le Dashboard opérateur classe le produit `Solana Free` en `API Key Mode Active`. La License Key est donc le secret data-plane à utiliser ; elle n’est pas une `X-ORBIT-KEY` Customer API.
|
||||
|
||||
Le CLI OrbitFlare courant n’est pas utilisé comme oracle positif pour l’auth gRPC : après stockage de la License Key, `orbitflare ping --service grpc --network devnet` retourne `invalid x-token: api key not found`, et son implémentation courante n’injecte pas le secret dans le canal gRPC.
|
||||
|
||||
## 7. Heartbeat
|
||||
|
||||
@@ -163,28 +174,36 @@ Ces valeurs restent provider-owned et ne deviennent pas des validations généri
|
||||
|
||||
## 11. Config V3
|
||||
|
||||
| Exigence | Verdict |
|
||||
|-------------------------------------|-----------------|
|
||||
| nouveau format Config nécessaire | **NO** |
|
||||
| `provider = orbitflare` | **PASS STATIC** |
|
||||
| `protocol = solana_yellowstone` | **PASS STATIC** |
|
||||
| `cluster = devnet` | **PASS STATIC** |
|
||||
| Devnet URL publique | **PASS STATIC** |
|
||||
| secret metadata par défaut | **NO / PASS** |
|
||||
| `X-ORBIT-KEY` dans Transport Config | **FORBID** |
|
||||
| `x-token` si token gRPC prouvé | **DEFER** |
|
||||
| heartbeat dans `grpc_defaults` | **NO** |
|
||||
| Exigence | Verdict |
|
||||
|---------------------------------------|-----------------|
|
||||
| nouveau format Config nécessaire | **NO** |
|
||||
| `provider = orbitflare` | **PASS STATIC** |
|
||||
| `protocol = solana_yellowstone` | **PASS STATIC** |
|
||||
| `cluster = devnet` | **PASS STATIC** |
|
||||
| Devnet URL publique | **PASS STATIC** |
|
||||
| secret metadata `x-token` | **REQUIRED** |
|
||||
| valeur License Key via `KSP_SECRET_*` | **PASS DESIGN** |
|
||||
| `X-ORBIT-KEY` dans Transport Config | **FORBID** |
|
||||
| heartbeat dans `grpc_defaults` | **NO** |
|
||||
|
||||
`pre.002-fix.001` corrige le profil en :
|
||||
|
||||
```text
|
||||
secret_metadata = x-token <- ${KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN}
|
||||
```
|
||||
|
||||
La valeur effective doit rester redacted dans toutes les projections safe/debug.
|
||||
|
||||
## 12. Smoke Devnet attendu
|
||||
|
||||
Premier smoke :
|
||||
Smoke corrigé :
|
||||
|
||||
```text
|
||||
Config/fixture -> YellowstoneGrpcEndpointSettings
|
||||
License Key lue sur stdin
|
||||
YellowstoneGrpcMetadataEntry::secret("x-token", ...)
|
||||
provider = orbitflare
|
||||
cluster = devnet
|
||||
url = http://devnet.rpc.orbitflare.com:10000
|
||||
metadata vide
|
||||
open standard Subscribe
|
||||
request slots confirmed
|
||||
receive Slot non nul
|
||||
@@ -194,15 +213,18 @@ close borné
|
||||
|
||||
Verdicts actuels :
|
||||
|
||||
| Preuve | Verdict |
|
||||
|------------------------------|----------------------------|
|
||||
| endpoint parsé par Config/N1 | **PASS STATIC** |
|
||||
| connect Devnet | **PENDING** |
|
||||
| Subscribe accepté | **PENDING** |
|
||||
| Slot reçu | **PENDING** |
|
||||
| server Ping reçu | **PENDING** |
|
||||
| auto reply KSP déterministe | **PASS N1** |
|
||||
| close borné | **PASS N1 / LIVE PENDING** |
|
||||
| Preuve | Verdict |
|
||||
|----------------------------------------------|--------------------------------|
|
||||
| endpoint parsé par N1 | **PASS STATIC** |
|
||||
| sans metadata | **FAIL EXPECTED / CLASSIFIED** |
|
||||
| secret `x-token` représentable par Config V3 | **PASS STATIC** |
|
||||
| License Key redacted | **PASS STATIC** |
|
||||
| connect authentifié | **PENDING OPERATOR** |
|
||||
| Subscribe authentifié | **PENDING OPERATOR** |
|
||||
| Slot reçu | **PENDING OPERATOR** |
|
||||
| server Ping reçu | **PENDING OPERATOR** |
|
||||
| auto reply KSP déterministe | **PASS N1** |
|
||||
| close borné | **PASS N1 / LIVE PENDING** |
|
||||
|
||||
## 13. Provider overlay gate
|
||||
|
||||
@@ -266,48 +288,75 @@ ownership/close provider bornés
|
||||
Verdict :
|
||||
|
||||
```text
|
||||
architecture/sizing gate = POSITIVE
|
||||
operator pre.001 gate = PASS
|
||||
pre.002 static gate = READY FOR OPERATOR VALIDATION
|
||||
live provider gate = PENDING pre.002 characterization
|
||||
architecture/sizing gate = POSITIVE
|
||||
operator pre.001 gate = PASS
|
||||
pre.002 static/workspace gate = PASS
|
||||
pre.002 live auth hypothesis = FAIL CLASSIFIED
|
||||
pre.002-fix.001 static gate = READY FOR OPERATOR VALIDATION
|
||||
live provider gate = PENDING authenticated characterization
|
||||
```
|
||||
|
||||
## 16. Gate `pre.002` candidat
|
||||
## 16. Gate `pre.002` commité
|
||||
|
||||
| Critère | Verdict |
|
||||
|-------------------------------------------|----------------------|
|
||||
| Cargo `0.2.10-pre.2` | **PASS STATIC** |
|
||||
| profil Config `orbitflare_devnet` | **PASS STATIC** |
|
||||
| endpoint gRPC sans metadata | **PASS STATIC** |
|
||||
| companions HTTP/WS Devnet préservés | **PASS STATIC** |
|
||||
| nouveau format Config | **NO** |
|
||||
| `.env.example` / secret OrbitFlare ajouté | **NO** |
|
||||
| moteur N1 modifié | **NO** |
|
||||
| standard N2 modifié | **NO** |
|
||||
| SDK OrbitFlare ajouté | **NO** |
|
||||
| smoke provider dans Transport | **PASS STATIC** |
|
||||
| reconnect du smoke | zéro retry |
|
||||
| fenêtre caractérisation | 45 secondes |
|
||||
| `Subscribe -> Slot` live | **PENDING OPERATOR** |
|
||||
| `SubscribeUpdate::Ping` live | **PENDING OPERATOR** |
|
||||
| close live | **PENDING OPERATOR** |
|
||||
| auth Devnet Free sans metadata | **PENDING OPERATOR** |
|
||||
Validation opérateur du 2026-08-25 :
|
||||
|
||||
Commande live dédiée :
|
||||
| Critère | Verdict |
|
||||
|------------------------------------------|---------------------------------|
|
||||
| Cargo `0.2.10-pre.2` | **PASS** |
|
||||
| `cargo fmt --all` | **PASS** |
|
||||
| audit Rust | **PASS** |
|
||||
| audit Markdown | **PASS / 98 tables / 98 files** |
|
||||
| `cargo check --workspace` | **PASS** |
|
||||
| `cargo clippy --workspace --all-targets` | **PASS** |
|
||||
| Config unit | **114 sur 114 PASS** |
|
||||
| Transport unit | **383 sur 383 PASS** |
|
||||
| Transport public API | **49 sur 49 PASS** |
|
||||
| Transport release completeness | **43 sur 43 PASS** |
|
||||
| workspace test | **PASS** |
|
||||
| graphes Transport | **FOURNIS / PAS DE CONFLIT N1** |
|
||||
| moteur N1 modifié | **NO** |
|
||||
| standard N2 modifié | **NO** |
|
||||
| live sans metadata | **FAIL CLASSIFIED** |
|
||||
| `SubscribeOpen` | **UNAUTHENTICATED** |
|
||||
|
||||
Le failure live est un résultat de caractérisation utile et non une régression du moteur. Il impose un fix de configuration/auth provider parce que `pre.002` est déjà commité.
|
||||
|
||||
## 17. Gate `pre.002-fix.001`
|
||||
|
||||
| Critère | Verdict |
|
||||
|-----------------------------------------------------------------|----------------------|
|
||||
| Cargo `0.2.10-pre.2.fix.1` | **PASS STATIC** |
|
||||
| `.env.example` inventorie le secret OrbitFlare | **PASS STATIC** |
|
||||
| Config `secret_metadata` contient `x-token` | **PASS STATIC** |
|
||||
| valeur provenant de `KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN` | **PASS STATIC** |
|
||||
| test Config prouve redaction et classification secrète | **PASS STATIC** |
|
||||
| smoke lit la License Key sur stdin | **PASS STATIC** |
|
||||
| secret absent des arguments CLI | **PASS STATIC** |
|
||||
| moteur N1 modifié | **NO** |
|
||||
| standard N2 modifié | **NO** |
|
||||
| SDK OrbitFlare ajouté | **NO** |
|
||||
| connect authentifié | **PENDING OPERATOR** |
|
||||
| `Subscribe -> Slot` live | **PENDING OPERATOR** |
|
||||
| `SubscribeUpdate::Ping` live | **PENDING OPERATOR** |
|
||||
| close live | **PENDING OPERATOR** |
|
||||
|
||||
Commande live dédiée, avec secret saisi sans l’inscrire dans l’historique :
|
||||
|
||||
```bash
|
||||
cargo test -p ksp-onchain-transport-lib --test yellowstone_orbitflare_smoke -- --ignored --nocapture
|
||||
read -rsp 'OrbitFlare License Key: ' ORBITFLARE_LICENSE_KEY; echo
|
||||
printf '%s\n' "$ORBITFLARE_LICENSE_KEY" | cargo test -p ksp-onchain-transport-lib --test yellowstone_orbitflare_smoke -- --ignored --nocapture
|
||||
unset ORBITFLARE_LICENSE_KEY
|
||||
```
|
||||
|
||||
Le résultat live décide la suite :
|
||||
Interprétation :
|
||||
|
||||
```text
|
||||
Slot + Ping PASS
|
||||
-> OrbitFlare reste standard ; aucun provider heartbeat/facade
|
||||
-> auth et heartbeat standards composables ; pre.003 devient gate technique/live final
|
||||
|
||||
connection/auth failure
|
||||
-> classifier le service/licence réel avant toute metadata
|
||||
Subscribe/Slot PASS mais Ping absent
|
||||
-> divergence heartbeat provider à traiter au-dessus de N1/N2 dans pre.003
|
||||
|
||||
Slot PASS mais Ping absent
|
||||
-> divergence heartbeat à prouver avant une couche provider-specific
|
||||
auth encore rejetée avec la License Key x-token
|
||||
-> blocker provider/account à qualifier ; ne jamais modifier N1 pour contourner le gate
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user