5.7 KiB
Delta 0.2.10-pre.002-fix.001 — OrbitFlare License Key x-token
1. Base et identité
Base exacte :
0.2.10-pre.002 commité
Le fix porte une correction runtime/configuration de l’auth provider. La version Cargo devient donc :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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é :
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 :
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
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.