Files
khadhroony-solana-project/deltas/0.2.4/pre.005.md
2026-08-18 21:03:00 +02:00

7.9 KiB

Delta 0.2.4-pre.005getBlockProduction

Base requise

Livraison précédente :

0.2.4-pre.004
workspace.package.version = "0.2.4-pre.4"

Les validations locales fournies pour cette base sont propres :

cargo fmt --all                         -> terminé
cargo check --workspace                 -> terminé sans warning
cargo clippy --workspace --all-targets  -> terminé sans warning
cargo test -p ksp-onchain-transport-lib -> 208 unit tests OK
                                           22 public API tests OK
                                           17 release-completeness tests OK
                                           1 smoke Devnet ignoré comme prévu
                                           0 échec

Objectif

Implémenter exactement la tranche dédiée prévue par le plan 0.2.4 :

getBlockProduction

Cette méthode est déjà enregistrée dans la partition :

V0_2_4 / Blocks / Read / RetrySafe

Le registre central n'est donc pas modifié.

Après cette tranche, neuf des dix wrappers Blocks de 0.2.4 sont matérialisés. Il reste volontairement :

pre.006  getBlock

Les cinq méthodes Economics restent hors scope jusqu'aux tranches pre.007 et pre.008.

Réaudit RPC de la tranche

Le contrat stable a été recroisé avec Agave v4.2.1 avant implémentation.

RpcBlockProductionConfig expose exactement :

identity: Option<String>
range: Option<{firstSlot, lastSlot?}>
commitment: Option<CommitmentConfig>

Le résultat est contextualisé :

RpcResponse<RpcBlockProduction>

avec :

context
value.byIdentity
value.range.firstSlot
value.range.lastSlot

byIdentity associe chaque validator identity aux comptes :

(leader slots, blocks produced)

Le runtime Agave rejette lastSlot < firstSlot. KSP effectue donc le même contrôle déterministe avant I/O.

Aucune restriction locale confirmed/finalized n'est appliquée au commitment de getBlockProduction : le CommitmentConfig général du runtime est préservé, y compris processed.

Aucun nouvel overload, champ ou type de résultat n'a été identifié ; le plan 011 reste donc inchangé en version 3.

Version Cargo

Nouvelle prerelease technique :

0.2.4-pre.4 -> 0.2.4-pre.5

Aucune dépendance ni feature Cargo n'est ajoutée ou modifiée.

Wrapper typed getBlockProduction

Signature publique :

HttpTransportPool::get_block_production(
    role,
    Option<&SolanaBlockProductionConfig>,
) -> Result<SolanaRpcResponse<SolanaBlockProduction>>

La configuration publique acquise en pre.002 est réutilisée sans duplication :

SolanaBlockProductionConfig
SolanaBlockProductionRange

Exemple complet :

[
  {
    "commitment":"finalized",
    "identity":"11111111111111111111111111111111",
    "range":{"firstSlot":430000000,"lastSlot":430000099}
  }
]

Une plage ouverte conserve l'absence de lastSlot :

[
  {
    "commitment":"processed",
    "range":{"firstSlot":430000000}
  }
]

Un Some(SolanaBlockProductionConfig::default()) est canoniquement omis et produit :

[]

Il n'existe ici aucun overload positional dont la distinction dépendrait d'un objet vide ; l'omission est donc équivalente au config runtime par défaut.

Validation déterministe avant I/O

Lorsque les deux bornes sont explicites :

lastSlot >= firstSlot -> valide
lastSlot <  firstSlot -> rejet avant I/O

L'erreur KSP utilise le domaine partagé :

ERROR_CODE_INVALID_RPC_PARAMETERS

avec contexte non secret :

rpc_method
first_slot
last_slot

Aucune autre validation économique ou de commitment n'est inventée.

Résultat contextualisé

Le wrapper préserve le SolanaRpcResponse<T> commun :

context.slot
context.apiVersion?
value.byIdentity
value.range

Les clés de byIdentity sont décodées en Pubkey KSP. Une clé wire invalide ferme le décodage avec ERROR_CODE_INVALID_RESPONSE sans recopier la valeur fautive dans le diagnostic.

Les couples :

(leader slots, blocks produced)

sont conservés exactement ; Transport ne recalcule pas les statistiques et n'interprète pas leur économie.

Discipline #[cfg(test)]

La règle introduite par pre.002-fix.001 reste appliquée.

Éléments devenus runtime dans cette tranche parce qu'ils ont désormais un consommateur réel :

SolanaBlockProductionRange::to_json_value
SolanaBlockProductionConfig::is_empty
SolanaBlockProductionConfig::to_json_value
SolanaBlockProduction::decode_wire
WireBlockProductionRange
WireBlockProduction
WireBlockProductionRpcResponse

Éléments déjà runtime des tranches précédentes :

SolanaBlockCommitment::decode_wire
WireBlockCommitment
SolanaPerformanceSample::decode_wire
WirePerformanceSample

Restent test-only jusqu'à pre.006 :

SolanaGetBlockConfig::{is_empty,to_json_value}
SolanaBlockReward::decode_wire
SolanaBlockTransaction::decode_wire
SolanaConfirmedBlock::decode_wire
helpers privés transaction/reward de bloc
WireBlockReward
WireBlockTransaction
WireConfirmedBlock

Tous les helpers/wires Economics restent également test-only jusqu'à leurs prereleases dédiées.

Aucun #[allow(dead_code)] n'est introduit.

Fixtures HTTP ajoutées

crates/ksp-onchain-transport-lib/fixtures/http/get_block_production.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_block_production.invalid_identity.json

Elles couvrent :

  • contexte slot + apiVersion ;
  • byIdentity typé ;
  • plage effective ;
  • erreur fermée sur identity wire invalide.

Tests ajoutés

Quatre unit tests HTTP sont ajoutés :

typed_get_block_production_serializes_full_config_and_decodes_contextual_result
typed_get_block_production_omits_empty_config_and_supports_open_range_with_processed_commitment
typed_get_block_production_rejects_reversed_range_before_io
typed_get_block_production_rejects_invalid_wire_identity_without_echoing_value

Une canarie public API vérifie que le wrapper reste disponible depuis la racine de crate :

public_v0_2_4_pre_005_block_production_wrapper_is_available_from_crate_root

Une canarie release-completeness vérifie le descriptor :

release_v0_2_4_pre_005_block_production_subset_is_exact_and_retry_safe

Compteurs attendus après validation locale :

212 unit tests
23 public API tests
18 release-completeness tests
1 smoke Devnet ignoré

Fichiers modifiés

Cargo.toml
crates/ksp-onchain-transport-lib/src/rpc_blocks.rs
crates/ksp-onchain-transport-lib/unit_tests/rpc_blocks.rs
crates/ksp-onchain-transport-lib/tests/public_api.rs
crates/ksp-onchain-transport-lib/tests/release_completeness.rs

Fichiers ajoutés

crates/ksp-onchain-transport-lib/fixtures/http/get_block_production.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_block_production.invalid_identity.json
deltas/0.2.4/pre.005.md

Aucun fichier n'est supprimé.

Validation attendue

À exécuter après application de l'overlay :

cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-onchain-transport-lib

Les critères de fermeture sont :

aucun warning introduit
212 unit tests OK
23 public API tests OK
18 release-completeness tests OK
smoke Devnet ignoré comme prévu
0 échec

Le sandbox de préparation ne possède pas le toolchain Cargo/Rust ; aucune compilation locale n'est revendiquée par ce delta.

Commit attendu

Après validation locale :

v0.2.4-pre.005

Suite

La prerelease suivante reste :

0.2.4-pre.006

Scope prévu :

réaudit SIMD-0298 / SIMD-0307
getBlock moderne
bare encoding legacy
transactionDetails
wire bloc riche
SIMD-0118 numRewardPartitions
SIMD-0291 commissionBps
canary version transaction numérique non zéro / SIMD-0385