15 KiB
Validation 0.2.8 — Helius LaserStream WebSocket
Statut : gate
0.2.8-pre.001positif ; architecture corrigée par0.2.8-pre.001-fix.001. Les graphes Cargo opérateur sont reçus et non bloquants. La validation runtime à venir doit prouver deux façades protocolaires distinctes partageant un seul moteurWsSession, et non unWsSessionHelius générique exposant des méthodes provider non supportées.
1. Références
prompt prompts/013-V0_2_8_START_PROMPT.md
plan docs/plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md
base stable v0.2.7 / deltas/0.2.7/rel.001.md
pre.001 deltas/0.2.8/pre.001.md
fix architecture deltas/0.2.8/pre.001-fix.001.md
validation standard WS docs/validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md
HTTP compliance docs/validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md
KSP-TRANSPORT-007 docs/validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md
Audit Helius initial : 2026-08-23.
2. Gate pre.001 et dependency graph
Baseline opérateur acquise :
cargo fmt --all OK
python3 scripts/audit_rust_workspace_rules.py clean
cargo check --workspace OK
cargo clippy --workspace --all-targets OK
cargo test --workspace OK
Graphes requis reçus :
cargo tree -p ksp-onchain-transport-lib OK / inspecté
cargo tree -p ksp-onchain-transport-lib --duplicates OK / inspecté
Versions résolues observées :
futures-util 0.3.34
tokio 1.53.1
tokio-tungstenite 0.30.0
reqwest 0.13.4
Doublons ciblés visibles :
syn 2.0.119 / 3.0.3
webpki-roots 0.26.11 / 1.0.9
Verdict : doublons transitifs, aucune nouvelle dépendance Helius, aucune anomalie bloquante du gate.
3. Matrice provider normative
| Capability | Standard KSP | Helius doc actuelle | Décision 0.2.8 |
Surface Helius attendue | Preuve finale attendue |
|---|---|---|---|---|---|
accountSubscribe pair |
oui | supporté | réutiliser wire standard | présente | exact wire + no regression |
logsSubscribe pair |
oui | supporté | réutiliser wire standard | présente | exact wire + no regression |
programSubscribe pair |
oui | supporté | réutiliser wire standard | présente | exact wire + no regression |
rootSubscribe pair |
oui | supporté | réutiliser standard | présente | exact wire + no regression |
signatureSubscribe pair |
oui | supporté | réutiliser standard | présente | one-shot conservé |
slotSubscribe pair |
oui | supporté | réutiliser standard | présente | exact wire + no regression |
blockSubscribe pair |
oui, unstable | non supporté | ne pas exposer Helius | absente | API absence + guard interne avant I/O |
slotsUpdatesSubscribe pair |
oui, unstable | docs divergentes ; index exhaustif = non supporté | ne pas exposer Helius | absente | API absence + divergence documentée |
voteSubscribe pair |
oui, unstable | non supporté | ne pas exposer Helius | absente | API absence + guard interne avant I/O |
transactionSubscribe |
non standard | extension Helius | ajouter typed | présente | request/ack/notification fixtures |
transactionUnsubscribe |
non standard | documenté dans référence transaction | ajouter via handle | présente | exact method + late-message race |
tokenAccounts |
non standard | none/balanceChanged/all |
ajouter typed | présente dans filter | enum + serialization |
notifyOn account |
non standard | deprecated, no-op Agave 4.2 | ne pas exposer | absente | absence DTO public |
notifyOn program |
non standard | deprecated, no-op Agave 4.2 | ne pas exposer | absente | absence DTO public |
| enhanced account extra | non standard | mentionné, wire exact non publié | report explicite | absente | réaudit final |
| proactive heartbeat | absent standard | 10 min idle, ping recommandé | Helius-only actor policy | interne | deterministic timer tests |
| replay historique | absent standard | pas de contrat WS KSP | interdit | absent | docs/canary no promise |
4. Matrice des façades protocolaires
4.1 Surface attendue
| Famille | SolanaStandardWsSession |
HeliusLaserStreamWsSession |
DTO/wire |
|---|---|---|---|
| Account | oui | oui | partagé standard |
| Block | oui | non | standard seulement |
| Logs | oui | oui | partagé standard |
| Program | oui | oui | partagé standard |
| Root | oui | oui | partagé standard |
| Signature | oui | oui | partagé standard |
| Slot | oui | oui | partagé standard |
| SlotsUpdates | oui | non | standard seulement |
| Vote | oui | non | standard seulement |
| Helius Transaction | non | oui | provider-specific |
4.2 Invariants architecture
| Critère | Décision | Preuve cible | État |
|---|---|---|---|
| actor physique | un seul WsSession actor partagé |
source/runtime canary | décidé |
| façade standard | SolanaStandardWsSession |
public API canary | décidé |
| façade Helius | HeliusLaserStreamWsSession |
public API canary | décidé |
| escape hatch Helius | aucun inner()/into_inner() public |
API/source canary | décidé |
generic Helius WsSession::connect |
ne doit pas permettre de contourner la façade | invalid protocol pre-I/O canary | décidé |
| Helius unsupported | absent de la façade | compile-fail/API absence canary | décidé |
| standard Helius commun | délégation vers le même wire/actor | exact fixture | décidé |
| DTO duplication | seulement si wire/sémantique divergent | public/source audit | décidé |
| Config direction | Config -> Transport uniquement | ownership tests | décidé |
| heartbeat | Helius-only, actor commun | deterministic timers | décidé |
| secret | query URL derrière WsEndpointUrl |
redaction canaries | décidé |
| new Rust dependency | aucune | manifest/tree audit | décidé |
5. transactionSubscribe à couvrir
5.1 Filter
| Champ | Type | Limite/état | Statut |
|---|---|---|---|
vote |
bool optionnel | pas de limite locale supplémentaire | audit fermé |
failed |
bool optionnel | pas de limite locale supplémentaire | audit fermé |
signature |
string optionnelle | provider valide la signature | audit fermé |
accountInclude |
string[] | <= 50 000 | audit fermé |
accountExclude |
string[] | <= 50 000 | audit fermé |
accountRequired |
string[] | <= 50 000 | audit fermé |
tokenAccounts |
enum string | none, balanceChanged, all |
audit fermé |
5.2 Options
| Champ | Valeurs | Règle | Statut |
|---|---|---|---|
commitment |
processed/confirmed/finalized | réutilisation possible à vérifier | audit fermé |
encoding |
base58/base64/jsonParsed | enum Helius restreint | audit fermé |
transactionDetails |
full/signatures/accounts/none | complet | audit fermé |
showRewards |
bool | optionnel | audit fermé |
maxSupportedTransactionVersion |
integer | requis pour accounts/full | audit fermé |
5.3 Notification
method = transactionNotification
full documented result = transaction + signature + slot + transactionIndex
Validation finale :
aucune forme inventée
types précis pour les formes prouvées
fallback borné si une forme officielle reste insuffisamment explicitée
aucun payload brut dans logs/snapshots
6. Validation lifecycle/provider à construire
[ ] un seul actor/socket implementation path
[ ] SolanaStandardWsSession public et constructible
[ ] HeliusLaserStreamWsSession public et constructible
[ ] WsSession historique standard reste compatible
[ ] Helius facade n'expose pas blockSubscribe
[ ] Helius facade n'expose pas slotsUpdatesSubscribe
[ ] Helius facade n'expose pas voteSubscribe
[ ] SolanaStandard facade n'expose pas transactionSubscribe
[ ] Helius facade n'expose aucun escape hatch vers le handle générique
[ ] protocol mismatch rejeté avant I/O
[ ] 6 familles standard Helius utilisent le wire standard exact
[ ] transaction subscribe/ack exact
[ ] transaction unsubscribe/result exact
[ ] transaction notification dispatch exact
[ ] notification decode failure isole la logical subscription
[ ] provider RPC application error ne tue pas la session
[ ] late notification après unsubscribe ne réactive rien
[ ] reconnect invalide/remappe remote ids
[ ] resubscribe garde local id
[ ] unsubscribe pendant reconnect gagne
[ ] heartbeat n'écrit qu'en Active
[ ] heartbeat est annulé au close
[ ] heartbeat write failure suit reconnect borné
[ ] shutdown interrompt heartbeat/backoff
[ ] oversized inbound frame reste borné
[ ] queue overflow d'une transaction subscription n'affecte pas les autres
[ ] payload/filters/api-key absents de Debug/snapshots sûrs
7. Non-régressions obligatoires
[ ] standard WebSocket 18/18 toujours comptabilisé pour SolanaStandard
[ ] partition standard unstable 3/9 inchangée
[ ] signature one-shot inchangée
[ ] HTTP current 52/52 inchangé
[ ] HTTP historical 14/14 inchangé
[ ] KSP-TRANSPORT-007 inchangé
[ ] Config V1 HTTP-only backward readable
[ ] Config V2 solana_standard backward readable
[ ] no Transport -> Config/Wallet/Store/Program/tracing direct
8. Security/redaction
[ ] api-key absente de Debug WsEndpointUrl
[ ] api-key absente de Debug settings/session/subscription
[ ] api-key absente des KspError safe contexts
[ ] URL complète absente des snapshots
[ ] remote subscription id absent des snapshots publics
[ ] raw transaction payload absent des logs/snapshots
[ ] large filter addresses non loggées
[ ] provider error payload arbitraire non copié dans context
[ ] façade Helius ne permet pas de contourner les capabilities par exposition du inner
9. Smoke live
Statut initial : non exécuté.
Contrat cible : opt-in, Config résout l'api-key, Transport ne lit pas l'environnement. Aucun secret n'est versionné ou affiché. Un échec lié au plan/credential provider doit rester distinguable d'une panne du moteur.
10. Forecast courant
Le forecast détaillé et normatif est visible dans la section 3 du plan. Résumé :
pre.001 audit/sizing
pre.001-fix.001 façades séparées + gate Cargo fermé
pre.002 socle protocolaire/façades/connect partagé
pre.003 6 wrappers Helius communs + absence 3 unsupported
pre.004 Config V2 + secrets
pre.005 transaction request/unsubscribe
pre.006 transaction notification + lifecycle
pre.007 heartbeat
pre.008 adversarial/security/backpressure
pre.009 compliance/non-regression
pre.010 live smoke/docs/dependency graph
pre.011 final workspace/prompt 0.2.9
rel.001 stable
Le forecast reste souple ; le numéro final n'est jamais un critère de clôture.
11. Gate initial après fix
[x] base stable inspectée
[x] baseline opérateur disponible
[x] sources Helius courantes relues
[x] terminologie/endpoints/auth clarifiés
[x] surface standard supportée/non supportée inventoriée
[x] transactionSubscribe/unsubscribe inventoriés
[x] tokenAccounts inventorié
[x] notifyOn classé deprecated/no-op
[x] divergence slotsUpdates enregistrée et arbitrée explicitement
[x] architecture corrigée : surfaces protocolaires séparées
[x] moteur WsSession/actor unique préservé
[x] stratégie de compatibilité WsSession 0.2.7 définie
[x] heartbeat ownership décidé
[x] Config shape décidée
[x] credential strategy décidée
[x] aucune nouvelle dépendance justifiée
[x] forecast recalibré et rendu visible dans le plan
[x] cargo tree direct exécuté par opérateur
[x] cargo tree duplicates exécuté par opérateur
[x] doublons ciblés analysés comme transitifs/non bloquants
Verdict : gate 0.2.8-pre.001 positif. pre.002 peut ouvrir le socle protocolaire/façades sans commencer prématurément transactionSubscribe.