v0.3.10-pre.006
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md -->
|
||||
<!-- version: 8 -->
|
||||
<!-- version: 9 -->
|
||||
|
||||
# Acquisition et alimentation `RawTransaction`
|
||||
|
||||
@@ -665,6 +665,54 @@ aucun edge Transport <-> ksp-raw-transaction-lib
|
||||
|
||||
La migration doit préserver exactement les golden bytes/hash RAW v1 déjà prouvés. Aucun RAW v2 n'est justifié.
|
||||
|
||||
### 13.1 Transaction wire Legacy/V0/V1
|
||||
|
||||
`pre.006` matérialise dans `ksp-raw-transaction-lib` un modèle wire Solana source-neutral, indépendant de Transport et des crates runtime Solana. Il sérialise exactement les formes Legacy, V0 et V1 puis expose aussi la représentation Base64.
|
||||
|
||||
Pour V1, le contrat suit SIMD-0385 tel qu'audité le 7 septembre 2026 :
|
||||
|
||||
```text
|
||||
0x81
|
||||
LegacyHeader
|
||||
TransactionConfigMask u32 LE
|
||||
LifetimeSpecifier [32]
|
||||
NumInstructions u8
|
||||
NumAddresses u8
|
||||
Addresses
|
||||
ConfigValues
|
||||
InstructionHeaders
|
||||
InstructionPayloads
|
||||
Signatures terminales
|
||||
```
|
||||
|
||||
Les limites common verrouillées sont : transaction `<= 4096` octets, `<= 12` signatures, `<= 64` adresses, `<= 64` instructions, indexes bornés, aucune ALT en V1 et aucune donnée après les signatures. La présence de `Message.config` Yellowstone distingue V1 ; `versioned=true` sans config reste V0, et `versioned=false` sans config reste Legacy.
|
||||
|
||||
L'extracteur de signature Base64 common reconnaît désormais V1 au premier octet `0x81` et parcourt structurellement le message jusqu'aux signatures terminales au lieu d'appliquer le short-vector signatures-first de Legacy/V0.
|
||||
|
||||
Le format V1 est encore documenté upstream comme pre-release/feature-gated ; KSP implémente donc la capacité de lecture/canonicalisation sans déclarer son activation sur un cluster particulier.
|
||||
|
||||
### 13.2 Qualification Yellowstone `pre.006`
|
||||
|
||||
Un canari cross-layer test-only dans Backfill monte un serveur Geyser local, ouvre le vrai `YellowstoneGrpcChannel::open_standard_subscribe`, reçoit successivement une update `Transaction` V1 et une update `Block` contenant la même transaction, puis projette les DTO Transport vers le modèle wire common uniquement dans le test.
|
||||
|
||||
Le gate prouve :
|
||||
|
||||
```text
|
||||
Transaction update -> slot/index + transaction wire V1 exact
|
||||
Block update -> slot/index + même transaction wire V1 exact + block_time
|
||||
Transport -> aucun edge production vers ksp-raw-transaction-lib
|
||||
Backfill -> tonic/yellowstone-grpc-proto strictement dev-only
|
||||
```
|
||||
|
||||
Il ne qualifie pas un RAW-direct complet Yellowstone : une update `Transaction` ne porte pas `block_time`, et la représentation protobuf Yellowstone de la meta n'est pas démontrée byte-identical avec la projection JSON HTTP servant au RAW v1 actuel. La décision `TR-C4` reste donc conservative :
|
||||
|
||||
```text
|
||||
Yellowstone Transaction/Block -> signal structuré + transaction wire fidèle
|
||||
RAW v1 complet -> hydration HTTP avant persistence
|
||||
```
|
||||
|
||||
Aucun adapter productif n'est ajouté en `pre.006`. Conformément à `TR-C2`, l'adapter `Transport DTO -> common` demeure réservé au Worker de `pre.007`.
|
||||
|
||||
## 14. Handoff `0.3.10` : Worker live
|
||||
|
||||
### 14.1 Contrat fonctionnel
|
||||
@@ -805,7 +853,7 @@ Aucun code, DTO, Config, endpoint, secret, dépendance ou convention de version
|
||||
|
||||
## 18. Sources externes auditées
|
||||
|
||||
Sources consultées le **4 septembre 2026**. Cette liste consolide les anciens audits A/B dans un seul registre documentaire.
|
||||
Sources consultées le **4 septembre 2026** et revalidées pour Transaction V1 le **7 septembre 2026**. Cette liste consolide les anciens audits A/B dans un seul registre documentaire.
|
||||
|
||||
### 18.1 Solana standard
|
||||
|
||||
@@ -828,43 +876,46 @@ Sources consultées le **4 septembre 2026**. Cette liste consolide les anciens a
|
||||
|
||||
### 18.2 Yellowstone et providers
|
||||
|
||||
| Source | URL |
|
||||
|----------------------------------|---------------------------------------------------------------------------------------------------|
|
||||
| Yellowstone proto | https://github.com/rpcpool/yellowstone-grpc/blob/master/yellowstone-grpc-proto/proto/geyser.proto |
|
||||
| Yellowstone README | https://github.com/rpcpool/yellowstone-grpc/blob/master/README.md |
|
||||
| Yellowstone changelog | https://github.com/rpcpool/yellowstone-grpc/blob/master/CHANGELOG.md |
|
||||
| Helius data streaming | https://www.helius.dev/docs/data-streaming |
|
||||
| Helius LaserStream | https://www.helius.dev/blog/introducing-laserstream |
|
||||
| Helius WebSockets | https://www.helius.dev/blog/laserstream-websockets |
|
||||
| Helius enhanced WebSockets | https://www.helius.dev/blog/introducing-next-generation-enhanced-websockets |
|
||||
| Helius getTransactionsForAddress | https://www.helius.dev/blog/introducing-gettransactionsforaddress |
|
||||
| Helius preprocessed transactions | https://www.helius.dev/docs/shred-delivery/preprocessed-transactions |
|
||||
| PublicNode Solana | https://solana.publicnode.com/ |
|
||||
| OrbitFlare Yellowstone | https://docs.orbitflare.com/data-streaming/yellowstone |
|
||||
| OrbitFlare RPC | https://orbitflare.com/products/rpc-nodes |
|
||||
| OrbitFlare gRPC | https://orbitflare.com/products/solana-grpc |
|
||||
| QuickNode Yellowstone | https://www.quicknode.com/guides/solana-development/tooling/solana-grpc/solana-grpc |
|
||||
| QuickNode gRPC plans | https://www.quicknode.com/blog/solana-grpc-is-now-included-with-scale-and-business-plans |
|
||||
| Alchemy Solana gRPC | https://www.alchemy.com/solana-grpc |
|
||||
| Alchemy Yellowstone quickstart | https://www.alchemy.com/docs/reference/yellowstone-grpc-quickstart |
|
||||
| Alchemy historical replay | https://www.alchemy.com/docs/reference/yellowstone-grpc-historical-replay |
|
||||
| Alchemy compute/bandwidth | https://www.alchemy.com/docs/reference/compute-unit-costs |
|
||||
| Chainstack Yellowstone | https://chainstack.com/yellowstone-grpc-more-streams-same-price/ |
|
||||
| Shyft Yellowstone | https://shyft.to/solana-yellowstone-grpc |
|
||||
| Shyft pricing | https://shyft.to/solana-rpc-grpc-pricing |
|
||||
| Shyft RabbitStream | https://shyft.to/solana-shreds-rabbitstream |
|
||||
| Triton pricing | https://triton.one/pricing |
|
||||
| Triton Yellowstone | https://blog.triton.one/complete-guide-to-solana-streaming-and-yellowstone-grpc/ |
|
||||
| Triton Fumarole | https://blog.triton.one/introducing-yellowstone-fumarole/ |
|
||||
| Triton Deshred | https://blog.triton.one/deshred-transactions-the-fastest-path-to-solana-data/ |
|
||||
| dRPC Yellowstone | https://drpc.org/docs/solana-yellowstone-geyser-grpc |
|
||||
| Ankr Solana | https://www.ankr.com/docs/rpc-service/chains/chains-list/s-t/ |
|
||||
| Ankr pricing | https://www.ankr.com/docs/rpc-service/pricing/ |
|
||||
| GetBlock pricing | https://getblock.io/pricing-new/ |
|
||||
| bloXroute pricing | https://bloxroute.com/pricing/ |
|
||||
| Jito ShredStream | https://docs.jito.wtf/lowlatencytxnfeed/ |
|
||||
| DoubleZero Edge | https://docs.malbeclabs.com/Edge%20Subscriber%20Connection/ |
|
||||
| Old Faithful | https://github.com/rpcpool/yellowstone-faithful |
|
||||
| Source | URL |
|
||||
|----------------------------------|--------------------------------------------------------------------------------------------------------------|
|
||||
| Yellowstone proto | https://github.com/rpcpool/yellowstone-grpc/blob/master/yellowstone-grpc-proto/proto/geyser.proto |
|
||||
| Yellowstone storage proto | https://github.com/rpcpool/yellowstone-grpc/blob/master/yellowstone-grpc-proto/proto/solana-storage.proto |
|
||||
| SIMD-0385 Transaction V1 | https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0385-transaction-v1.md |
|
||||
| Transaction V1 examples | https://github.com/solana-foundation/transaction-v1-examples |
|
||||
| Yellowstone README | https://github.com/rpcpool/yellowstone-grpc/blob/master/README.md |
|
||||
| Yellowstone changelog | https://github.com/rpcpool/yellowstone-grpc/blob/master/CHANGELOG.md |
|
||||
| Helius data streaming | https://www.helius.dev/docs/data-streaming |
|
||||
| Helius LaserStream | https://www.helius.dev/blog/introducing-laserstream |
|
||||
| Helius WebSockets | https://www.helius.dev/blog/laserstream-websockets |
|
||||
| Helius enhanced WebSockets | https://www.helius.dev/blog/introducing-next-generation-enhanced-websockets |
|
||||
| Helius getTransactionsForAddress | https://www.helius.dev/blog/introducing-gettransactionsforaddress |
|
||||
| Helius preprocessed transactions | https://www.helius.dev/docs/shred-delivery/preprocessed-transactions |
|
||||
| PublicNode Solana | https://solana.publicnode.com/ |
|
||||
| OrbitFlare Yellowstone | https://docs.orbitflare.com/data-streaming/yellowstone |
|
||||
| OrbitFlare RPC | https://orbitflare.com/products/rpc-nodes |
|
||||
| OrbitFlare gRPC | https://orbitflare.com/products/solana-grpc |
|
||||
| QuickNode Yellowstone | https://www.quicknode.com/guides/solana-development/tooling/solana-grpc/solana-grpc |
|
||||
| QuickNode gRPC plans | https://www.quicknode.com/blog/solana-grpc-is-now-included-with-scale-and-business-plans |
|
||||
| Alchemy Solana gRPC | https://www.alchemy.com/solana-grpc |
|
||||
| Alchemy Yellowstone quickstart | https://www.alchemy.com/docs/reference/yellowstone-grpc-quickstart |
|
||||
| Alchemy historical replay | https://www.alchemy.com/docs/reference/yellowstone-grpc-historical-replay |
|
||||
| Alchemy compute/bandwidth | https://www.alchemy.com/docs/reference/compute-unit-costs |
|
||||
| Chainstack Yellowstone | https://chainstack.com/yellowstone-grpc-more-streams-same-price/ |
|
||||
| Shyft Yellowstone | https://shyft.to/solana-yellowstone-grpc |
|
||||
| Shyft pricing | https://shyft.to/solana-rpc-grpc-pricing |
|
||||
| Shyft RabbitStream | https://shyft.to/solana-shreds-rabbitstream |
|
||||
| Triton pricing | https://triton.one/pricing |
|
||||
| Triton Yellowstone | https://blog.triton.one/complete-guide-to-solana-streaming-and-yellowstone-grpc/ |
|
||||
| Triton Fumarole | https://blog.triton.one/introducing-yellowstone-fumarole/ |
|
||||
| Triton Deshred | https://blog.triton.one/deshred-transactions-the-fastest-path-to-solana-data/ |
|
||||
| dRPC Yellowstone | https://drpc.org/docs/solana-yellowstone-geyser-grpc |
|
||||
| Ankr Solana | https://www.ankr.com/docs/rpc-service/chains/chains-list/s-t/ |
|
||||
| Ankr pricing | https://www.ankr.com/docs/rpc-service/pricing/ |
|
||||
| GetBlock pricing | https://getblock.io/pricing-new/ |
|
||||
| bloXroute pricing | https://bloxroute.com/pricing/ |
|
||||
| Jito ShredStream | https://docs.jito.wtf/lowlatencytxnfeed/ |
|
||||
| DoubleZero Edge | https://docs.malbeclabs.com/Edge%20Subscriber%20Connection/ |
|
||||
| Old Faithful | https://github.com/rpcpool/yellowstone-faithful |
|
||||
|
||||
Les URLs sont documentaires. Aucun endpoint runtime, token ou secret de compte n'est ajouté au dépôt par cet audit.
|
||||
|
||||
@@ -883,6 +934,9 @@ support vs preuve = axes séparés ; NON PROUVÉ n'implique pas REJET
|
||||
provider model = capabilities/configuration, jamais enum provider fermé
|
||||
network identity = mainnet canonique ; mainnet-beta alias legacy/externe
|
||||
RAW canonicalisation = lower-layer commune, sans edge Job <-> Worker
|
||||
Transaction V1 = wire source-neutral Legacy/V0/V1 dans common ; activation cluster non supposée
|
||||
Yellowstone pre.006 = transaction wire V1 qualifié ; RAW complet via hydration HTTP
|
||||
TR-C2 = adapter productif Transport DTO -> common réservé au Worker pre.007
|
||||
0.3.10 = Worker live multi-source + adaptations communes nécessaires
|
||||
0.3.12 = Job Backfill multi-stratégie historique
|
||||
```
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/031-V0_3_10_RAW_TRANSACTION_INGEST_PLAN.md -->
|
||||
<!-- version: 9 -->
|
||||
<!-- version: 10 -->
|
||||
|
||||
# Plan v0.3.10 — RAW Transaction commune + Worker d’ingestion multi-source
|
||||
|
||||
@@ -1080,7 +1080,19 @@ Le second rejeu opérateur de `pre.005-fix.001` révèle ensuite deux gardes de
|
||||
|
||||
### `pre.006` — parité Yellowstone transactions/blocks
|
||||
|
||||
Fermer les adapters structurés Yellowstone transaction/block, Transaction V1, meta et cross-source parity. Aucune persistance directe si le gate byte-identical échoue.
|
||||
**Statut : réalisé, en attente du gate opérateur Rust.**
|
||||
|
||||
La common RAW gagne un modèle transaction wire source-neutral Legacy/V0/V1 et des serializers exacts bytes/Base64. Les goldens couvrent Legacy, V0, V1 avec configuration complète et V1 avec configuration présente mais vide. L'extracteur de première signature Base64 traite désormais le layout V1 `0x81` à signatures terminales et conserve le chemin signatures-first Legacy/V0.
|
||||
|
||||
Le modèle V1 verrouille les contraintes SIMD-0385 utiles à l'ingestion : 4096 octets maximum, 12 signatures, 64 adresses, 64 instructions, indexes bornés, aucune ALT, configuration inline et absence de trailing bytes après les signatures. La common reste Transport/Config/Job/Worker/runtime-free.
|
||||
|
||||
Un canari `yellowstone_raw_parity.rs` monte un Geyser Tonic local et utilise le vrai chemin public Transport `YellowstoneGrpcChannel -> open_standard_subscribe -> YellowstoneSubscribeUpdate`. Une `Transaction` V1 puis un `Block` V1 portant la même transaction sont projetés test-only vers la common et doivent sérialiser exactement le même wire V1. Le canari vérifie aussi slot, transaction index et `block_time` côté Block.
|
||||
|
||||
La qualification RAW-direct complète est refusée : l'update Transaction n'a pas `block_time`, et la meta Yellowstone protobuf n'est pas prouvée byte-identical avec la meta JSON HTTP du RAW v1 actuel. Le futur Worker doit donc utiliser Yellowstone comme signal live/transaction-wire riche puis hydrater par HTTP avant persistence RAW, tant qu'un gate ultérieur ne prouve pas `TR-C4`.
|
||||
|
||||
`tonic` et `yellowstone-grpc-proto` sont ajoutés uniquement en `dev-dependencies` du Backfill pour le serveur déterministe ; les canaris dependency/hardening verrouillent leur absence du graphe productif. Aucun adapter productif n'est placé en Backfill ou Transport : `TR-C2` reste réservé au Worker `pre.007`.
|
||||
|
||||
La fraicheur upstream a été revalidée le 7 septembre 2026 : SIMD-0385 décrit encore V1 comme `Review`/pre-release et les exemples Solana signalent une activation cluster feature-gated. KSP implémente donc le décodage/canonicalisation sans supposer l'activation Mainnet.
|
||||
|
||||
### `pre.007` — Worker foundation/runtime
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/027-V0_3_10_RAW_TRANSACTION_INGEST.md -->
|
||||
<!-- version: 9 -->
|
||||
<!-- version: 10 -->
|
||||
|
||||
# Validation v0.3.10 — RAW Transaction commune + Worker d’ingestion
|
||||
|
||||
@@ -942,3 +942,50 @@ KSP workspace Rust rule audit: clean
|
||||
Markdown table audit: clean (339 table(s), 761 file(s))
|
||||
```
|
||||
|
||||
### 13.10 Gate d'assemblage `pre.006` — Transaction V1 et Yellowstone
|
||||
|
||||
Le rejeu opérateur de `pre.005-fix.002` communiqué le 6 septembre 2026 est intégralement vert : audits statiques, `cargo check --workspace`, Clippy strict, common RAW, 387 tests Transport avec suites publiques/release/doctests, et suite Backfill complète incluant hardening et parité WS/Helius. `pre.006` part donc de cette baseline fermée.
|
||||
|
||||
La tranche ajoute dans `ksp-raw-transaction-lib` :
|
||||
|
||||
```text
|
||||
RawSolanaMessageVersion Legacy/V0/V1
|
||||
RawSolanaMessageHeader
|
||||
RawSolanaCompiledInstruction
|
||||
RawSolanaAddressTableLookup
|
||||
RawSolanaTransactionConfig
|
||||
RawSolanaTransactionMessage
|
||||
RawSolanaTransactionWire
|
||||
serialize_solana_transaction_wire
|
||||
serialize_solana_transaction_wire_base64
|
||||
```
|
||||
|
||||
Les tests common imposent des goldens Base64 exacts Legacy/V0/V1, la configuration V1 vide significative, les limites structurelles V1, l'interdiction des ALT et l'extraction de signature depuis les signatures terminales.
|
||||
|
||||
Le canari Backfill `tests/yellowstone_raw_parity.rs` utilise un serveur Geyser local et le vrai canal public Yellowstone Transport. Il exige :
|
||||
|
||||
```text
|
||||
Transaction V1 : slot = 42, index = 3, wire = golden common
|
||||
Block V1 : slot = 42, index = 3, block_time présent, wire identique
|
||||
meta : conservée comme DTO Yellowstone, sans prétendre à l'identité JSON HTTP
|
||||
```
|
||||
|
||||
Décision de qualification :
|
||||
|
||||
```text
|
||||
Yellowstone transaction wire = QUALIFIÉ
|
||||
Yellowstone Transaction RAW = HYDRATION HTTP (block_time absent)
|
||||
Yellowstone Block RAW complet = HYDRATION HTTP (meta JSON byte-identical non prouvée)
|
||||
TR-C2 adapter productif = différé au Worker pre.007
|
||||
```
|
||||
|
||||
Le manifest Backfill ajoute uniquement en dev :
|
||||
|
||||
```text
|
||||
tonic = { workspace = true, features = ["codegen", "server"] }
|
||||
yellowstone-grpc-proto = { workspace = true, features = ["tonic"] }
|
||||
```
|
||||
|
||||
`tests/dependency_boundary.rs` vérifie qu'elles ne figurent pas avant `[dev-dependencies]`, et le canari hardening attend exactement `{tokio, tokio-tungstenite, tonic, yellowstone-grpc-proto}` en dev tout en gardant l'inventaire normal inchangé.
|
||||
|
||||
L'environnement d'assemblage ne fournit ni `cargo`, ni `rustc`, ni `rustfmt`. Le gate Cargo/Clippy/tests reste donc opérateur. Les audits Python KSP et Markdown sont exécutés après fermeture du delta et leurs résultats sont enregistrés dans `deltas/0.3.10/pre.006.md`.
|
||||
|
||||
Reference in New Issue
Block a user