# Audit-Leitfaden

> Alles, was ein Auditor von Apogee VM v1.0.0 für den Einstieg braucht: der Umfang, die normative Spezifikation und ihr Aufbau, die Notation, die Vertrauensgrenze, eine Lesereihenfolge und die Eigenschaften, deren Prüfung sich zuerst am meisten lohnt.

Dieser Abschnitt ist die vollständige Konstruktion von Apogee VM v1.0.0, für die Begutachtung geordnet. Sein Kern ist die **normative Spezifikation**, wörtlich wiedergegeben: eine Seite pro Thema, mit jeder committeten Spalte nach Index und Name, jedem Gate als Polynom, jedem Lookup und seinem Kanal, jeder Transkript-Nachricht in ihrer Reihenfolge und jedem Byte jedes Serialisierungsformats. Darum herum bieten dieser Leitfaden und die [Soundness-Karte](https://apogee.gweb3networks.com/docs/auditors/soundness-map) einem Auditor einen Einstieg.

## Umfang

| Im Umfang | Wo |
| --- | --- |
| Die Aussage, die ein Beweis begründet, und was ein Verifier besitzen muss | [Das System von Anfang bis Ende](https://apogee.gweb3networks.com/docs/auditors/spec/architecture), [Der Beweis](https://apogee.gweb3networks.com/docs/auditors/spec/proof) |
| Die Arithmetik: `Fr`, der `Fq`-Turm, G1 und G2, das Pairing, MSM, multilineare Polynome, der Sumcheck | [Primitive](https://apogee.gweb3networks.com/docs/auditors/spec/primitives) |
| Fiat–Shamir: Poseidon2, der Duplex-Sponge, jedes Tag | [Transkript](https://apogee.gweb3networks.com/docs/auditors/spec/transcript) |
| Das Setup und das Commitment-Verfahren | [Strukturierter Referenzstring](https://apogee.gweb3networks.com/docs/auditors/spec/srs), [Mercury](https://apogee.gweb3networks.com/docs/auditors/spec/mercury) |
| Das Programm: Laden, Dekodieren, Tabellen, Konfiguration, Identität | [Programm und Identität](https://apogee.gweb3networks.com/docs/auditors/spec/program), [Gastprogramm-ABI](https://apogee.gweb3networks.com/docs/auditors/spec/ecall-abi) |
| Das Ausführungsmodell und der Trace | [Ausführungs-Trace](https://apogee.gweb3networks.com/docs/auditors/spec/execution-trace), [Öffentliche Werte und Hilfsdaten](https://apogee.gweb3networks.com/docs/auditors/spec/public-values) |
| Das Beweissystem: GKR, die Schaltkreis-Registry, das Speicherargument, Lookups | [GKR-Engine](https://apogee.gweb3networks.com/docs/auditors/spec/gkr), [Schaltkreise](https://apogee.gweb3networks.com/docs/auditors/spec/circuits), [Speicherargument](https://apogee.gweb3networks.com/docs/auditors/spec/memory), [Lookups](https://apogee.gweb3networks.com/docs/auditors/spec/lookup) |
| Jede Schaltkreisfamilie, Spalte für Spalte | die sieben Befehlsfamilien und die sechs Delegationsschaltkreise |
| Der Aufbau des Provers | [Streaming-Prover](https://apogee.gweb3networks.com/docs/auditors/spec/streaming) |
| Rekursion, der Groth16-Decider und seine Zeremonie, der Contract | [Rekursion und Decider](https://apogee.gweb3networks.com/docs/auditors/spec/recursion) |
| Die Ethereum-Arbeitslast | [Ethereum-Blöcke](https://apogee.gweb3networks.com/docs/auditors/spec/ethereum) |

Die Seiten der Spezifikation sind aus dem Verzeichnis `docs/` des Repositorys von Apogee VM in der Quellrevision `3571370` übernommen; relative Links wurden in Links auf dieser Website umgewandelt und jeder `§`-Verweis in einen Link auf seinen Abschnitt. Eine Wendung im Glossar ist umformuliert, damit sie zum Rest dieser Website passt; sonst ist nichts verändert. **Wo eine Seite der Spezifikation und der Code voneinander abweichen, hat der Code recht**, und die Abweichung ist ein Befund.

## Wie die Spezifikation zu lesen ist

Die Seiten sind dafür geschrieben, neben dem Code gelesen zu werden. Jede nennt das Crate und die Funktion, die implementieren, was sie festlegt, und Kommentare im Quellcode verweisen abschnittsgenau zurück auf die Spezifikation (`docs/spec/memory.md` §2.4). Einige wiederkehrende Konventionen:

| Notation | Bedeutung |
| --- | --- |
| `M[i]`, `W[i]`, `S[i]` | committete Spalten eines Schaltkreises: Speicherspalten (im globalen Transkript gebunden, vor den Speicher-Challenges), Witness-Spalten (im eigenen Transkript des Shards gebunden), Setup-Spalten (durch die Programmidentität oder den SRS-Digest gebunden) |
| `V[…]` | eine virtuelle Tabelle: eine geschlossene Form des Zeilenindex, nie committet |
| `L{k}[j]`, `C{k}[j]`, `scratch[i]` | innere Spalte `j` der Schicht `k`; ein zwischengespeicherter Eintrag; ein Zwischenwert einer flachen Relation |
| `W[8..14]` | ein halboffener Bereich von Spaltenindizes, `W[8]` bis `W[13]` |
| `T(AS, ADDR, TS, VAL)` | ein Speichertupel, `γ_M + AS + α_addr·ADDR + α_ts·TS + α_val·VAL` |
| `4c + Δ` | der Zeitstempel von Slot `Δ` in Zyklus `c` |
| G1–G11, S1–S6 | die Schritte des globalen und des Shard-Transkripts |
| Schritte 1–12, B1–B6 | die Prüfungen des Verifiers, in ihrer Reihenfolge, für einen Shard und einen Block |
| `2^n` | eine Zweierpotenz; Höhen sind `2^8, 2^12, 2^16, 2^18, 2^20, 2^22` |

Ein als Ausdruck geschriebenes Gate wird auf 0 gehalten. Ein Lookup wird als sein Kanal, sein Selektor und sein Tupel geschrieben. „Beschränkt“ (*bounded*) bedeutet per Range-Check geprüft, und ein Wert, der **Wort** (*word*) heißt, ist eine ganze Zahl in `[0, 2^32)`.

## Lesereihenfolge

Für einen ersten Durchgang, der das ganze Argument aufbaut, bevor er in die Schaltkreise hinabsteigt:

1. **[Das System von Anfang bis Ende](https://apogee.gweb3networks.com/docs/auditors/spec/architecture).** Die Behauptung, die Kompositionstabelle, die Annahmen, die Grenzen.
2. **[Der Beweis](https://apogee.gweb3networks.com/docs/auditors/spec/proof).** Die Aussage, beide Transkripte, die Verifikationsreihenfolge, der Schlüssel und seine Laderegeln.
3. **[GKR-Engine](https://apogee.gweb3networks.com/docs/auditors/spec/gkr).** Das Schichtenmodell, das Artefakt und seine Gesetze, der Rückwärtsdurchlauf und die Begründung seiner Soundness.
4. **[Speicherargument](https://apogee.gweb3networks.com/docs/auditors/spec/memory)** und **[Lookups](https://apogee.gweb3networks.com/docs/auditors/spec/lookup).** Die beiden Argumente, auf denen alles beruht, was über eine Zeile hinausreicht, mit ihren Regeln zur Konstruktionszeit.
5. **[Schaltkreise](https://apogee.gweb3networks.com/docs/auditors/spec/circuits).** Die Registry, die Formen und wie ein Familienschaltkreis zusammengesetzt wird.
6. **Die Befehlsfamilien**, beginnend mit **[`ADD_SUB_LUI_AUIPC`](https://apogee.gweb3networks.com/docs/auditors/spec/add-sub)**, die jeden `ecall` und die Anfrageseite jeder Delegation trägt.
7. **[Delegations-ABI](https://apogee.gweb3networks.com/docs/auditors/spec/delegation)** und **[Delegationsschaltkreise](https://apogee.gweb3networks.com/docs/auditors/spec/delegation-circuits).**
8. **[Programm und Identität](https://apogee.gweb3networks.com/docs/auditors/spec/program)**, **[Öffentliche Werte](https://apogee.gweb3networks.com/docs/auditors/spec/public-values)**, **[Ausführungs-Trace](https://apogee.gweb3networks.com/docs/auditors/spec/execution-trace)**.
9. **[Transkript](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)**, **[Primitive](https://apogee.gweb3networks.com/docs/auditors/spec/primitives).**
10. **[Rekursion und Decider](https://apogee.gweb3networks.com/docs/auditors/spec/recursion)**, dann der Contract.

## Die Vertrauensgrenze

Die Soundness liegt allein beim Verifier, und der Code des Verifiers ist eine festgelegte Menge von Crates:

| Vertrauen nötig für | Crates |
| --- | --- |
| Verifizieren eines Blocks | `constants`, `field`, `curve`, `transcript`, `poly`, `sumcheck`, `pcs-verify`, `pcs`, `gkr-verify`, `verifier-core`, `verifier` und `constraints`, weil die Schaltkreise Teil der Aussage sind und ein fehlendes Gate ein Soundness-Fehler ist |
| Berechnen einer Identität aus einem ELF | `loader`, `isa`, `program` |
| Der letzte Schritt zur Chain | `guests/recursion`, `groth16`, der Schaltkreis des Deciders, `contracts/ApogeeVerifier.sol` |
| Kein Vertrauen nötig | `prover`, `emulator`, `trace`, die beweisende Hälfte von `host`: Der Prover validiert nichts |

Die Annahmen sind die Knowledge Soundness von Mercury und KZG im algebraischen Gruppenmodell unter q-DLOG, Poseidon2 als Random Oracle, die eigenen Annahmen von Groth16 für den letzten Schritt und ein ehrlicher Beitragender zu jeder Zeremonie. Nichts ist in konstanter Laufzeit implementiert, und kein Beweis ist zero-knowledge. Ein Verifier muss die Programmidentität und den SRS-Digest der Zeremonie über einen Kanal beziehen, den der Prover nicht kontrolliert.

## Wo zuerst hinsehen

Dies sind die Eigenschaften, deren Verletzung eine Fälschung wäre, jeweils mit der Stelle, an der sie begründet werden. Die [Soundness-Karte](https://apogee.gweb3networks.com/docs/auditors/soundness-map) behandelt jede Behauptung der Aussage auf dieselbe Weise.

| Eigenschaft | Begründet in |
| --- | --- |
| Jede Challenge wird nach allem gezogen, was sie schützt: die Speicher-Challenges nach jedem `M`-Commitment, der Fensterliste, `io_digest` und den 64 Randskalaren; `g` und `β` nach den `W`-Commitments des Shards | [Beweis §2](https://apogee.gweb3networks.com/docs/auditors/spec/proof#s2), [§4](https://apogee.gweb3networks.com/docs/auditors/spec/proof#s4); [Speicher §6.1](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s6-1) |
| Kein Speichertupel und keine Wurzel liest eine `W`-Spalte, die erst nach den Speicher-Challenges committet wird | [Speicher §8](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s8) |
| Ein Frame erzwingt für seine Masken nur, dass sie boolesch sind; jede Familie legt jede Maske auf `m_pc` mal die Arten fest, die die Abfrage stellen | [Speicher §2.1](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s2-1); die Seite jeder Familie |
| Jeder Schlüssel, den ein Tabellenkanal nachschlägt, ist durch seine Familie beschränkt, und jede über eine Copower geschriebene Schranke trägt zusätzlich eine direkte Schranke | [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) |
| Ein aus einem Frame-Wort dekodierter Selektor ist one-hot, da sich Codes addieren | [Delegationsschaltkreise §1](https://apogee.gweb3networks.com/docs/auditors/spec/delegation-circuits#s1) |
| Jede Delegationsanfrage wird mit genau einem Aufruf gepaart | [Delegation §5](https://apogee.gweb3networks.com/docs/auditors/spec/delegation#s5) |
| Nur die Exit-Zeile kann `HALT_PC` schreiben; `next_pc` wird überall dort, wo eine Familie es berechnet, als gerade erzwungen | [Speicher §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) |
| Ein Anfangswert pro Adresse: die Fensterregeln | [Speicher §3.5](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s3-5), [§9](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s9) |
| Die Eingabe- und Journal-Fenster enthalten die Bytes der Aussage; das Journal hat keine Anfangsspalte | [Öffentliche Werte §5](https://apogee.gweb3networks.com/docs/auditors/spec/public-values#s5) |
| Die Öffnung entnimmt die Setup-Commitments dem Schlüssel und bindet so die Tabellen und das Image, die die Identität committet | [Beweis §5](https://apogee.gweb3networks.com/docs/auditors/spec/proof#s5); [Speicher §6.2](https://apogee.gweb3networks.com/docs/auditors/spec/memory#s6-2) |
| Die Schaltkreise eines Schlüssels sind die der Registry, und sein SRS-Digest wird mit dem der Zeremonie verglichen | [Beweis §3](https://apogee.gweb3networks.com/docs/auditors/spec/proof#s3), [§7](https://apogee.gweb3networks.com/docs/auditors/spec/proof#s7) |
| Rekursion: durch die Programmidentität gebundene Tapes, die Transkriptkette, Faltungsgewichte, die nach dem gezogen werden, was sie gewichten, die gebundenen Wires des Deciders und die Reihenfolge der Zeremonierunden | [Rekursion §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) |

## Reproduzieren

Nichts von dem, was die CI ausführt, braucht eine Zeremoniedatei. Die Suiten, die echte Shards beweisen, laufen über einem eigenen Spielzeug-SRS und brauchen Dutzende GiB; deshalb werden sie namentlich aufgerufen:

```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
```

[Die Implementierung prüfen](https://apogee.gweb3networks.com/docs/auditors/implementation-checks) beschreibt, was jedes Orakel und jede Suite belegt und was keines von ihnen leistet.

## Befunde melden

Melden Sie Befunde an [admin@gweb3networks.com](mailto:admin@gweb3networks.com), mit dem Abschnitt der Spezifikation oder dem Codepfad, der betroffenen Eigenschaft und nach Möglichkeit einem Manipulations-Zwilling: einem gefälschten Witness, bewiesen, wie ein ehrlicher Prover ihn beweisen würde, der verifiziert wird.
