Files
khadhroony-solana-project/deltas/0.2.9/pre.001.md
2026-08-24 08:37:36 +02:00

8.9 KiB
Raw Blame History

Delta 0.2.9-pre.001 — audit/sizing Yellowstone gRPC standard

1. Base requise et vérifiée

Archive autoritaire fournie :

khadhroony-solana-project-v0.2.8-full-from-gitea.zip

État vérifié :

workspace.package.version = 0.2.8
deltas/0.2.8/rel.001.md présent
prompts/014-V0_2_9_START_PROMPT.md présent
prompt fourni = byte-identique au prompt embarqué
metadata .git absente de l'archive

Cette livraison ouvre :

workspace.package.version = 0.2.9-pre.1
commit attendu            = v0.2.9-pre.001
aucun tag prerelease

2. Objet

pre.001 exécute le gate obligatoire :

lecture base/règles/architecture
baseline stable
réaudit Yellowstone actuel
matrice service/proto
licences/dependencies/MSRV
architecture provider-neutral
threat model/resources/backpressure/replay
sizing et forecast
récensement des providers gRPC gratuits durables

Aucune implémentation gRPC lourde n'est ajoutée.

3. Baseline opérateur acquise

Preuve fournie sur v0.2.8 :

cargo fmt --all                               OK
python3 scripts/audit_rust_workspace_rules.py OK / clean
cargo check --workspace                       OK
cargo clippy --workspace --all-targets        OK
cargo test --workspace                        OK
cargo tree -p ksp-onchain-transport-lib        fourni
cargo tree --duplicates                        fourni

Transport pendant le workspace test :

335 unit
41 public_api
34 release_completeness
4 doctests

Les live smokes restent opt-in/ignored par défaut.

4. Réaudit Yellowstone du 2026-08-23

Divergence importante par rapport au snapshot du start prompt :

prompt snapshot release = v14.2.2+solana.4.1.0
release GitHub courante = v15.1.2+solana.4.2.0, publiée 2026-08-18, Rust 1.96.1
client crate courant     = yellowstone-grpc-client 13.3.0
proto crate courant      = yellowstone-grpc-proto 12.6.0

Service Geyser courant inventorié :

Subscribe                 IN
SubscribeDeshred          OUT — Triton extension / pre-execution
SubscribeReplayInfo       IN
Ping                      IN
GetLatestBlockhash        IN
GetBlockHeight            IN
GetSlot                   IN
IsBlockhashValid          IN
GetVersion                IN

SubscribeRequest standard retenu :

accounts
slots
transactions
transactions_status
blocks
blocks_meta
entry
commitment
accounts_data_slice
ping
from_slot

Capacités nouvelles/actuelles retenues car présentes dans le proto publié standard :

CuckooFilter account/block/transaction include
TokenAccountExpansionControlFlag ALL/BALANCE_CHANGED
lamports eq/ne/lt/gt
slot interslot updates

SubscribeUpdate :

account
slot
transaction
transaction_status
block
ping
pong
block_meta
entry

5. Licence et dépendances

Upstream :

repository default = AGPL-3.0-only
client subtree      = Apache-2.0
proto subtree       = Apache-2.0

Stratégies comparées :

A client upstream + proto  -> rejetée comme default
B proto publié + client KSP autour de Tonic -> RETENUE
C proto vendored KSP       -> fallback seulement

Raisons de B :

pas de copie proto
wire officiel disponible
licence Apache compatible MIT
reconnect/backpressure/redaction KSP-owned
upstream raw types cachés
stack tonic 0.14 cohérente avec HTTP/2 moderne existant

Aucune dependency n'est ajoutée dans pre.001. pre.002 doit matérialiser les features minimales et produire les graphes Cargo.

6. Replay/continuity

L'upstream a corrigé en juillet 2026 un cas où from_slot pour blocks pouvait être accepté puis reprendre live avec un state gap ; l'autoreconnect upstream a aussi été renforcé pour traiter l'equivocation entre nodes.

KSP ferme donc :

reconnect/resubscribe = oui, borné et KSP-owned
from_slot             = oui
ReplayInfo            = oui
exactly-once          = non garanti
lossless              = non garanti
gaps/duplicates       = observables
node divergence       = couverture explicite seulement si prouvée

7. Config / architecture

Décisions :

backend gRPC distinct de HTTP/WS
pas de WsProtocolKind gRPC
pas de raw Tonic client public
Transport owns Yellowstone
Config -> Transport seulement
metadata publique et metadata sensible séparées
Transport ne lit aucun env

Le schéma V2 actuel étant fermé, l'ajout gRPC cible :

format_version = 3
globals.grpc_defaults
profiles[].grpc_endpoints[]
metadata[]
secret_metadata[]

V1 et V2 restent backward-readable.

8. Providers gRPC gratuits durables

PublicNode / Allnodes-backed — priorité 1

Confirmé officiellement :

Solana Mainnet Yellowstone GRPC
Solana Testnet GRPC
Mainnet endpoint = solana-yellowstone-grpc.publicnode.com:443
service annoncé free/public

Décision : dans 0.2.9, mais pas sous forme d'adapter public spécifique. PublicNode sert de premier smoke live standard provider-neutral.

Le hostname Testnet exact n'est pas figé avant vérification officielle/live.

OrbitFlare — priorité 2

Plan Free officiel :

$0/mo
10 RPS
1 TPS
gRPC Devnet only
Unlimited credit limits

Décision : dans 0.2.9 comme second smoke live, via generic secret metadata Config -> Transport. Aucun type OrbitFlareGrpc* public.

Tatum — tertiaire

Mainnet Yellowstone gRPC
Free plan durable
3 RPS
100K lifetime credits
5 subscriptions

Décision : opérateur optionnel, pas gate durable principal à cause du quota lifetime.

Vérifiés non gratuits / non applicables

Helius      Free sans gRPC
Shyft       Free = No gRPC Access
Alchemy     PAYG/Enterprise requis
QuickNode   Scale/Business ou add-on payant
Chainstack  add-on Yellowstone payant, Growth+
ERPC        Geyser payant ; trial seulement 1 jour
NodeFlare   plan Yellowstone mensuel payant
Bitquery    CoreCast custom, pas Yellowstone standard ; stream free non garanti

Candidat à revalider :

Solinfra = free tier + Yellowstone annoncés publiquement, mais accès gRPC inclus dans Free non confirmé

9. Threat model

Le plan ferme explicitement :

metadata/URI credential leak
Tonic Status arbitraire
oversized messages
stream flood/backpressure
filter explosion / collisions de noms
unknown enum/oneof
server/client half-close
reconnect loop
node divergence
late updates après mutation
from_slot gaps/duplicates
TLS failures
unary timeout

10. Forecast recalibré

pre.001 DONE audit/sizing/provider/deps/license
pre.002 deps + settings/errors/facade + cargo tree
pre.003 TLS/metadata + local fixture + 7 unary
pre.004 Subscribe common + Cuckoo/token/from_slot/bounds
pre.005 Accounts + Slots
pre.006 Transactions + transaction_status
pre.007 Blocks + block_meta + entry
pre.008 bidi lifecycle/backpressure/half-close/shutdown
pre.009 reconnect/replay/gaps/duplicates/equivocation
pre.010 Config V3
pre.011 PublicNode/OrbitFlare live + compliance + final cargo graphs
pre.012 docs/workspace final + prompt 0.2.10
rel.001 stable

Chaque tranche vise ~1520 minutes ; pre.012 n'est pas une deadline.

Critères de split : conflit MSRV/stack réseau, explosion DTO transaction/block, nouvelle évolution proto matérielle, replay trop large, ou comportement provider-specific contaminant le contrat standard.

11. Fichiers ajoutés

docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md
docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md
deltas/0.2.9/pre.001.md

12. Fichiers modifiés

Cargo.toml
docs/000-README.md
docs/plans/000-README.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/validation/000-README.md

13. Fichiers volontairement inchangés

ROADMAP.md
CHANGELOG.md
.env.example
config/**
crates/**
docs/architecture/**
crates/ksp-onchain-transport-lib/README.md
crates/ksp-onchain-transport-lib/USAGE.md

Aucun gRPC runtime/config/dependency n'est introduit avant le gate positif de cette tranche.

14. Validations du sandbox de préparation

Le sandbox a pu exécuter :

inspection archive/version/rel/prompt                   OK
comparaison prompt fourni / prompt archive              OK
lecture règles/architecture/plans/code/config           OK
réaudit upstream Yellowstone/provider/dependencies      OK
python3 scripts/audit_rust_workspace_rules.py           OK / clean après overlay

Le sandbox ne dispose pas de Cargo ; aucun nouveau cargo check/clippy/test/tree n'est déclaré réussi localement après le changement de version/documentation.

15. Validation opérateur attendue avant commit

Comme pre.001 ne modifie aucun Rust/dependency/config runtime, exécuter au minimum :

cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test --workspace
cargo tree -p ksp-onchain-transport-lib
cargo tree -p ksp-onchain-transport-lib --duplicates

Attendu : aucune nouvelle dependency gRPC avant pre.002.