8.1 KiB
Audit de clôture native, exécution et RPC — 0.4.2
Décision
Le jalon 0.4.2 est clôturé. L’audit distingue quatre contrats indépendants :
- les opérations futures constructibles par
kb_executor_solana_core; - les instructions passées décodables par
kb_decoder_solana_core; - les méthodes standard HTTP/WebSocket exposées par
kb_onchain_transport; - l’orchestration de sécurité, de simulation, d’envoi et de replay post-exécution.
Une méthode transportable via JSON brut n’est pas considérée comme un adaptateur typé. Un builder stateless n’autorise pas à lui seul une opération dépendant d’un compte, d’une autorité, du rent, d’un slot ou d’un epoch. Une opération dangereuse peut être complète dans la bibliothèque tout en restant absente de l’UI et désactivée sur Mainnet.
Résultat synthétique
| Domaine | Inventaire canonique | Contrat final 0.4.2 |
|---|---|---|
| Exécuteur natif | 18 surfaces, 14 appelables, 4 non invocables/historiques, 109 opérations | égalité imposée par test Rust ; builders comparés aux interfaces ou layouts officiels |
| Décodeur natif | 18 surfaces, 121 déclarations | égalité imposée avec kb_program_ids::native_program_ids() et SolanaCoreDecoder::coverage() |
| HTTP JSON-RPC | 52 méthodes | 52 contrats typés configurables, 0 méthode standard limitée au JSON brut |
| WebSocket JSON-RPC | 9 paires / 18 méthodes | 9 requêtes, 9 notifications et 9 runtimes persistants typés |
| Préflight stateful | ALT, Config, Feature, Slashing, ZK ElGamal | rapports NotRequired / Ready / Blocked, Localnet/Devnet uniquement |
| Parcours mutable validé | System transfer Devnet | simulation, signature, envoi, confirmation, canonical, core et decode replay réussis |
Exécuteur Solana Core
docs/NATIVE_SOLANA_EXECUTION_MATRIX.json et SOLANA_CORE_OPERATION_CODES imposent :
- exactement 18 surfaces ;
- exactement 14 surfaces appelables et 4 surfaces sans instruction client ;
- exactement 109 codes d’opération uniques ;
- Program IDs présents dans
kb_program_ids; - contrat de construction, politique, tests, validation cluster et décision UI pour chaque opération ;
- distribution des préflights
27 none / 14 required / 68 future.
Les surfaces sans builder client sont BPF Loader v1, BPF Loader v2, Native Loader et l’ancien ZK Token Proof Program. Stake Redelegate reste historique decode-only. Cette classification évite d’inventer des instructions qui ne sont plus ou n’ont jamais été appelables par un client moderne.
Les entrées future ne signifient pas « non implémenté ». Elles signifient que le wire et le plan sont couverts offline, mais que l’activation mutable exige encore une preuve stateful par scénario sur Localnet/Devnet. Aucune de ces opérations n’est activée sur Mainnet par 0.4.2.
Décodeur Solana Core
docs/NATIVE_SOLANA_DECODER_MATRIX.json couvre exactement les 18 surfaces du registre natif et 121 déclarations. Les tests de complétude parcourent les enums officielles ou les tables wire auditées pour System, Compute Budget, ALT, Stake, Vote, loaders, précompiles, Slashing et preuves ZK.
Stake Config reste un compte bien connu non exécutable. Il ne possède ni dispatch d’instruction ni plan d’exécution.
HTTP JSON-RPC standard
docs/SOLANA_STANDARD_RPC_MATRIX.json et STANDARD_HTTP_METHODS enregistrent 52 méthodes. Chacune possède un contrat de requête/résultat propre à kb_onchain_transport. Les options facultatives restent indépendantes : commitment, minContextSlot, encodage, dataSlice, filtres, contexte, tri, niveau de détail, rewards et version maximale de transaction.
Les DTO Agave ne font pas partie de l’API publique. La voie JSON brute reste une primitive interne ou d’extension fournisseur, pas un substitut à une méthode standard absente.
WebSocket JSON-RPC standard
Les neuf paires standard possèdent paramètres, notifications et runtime persistant dans kb_onchain_transport. WsSession fournit :
- une socket multiplexée ;
- des identifiants locaux stables et distants remappables ;
- unsubscribe explicite ;
- timeouts bornés ;
- ping/pong et fermeture ;
- reconnexion exponentielle bornée ;
- réabonnement ;
- suppression terminale de
signatureSubscribe.
blockSubscribe, slotsUpdatesSubscribe et voteSubscribe sont désactivées par défaut, mais activables lorsqu’un endpoint les annonce explicitement. La première souscription réelle sert de probe paresseux. Une réponse Method not found, not enabled, unavailable ou unsupported désactive uniquement la capacité concernée pour la session ; les erreurs de paramètres, d’authentification ou de rate limit ne la désactivent pas.
Frontière Tauri et TS-rs
Les payloads actifs de kb_app_demo et kb_config transmis par JSON utilisent des number, pas des bigint. Les valeurs d’identifiants sont contrôlées avec Number.isSafeInteger avant invocation. Les types génériques hors frontière Tauri conservent leurs contrats exacts lorsqu’ils ne sont pas sérialisés par JSON.stringify.
Le navigateur SQL applique maintenant la limite maximale reçue du backend avant l’appel Tauri. Une valeur supérieure à 5 000 produit un diagnostic frontend et n’atteint plus PostgreSQL.
Preuves de validation
Validations fournies le 13 juillet 2026 :
| Crate / contrôle | Résultat |
|---|---|
kb_program_ids |
5 tests |
kb_decoder_solana_core |
116 tests |
kb_executor_solana_core |
88 tests |
kb_execution_api |
22 tests |
kb_execution_safety |
15 tests |
kb-lib::executor::solana::transaction |
12 tests |
kb_onchain_transport |
113 tests |
kb_pipeline |
56 tests |
kb_config |
41 tests |
kb_app_demo |
88 tests |
kb_store_pg avec PostgreSQL réel |
45 tests |
cargo clippy --all-targets |
propre |
Le test Devnet opt-in a exécuté un transfert de 1 000 000 lamports avec airdrop nul depuis un wallet préfinancé. Il a confirmé simulation, signature, envoi, confirmation, hydratation canonique, extraction core et decode replay. cargo tauri dev a démarré Vite, initialisé les treize tables attendues et exercé les sessions WebSocket.
L’archive de logs Mainnet/Tauri confirme des unsubscribe réels pour slot, root et program. Le refus de sélectionner un autre endpoint tant qu’une session est active est un garde-fou volontaire. L’ancien échec JSON.stringify cannot serialize BigInt n’est plus présent.
Limites conservées après clôture
- Mainnet reste désactivé par défaut et exige une politique explicite.
- Les opérations stateful administratives non exercées sur cluster restent hors UI et bloquées avant toute future activation mutable.
- Le parcours validé utilise une transaction legacy avec recent blockhash ; durable nonce et transactions v0 sont couverts par les bibliothèques mais nécessitent leurs propres parcours opérateur avant exposition.
- Les méthodes WebSocket instables dépendent du nœud et peuvent être désactivées automatiquement à l’exécution.
La clôture de 0.4.2 n’ouvre aucune version suivante et ne fixe aucun plan de sources historiques externes.