v0.1.0-pre.064-065

This commit is contained in:
2026-07-30 17:50:29 +02:00
parent e0028b323e
commit 0befb170c7
440 changed files with 36186 additions and 39 deletions

View File

@@ -0,0 +1,116 @@
<!-- file: kb_decoder_solana_core/README.md -->
<!-- version: 20 -->
# kb_decoder_solana_core
Ce crate décode les programmes Solana natifs/runtime, les programmes historiques encore observables, les loaders et les précompiles. `memo` est explicitement exclu de cette crate et appartient à la série SPL.
## Rôle dans l'écosystème
`SolanaCoreDecoder` implémente le contrat commun `InstructionDecoder` et consomme uniquement les inputs contextualisés produits par lextraction core. Il ne dépend ni de PostgreSQL, ni de Tauri, ni dun fournisseur RPC.
Le processor conserve lidentité stable `solana_native_classifier` introduite en `0.4.0`. Cette continuité permet au ledger processor/version/hash de remplacer les anciens résultats `unsupported` lors dun force replay. La version du processor reste `0.4.1` pendant les deltas préparatoires.
## Couverture `0.4.1-pre.018`
Les deltas préparatoires de `0.4.1` livrent les phases A à E et poursuivent laudit final :
- utilitaires de lecture base64 bornée et de lecture little-endian ;
- validation des comptes résolus et attribution de rôles officiels ;
- événements natifs versionnés, déterministes et explicites sur le succès on-chain ;
- décodage des quatorze variantes actuelles de `SystemInstruction` depuis `solana-system-interface 3.2.0` ;
- décodage des variantes Compute Budget actuelles depuis `solana-compute-budget-interface 3.0.0`, avec compatibilité runtime Borsh unchecked : valeurs minimales décodées et suffixes conservés par taille, préfixe et SHA-256 ;
- prise en charge historique de `RequestUnitsDeprecated` ;
- distinction entre `decoded`, `ignored`, `unsupported` et `failed` ;
- absence de mutation commitée pour une transaction source échouée ;
- décodage exact des cinq variantes Address Lookup Table depuis `solana-address-lookup-table-interface 3.1.0` ;
- gestion de la paire optionnelle payer/System lors dun extend et de la règle signer historique de lautorité lors dun create ;
- projection lifecycle ALT séparée dans `kb_materializer_lifecycle` pour les observations réussies et commitées ;
- conservation des comptes System additionnels correctement résolus avec le rôle `additional_account`, après validation sur un transfert mainnet réussi ;
- décodage exact des loaders BPF immuables, upgradeable et v4 avec tailles canoniques, champs historiques optionnels et hashes des blocs écrits ;
- classification de linvocation directe du Native Loader comme `ignored`, car aucune enum dinstruction autonome stable nest publiée ;
- projection lifecycle des finalize/deploy/upgrade/close/extend/retract/set length réussis ; `pre.020` projette séparément les changements dautorité dans `kb_materializer_admin` et les writes/copies de bytecode dans `kb_materializer_compliance_audit`, avec hash et préfixe borné ;
- décodage de `FeatureGateInstruction::RevokePendingActivation` avec validation des comptes Feature, Incinerator et System ;
- décodage générique du Config Program : clés compactes, signataires et payload opaque borné/hashé ;
- exclusion de Stake Config des surfaces, car son adresse désigne un compte historique non exécutable ;
- décodage exact des vingt variantes `VoteInstruction` de `solana-vote-interface ^6.0` via `wincode::deserialize_exact`, y compris les formes checked/seed, compactes, tower sync, initialisation V2 avec BLS, commissions différenciées et dépôt de récompenses délégateurs ;
- validation des sysvars Rent, Clock et Slot Hashes aux positions officielles, tout en conservant les comptes additionnels résolus et les privilèges attendus/observés ;
- aucune matérialisation Vote ajoutée : les événements restent des observations structurées et les transactions échouées restent non commitées.
- validation mainnet Vote sur 500 instructions réelles `tower_sync`, sans échec Vote ;
- correction du seul échec de replay observé, un `set_compute_unit_limit` de 12 octets accepté par Agave mais auparavant rejeté par le décodeur strict ;
- décodage des dix-huit variantes `StakeInstruction` depuis `solana-stake-interface ^4.3`, au moyen dun miroir wire privé compatible avec le format historique et décodé par `wincode::deserialize_exact` ;
- distinction entre les layouts de comptes historiques avec sysvars et les layouts BPF modernes, avec `accountLayout`, comptes additionnels et privilèges attendus/observés ;
- classification de `Redelegate` comme instruction historique officiellement désactivée et décodage des transactions échouées comme intentions non commitées ;
- absence de matérialisation Stake tant que létat préalable du compte, le lockup et la délégation ne sont pas disponibles dans un contrat de projection stable.
- contrat core contextualisé `2`, avec accès stable aux payloads de toutes les instructions outer de la transaction ;
- décodage structurel exact des précompiles Ed25519, secp256k1 et secp256r1, y compris références courantes/externes, signatures multiples, clé ou adresse, recovery ID et message ;
- conservation bornée des composants par longueur, SHA-256 et préfixe hexadécimal, sans recopier les messages et sans recalculer les signatures ;
- interprétation prudente du runtime : acceptation affirmée uniquement pour une transaction réussie, aucune validité cryptographique affirmée pour une transaction échouée ;
- aucune matérialisation des précompiles, avec `materializedOutputs = 0` ;
- décodage des treize instructions ZK ElGamal Proof depuis `solana-zk-elgamal-proof-interface ^0.1` et le runtime Agave ;
- distinction entre preuve inline et preuve référencée par compte, offset `u32 LE`, création optionnelle dun compte de contexte et fermeture du contexte ;
- séparation bornée contexte/corps pour les preuves inline selon les tailles `Pod` officielles, avec longueurs, SHA-256 et préfixes limités, sans conserver ni vérifier cryptographiquement la preuve ;
- marquage explicite du contenu historique indisponible pour les preuves stockées dans un compte, sans lecture RPC actuelle susceptible de diverger ;
- aucune matérialisation ZK dans `pre.015`, avec `materializedOutputs = 0`.
`pre.016` décode lancien ZK Token Proof Program comme surface historique et couvre ses dix-sept discriminants officiels. Les layouts inline utilisent les tailles `Pod` de un miroir wire local audité contre `solana-zk-token-sdk 3.1.14`; les instructions exactes de cinq octets conservent loffset vers un compte de preuve, sans lire un état RPC actuel. Les gates historiques `enable_zk_proof_from_account` et `enable_zk_transfer_with_fee`, les arités de contexte et linterdiction historique des vérifications inner sont exposées explicitement.
Le runtime Agave `v4.1.1` est un stub sans effet. Un payload qui ne correspond pas exactement à un layout historique est donc classé `current_runtime_noop_invocation`, pas `unsupported` ou `failed`. Aucun corpus mainnet nayant été trouvé, la validation repose sur les sources officielles et des fixtures synthétiques. Le décodeur ne vérifie aucune preuve, ne lie pas une transaction à une version runtime supposée et ne produit aucune matérialisation.
## Matérialisations natives
Le stateless Slashing Program est couvert depuis `pre.018` par deux layouts exacts. La preuve duplicate block externe nest pas relue depuis un état RPC actuel ; le décodeur conserve uniquement les données transactionnelles et la relation avec linstruction Ed25519 précédente.
La couverture du décodeur est volontairement plus large que celle de chaque matérialiseur spécialisé. ALT, loaders et Feature possèdent des projections lifecycle stables. Les durable nonce accounts System, les comptes de contexte ZK et les rapports Slashing possèdent désormais leurs projections stables. Stake et Vote nécessitent un matérialiseur détat dédié, `kb_materializer_staking`, car une instruction seule ne suffit pas toujours à reconstruire létat antérieur, le lockup, la délégation ou lautorité effective.
Compute Budget, les précompiles de signature et les preuves ZK sans contexte restent en audit : ils nintroduisent pas à eux seuls un état métier durable, et une projection partielle serait trompeuse. Cette distinction est maintenant suivie explicitement dans le ROADMAP et dans `docs/DECODER_MATERIALIZATION_CONTRACTS.md`.
## Contrat des événements
Chaque observation décodée contient notamment :
- `eventVersion` ;
- program ID, surface et entry code ;
- signature, slot et chemin outer/inner via `DecodedProtocolEvent` ;
- paramètres numériques sans perte ;
- comptes résolus avec rôle, index, clé et privilèges attendus/observés ;
- `transactionSucceeded` ;
- hash du payload ;
- preuve indiquant linterface officielle utilisée.
Une transaction échouée peut produire un événement dintention décodé, mais `observation_committed` reste obligatoirement faux.
## Règles locales
- Les commentaires de code restent en anglais.
- La documentation Markdown reste en français.
- Les exports publics sont contrôlés depuis `lib.rs`.
- Aucun discriminant, offset ou ordre de compte ne doit être ajouté sans source officielle vérifiable.
- Les payloads inconnus ou invalides ne doivent jamais provoquer de panic en production.
## Précompiles de signature
Ed25519 et secp256r1 utilisent la sentinelle officielle `u16::MAX` pour référencer le payload de linstruction cible. secp256k1 na pas de sentinelle : chaque index `u8` désigne explicitement une instruction outer, et la provenance `current_instruction` est déduite lorsque cet index égale celui de la cible. Les données après la table doffsets restent autorisées, car elles peuvent contenir les signatures, clés et messages référencés.
Les règles zéro signature suivent le runtime : Ed25519 accepte exactement deux octets, secp256k1 exactement un octet, et secp256r1 refuse zéro entrée et limite le compteur à huit. Le décodeur ne dépend daucune nouvelle crate officielle : les structures publiées documentent le layout, mais le comportement runtime est reproduit par un parseur local borné et aucune opération cryptographique nest exécutée.
## Interfaces et tracing
Le crate privilégie les interfaces officielles étroites : ALT, System, Vote et Loader v3 utilisent leurs enums officielles avec `wincode`; Stake consomme son interface officielle et un miroir wire privé `wincode` parce que `StakeInstruction` ne dérive pas directement les traits Wincode ; Compute Budget saligne sur linterface Borsh et le comportement unchecked du runtime. Config et Loader v2 conservent des parseurs locaux bornés parce que leurs helpers officiels sont uniquement exposés derrière `bincode`. Loader v4 conserve également un parser local borné : son interface publie lenum et les comptes, mais ses helpers sont conditionnés par `bincode` et aucun schéma `wincode` nest exposé.
Depuis `0.4.2-pre.020`, Loader v3 est désérialisé par `wincode::deserialize_exact<UpgradeableLoaderInstruction>`. Les tags, champs, booléens optionnels historiques, payloads suffixés et comptes restent couverts par les fixtures de la crate officielle et par les tests négatifs du décodeur.
Le target canonique est `kb_decoder_solana_core`. Tout statut `failed` ou `unsupported` après dispatch émet un événement `error` contenant signature, slot, chemin, program ID, processor/version, clé dinput, longueur et hash du payload, statut transactionnel et diagnostics bornés. Une transaction on-chain échouée correctement décodée reste un événement valide non commité.
## Compatibilité ZK Token historique sans SDK déprécié
Le crate ne dépend plus de `solana-zk-token-sdk`. Les tags `0..16`, tailles totales de preuve/contexte et règles de forme sont conservés dans une table locale bornée, auditée contre la dernière interface historique et le runtime Agave `v2.0.0`. Aucun helper `bincode` nest utilisé et le fallback no-op Agave `v4.1.1` reste explicite.
## Matrice de complétude native — `0.4.2-pre.023`
`docs/NATIVE_SOLANA_DECODER_MATRIX.json` inventorie les 18 surfaces de `kb_program_ids::native_program_ids()` et leurs 121 déclarations de couverture. Le test de matrice impose légalité exacte avec `SolanaCoreDecoder::surfaces()` et `SolanaCoreDecoder::coverage()`, ainsi que le nombre de déclarations attendu pour chaque Program ID.
La matrice complète les tests spécialisés qui parcourent les enums officielles ou tables wire auditées. Elle empêche quune surface soit ajoutée au registre partagé sans décodeur, quune famille disparaisse de lagrégateur ou que son nombre de variantes change sans mise à jour explicite de laudit.
Laudit consolidé exécuteur/décodeur/RPC est disponible dans `docs/SOLANA_NATIVE_RPC_CLOSURE_AUDIT.md`.