7.9 KiB
Delta 0.2.4-pre.005 — getBlockProduction
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; byIdentitytypé ;- 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