9.2 KiB
Delta v0.2.1-pre.005
Base
Base attendue :
v0.2.1-pre.004-fix.002
Cette base a été validée localement par le user avec cargo fmt --all, cargo check --workspace, cargo clippy --workspace --all-targets, cargo test -p ksp-onchain-transport-lib et cargo test --workspace.
Version Cargo cible :
0.2.1-pre.5
Objectif
Matérialiser la première exécution réseau HTTP complète de ksp-onchain-transport-lib et les quatre méthodes typées canari assignées à 0.2.1 :
getHealth
getVersion
getGenesisHash
getBalance
La tranche doit également corriger l'ownership des canaries de dépendances générales : les contrôles portant sur le workspace entier ne restent pas dans la crate métier Transport et sont centralisés dans la surface de tests de ksp-core-lib tant qu'aucun outil d'audit dédié n'existe.
Vérification de la surface Solana
La documentation Solana HTTP officielle a été revérifiée le 17 août 2026 pour les quatre canaris :
getHealth: aucun paramètre, résultat stable"ok"lorsque le node est sain ;getGenesisHash: aucun paramètre, résultat string base58 ;getVersion: aucun paramètre, objet contenantsolana-coreetfeature-setoptionnel/null ;getBalance: pubkey base58 obligatoire, configuration optionnellecommitment/minContextSlot, réponse{ context, value }oùvalueest le solde en lamports.
Exécuteur HTTP JSON-RPC
Nouvelle surface publique :
HttpTransportPool::execute_standard_rpc(...)
L'exécuteur :
- vérifie le descriptor RPC audité et son support runtime ;
- alloue un identifiant JSON-RPC numérique KSP ;
- construit et sérialise
JsonRpcRequestsans exposer les params dansDebug; - dérive le request-kind depuis le registre ;
- fixe une deadline commune à partir du plus petit
request_timeoutdes endpoints compatibles ; - acquiert un
HttpRequestPermit, donc respecte rôles/capabilities/priorité/fairness/RPS/burst/concurrence/cooldown ; - exécute un POST
application/jsonvia lereqwest::Clientprivé de l'endpoint ; - mappe connexion, timeout, HTTP status, JSON invalide, protocole JSON-RPC et RPC application error vers les codes KSP existants ;
- met à jour la santé passive du rôle ;
- applique le retry/backoff centralisé sans dépasser la deadline commune.
Les retries libèrent le permit précédent puis réacquièrent explicitement capacité RPS/concurrence : ils ne contournent donc pas les limites runtime du pool.
HTTP status, Retry-After et retry
Le raccordement réseau de la résilience est désormais effectif :
429->record_rate_limited, cooldown de rôle etHttpRetryCause::RateLimited;Retry-Aftersous forme HTTP delta-seconds ->Duration, puis borne défensive déjà possédée par la résilience ;408,500,502,503,504->HttpRetryCause::TemporaryHttp;- erreur de connexion reqwest ->
HttpRetryCause::Connection+NotDispatched; - timeout reqwest ->
HttpRetryCause::Timeout+DispatchedAmbiguous; - autres erreurs request -> non retryables automatiquement ;
- RPC application error et réponse invalide restent hors retry transport.
Le parsing d'une forme HTTP-date de Retry-After n'est pas introduit dans cette tranche : si le header n'est pas un delta-seconds valide, le cooldown local configuré/fallback reste utilisé.
La règle NeverAfterDispatch reste centralisée dans evaluate_transport_retry() ; l'exécuteur générique ne la contourne pas et prépare donc correctement les futurs appels write/submission de 0.2.3.
Quatre canaris typés
getHealth
Nouvelle méthode :
HttpTransportPool::get_health(...)
Résultat public :
SolanaNodeHealth::Healthy
Toute autre forme qu'un résultat string exact "ok" est classée invalid_response.
getGenesisHash
Nouvelle méthode :
HttpTransportPool::get_genesis_hash(...)
Résultat public :
SolanaGenesisHash
Le wrapper exige un string non vide et trimé et n'utilise pas abusivement Pubkey pour représenter sémantiquement un hash de genesis.
getVersion
Nouvelle méthode :
HttpTransportPool::get_version(...)
Résultat public :
SolanaNodeVersion
solana_core: String
feature_set: Option<u32>
getBalance
Nouvelle méthode :
HttpTransportPool::get_balance(...)
L'adresse est reçue sous forme ksp_core_lib::Pubkey, conformément à l'ownership Core du type Solana bas niveau.
Nouveaux contrats :
SolanaCommitment
GetBalanceConfig
SolanaRpcContext
GetBalanceResult
GetBalanceConfig encode uniquement les champs présents ; un config vide n'ajoute pas un second paramètre inutile.
Fixtures déterministes
Nouvelles fixtures :
crates/ksp-onchain-transport-lib/fixtures/http/get_health.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_genesis_hash.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_version.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_balance.success.json
Les tests utilisent un serveur TCP local déterministe pour exercer réellement le POST HTTP sans dépendre de Devnet ou d'Internet.
Ils vérifient notamment :
- les quatre réponses typées ;
- le nom de méthode envoyé ;
- les params
getBalance, dontcommitmentetminContextSlot; - un cycle
429 + Retry-After: 0 -> retry -> succès; - le mapping d'un timeout reqwest vers
ERROR_CODE_TIMEOUT.
Le smoke réseau réel reste opt-in et appartient toujours à pre.007.
Centralisation des canaries de dépendances
Le fichier suivant est supprimé :
crates/ksp-onchain-transport-lib/tests/dependency_boundary.rs
Les deux contrôles qu'il contenait sont transférés vers :
crates/ksp-core-lib/tests/workspace_dependencies.rs
Ils continuent de vérifier :
- absence d'activation
features = [...]sous[workspace.dependencies]; - maintien de
default-featuresau root ; - firewall direct Transport -> pas de Config/Store/Program/
tracing; - feature-set direct attendu de
reqwestettokiodans le manifest Transport.
Nouvelle règle DEP-CARGO-007 : les canaries qui inspectent une politique générale du workspace ou plusieurs manifests appartiennent à une surface de gouvernance/fondation, actuellement ksp-core-lib, et non à une crate métier spécialisée.
ROADMAP et plan
ROADMAP.md reçoit uniquement la mise à jour synthétique normale de la release : exécution HTTP et quatre canaris deviennent acquis ; Config standard et clôture restent à venir.
Le plan 008 marque pre.005 réalisé et ajoute son état détaillé. L'historique technique reste dans deltas/.
Tests
Après déplacement des deux canaries workspace hors de Transport et ajout des nouveaux tests :
ksp-onchain-transport-lib : 78 tests Rust déclarés
ksp-core-lib : +2 tests d'intégration workspace_dependencies
La suite Transport reste propriétaire uniquement des tests fonctionnels/API de son domaine ; les canaries workspace générales sont exécutées via Core lors du cargo test --workspace.
Dépendances
Aucune nouvelle dépendance externe et aucune nouvelle feature externe ne sont introduites.
La politique de pre.004-fix.001/.002 reste inchangée : versions/default-features au root, features d'usage dans chaque crate consommatrice.
Fichiers ajoutés
crates/ksp-core-lib/tests/workspace_dependencies.rs
crates/ksp-onchain-transport-lib/fixtures/http/get_balance.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_genesis_hash.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_health.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_version.success.json
crates/ksp-onchain-transport-lib/src/executor.rs
crates/ksp-onchain-transport-lib/src/rpc_canary.rs
crates/ksp-onchain-transport-lib/unit_tests/executor.rs
crates/ksp-onchain-transport-lib/unit_tests/rpc_canary.rs
deltas/0.2.1/pre.005.md
Fichiers modifiés
Cargo.toml
ROADMAP.md
crates/ksp-onchain-transport-lib/src/client.rs
crates/ksp-onchain-transport-lib/src/lib.rs
crates/ksp-onchain-transport-lib/src/pool.rs
crates/ksp-onchain-transport-lib/tests/public_api.rs
docs/plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md
docs/rules/RULES_DEPENDENCIES.md
Fichiers supprimés
crates/ksp-onchain-transport-lib/tests/dependency_boundary.rs
Validation
Non exécutée dans le sandbox de génération : cargo et rustc n'y sont pas installés.
Après application :
cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-onchain-transport-lib
cargo test -p ksp-core-lib
cargo test --workspace
Aucune dépendance/feature n'ayant changé, un cargo tree complet n'est pas requis pour cette tranche. Il peut néanmoins être rejoué au checkpoint final pre.007 comme prévu.
Suite
Tranche suivante prévue :
0.2.1-pre.006
Périmètre : document/schema/exemple Config standard std.transport, enregistrement dans Config, adapter Config -> Transport et tests de sensibilité/provenance/env sans créer de dépendance inverse Transport -> Config.