Files
khadhroony-solana-project/deltas/0.2.9/pre.013-fix.003.md

4.5 KiB

Delta 0.2.9-pre.013-fix.003 — credentials PublicNode par réseau + fermeture live bornée

1. Base

0.2.9-pre.013-fix.002

Cette tranche reste strictement dans le couloir technique/live de fin de release. Elle ne modifie ni README/USAGE, ni plan/validation, ni CHANGELOG/ROADMAP, ni le prompt de la release suivante.

2. Motif opérateur

Deux exécutions live de yellowstone_publicnode_smoke avec deux personal tokens PublicNode différents ont montré que l'hypothèse de fix.002 « un token commun Mainnet/Testnet » n'est pas suffisamment générale :

  • avec le premier token fourni au smoke, SubscribeOpen a retourné PERMISSION_DENIED sur Mainnet et Testnet ;
  • avec le second token, Mainnet a encore retourné PERMISSION_DENIED ;
  • avec ce même second token, Testnet a franchi SubscribeOpen, reçu le slot attendu, puis close() a retourné le timeout borné de cinq secondes parce que le provider n'a pas terminé son half-close avant la deadline KSP.

Ces observations ne suffisent pas à affirmer que PublicNode documente des tokens obligatoirement liés à un réseau. Elles imposent en revanche que KSP puisse fournir des credentials distincts à Mainnet et Testnet et que le smoke ne suppose plus leur interchangeabilité.

3. Version technique

workspace.package.version devient :

0.2.9-pre.13.fix.3

4. Config V3 — secrets PublicNode séparés

Le placeholder partagé est supprimé au profit de deux variables indépendantes :

KSP_SECRET_PUBLICNODE_MAINNET_GRPC_X_TOKEN
KSP_SECRET_PUBLICNODE_TESTNET_GRPC_X_TOKEN

Le profil publicnode_mainnet consomme uniquement la première ; le profil publicnode_testnet consomme uniquement la seconde. Les deux restent injectées comme metadata gRPC secrète x-token, jamais dans l'URL.

.env.example inventorie les deux noms sans valeur réelle. Le test Config construit chaque profil avec uniquement son propre canary d'environnement afin de vérifier cette séparation.

5. Smoke PublicNode

Le smoke Transport reste programmatique et indépendant de Config/env KSP. Son stdin contient maintenant exactement deux lignes :

ligne 1 = token Mainnet
ligne 2 = token Testnet

Les deux valeurs sont lues une seule fois dans un OnceLock et sont affectées explicitement au réseau correspondant. L'ordre d'exécution des deux tests n'influence donc pas l'association token/réseau.

Après ouverture de Subscribe et réception d'un YellowstoneSubscribeUpdate::Slot avec slot > 0, la fermeture live accepte deux résultats :

  1. fermeture gracieuse Ok(()) du provider ;
  2. ERROR_CODE_TIMEOUT produit par la deadline KSP de half-close.

Le second résultat ne masque pas un échec fonctionnel : il n'est accepté qu'après réception prouvée d'un slot et un timeout externe de sept secondes vérifie que session.close() reste lui-même borné. Toute autre erreur de fermeture reste un échec du smoke.

Le runtime Yellowstone n'est pas modifié par cette adaptation provider/live ; ses contrats déterministes de fermeture restent inchangés.

6. Gate opérateur ciblé

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.9
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

Puis, avec les deux personal tokens réellement générés :

read -rsp 'PublicNode Mainnet Yellowstone x-token: ' PUBLICNODE_MAINNET_TOKEN
echo
read -rsp 'PublicNode Testnet Yellowstone x-token: ' PUBLICNODE_TESTNET_TOKEN
echo
printf '%s\n%s\n' "$PUBLICNODE_MAINNET_TOKEN" "$PUBLICNODE_TESTNET_TOKEN" \
  | cargo test -p ksp-onchain-transport-lib --test yellowstone_publicnode_smoke -- --ignored --nocapture
unset PUBLICNODE_MAINNET_TOKEN PUBLICNODE_TESTNET_TOKEN

Attendu :

2 passed
0 failed
0 ignored

Puis les graphes et le gate workspace de fermeture technique :

cargo tree -p ksp-onchain-transport-lib
cargo tree -p ksp-onchain-transport-lib --duplicates
cargo tree --duplicates
cargo test --workspace

7. Fichiers modifiés/ajoutés

.env.example
Cargo.toml
config/std.transport.json
crates/ksp-config-lib/unit_tests/transport.rs
crates/ksp-onchain-transport-lib/tests/yellowstone_publicnode_smoke.rs
deltas/0.2.9/pre.013-fix.003.md