# Guide d’audit

> Tout ce qu’il faut à un auditeur d’Apogee VM v1.0.0 pour commencer : le périmètre, la spécification normative et son organisation, la notation, la frontière de confiance, un ordre de lecture, et les propriétés qui méritent d’être vérifiées en premier.

Cette section présente la construction complète d’Apogee VM v1.0.0, organisée pour l’évaluation. Son cœur est la **spécification normative**, reproduite textuellement : une page par sujet, avec chaque colonne engagée par indice et par nom, chaque porte sous forme de polynôme, chaque lookup et son canal, chaque message de la transcription dans l’ordre, et chaque octet de chaque format de sérialisation. Autour d’elle, ce guide et la [carte de solidité](https://apogee.gweb3networks.com/docs/auditors/soundness-map) offrent à l’auditeur une porte d’entrée.

## Périmètre

| Dans le périmètre | Où |
| --- | --- |
| L’énoncé qu’établit une preuve, et ce que doit détenir un vérificateur | [Système, de bout en bout](https://apogee.gweb3networks.com/docs/auditors/spec/architecture), [La preuve](https://apogee.gweb3networks.com/docs/auditors/spec/proof) |
| L’arithmétique : `Fr`, la tour `Fq`, G1 et G2, le couplage, la MSM, les polynômes multilinéaires, le sumcheck | [Primitives](https://apogee.gweb3networks.com/docs/auditors/spec/primitives) |
| Fiat–Shamir : Poseidon2, l’éponge duplex, chaque étiquette | [Transcription](https://apogee.gweb3networks.com/docs/auditors/spec/transcript) |
| La mise en place et le schéma d’engagement | [Chaîne de référence structurée](https://apogee.gweb3networks.com/docs/auditors/spec/srs), [Mercury](https://apogee.gweb3networks.com/docs/auditors/spec/mercury) |
| Le programme : chargement, décodage, tables, configuration, identité | [Programme et identité](https://apogee.gweb3networks.com/docs/auditors/spec/program), [ABI du programme invité](https://apogee.gweb3networks.com/docs/auditors/spec/ecall-abi) |
| Le modèle d’exécution et la trace | [Trace d’exécution](https://apogee.gweb3networks.com/docs/auditors/spec/execution-trace), [Valeurs publiques et données auxiliaires](https://apogee.gweb3networks.com/docs/auditors/spec/public-values) |
| Le système de preuve : GKR, le registre des circuits, l’argument de mémoire, les lookups | [Moteur GKR](https://apogee.gweb3networks.com/docs/auditors/spec/gkr), [Circuits](https://apogee.gweb3networks.com/docs/auditors/spec/circuits), [Argument de mémoire](https://apogee.gweb3networks.com/docs/auditors/spec/memory), [Lookups](https://apogee.gweb3networks.com/docs/auditors/spec/lookup) |
| Chaque famille de circuits, colonne par colonne | les sept familles d’instructions et les six circuits de délégation |
| La structure du prouveur | [Prouveur en flux](https://apogee.gweb3networks.com/docs/auditors/spec/streaming) |
| La récursion, le décideur Groth16 et sa cérémonie, le contrat | [Récursion et décideur](https://apogee.gweb3networks.com/docs/auditors/spec/recursion) |
| La charge de travail Ethereum | [Blocs Ethereum](https://apogee.gweb3networks.com/docs/auditors/spec/ethereum) |

Les pages de la spécification sont reproduites à partir du répertoire `docs/` du dépôt Apogee VM à la révision source `3571370`, les liens relatifs étant transformés en liens vers ce site et chaque renvoi `§` en lien vers sa section. Une expression du glossaire est reformulée pour concorder avec le reste du site; rien d’autre n’est modifié. **Là où une page de la spécification et le code divergent, c’est le code qui a raison**, et la divergence constitue une constatation.

## Comment lire la spécification

Les pages sont écrites pour être lues en regard du code. Chacune nomme la crate et la fonction qui implémentent ce qu’elle énonce, et les commentaires du code source renvoient à la spécification par section (`docs/spec/memory.md` §2.4). Quelques conventions récurrentes :

| Notation | Signification |
| --- | --- |
| `M[i]`, `W[i]`, `S[i]` | les colonnes engagées d’un circuit : colonnes mémoire (liées dans la transcription globale, avant les défis mémoire), colonnes témoins (liées dans la transcription propre au shard), colonnes de mise en place (liées par l’identité du programme ou par le condensé SRS) |
| `V[…]` | une table virtuelle : une forme close de l’indice de ligne, jamais engagée |
| `L{k}[j]`, `C{k}[j]`, `scratch[i]` | la colonne interne `j` de la couche `k`; une entrée en cache; une valeur intermédiaire d’une relation plate |
| `W[8..14]` | un intervalle semi-ouvert d’indices de colonnes, de `W[8]` à `W[13]` |
| `T(AS, ADDR, TS, VAL)` | un tuple mémoire, `γ_M + AS + α_addr·ADDR + α_ts·TS + α_val·VAL` |
| `4c + Δ` | l’horodatage du créneau `Δ` du cycle `c` |
| G1–G11, S1–S6 | les étapes de la transcription globale et de celle du shard |
| étapes 1–12, B1–B6 | les vérifications du vérificateur, dans l’ordre, pour un shard et pour un bloc |
| `2^n` | une puissance de deux; les hauteurs sont `2^8, 2^12, 2^16, 2^18, 2^20, 2^22` |

Une porte écrite sous forme d’expression est astreinte à valoir 0. Un lookup s’écrit par son canal, son sélecteur et son tuple. « Borné » signifie vérifié par intervalle, et une valeur appelée **mot** est un entier dans `[0, 2^32)`.

## Ordre de lecture

Pour une première lecture qui construit l’argument entier avant de descendre dans les circuits :

1. **[Système, de bout en bout](https://apogee.gweb3networks.com/docs/auditors/spec/architecture).** L’affirmation, la table de composition, les hypothèses, les limites.
2. **[La preuve](https://apogee.gweb3networks.com/docs/auditors/spec/proof).** L’énoncé, les deux transcriptions, l’ordre de vérification, la clé et ses règles de chargement.
3. **[Moteur GKR](https://apogee.gweb3networks.com/docs/auditors/spec/gkr).** Le modèle en couches, l’artefact et ses lois, la passe arrière et ce qui la rend solide.
4. **[Argument de mémoire](https://apogee.gweb3networks.com/docs/auditors/spec/memory)** et **[Lookups](https://apogee.gweb3networks.com/docs/auditors/spec/lookup).** Les deux arguments sur lesquels repose tout ce qui traverse une ligne, avec leurs règles appliquées à la construction.
5. **[Circuits](https://apogee.gweb3networks.com/docs/auditors/spec/circuits).** Le registre, les formes, et la façon dont le circuit d’une famille est assemblé.
6. **Les familles d’instructions**, en commençant par **[`ADD_SUB_LUI_AUIPC`](https://apogee.gweb3networks.com/docs/auditors/spec/add-sub)**, qui porte chaque `ecall` et le côté demande de chaque délégation.
7. **[ABI de délégation](https://apogee.gweb3networks.com/docs/auditors/spec/delegation)** et **[Circuits de délégation](https://apogee.gweb3networks.com/docs/auditors/spec/delegation-circuits).**
8. **[Programme et identité](https://apogee.gweb3networks.com/docs/auditors/spec/program)**, **[Valeurs publiques](https://apogee.gweb3networks.com/docs/auditors/spec/public-values)**, **[Trace d’exécution](https://apogee.gweb3networks.com/docs/auditors/spec/execution-trace)**.
9. **[Transcription](https://apogee.gweb3networks.com/docs/auditors/spec/transcript)**, **[SRS](https://apogee.gweb3networks.com/docs/auditors/spec/srs)**, **[Mercury](https://apogee.gweb3networks.com/docs/auditors/spec/mercury)**, **[Primitives](https://apogee.gweb3networks.com/docs/auditors/spec/primitives).**
10. **[Récursion et décideur](https://apogee.gweb3networks.com/docs/auditors/spec/recursion)**, puis le contrat.

## La frontière de confiance

La solidité (*soundness*) relève du seul vérificateur, et le code du vérificateur est un ensemble défini de crates :

| Confiance requise pour | Crates |
| --- | --- |
| Vérifier un bloc | `constants`, `field`, `curve`, `transcript`, `poly`, `sumcheck`, `pcs-verify`, `pcs`, `gkr-verify`, `verifier-core`, `verifier`, et `constraints`, car les circuits font partie de l’énoncé et une porte manquante est un défaut de solidité |
| Calculer une identité à partir d’un ELF | `loader`, `isa`, `program` |
| La dernière étape vers la chaîne | `guests/recursion`, `groth16`, le circuit du décideur, `contracts/ApogeeVerifier.sol` |
| Aucune confiance | `prover`, `emulator`, `trace`, la moitié de `host` consacrée à la preuve : le prouveur ne valide rien |

Les hypothèses sont la solidité de connaissance (*knowledge soundness*) de Mercury et de KZG dans le modèle du groupe algébrique sous q-DLOG, Poseidon2 comme oracle aléatoire, les hypothèses propres à Groth16 pour la dernière étape, et un contributeur honnête à chaque cérémonie. Rien n’est à temps constant, et aucune preuve n’est à divulgation nulle de connaissance. Un vérificateur doit obtenir l’identité du programme et le condensé SRS de la cérémonie par un canal que le prouveur ne contrôle pas.

## Par où commencer

Voici les propriétés dont la défaillance constituerait une contrefaçon, avec l’endroit où chacune est argumentée. La [carte de solidité](https://apogee.gweb3networks.com/docs/auditors/soundness-map) traite de la même façon chaque affirmation de l’énoncé.

| Propriété | Argumentée dans |
| --- | --- |
| Chaque défi est tiré après tout ce qu’il protège : les défis mémoire après chaque engagement `M`, la liste des fenêtres, `io_digest` et les 64 scalaires de frontière; `g` et `β` après les engagements `W` du shard | [preuve §2](https://apogee.gweb3networks.com/docs/auditors/spec/proof#s2), [§4](https://apogee.gweb3networks.com/docs/auditors/spec/proof#s4); [mémoire §6.1](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s6-1) |
| Aucun tuple ni aucune racine de la mémoire ne lit une colonne `W`, laquelle est engagée après les défis mémoire | [mémoire §8](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s8) |
| Un cadre n’astreint ses masques qu’à la booléanité; chaque famille fixe chaque masque à `m_pc` multiplié par les types qui effectuent la requête | [mémoire §2.1](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s2-1); la page de chaque famille |
| Chaque clé que recherche un canal de table est bornée par sa famille, et toute borne écrite au moyen d’une copuissance porte aussi une borne directe | [lookup §4](https://apogee.gweb3networks.com/docs/auditors/spec/lookup#s4), [§11](https://apogee.gweb3networks.com/docs/auditors/spec/lookup#s11); [shift-bitwise §3](https://apogee.gweb3networks.com/docs/auditors/spec/shift-bitwise#s3) |
| Un sélecteur décodé à partir d’un mot du cadre est one-hot, puisque les codes s’additionnent | [circuits de délégation §1](https://apogee.gweb3networks.com/docs/auditors/spec/delegation-circuits#s1) |
| Chaque demande de délégation est appariée à exactement une invocation | [délégation §5](https://apogee.gweb3networks.com/docs/auditors/spec/delegation#s5) |
| Seule la ligne de sortie peut écrire `HALT_PC`; `next_pc` est astreint à être pair là où une famille le calcule | [mémoire §5](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s5); [jump-branch-slt §5](https://apogee.gweb3networks.com/docs/auditors/spec/jump-branch-slt#s5) |
| Une seule valeur initiale par adresse : les règles des fenêtres | [mémoire §3.5](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s3-5), [§9](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s9) |
| Les fenêtres d’entrée et de journal contiennent les octets de l’énoncé; le journal n’a pas de colonne initiale | [valeurs publiques §5](https://apogee.gweb3networks.com/docs/auditors/spec/public-values#s5) |
| L’ouverture prend les engagements de mise en place dans la clé, liant ainsi les tables et l’image que l’identité engage | [preuve §5](https://apogee.gweb3networks.com/docs/auditors/spec/proof#s5); [mémoire §6.2](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s6-2) |
| Les circuits d’une clé sont ceux du registre, et son condensé SRS est comparé à celui de la cérémonie | [preuve §3](https://apogee.gweb3networks.com/docs/auditors/spec/proof#s3), [§7](https://apogee.gweb3networks.com/docs/auditors/spec/proof#s7) |
| Récursion : bandes liées par l’identité du programme, chaînage des transcriptions, poids de repliement tirés après ce qu’ils pondèrent, fils liés du décideur, et ordre des tours de la cérémonie | [récursion §7](https://apogee.gweb3networks.com/docs/auditors/spec/recursion#s7), [§8](https://apogee.gweb3networks.com/docs/auditors/spec/recursion#s8), [§9](https://apogee.gweb3networks.com/docs/auditors/spec/recursion#s9) |

## Reproduire

Rien de ce qu’exécute la CI n’a besoin du fichier de cérémonie. Les suites qui prouvent de vrais shards s’exécutent sur leur propre SRS jouet et nécessitent des dizaines de GiB; elles sont donc lancées par leur nom :

```sh
cargo test --workspace                                   # every unit, law and row suite
cargo run -p kat-gen && git diff --exit-code             # fixtures regenerate identically
cargo test --release -p prover --test <suite> -- --include-ignored --test-threads=1
#   acceptance, control, alu, mem, fills, block, streaming, keccak, recursion, public_io, revm
cargo test --release -p checker --test tamper -- --include-ignored --test-threads=1   # every tamper twin
cargo run -p checker -- laws <artifact>                  # Laws 1–4 and the lookup rules, independently
```

[Vérifier l’implémentation](https://apogee.gweb3networks.com/docs/auditors/implementation-checks) décrit ce qu’établit chaque oracle et chaque suite, et ce qu’aucun d’eux n’établit.

## Signalement

Signalez vos constatations à [admin@gweb3networks.com](mailto:admin@gweb3networks.com), en indiquant la section de la spécification ou le chemin dans le code, la propriété en jeu et, si possible, un jumeau falsifié : un témoin contrefait, prouvé comme un prouveur honnête le prouverait, et qui passe la vérification.
