From d32d8de3a5984f46686425ca46a7be7ec6cf304a Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Mon, 24 Aug 2026 17:36:41 +0200 Subject: [PATCH] v0.2.9-pre.009-fix.001 --- Cargo.toml | 4 +- .../src/grpc_subscribe.rs | 8 +- .../tests/public_api.rs | 3 +- deltas/0.2.9/pre.009-fix.001.md | 75 ++++++++++++++++++ .../plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md | 25 +++++- .../validation/012-V0_2_9_YELLOWSTONE_GRPC.md | 77 ++++++++++++------- 6 files changed, 154 insertions(+), 38 deletions(-) create mode 100644 deltas/0.2.9/pre.009-fix.001.md diff --git a/Cargo.toml b/Cargo.toml index ed14a57..a0a6b93 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 249 +# version: 250 [workspace] resolver = "3" members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"] [workspace.package] -version = "0.2.9-pre.9" +version = "0.2.9-pre.9.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-onchain-transport-lib/src/grpc_subscribe.rs b/crates/ksp-onchain-transport-lib/src/grpc_subscribe.rs index 110126b..feff696 100644 --- a/crates/ksp-onchain-transport-lib/src/grpc_subscribe.rs +++ b/crates/ksp-onchain-transport-lib/src/grpc_subscribe.rs @@ -1,5 +1,5 @@ // file: crates/ksp-onchain-transport-lib/src/grpc_subscribe.rs -// version: 7 +// version: 8 const MAX_GRPC_BLOCKHASH_TEXT_LENGTH_BYTES: usize = 128; const MAX_GRPC_BLOCK_VECTOR_COUNT: usize = 65_536; @@ -2478,7 +2478,7 @@ pub enum YellowstoneSubscribeUpdate { /// Slot lifecycle update. Slot(crate::YellowstoneSlotUpdate), /// Full transaction update. - Transaction(crate::YellowstoneTransactionUpdate), + Transaction(std::boxed::Box), /// Lightweight transaction-status update. TransactionStatus(crate::YellowstoneTransactionStatusUpdate), /// Full block update. @@ -3679,7 +3679,9 @@ pub(crate) fn yellowstone_subscribe_update_from_wire( return match kind { 1 => decode_account_update(wire).map(crate::YellowstoneSubscribeUpdate::Account), 2 => decode_slot_update(wire).map(crate::YellowstoneSubscribeUpdate::Slot), - 3 => decode_transaction_update(wire).map(crate::YellowstoneSubscribeUpdate::Transaction), + 3 => decode_transaction_update(wire).map(|update| { + return crate::YellowstoneSubscribeUpdate::Transaction(std::boxed::Box::new(update)); + }), 4 => decode_transaction_status_update(wire).map(crate::YellowstoneSubscribeUpdate::TransactionStatus), 5 => decode_block_update(wire).map(crate::YellowstoneSubscribeUpdate::Block), 6 => decode_ping_update(wire).map(crate::YellowstoneSubscribeUpdate::Ping), diff --git a/crates/ksp-onchain-transport-lib/tests/public_api.rs b/crates/ksp-onchain-transport-lib/tests/public_api.rs index f0ff5f4..f3aac48 100644 --- a/crates/ksp-onchain-transport-lib/tests/public_api.rs +++ b/crates/ksp-onchain-transport-lib/tests/public_api.rs @@ -1,5 +1,5 @@ // file: crates/ksp-onchain-transport-lib/tests/public_api.rs -// version: 46 +// version: 47 //! Integration tests for the public `ksp-onchain-transport-lib` consumer contract. @@ -973,6 +973,7 @@ fn public_v0_2_9_pre_008_yellowstone_blocks_contract_is_available_from_crate_roo #[test] fn public_v0_2_9_pre_009_yellowstone_bidi_session_contract_is_available_from_crate_root() { fn assert_send() { + let _ = std::marker::PhantomData::; return; } assert_send::(); diff --git a/deltas/0.2.9/pre.009-fix.001.md b/deltas/0.2.9/pre.009-fix.001.md new file mode 100644 index 0000000..fd6bb65 --- /dev/null +++ b/deltas/0.2.9/pre.009-fix.001.md @@ -0,0 +1,75 @@ + + + +# Delta `0.2.9-pre.009-fix.001` — hygiène Clippy du flux bidi + +## 1. Objet + +Supprimer les deux warnings Clippy observés au gate opérateur de `pre.009`, sans modifier le protocole Yellowstone, le lifecycle bidi, les bornes ni les dépendances. + +## 2. Gate opérateur avant fix + +| Gate | Résultat | +|------------------------------------------|-------------------| +| `cargo fmt --all` | PASS | +| audit Rust workspace | PASS / clean | +| `cargo check --workspace` | PASS | +| `cargo clippy --workspace --all-targets` | PASS + 2 warnings | +| Transport unit | 379/379 PASS | +| Transport `public_api` | 48/48 PASS | +| Transport `release_completeness` | 42/42 PASS | +| Transport doctests | 4/4 PASS | +| Core dependency canary | 3/3 PASS | +| `cargo test --workspace` | PASS | + +Warnings : + +```text +clippy::large_enum_variant + YellowstoneSubscribeUpdate::Transaction >= 664 bytes + YellowstoneSubscribeUpdate::Block >= 280 bytes + +clippy::extra_unused_type_parameters + assert_send() dans tests/public_api.rs +``` + +## 3. Correctifs + +### 3.1 `YellowstoneSubscribeUpdate::Transaction` + +La variante devient : + +```rust +Transaction(Box) +``` + +Le décodeur alloue cette indirection uniquement pour les updates transaction. Le DTO `YellowstoneTransactionUpdate`, le wire protobuf et les autres variantes ne changent pas. La queue bidi n’a plus à dimensionner chaque élément sur la variante transaction de ~664 octets. + +### 3.2 Canari `Send` + +Le helper de test conserve `T: Send` et matérialise `PhantomData` dans son corps. Le paramètre générique devient réellement utilisé sans construction réseau ni changement de contrat. + +## 4. Frontières inchangées + +```text +reconnect / resubscribe / replay OUT -> pre.010 +SubscribeDeshred OUT 0.2.9 +PublicNode / Config V3 OUT pre.009 +dépendances / features inchangées +``` + +Aucun `#[allow(clippy::...)]` n’est ajouté. + +## 5. Gate attendu + +```bash +cargo fmt --all +python3 scripts/audit_rust_workspace_rules.py +cargo check --workspace +cargo clippy --workspace --all-targets +cargo test -p ksp-onchain-transport-lib +cargo test -p ksp-core-lib --test workspace_dependencies +cargo test --workspace +``` + +Attendu : Clippy sans warning et compteurs fonctionnels inchangés à 379 unit / 48 public API / 42 release-completeness / 4 doctests. diff --git a/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md b/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md index 2b97126..2667c48 100644 --- a/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md +++ b/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md @@ -1,9 +1,9 @@ - + # Plan `0.2.9` — moteur Yellowstone gRPC + standard Solana + PublicNode -> **Statut : `0.2.9-pre.008-fix.001` est fermée sur gate opérateur sans warning : fmt/audit/check/Clippy/workspace PASS, Transport 370 unit + 47 public API + 41 completeness + 4 doctests. `0.2.9-pre.009` est candidate : stream bidi standard réel, mutation request, Ping/Pong, backpressure, half-close et shutdown borné ; reconnect/replay restent `pre.010`.** +> **Statut : `0.2.9-pre.009` est fonctionnellement verte sur gate opérateur (Transport 379 unit + 48 public API + 42 completeness + 4 doctests, workspace PASS), mais Clippy signale deux warnings d’hygiène. `0.2.9-pre.009-fix.001` est candidate pour les supprimer sans modifier le protocole ni le lifecycle ; reconnect/replay restent `pre.010`.** ## 1. Objet, base et état d'ouverture @@ -934,8 +934,8 @@ pre.007 DONE — standard Solana : Transactions + transaction_status pre.008 DONE — standard Solana : Blocks + block_meta + entry budget : 15–20 min ; gate final fix.001 : fmt/audit/check/Clippy/workspace PASS sans warning + Transport 370/47/41/4 -pre.009 CANDIDATE — moteur partagé : bidi mutation + Ping/Pong + half-close + backpressure + shutdown - budget : 15–20 min ; preuve : fixture locale bidi + bounded queues + half-close/drop/timeout déterministes +pre.009 FIX.001 CANDIDATE — moteur partagé : bidi mutation + Ping/Pong + half-close + backpressure + shutdown + budget : 15–20 min ; gate fonctionnel 379/48/42/4 + workspace PASS ; fix de deux warnings Clippy pre.010 moteur partagé : reconnect/resubscribe + from_slot/ReplayInfo + gaps/duplicates budget : 15–20 min ; preuve : reconnect local déterministe + aucune promesse lossless @@ -1371,3 +1371,20 @@ Le reconnect est volontairement absent de `pre.009` : un server half-close est n **Gate candidat :** audit statique clean ; fixture locale couvre round-trip, mutation, Ping/Pong, server half-close, client half-close, shutdown hostile borné, Drop best-effort, update overflow, Status distant sûr, update malformed et rejet outbound oversized. Compilation/Clippy/tests opérateur requis avant fermeture. +## 27. `pre.009-fix.001` — compaction de l’update transaction et hygiène du canari `Send` + +Le gate opérateur de `pre.009` valide intégralement le comportement bidi : fmt/audit/check passent ; Transport passe 379/379 unit, 48/48 public API, 42/42 release-completeness et 4/4 doctests ; le dependency canary Core passe 3/3 et `cargo test --workspace` est vert. Clippy termine avec succès mais signale deux warnings : + +```text +large_enum_variant YellowstoneSubscribeUpdate::Transaction +extra_unused_type_parameters assert_send() dans tests/public_api.rs +``` + +Le fix applique deux corrections sans `allow` : + +- `YellowstoneSubscribeUpdate::Transaction` transporte désormais `Box`. La queue ne réserve donc plus la taille de la variante transaction (~664 octets) pour chaque élément ; le wire et le DTO transaction eux-mêmes restent inchangés. La modification intervient avant fermeture de la candidate `pre.009`. +- le canari `assert_send()` matérialise `PhantomData` afin que le paramètre générique soit effectivement utilisé tout en conservant exactement la même preuve compile-time. + +Aucun changement n’est apporté aux neuf variantes wire, à la mutation request, à Ping/Pong, au half-close, au shutdown, à la backpressure, aux dépendances ou aux frontières de `pre.010`. + +**Gate fix requis :** fmt/audit/check/Clippy sans warning + Transport 379/48/42/4 + dependency canary + workspace. diff --git a/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md b/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md index 4e2f526..459404f 100644 --- a/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md +++ b/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md @@ -1,9 +1,9 @@ - + # Validation `0.2.9` — moteur Yellowstone + standard Solana + PublicNode -> **Statut : `pre.008-fix.001` est fermée sur gate opérateur sans warning : fmt/audit/check/Clippy/workspace PASS, Transport 370 unit + 47 public API + 41 completeness + 4 doctests. `pre.009` est candidate pour le bidi standard, mutation request, Ping/Pong, backpressure, half-close et shutdown borné ; reconnect/replay restent `pre.010`.** +> **Statut : `pre.009` est fonctionnellement verte : Transport 379 unit + 48 public API + 42 completeness + 4 doctests et workspace PASS. Clippy signale deux warnings d’hygiène ; `pre.009-fix.001` est candidate pour les supprimer sans changement de protocole/lifecycle.** ## 1. Autorités du gate @@ -411,7 +411,7 @@ pre.005 DONE standard: accounts + slots 15 pre.006 DONE structure: namespace privé HTTP `http_*` 15–20 min ; gate PASS pre.007 DONE standard: transactions + transaction_status 15–20 min ; gate PASS pre.008 DONE standard: blocks + block_meta + entry 15–20 min ; gate final fix.001 PASS sans warning -pre.009 CANDIDATE moteur: bidi/backpressure/half-close/shutdown 15–20 min ; fixture locale adversariale +pre.009 FIX.001 CANDIDATE moteur: bidi/backpressure/half-close/shutdown 15–20 min ; gate fonctionnel vert, 2 warnings Clippy pre.010 TODO moteur: reconnect/replay/gap/duplicate 15–20 min pre.011 TODO Config V3 + protocol/provider + profils PublicNode 15–20 min pre.012 TODO PublicNode live + compliance + docs/prompt 0.2.10 15–20 min @@ -886,30 +886,31 @@ Le warning provient uniquement de `minimal_transaction_info()` dans `unit_tests/ ## 27. Gate `pre.009` — bidi standard + backpressure + half-close + shutdown candidate -| Surface / invariant | État candidate | -|-------------------------------------------------|----------------| -| workspace version | `0.2.9-pre.9` | -| `/geyser.Geyser/Subscribe` bidi | SOURCE+TEST | -| request initial dans queue bornée | SOURCE+TEST | -| mutation `try_update()` ordonnée/non bloquante | SOURCE+TEST | -| aucune `unbounded_channel` | CANARY | -| decode des 9 variantes standard | SOURCE+TEST | -| server Ping -> ping-only id=1 | SOURCE+TEST | -| Pong observable | SOURCE+TEST | -| server half-close => `Ok(None)` | SOURCE+TEST | -| client close => request half-close | SOURCE+TEST | -| shutdown hostile borné par `close_timeout` | SOURCE+TEST | -| Drop session => half-close best-effort | SOURCE+TEST | -| slow receiver => terminal backpressure overflow | SOURCE+TEST | -| Status distant sans message/details secrets | SOURCE+TEST | -| update malformed => invalid response | SOURCE+TEST | -| max inbound Tonic | SOURCE+TEST | -| outbound encoded_len avant dispatch | SOURCE+TEST | -| reconnect/resubscribe/replay | OUT pre.009 | -| `SubscribeDeshred` | OUT 0.2.9 | -| PublicNode / Config V3 | OUT pre.009 | -| audit Rust workspace local | PASS / clean | -| fmt/check/Clippy/tests/workspace | opérateur TODO | +| Surface / invariant | État candidate | +|-------------------------------------------------|-------------------| +| workspace version | `0.2.9-pre.9` | +| `/geyser.Geyser/Subscribe` bidi | SOURCE+TEST | +| request initial dans queue bornée | SOURCE+TEST | +| mutation `try_update()` ordonnée/non bloquante | SOURCE+TEST | +| aucune `unbounded_channel` | CANARY | +| decode des 9 variantes standard | SOURCE+TEST | +| server Ping -> ping-only id=1 | SOURCE+TEST | +| Pong observable | SOURCE+TEST | +| server half-close => `Ok(None)` | SOURCE+TEST | +| client close => request half-close | SOURCE+TEST | +| shutdown hostile borné par `close_timeout` | SOURCE+TEST | +| Drop session => half-close best-effort | SOURCE+TEST | +| slow receiver => terminal backpressure overflow | SOURCE+TEST | +| Status distant sans message/details secrets | SOURCE+TEST | +| update malformed => invalid response | SOURCE+TEST | +| max inbound Tonic | SOURCE+TEST | +| outbound encoded_len avant dispatch | SOURCE+TEST | +| reconnect/resubscribe/replay | OUT pre.009 | +| `SubscribeDeshred` | OUT 0.2.9 | +| PublicNode / Config V3 | OUT pre.009 | +| audit Rust workspace local | PASS / clean | +| fmt/check/tests/workspace | PASS | +| Clippy | PASS + 2 warnings | Les helpers protobuf qui étaient test-only jusqu'à `pre.008` sont maintenant compilés en runtime parce que `grpc_stream` les consomme effectivement. Aucun helper raw n'est public : les frontières restent `YellowstoneSubscribeRequest` et `YellowstoneSubscribeUpdate`. @@ -917,5 +918,25 @@ Le flux sortant utilise la même `mpsc` bornée que celle fournie à `tonic::cli `pre.009` ne tente aucun reconnect. Un half-close serveur est terminal normal ; `Status`, decode invalide et overflow sont terminaux en erreur. Le budget de reconnect, l'ordre de resubscribe, `from_slot`/ReplayInfo, gaps, duplicates et node divergence restent exclusivement `pre.010`. -**Verdict candidat :** source/fixture/audit statique prêts ; gate Cargo opérateur requis. +**Verdict `pre.009` :** contrat fonctionnel validé ; fix Clippy-only requis avant fermeture. +## 28. Gate `pre.009-fix.001` — taille de l’enum update + canari `Send` + +| Gate / observation | Résultat `pre.009` | Correctif `fix.001` | +|------------------------------------------|-------------------------------------------|---------------------------------------------------| +| `cargo fmt --all` | PASS | à réexécuter | +| audit Rust workspace | PASS / clean | PASS local / clean | +| `cargo check --workspace` | PASS | contrat inchangé | +| `cargo clippy --workspace --all-targets` | PASS + 2 warnings | boxing Transaction + usage réel de `T` | +| Transport unit | 379/379 PASS | contrat attendu inchangé | +| Transport `public_api` | 48/48 PASS | contrat attendu inchangé | +| Transport `release_completeness` | 42/42 PASS | contrat attendu inchangé | +| Transport doctests | 4/4 PASS | contrat attendu inchangé | +| Core dependency canary | 3/3 PASS | dépendances inchangées | +| `cargo test --workspace` | PASS | contrat attendu inchangé | +| `large_enum_variant` | Transaction ~664 B, Block ~280 B | `Transaction(Box)` | +| `extra_unused_type_parameters` | helper `assert_send()` n’utilise pas T | `PhantomData` matérialise l’usage compile-time | + +Le boxing ne modifie ni le protobuf ni `YellowstoneTransactionUpdate` : il réduit uniquement la taille du discriminant public transporté dans la queue bidi. Le canari `Send` conserve la même contrainte et ne construit aucune session réseau. Aucun `allow` Clippy n’est ajouté. + +**Verdict fix candidate :** correction minimale prête ; fermeture de `pre.009` après gate opérateur sans warning.