9.0 KiB
Delta 0.2.2-pre.005 — sept wrappers HTTP Cluster simples typés
Base requise
Livraison précédente validée localement par l'opérateur :
0.2.2-pre.004
workspace.package.version = "0.2.2-pre.4"
La validation opérateur du 2026-08-18 a confirmé :
cargo fmt --all OK
cargo check --workspace OK
cargo clippy --workspace --all-targets OK
cargo test -p ksp-onchain-transport-lib OK
Résultats Transport de cette base :
106 unit tests
11 public API tests
4 release completeness tests
0 warning signalé par check/clippy
Le plan canonique reste docs/plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md version 3.
Contrôle documentaire avant nouvelle tranche
Le contrôle de cohérence demandé entre prereleases confirme :
ROADMAP.mdconserve correctement0.2.2en cours[/];- le plan
009attribue exactement àpre.005les sept méthodes Cluster simples implémentées ici ; pre.006conserve exactement cinq méthodes différées :getLeaderSchedule,getSlot,getSlotLeader,getSlotLeaders,getVoteAccounts;- les index
docs/000-README.md,docs/plans/000-README.mdetdocs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.mdrestent cohérents et ne nécessitent aucune modification.
Objectif
Implémenter les sept wrappers publics typés Cluster simples prévus par le plan :
getClusterNodes
getEpochInfo
getEpochSchedule
getHighestSnapshotSlot
getIdentity
getMaxRetransmitSlot
getMaxShredInsertSlot
Tous passent par la foundation HTTP commune :
wrapper typé
-> descriptor audité
-> execute_standard_rpc
-> pool/admission/retry/deadline
-> reqwest HTTP
-> JSON-RPC validation
-> décodage DTO KSP
Aucun wrapper Cluster ne contacte reqwest directement.
Version Cargo
Conformément au cycle prerelease KSP :
0.2.2-pre.4 -> 0.2.2-pre.5
Aucune dépendance ni feature Cargo n'est ajoutée ou retirée.
Réaudit ciblé du contrat courant
Les pages RPC Solana courantes ont été revérifiées le 2026-08-18 :
https://solana.com/docs/rpc/http/getclusternodes
https://solana.com/docs/rpc/http/getepochinfo
https://solana.com/docs/rpc/http/getepochschedule
https://solana.com/docs/rpc/http/gethighestsnapshotslot
https://solana.com/docs/rpc/http/getidentity
https://solana.com/docs/rpc/http/getmaxretransmitslot
https://solana.com/docs/rpc/http/getmaxshredinsertslot
Le contrat reste cohérent avec le plan 009 :
getClusterNodesne prend aucun paramètre et renvoie une liste de contacts de noeuds ;getEpochInfoaccepte uniquement la config communecommitment/minContextSlotet conservetransactionCountnullable ;getEpochSchedulene prend aucun paramètre et renvoie la structure fixe d'epoch schedule ;getHighestSnapshotSlotne prend aucun paramètre, conserveincrementalnullable et laisse l'absence de snapshot comme erreur JSON-RPC distante ;getIdentityne prend aucun paramètre et renvoie l'objet{ identity }, converti enPubkeyKSP ;getMaxRetransmitSlotetgetMaxShredInsertSlotne prennent aucun paramètre et renvoient chacun unu64.
Le champ Agave v4.2.1 clientId: Option<String> identifié par pre.001-fix.001 reste conservé par SolanaClusterNode, sans devenir obligatoire.
Surface typée Cluster simple
getClusterNodes
role -> Vec<SolanaClusterNode>
Chaque pubkey est validée et convertie en ksp_core_lib::Pubkey. Les endpoints réseau restent des chaînes optionnelles. Les champs optionnels absents, y compris clientId, restent None.
getEpochInfo
role + Option<SolanaContextConfig> -> SolanaEpochInfo
Un config explicitement vide est omis de params. transactionCount: null reste None.
getEpochSchedule
role -> SolanaEpochSchedule
Aucune transformation métier n'est introduite.
getHighestSnapshotSlot
role -> SolanaSnapshotSlotInfo
incremental reste optionnel. Une erreur RPC « no snapshot » n'est pas convertie en valeur sentinelle.
getIdentity
role -> Pubkey
Le wrapper valide la chaîne identity avant de l'exposer comme Pubkey, sans recopier une valeur wire invalide dans le diagnostic.
getMaxRetransmitSlot / getMaxShredInsertSlot
role -> u64
Les deux wrappers partagent un chemin privé simple de décodage u64 et ne créent aucun DTO artificiel.
Activation ciblée des helpers préparés en pre.002
Les helpers Cluster nécessaires à cette tranche deviennent production-live uniquement maintenant qu'ils ont des consommateurs runtime :
SolanaClusterNode::decode_wire+WireClusterNode;SolanaEpochInfo::decode_wire+WireEpochInfo;SolanaEpochSchedule::decode_wire+WireEpochSchedule;SolanaSnapshotSlotInfo::decode_wire+WireSnapshotSlotInfo.
Les helpers spécifiques à getLeaderSchedule et getVoteAccounts restent sous #[cfg(test)] jusqu'à pre.006. Aucun #[allow(dead_code)] n'est ajouté.
Fixtures HTTP déterministes ajoutées
crates/ksp-onchain-transport-lib/fixtures/http/get_cluster_nodes.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_cluster_nodes.invalid_pubkey.json
crates/ksp-onchain-transport-lib/fixtures/http/get_epoch_info.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_epoch_schedule.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_highest_snapshot_slot.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_highest_snapshot_slot.error.json
crates/ksp-onchain-transport-lib/fixtures/http/get_identity.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_identity.invalid_pubkey.json
crates/ksp-onchain-transport-lib/fixtures/http/get_max_retransmit_slot.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_max_shred_insert_slot.success.json
Les tests utilisent uniquement un serveur HTTP loopback local.
Couverture de tests ajoutée
Les tests couvrent notamment :
- requête sans paramètres pour les six méthodes sans config ;
- sérialisation exacte
commitment + minContextSlotpourgetEpochInfo; - omission d'un
SolanaContextConfigexplicitement vide ; transactionCount: null;- champs ClusterNode optionnels présents et absents ;
- conservation de
clientIdAgavev4.2.1; - rejet d'une
pubkeyde noeud invalide ; incremental: null;- propagation d'une erreur RPC « no snapshot » ;
- validation de l'identity
Pubkey; - décodage des deux slots max comme
u64.
Le test public compile explicitement les sept nouvelles méthodes depuis HttpTransportPool.
Un canari release fige le sous-ensemble pre.005 exact et vérifie Read + RetrySafe pour les sept descriptors, tout en laissant les cinq méthodes Cluster de pre.006 enregistrées mais différées.
Après application, la cible Transport attendue devient :
116 unit tests
12 public API tests
5 release completeness tests
Fichiers ajoutés
crates/ksp-onchain-transport-lib/fixtures/http/get_cluster_nodes.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_cluster_nodes.invalid_pubkey.json
crates/ksp-onchain-transport-lib/fixtures/http/get_epoch_info.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_epoch_schedule.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_highest_snapshot_slot.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_highest_snapshot_slot.error.json
crates/ksp-onchain-transport-lib/fixtures/http/get_identity.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_identity.invalid_pubkey.json
crates/ksp-onchain-transport-lib/fixtures/http/get_max_retransmit_slot.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_max_shred_insert_slot.success.json
deltas/0.2.2/pre.005.md
Fichiers modifiés
Cargo.toml
crates/ksp-onchain-transport-lib/src/rpc_cluster.rs
crates/ksp-onchain-transport-lib/unit_tests/rpc_cluster.rs
crates/ksp-onchain-transport-lib/tests/public_api.rs
crates/ksp-onchain-transport-lib/tests/release_completeness.rs
Fichiers supprimés
Aucun.
Documentation durable
Aucune modification de ROADMAP/plan/index n'est requise par cette tranche après le contrôle documentaire : les documents existants décrivent déjà exactement ce découpage.
CHANGELOG.md reste réservé à la clôture stable.
Validation à exécuter sur le checkout opérateur
cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-onchain-transport-lib
La livraison n'affirme pas que ces commandes ont été exécutées dans l'environnement de génération.
Critères de validation de pre.005
pre.005 est validable lorsque :
- les quatre commandes ci-dessus passent sans warning nouveau ;
- les 116 unit tests passent ;
- les 12 tests public API passent ;
- les 5 tests release completeness passent ;
- aucun helper Cluster simple production-live n'est
dead_code; - les cinq wrappers complexes de
pre.006restent hors de cette tranche.