197 lines
5.7 KiB
Markdown
197 lines
5.7 KiB
Markdown
<!-- file: deltas/0.2.10/pre.002-fix.001.md -->
|
||
<!-- version: 1 -->
|
||
|
||
# Delta `0.2.10-pre.002-fix.001` — OrbitFlare License Key `x-token`
|
||
|
||
## 1. Base et identité
|
||
|
||
Base exacte :
|
||
|
||
```text
|
||
0.2.10-pre.002 commité
|
||
```
|
||
|
||
Le fix porte une correction runtime/configuration de l’auth provider. La version Cargo devient donc :
|
||
|
||
```text
|
||
workspace.package.version = 0.2.10-pre.2.fix.1
|
||
commit attendu = v0.2.10-pre.002-fix.001
|
||
aucun tag prerelease
|
||
```
|
||
|
||
## 2. Défaut démontré par le live `pre.002`
|
||
|
||
Le gate statique/workspace `pre.002` est vert. Le smoke live sans metadata a atteint OrbitFlare puis l’ouverture du stream a échoué de manière sûre :
|
||
|
||
```text
|
||
grpc_operation = SubscribeOpen
|
||
grpc_status = Unauthenticated
|
||
grpc_code = The request does not have valid authentication credentials
|
||
```
|
||
|
||
Le Dashboard opérateur montre un produit `Solana Free` avec License Key `ORBIT-*` et `API Key Mode Active`.
|
||
|
||
La référence Yellowstone OrbitFlare précise ensuite le contrat data-plane :
|
||
|
||
```text
|
||
ORBITFLARE_LICENSE_KEY
|
||
-> metadata gRPC x-token
|
||
-> Yellowstone
|
||
```
|
||
|
||
Le `X-ORBIT-KEY` et le Bearer Device Flow restent des credentials Customer API et ne sont pas utilisés par Transport Yellowstone.
|
||
|
||
## 3. Correction Config V3
|
||
|
||
`config/std.transport.json` conserve le même endpoint et ajoute uniquement la metadata secrète requise :
|
||
|
||
```text
|
||
provider = orbitflare
|
||
cluster = devnet
|
||
protocol = solana_yellowstone
|
||
url = http://devnet.rpc.orbitflare.com:10000
|
||
metadata = []
|
||
secret_metadata = x-token <- ${KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN}
|
||
```
|
||
|
||
Aucun format Config V4 n’est créé.
|
||
|
||
`.env.example` inventorie désormais :
|
||
|
||
```text
|
||
KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN
|
||
```
|
||
|
||
La valeur locale attendue est la License Key `ORBIT-*`. Une `X-ORBIT-KEY` Customer API ne doit jamais être placée dans cette variable.
|
||
|
||
## 4. Preuve Config déterministe
|
||
|
||
Le test `committed_v3_orbitflare_devnet_profile_maps_provider_neutral_yellowstone_grpc_with_license_x_token` injecte un canari secret via `ConfigEnvironment` et prouve :
|
||
|
||
```text
|
||
profil explicite orbitflare_devnet
|
||
companions HTTP/WS Devnet inchangés
|
||
endpoint Yellowstone OrbitFlare inchangé
|
||
metadata key = x-token
|
||
metadata classée secret
|
||
validation Transport PASS
|
||
URL provider absente du Debug
|
||
canari secret absent du Debug
|
||
X-ORBIT-KEY absent du Transport
|
||
```
|
||
|
||
## 5. Smoke live corrigé
|
||
|
||
`yellowstone_orbitflare_smoke.rs` ne dépend toujours pas de Config et ne lit aucun environnement. Il suit le pattern de sécurité déjà utilisé par les smokes PublicNode :
|
||
|
||
```text
|
||
une License Key lue sur stdin
|
||
aucun secret en argument de ligne de commande
|
||
YellowstoneGrpcMetadataEntry::secret("x-token", ...)
|
||
reconnect max_retries = 0
|
||
Subscribe slots confirmed
|
||
fenêtre Slot + Ping = 45 s
|
||
close borné
|
||
```
|
||
|
||
Le smoke vérifie également que la License Key n’apparaît pas dans `Debug`.
|
||
|
||
Commande opérateur :
|
||
|
||
```bash
|
||
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
|
||
```
|
||
|
||
## 6. Invariant architectural
|
||
|
||
Toujours inchangés :
|
||
|
||
```text
|
||
src/grpc_settings.rs
|
||
src/grpc_channel.rs
|
||
src/grpc_unary.rs
|
||
src/grpc_subscribe.rs
|
||
src/grpc_stream.rs
|
||
```
|
||
|
||
Le standard Yellowstone N2 reste inchangé. Aucun SDK OrbitFlare runtime n’est ajouté.
|
||
|
||
L’auth provider est entièrement composée par la surface metadata secrète déjà existante.
|
||
|
||
## 7. Heartbeat
|
||
|
||
Ce fix ne matérialise aucun heartbeat OrbitFlare.
|
||
|
||
Le rerun authentifié doit d’abord qualifier :
|
||
|
||
```text
|
||
Slot non nul
|
||
SubscribeUpdate::Ping serveur
|
||
```
|
||
|
||
Si les deux sont observés, N1 répond déjà automatiquement au Ping standard et aucune couche provider heartbeat n’est requise.
|
||
|
||
Si le stream authentifié fonctionne mais n’émet aucun Ping serveur dans la fenêtre de caractérisation, `pre.003` devient une tranche provider-specific au-dessus de N1/N2. Il reste interdit d’ajouter un timer OrbitFlare au moteur gRPC.
|
||
|
||
## 8. Validation disponible dans l’environnement de génération
|
||
|
||
Exécuté :
|
||
|
||
```text
|
||
python3 scripts/audit_rust_workspace_rules.py
|
||
General Rust rule audit: clean
|
||
Rust export completeness audit: 0 candidate(s)
|
||
KSP workspace Rust rule audit: clean
|
||
|
||
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.10
|
||
Markdown table audit: clean (99 table(s), 99 file(s))
|
||
|
||
config/std.transport.json
|
||
JSON parse PASS
|
||
JSON Schema validation PASS
|
||
|
||
comparaison N1 avec pre.002
|
||
grpc_settings.rs inchangé
|
||
grpc_channel.rs inchangé
|
||
grpc_unary.rs inchangé
|
||
grpc_subscribe.rs inchangé
|
||
grpc_stream.rs inchangé
|
||
```
|
||
|
||
Aucune commande Cargo n’est déclarée exécutée dans l’environnement de génération.
|
||
|
||
## 9. Gates opérateur
|
||
|
||
Après application du fix :
|
||
|
||
```bash
|
||
cargo fmt --all
|
||
python3 scripts/audit_rust_workspace_rules.py
|
||
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.10
|
||
cargo check --workspace
|
||
cargo clippy --workspace --all-targets
|
||
cargo test -p ksp-config-lib
|
||
cargo test -p ksp-onchain-transport-lib
|
||
cargo test -p ksp-core-lib --test workspace_dependencies
|
||
cargo test --workspace
|
||
```
|
||
|
||
Puis exécuter le live authentifié décrit en section 5.
|
||
|
||
## 10. Fichiers ajoutés/modifiés
|
||
|
||
```text
|
||
Cargo.toml
|
||
.env.example
|
||
config/std.transport.json
|
||
crates/ksp-config-lib/unit_tests/transport.rs
|
||
crates/ksp-onchain-transport-lib/tests/yellowstone_orbitflare_smoke.rs
|
||
docs/plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md
|
||
docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md
|
||
deltas/0.2.10/pre.002-fix.001.md
|
||
```
|
||
|
||
Le delta commité `deltas/0.2.10/pre.002.md` reste immuable.
|