7.5 KiB
Delta 0.2.3-pre.006 — requestAirdrop + sendTransaction et preuve no-resend
Base requise
Livraison précédente validée localement par l'opérateur :
0.2.3-pre.005
workspace.package.version = "0.2.3-pre.5"
La validation opérateur du 2026-08-18 a confirmé :
cargo fmt --all OK
cargo check --workspace OK
cargo clippy --workspace --all-targets OK
cargo test -p ksp-onchain-transport-lib OK
Résultats Transport de cette base :
168 unit tests
17 public API tests
11 release completeness tests
0 warning signalé par check/clippy
Objectif
Activer les deux écritures de la famille Transactions :
requestAirdrop
sendTransaction
Les deux wrappers restent attachés aux descriptors centraux déjà audités :
RpcOperationKind::WriteSubmission
TransportRetryClass::NeverAfterDispatch
Après cette tranche :
10 / 11 wrappers Transactions exécutés
8 Read
2 WriteSubmission
1 Simulation encore différée
simulateTransaction reste réservée à pre.007.
Version Cargo
Conformément à VER-ID-009 :
0.2.3-pre.5 -> 0.2.3-pre.6
Aucune dépendance ni feature Cargo n'est ajoutée.
Complétude requestAirdrop
API publique :
HttpTransportPool::request_airdrop(
role,
recipient: &Pubkey,
lamports: u64,
Option<&SolanaRequestAirdropConfig>,
)
-> Result<String>
La page publique Solana courante documente commitment dans l'objet de config. La source primaire Agave v4.2.1 conserve en plus :
recentBlockhash: Option<String>
KSP l'expose donc conformément à KSP-TRANSPORT-007 au lieu de réduire la surface au seul exemple/document public visible.
Le résultat reste la signature de transaction retournée par le faucet sous forme de chaîne wire. Transport ne prend pas une dépendance Signature uniquement pour redécoder une valeur que le provider vient de produire.
Une config vide est canonicalisée vers l'omission du troisième paramètre, syntaxe strictement équivalente autorisée par KSP-TRANSPORT-007.
Complétude sendTransaction
API publique :
HttpTransportPool::send_transaction(
role,
transaction: &str,
Option<&SolanaSendTransactionConfig>,
)
-> Result<String>
Transport reçoit une transaction déjà construite, signée et encodée. Il ne la décode, ne la signe et ne la modifie pas.
La config expose la surface courante complète :
encoding Base58 | Base64
skipPreflight Option<bool>
preflightCommitment Option<SolanaCommitment>
maxRetries Option<usize>
minContextSlot Option<u64>
Les deux encodings binaires sont exercés par fixtures HTTP locales.
Une config vide est canonicalisée vers l'omission du second paramètre.
Distinction impérative des retries
SolanaSendTransactionConfig.maxRetries = retransmissions node-side après acceptation RPC
HttpRetrySettings = retries HTTP Transport KSP
Le premier champ n'accorde aucune permission de resoumission HTTP au wrapper.
Preuves end-to-end de no-resend
Les tests ne se limitent pas à evaluate_transport_retry.
Ils exercent réellement :
wrapper typed
-> descriptor central
-> execute_standard_rpc
-> client HTTP fixture
Pour chacun de requestAirdrop et sendTransaction, un serveur local compte les requêtes reçues.
Cas ambigus après dispatch :
HTTP 429 -> erreur rate_limited -> compteur = 1
HTTP 503 -> erreur http_request_failed -> compteur = 1
timeout -> erreur timeout -> compteur = 1
Même avec plusieurs retries configurés dans HttpRetrySettings, aucune seconde soumission n'est émise après ces trois états ambigus.
Cas explicitement sûr :
connexion refusée -> ERROR_CODE_HTTP_CONNECTION_FAILED -> NotDispatched
Avec deux endpoints de même priorité, la première tentative échoue avant dispatch et le retry central peut atteindre le second endpoint. Cette preuve est exercée séparément pour les deux wrappers.
Erreurs RPC applicatives
Les fixtures couvrent aussi :
- une erreur
requestAirdropde paramètres/blockhash ; - une erreur
sendTransactionde preflight/simulation.
Ces réponses restent ERROR_CODE_RPC_APPLICATION_ERROR et ne deviennent jamais des retries transport.
KSP-TRANSPORT-007 rétroactif
La question opérateur sur les wrappers antérieurs est enregistrée dans le plan 010.
Les audits 0.2.1/0.2.2 avaient déjà recherché la surface complète. Un contrôle ciblé pendant cette tranche confirme notamment l'alignement KSP avec
Agave v4.2.1 pour :
RpcAccountInfoConfig
RpcProgramAccountsConfig
RpcLargestAccountsConfig
RpcLeaderScheduleConfig
RpcGetVoteAccountsConfig
Mais la règle n'était pas encore un critère de clôture nommé. La prévision devient donc :
pre.007 simulateTransaction complet
pre.008 audit rétroactif KSP-TRANSPORT-007 sur 0.2.1 -> 0.2.3 + corrections éventuelles
pre.009 clôture finale documentaire/validation/smoke/prompt 0.2.4
Cette tranche supplémentaire évite de transformer la clôture en remédiation fonctionnelle tardive.
Documentation/source synchronisée
crates/ksp-onchain-transport-lib/src/lib.rs est corrigé pour refléter la surface réellement disponible après pre.006 :
8 reads Transactions
2 write submissions
simulateTransaction encore staged
Le plan docs/plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md passe en version 5 et enregistre le nouveau découpage jusqu'à pre.009.
CHANGELOG.md reste réservé à 0.2.3-rel.001.
Tests ajoutés
Sept tests unitaires couvrent :
requestAirdrop config complète + canonicalisation config vide
sendTransaction config complète + base58/base64 + config vide
erreurs RPC applicatives des deux writes
no-resend après HTTP 429 pour les deux writes
no-resend après HTTP 503 pour les deux writes
no-resend après timeout ambigu pour les deux writes
retry/fallback autorisé après connexion NotDispatched pour les deux writes
Un test public vérifie la disponibilité des deux wrappers/configs à la racine de crate.
Une canarie release vérifie le sous-ensemble pre.006 :
8 Read / RetrySafe
2 WriteSubmission / NeverAfterDispatch
simulateTransaction encore différée
Cible après application :
175 unit tests
18 public API tests
12 release completeness tests
Fichiers du delta
Modifiés :
Cargo.toml
crates/ksp-onchain-transport-lib/src/lib.rs
crates/ksp-onchain-transport-lib/src/rpc_transactions.rs
crates/ksp-onchain-transport-lib/unit_tests/rpc_transactions.rs
crates/ksp-onchain-transport-lib/tests/public_api.rs
crates/ksp-onchain-transport-lib/tests/release_completeness.rs
docs/plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md
Ajoutés :
crates/ksp-onchain-transport-lib/fixtures/http/request_airdrop.success.json
crates/ksp-onchain-transport-lib/fixtures/http/request_airdrop.error.json
crates/ksp-onchain-transport-lib/fixtures/http/send_transaction.success.json
crates/ksp-onchain-transport-lib/fixtures/http/send_transaction.preflight_error.json
deltas/0.2.3/pre.006.md
Validations attendues opérateur
cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-onchain-transport-lib
L'environnement de préparation du delta ne possède pas Cargo/Rustfmt. Aucune de ces commandes n'est donc déclarée réussie avant preuve opérateur.