246 lines
7.4 KiB
Markdown
246 lines
7.4 KiB
Markdown
<!-- file: deltas/0.2.7/pre.001.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# Delta `0.2.7-pre.001` — audit WebSocket Solana, threat model, dependencies et sizing
|
|
|
|
## Base requise
|
|
|
|
Release stable attendue et auditée :
|
|
|
|
```text
|
|
v0.2.6
|
|
workspace.package.version = 0.2.6 avant ouverture
|
|
```
|
|
|
|
L'archive Gitea fournie contient `deltas/0.2.6/rel.001.md` et annonce `0.2.7 — WebSocket Solana standard` comme prochaine release. Elle est utilisée comme autorité primaire.
|
|
|
|
## Type de livraison
|
|
|
|
```text
|
|
ksp-general-0.2.7-pre.001.zip
|
|
```
|
|
|
|
L'archive d'échange est un delta applicable depuis la racine de `v0.2.6` et contient uniquement les fichiers ajoutés/modifiés par cette tranche.
|
|
|
|
## Objet
|
|
|
|
`pre.001` reste volontairement un gate de lecture/audit/conception. Aucun client WebSocket, session runtime, wrapper subscribe ou dependency réseau nouvelle n'est encore ajouté.
|
|
|
|
Le gate :
|
|
|
|
- relit les règles, architecture, plans, validations et contrats réels requis ;
|
|
- vérifie la stabilité `v0.2.6` et l'héritage HTTP/Wallet Desk ;
|
|
- réaudite `ksp-onchain-transport-lib` et l'adapter Config actuel ;
|
|
- constate que `std.transport` V1 est strictement HTTP et décide un V2 explicite HTTP+WS avec backward V1 ;
|
|
- audite l'archive bot3 comme référence historique seulement ;
|
|
- réaudite la documentation Solana WebSocket officielle du 2026-08-22 et cross-checke Agave `v3.1.8` sur les ambiguïtés ;
|
|
- documente notamment `accountSubscribe.minContextSlot` comme option partagée mais ignorée en PubSub, et `vote.timestamp` comme `Option<i64>` ;
|
|
- compte exactement **18 méthodes = 9 subscribe + 9 unsubscribe** ;
|
|
- classe `block`, `slotsUpdates` et `vote` comme paires unstable ;
|
|
- crée la matrice compliance initiale `010` ;
|
|
- audite les crates candidates et retient `tokio-tungstenite 0.30.0` + `futures-util 0.3.34` pour une tranche ultérieure ;
|
|
- fixe le modèle actor/session, IDs locaux, state machines, reconnect/resubscribe, continuity gaps, backpressure et shutdown ;
|
|
- fixe les exigences de redaction URL/credentials et de bornes de ressources ;
|
|
- regranularise la release jusqu'à un forecast nominal `pre.014` sans imposer ce numéro comme deadline.
|
|
|
|
## Décisions principales
|
|
|
|
### Cardinalité
|
|
|
|
```text
|
|
endpoint -> N sessions physiques explicites -> N subscriptions par session
|
|
aucun pool/scheduler automatique en 0.2.7
|
|
```
|
|
|
|
### Identités
|
|
|
|
```text
|
|
WsSessionId stable local KSP
|
|
WsSubscriptionId stable local KSP
|
|
remote id éphémère et interne, remappé après reconnect
|
|
```
|
|
|
|
### Reconnect / resubscribe
|
|
|
|
```text
|
|
budget fini
|
|
backoff exponentiel borné
|
|
pas de jitter en 0.2.7
|
|
policy Never | ActiveSubscriptions
|
|
ordre de restore déterministe par ID local
|
|
continuity gap explicite après toute reconnexion
|
|
aucune garantie lossless / aucun backfill HTTP Transport
|
|
```
|
|
|
|
### Backpressure
|
|
|
|
```text
|
|
command queue bounded
|
|
notification queue bounded par subscription
|
|
overflow -> subscription Failed explicite + best-effort unsubscribe
|
|
aucun drop silencieux
|
|
les autres subscriptions restent actives
|
|
```
|
|
|
|
### Config
|
|
|
|
```text
|
|
std.transport V1 reste strict et lisible
|
|
std.transport V2 = HTTP existant + ws_defaults + profiles[].ws_endpoints
|
|
Config -> Transport uniquement
|
|
```
|
|
|
|
### Dependencies
|
|
|
|
```text
|
|
tokio-tungstenite ^0.30, default-features=false, connect + rustls-tls-webpki-roots
|
|
futures-util ^0.3, default-features=false, std + sink
|
|
```
|
|
|
|
Ces dependencies sont **planifiées seulement** ; le graphe n'est pas modifié dans `pre.001`.
|
|
|
|
## Prévision souple recalibrée
|
|
|
|
```text
|
|
pre.001 audit + matrice + threat model + dependencies + sizing
|
|
pre.002 settings/IDs/states/snapshots/redaction
|
|
pre.003 std.transport V2 + adapter Config
|
|
pre.004 actor session physique + deps WS + local server
|
|
pre.005 limits/control/cancellation/shutdown
|
|
pre.006 registry + generic subscribe/unsubscribe + channels typed
|
|
pre.007 reconnect/resubscribe/gap/races
|
|
pre.008 backpressure/limits/leaks adversarial
|
|
pre.009 account/program/logs
|
|
pre.010 signature/slot/root
|
|
pre.011 block/slotsUpdates/vote unstable
|
|
pre.012 compliance 18/18 + Config composition + HTTP regression
|
|
pre.013 smoke live + README/USAGE + cargo trees
|
|
pre.014 workspace final + docs/compliance + prompt 0.2.8
|
|
rel.001 publication stable
|
|
```
|
|
|
|
Le sizing reste positif : la release n'est pas scindée fonctionnellement, mais le forecast initial `pre.008` est volontairement décompressé.
|
|
|
|
## Fichiers ajoutés
|
|
|
|
```text
|
|
docs/plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md
|
|
docs/validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md
|
|
deltas/0.2.7/pre.001.md
|
|
```
|
|
|
|
## Fichiers modifiés
|
|
|
|
```text
|
|
Cargo.toml
|
|
docs/000-README.md
|
|
docs/plans/000-README.md
|
|
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
|
|
docs/validation/000-README.md
|
|
```
|
|
|
|
## Fichiers volontairement inchangés
|
|
|
|
```text
|
|
CHANGELOG.md
|
|
ROADMAP.md
|
|
.env.example
|
|
config/**
|
|
crates/**
|
|
docs/architecture/**
|
|
crates/ksp-onchain-transport-lib/README.md
|
|
crates/ksp-onchain-transport-lib/USAGE.md
|
|
```
|
|
|
|
`ROADMAP.md` reste global et possède déjà l'entrée `0.2.7`. README/USAGE Transport ne sont pas modifiés avant qu'une surface runtime WebSocket existe réellement.
|
|
|
|
## Version technique
|
|
|
|
Conformément au workflow non-fix :
|
|
|
|
```text
|
|
workspace.package.version = 0.2.7-pre.1
|
|
commit = v0.2.7-pre.001
|
|
aucun tag prerelease
|
|
```
|
|
|
|
## Audit officiel WebSocket
|
|
|
|
Index :
|
|
|
|
```text
|
|
https://solana.com/docs/rpc/websocket
|
|
```
|
|
|
|
Inventaire exact au 2026-08-22 :
|
|
|
|
```text
|
|
accountSubscribe/accountUnsubscribe
|
|
blockSubscribe/blockUnsubscribe unstable pair
|
|
logsSubscribe/logsUnsubscribe
|
|
programSubscribe/programUnsubscribe
|
|
rootSubscribe/rootUnsubscribe
|
|
signatureSubscribe/signatureUnsubscribe
|
|
slotSubscribe/slotUnsubscribe
|
|
slotsUpdatesSubscribe/slotsUpdatesUnsubscribe unstable pair
|
|
voteSubscribe/voteUnsubscribe unstable pair
|
|
```
|
|
|
|
Aucune méthode de cet index n'est marquée Deprecated.
|
|
|
|
## Audit bot3
|
|
|
|
Référence inspectée :
|
|
|
|
```text
|
|
ks-onchain-transport/src/standard_ws.rs
|
|
ks-onchain-transport/src/ws_client.rs
|
|
ks-onchain-transport/src/ws_pool.rs
|
|
ks-onchain-transport/src/ws_session.rs
|
|
```
|
|
|
|
Repris comme concepts : session multiplexée, ID local/remote séparé, reconnect/resubscribe borné. Rejetés : Transport -> Config, tracing direct, scheduler/pool, unsubscribe public par remote ID et broadcast data comme contrat principal.
|
|
|
|
## Validations exécutées avant modification
|
|
|
|
```text
|
|
archive stable v0.2.6 extraite/auditée OK
|
|
documents internes obligatoires relus OK
|
|
inventory Transport + Config OK
|
|
archive bot3 auditée OK
|
|
documentation Solana WebSocket actuelle auditée OK
|
|
dependencies Rust candidates auditée OK
|
|
python3 scripts/audit_rust_workspace_rules.py OK
|
|
```
|
|
|
|
Sortie audit Python :
|
|
|
|
```text
|
|
General Rust rule audit: clean
|
|
Rust export completeness audit: 0 candidate(s)
|
|
KSP workspace Rust rule audit: clean
|
|
```
|
|
|
|
## Validations tentées mais impossibles dans le sandbox
|
|
|
|
Le binaire `cargo` n'est pas installé. Tentatives avant modification :
|
|
|
|
```text
|
|
cargo fmt --all code 127
|
|
cargo check --workspace code 127
|
|
cargo clippy --workspace --all-targets code 127
|
|
```
|
|
|
|
Aucune de ces commandes n'est déclarée réussie.
|
|
|
|
## Validation opérateur requise avant commit
|
|
|
|
```bash
|
|
cargo fmt --all
|
|
python3 scripts/audit_rust_workspace_rules.py
|
|
cargo check --workspace
|
|
cargo clippy --workspace --all-targets
|
|
```
|
|
|
|
Aucun test Transport, Config, workspace ou smoke live n'est déclaré vert dans ce sandbox tant qu'il n'a pas été effectivement exécuté par l'opérateur. Aucun build Tauri n'est requis pour `0.2.7-pre.001`.
|