# Umgebung einrichten

> Die Toolchain, die das Repository festlegt, die beiden Workspaces, die es enthält, die Zeremoniedatei, die das Beweisen braucht, und die Maschine, die jeder Schritt verlangt.

Apogee v1.0.0 ist ein Rust-Repository. Außer `rustup` gibt es nichts zu installieren: Das Repository legt seine Toolchain fest, und die Toolchain bringt das Target der Gastprogramme (Guests) mit. Ein Gastprogramm zu schreiben, zu bauen, auszuführen und zu profilieren erfordert nichts weiter. Das Beweisen fügt eine große Datei hinzu und eine Maschine mit entsprechend viel Arbeitsspeicher.

## Die Toolchain

`rust-toolchain.toml` im Wurzelverzeichnis des Repositorys legt stable Rust **1.96.1** mit `rustfmt`, `clippy` und `llvm-tools` fest, dazu das Target **`riscv32imac-unknown-none-elf`**, dessen `core` und `alloc` vorkompiliert mitgeliefert werden. rustup wendet diese Festlegung in jedem Verzeichnis unterhalb der Wurzel an und installiert die Toolchain bei der ersten Verwendung.

```sh
cd apogee-vm
rustup show active-toolchain     # 1.96.1, overridden by rust-toolchain.toml
cargo --version
```

Nirgends werden Nightly oder instabile Features verwendet. `llvm-tools` liefert die zum LLVM des Compilers passenden `llvm-objdump` und `llvm-nm`, die das Repository für seine eingecheckten Disassembly-Listings verwendet und mit denen Sie den Code Ihres Gastprogramms lesen können.

## Zwei Workspaces

Der Checkout enthält zwei Cargo-Workspaces, und die Trennung ist wichtig:

| Workspace | Wurzel | Baut für | Enthält |
| --- | --- | --- | --- |
| Der Root-Workspace | `Cargo.toml` | Ihren Host | den Prover, den Verifier, das Host-SDK, die Werkzeuge, alles in `crates/` und `tools/` |
| Der Gastprogramm-Workspace | `guests/Cargo.toml` | `riscv32imac-unknown-none-elf` | jedes Gastprogramm, mit einem eigenen Verzeichnis `guests/target` |

Gastprogramme werden getrennt gehalten, weil jedes Mitglied für das Target der Gastprogramme kompiliert und einen `#[panic_handler]` linkt; `cargo test --workspace` in der Wurzel darf sie nie erreichen. Der Gastprogramm-Workspace bringt außerdem mit, was ein Gastprogramm braucht, um korrekt gebaut zu werden, sodass Sie es nie eintippen:

- `guests/.cargo/config.toml` setzt das Target und übergibt dem Linker `-T crates/guest-sdk/link.ld`, die Speicherkarte, sowie `--no-relax`, weil Relaxation Adressen verschieben würde, die die Programmidentität bindet.
- `guests/Cargo.toml` legt beide Build-Profile auf dieselbe Semantik fest, Überlaufprüfungen eingeschlossen ([Bauen und inspizieren](https://apogee.gweb3networks.com/docs/launch/build#profiles)).
- Sein `[patch.crates-io]` leitet `k256`, `ark-ff` und `revm-precompile` auf mitgelieferte Kopien um, die die Delegationen von Apogee aufrufen ([Delegationen](https://apogee.gweb3networks.com/docs/launch/delegations#vendored)).

> [!TIP]
> Öffnen Sie `guests/` in Ihrem Editor als eigenen Ordner. rust-analyzer liest dann die `.cargo/config.toml` dieses Workspace und prüft den Code der Gastprogramme gegen deren Target statt gegen Ihren Host.

## Die Zeremoniedatei

Jedes Commitment, das Apogee bildet, beruht auf den Potenzen eines geheimen `τ` aus einer öffentlichen Zeremonie: den **Perpetual Powers of Tau der PSE, Beitrag 80**. Eine einzige Datei dient jedem Zweck:

```text
assets/ptau/ppot_0080_24.ptau        19.3 GB, 2^24 powers; assets/ptau/ is gitignored
```

Sie brauchen sie, um eine Programmidentität zu berechnen, um echte Schlüssel zu bauen und um zu beweisen. Sie brauchen sie nicht, um ein Gastprogramm zu bauen, auszuführen oder zu profilieren, und auch nicht für die Workspace-Tests, die über eigenen Spielzeug-Setups beweisen.

Dateien aus der Zeremonie der PSE sind aus einem einzigen Transkript geschnitten; jede Datei mit Potenz 24 oder mehr ist also geeignet. `powersOfTau28_hez_final_*.ptau` von Hermez ist eine andere Zeremonie mit einem anderen `τ`: Der Reader liest sie ebenso bereitwillig ein, und jedes Commitment, jeder Schlüssel und jede Identität darüber fällt anders aus. Damit Sie bestätigen können, dass Sie die richtige Zeremonie haben: Das `[τ]_1` der Zeremonie, als Hex seiner kanonischen Kodierung `x ‖ y`, lautet:

```text
9bbb31bedc304e081e2aada4b56c2217e0e94ee16874e3517d14bef5dcec3a16
317ff1589e53513fa333591b318e8f1e55ef7c37d92beb6d9a61d770a2f39506
```

Die [SRS-Seite](https://apogee.gweb3networks.com/docs/auditors/spec/srs) der Spezifikation legt genau dar, was der Reader prüft und was er ungeprüft voraussetzt.

## Die Maschine

Bauen und Ausführen sind Laptop-Arbeit. Beweisen ist speichergebunden, und sein Speicherbedarf folgt den gleichzeitig bewiesenen Shards, nicht der Länge des Laufs.

| Schritt | Braucht |
| --- | --- |
| Ein Gastprogramm bauen, ausführen, profilieren, sein Image exportieren und inspizieren | Jeden aktuellen Laptop; Sekunden |
| Eine Programmidentität berechnen (`artifact-dump tables --ptau`) | Die Zeremoniedatei; etwa 25 s auf einem Laptop mit 18 Kernen bei den Standardhöhen |
| Ein kleines Gastprogramm bei Höhen von `2^20` beweisen | Dutzende GiB. Ein `2^20`-Shard der breitesten Befehlsfamilie hält in seinem Vorwärtsdurchlauf etwa 8,4 GiB an Körperelementen, und jeder gleichzeitig bearbeitete Shard hält seine eigenen |
| Einen vollständigen Ethereum-Block beweisen | Der gemessene Block erreichte eine Spitze von 174 GiB auf einer Maschine mit 32 vCPUs und 247,7 GiB |

Die Seite zum Beweisen erklärt, wie Höhen und die Zahl der gleichzeitig bearbeiteten Shards Speicher gegen Zeit tauschen: [Beweisen und verifizieren](https://apogee.gweb3networks.com/docs/launch/prove#heights).

## Ihren Checkout prüfen

Was die CI ausführt, alles ohne die Zeremoniedatei:

```sh
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
cargo run -p kat-gen && git diff --exit-code      # committed fixtures regenerate identically
(cd guests && cargo clippy --bins -- -D warnings)
```

Die Suiten, die echte Shards beweisen, sind mit `#[ignore]` markiert, weil jede Dutzende GiB braucht. Rufen Sie eine namentlich auf, wenn Sie auf Ihrer eigenen Maschine sehen wollen, wie ein Beweis erstellt und zurückgewiesen wird:

```sh
cargo test --release -p prover --test acceptance -- --include-ignored --test-threads=1
```

Weiter: [Ein Gastprogramm schreiben](https://apogee.gweb3networks.com/docs/launch/write), oder gehen Sie den gesamten Ablauf einmal im [Schnellstart](https://apogee.gweb3networks.com/docs/launch/quickstart) durch.
