Files
2026-09-06 17:15:51 +02:00

8.5 KiB
Raw Permalink Blame History

Delta 0.3.10-pre.004 — HTTP observed block + matériau RAW block

Base requise

0.3.10-pre.003
workspace.package.version = 0.3.10-pre.3

Le gate opérateur communiqué le 2026-09-06 ferme intégralement pre.003 : audits statiques propres, cargo check --workspace PASS, Clippy workspace --all-targets --all-features -- -D warnings PASS, tests de ksp-raw-transaction-lib PASS, tests de ksp-job-backfill-lib PASS avec 51 tests unitaires et 20 tests dintégration, arbres normal/features conformes.

Objectif

Fermer TR-B et la preuve HTTP block de TR-C sans ouvrir le Worker :

getBlock pool HTTP
    -> valeur observée + provider/endpoint winner
    -> SolanaConfirmedBlock
    -> N SolanaBlockTransaction full Base64
    -> matériau RAW source-neutral

La tranche ne crée aucun adapter productif Transport -> common. Conformément à TR-C2, cet adapter reste producer-owned et sera matérialisé dans le futur ksp-worker-raw-transaction-ingest-lib.

Version

workspace.package.version = 0.3.10-pre.4

Le header du Cargo.toml racine passe de 493 à 494. Le nombre de membres workspace reste 20.

get_block_observed

ksp-onchain-transport-lib ajoute :

HttpTransportPool::get_block_observed(...)

Le wrapper :

réutilise exactement la validation/config moderne de get_block
utilise le routing/admission/timeout/retry standard du pool
retourne HttpObservedValue<Option<SolanaConfirmedBlock>>
conserve endpoint_name + provider du winner réel après retry/reroute
préserve result = null comme None
nexpose ni URL, ni headers, ni raw HTTP body
réutilise le décodage typé SolanaConfirmedBlock

get_block(...) et get_block_observed(...) partagent désormais le même helper privé de paramètres et la même validation du commitment processed.

Provenance winner déterministe

Le canari Transport configure deux endpoints :

endpoint 1 -> HTTP 429
endpoint 2 -> getBlock success

La valeur observée doit reporter exclusivement :

endpoint_name = winner-endpoint
provider = winner-provider

Le Debug conserve uniquement la projection sûre et ne rend pas le transaction wire Base64.

Matériau Base64 source-neutral

ksp-raw-transaction-lib ajoute base64 à son graphe common et expose :

extract_raw_transaction_signature_from_binary_base64(...)
RawTransactionMaterial::binary_base64_with_embedded_signature(...)

Lextracteur lit directement le wire transaction Solana Base64 sans dépendance à une crate transaction runtime :

borne la représentation textuelle avant décodage
exige Base64 STANDARD canonique
lit un short_vec de signature count borné et canonique
refuse count = 0
refuse short_vec tronqué/non canonique
refuse tableau de signatures tronqué
exige au moins un byte de message après les signatures déclarées
retourne uniquement la première signature exacte de 64 octets
ne copie jamais le transaction wire dans erreur/Debug

Le constructeur common réutilise cette signature puis conserve les dimensions RAW v1 existantes :

network
slot
block_time
transaction Base64
meta omitted/null/value
version omitted/null/legacy/number
transaction_index

Le format canonique reste strictement ksp.solana.raw_transaction v1.

Preuve cross-layer sans nouveau couplage de production

Le nouveau canari test-only :

crates/ksp-job-backfill-lib/tests/http_block_material.rs

utilise une crate qui dépend déjà de Transport et de common pour prouver la composition future sans créer dedge architectural supplémentaire :

get_block_observed
    -> SolanaConfirmedBlock
    -> 2 SolanaBlockTransaction distinctes
    -> full Base64 + meta + version + transactionIndex 0/1
    -> RawTransactionMaterial::binary_base64_with_embedded_signature
    -> canonicalize_raw_transaction

Les deux transaction wires minimales font 66 octets chacune et utilisent des signatures distinctes :

transaction 0 -> signature [0; 64]
transaction 1 -> signature [1; 64]

Le canari vérifie que ces signatures et les index 0/1 restent associés à la bonne transaction, avec le slot et le block time communs du bloc.

Cette preuve reste strictement test-only. Aucun symbole ksp_raw_transaction_lib nest ajouté aux sources de production de ksp-onchain-transport-lib.

Dépendances common

Le graphe runtime direct de ksp-raw-transaction-lib devient exactement :

base64
ksp-core-lib
ksp-store-api
serde_json
sha2

Restent interdits :

ksp-store-lib
ksp-onchain-transport-lib
ksp-config-lib
ksp-job-api
ksp-job-backfill-lib
ksp-worker-api
tokio
futures

La règle DEP-PIPE-006 reste donc respectée.

Documentation durable

crates/ksp-onchain-transport-lib/USAGE.md documente la différence entre :

get_block(...)
get_block_observed(...)

sans transformer le guide en journal de prerelease.

docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md ferme TR-B, conserve TR-C2 producer-owned et corrige le graphe common vers ksp-store-api.

Le plan 031 et la validation 027 enregistrent également la fermeture opérateur de pre.003 et le périmètre exact de pre.004.

Fichiers ajoutés

crates/ksp-job-backfill-lib/tests/http_block_material.rs
crates/ksp-onchain-transport-lib/fixtures/http/get_block.observed_material.success.json
deltas/0.3.10/pre.004.md

Fichiers modifiés

Cargo.toml
crates/ksp-onchain-transport-lib/USAGE.md
crates/ksp-onchain-transport-lib/src/rpc_blocks.rs
crates/ksp-onchain-transport-lib/tests/public_api.rs
crates/ksp-onchain-transport-lib/unit_tests/rpc_blocks.rs
crates/ksp-raw-transaction-lib/Cargo.toml
crates/ksp-raw-transaction-lib/src/canonical.rs
crates/ksp-raw-transaction-lib/src/error.rs
crates/ksp-raw-transaction-lib/src/lib.rs
crates/ksp-raw-transaction-lib/src/signature.rs
crates/ksp-raw-transaction-lib/tests/dependency_boundary.rs
crates/ksp-raw-transaction-lib/tests/public_api.rs
crates/ksp-raw-transaction-lib/unit_tests/canonical.rs
crates/ksp-raw-transaction-lib/unit_tests/signature.rs
docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md
docs/plans/031-V0_3_10_RAW_TRANSACTION_INGEST_PLAN.md
docs/validation/027-V0_3_10_RAW_TRANSACTION_INGEST.md

Fichiers supprimés

Aucun.

Validations exécutées dans lenvironnement dassemblage

python3 scripts/audit_rust_workspace_rules.py
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean

python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas
Markdown table audit: clean (339 table(s), 757 file(s))

Lenvironnement dassemblage ne fournit ni cargo, ni rustc, ni rustfmt.

Gate opérateur demandé

cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-raw-transaction-lib
cargo test -p ksp-onchain-transport-lib
cargo test -p ksp-job-backfill-lib --test http_block_material
cargo tree -p ksp-raw-transaction-lib --edges normal
cargo tree -p ksp-onchain-transport-lib --edges normal

Validations non exécutées localement

cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-raw-transaction-lib
cargo test -p ksp-onchain-transport-lib
cargo test -p ksp-job-backfill-lib --test http_block_material
cargo tree -p ksp-raw-transaction-lib --edges normal
cargo tree -p ksp-onchain-transport-lib --edges normal
smokes live : non requis pour cette tranche déterministe

Décisions prises

TR-B est fermé par get_block_observed
get_block et get_block_observed partagent validation + décodage
la common extrait la signature dun transaction wire Base64 complet
aucune dépendance Solana transaction runtime nest ajoutée à la common
aucun adapter productif Transport -> common dans Transport
TR-C2 reste Worker-owned
la preuve block -> common est cross-layer et test-only
RAW v1 reste inchangé
aucun Worker live nest ouvert dans pre.004

Questions ouvertes

Aucune question ne bloque le gate de pre.004. pre.005 reste dédiée à la parité WS blockSubscribe + Helius transactionSubscribe, avec golden parity ou fallback hydration explicitement qualifié selon la représentation réellement disponible.