Docs: leech mode, no-warranty disclaimer, Rust type-safety standards

This commit is contained in:
2026-09-24 12:36:24 +02:00
parent 3bc240dd9b
commit e4641d1e71
5 changed files with 80 additions and 5 deletions
+9 -1
View File
@@ -24,6 +24,13 @@ Das Projekt besteht aus zwei Hälften:
- Code-Lizenz: AGPL-3.0 (passt zum Ethos; `freenet-core` ist ebenfalls AGPL-3.0) - Code-Lizenz: AGPL-3.0 (passt zum Ethos; `freenet-core` ist ebenfalls AGPL-3.0)
- Keine Secrets ins Repo (Passwörter, Token, private IP-Listen realer Nachbarn) - Keine Secrets ins Repo (Passwörter, Token, private IP-Listen realer Nachbarn)
- Persönliche Daten von Nachbarn (Namen, Adressen) bleiben außerhalb des Repos - Persönliche Daten von Nachbarn (Namen, Adressen) bleiben außerhalb des Repos
- **Keine Garantie:** Die Software wird ohne jegliche Garantie bereitgestellt
(AGPL §§ 15/16) und muss überall prominent so gekennzeichnet sein — Nutzung
auf eigene Verantwortung der Nutzer:innen, wir übernehmen keine Haftung
für die Verwendung.
- **Maximale Type-Safety in Rust** (Details in `server/README.md`): kein
`unsafe` (`#![forbid(unsafe_code)]`), Newtypes statt roher Primitive,
exhaustive Enums/Match, keine `unwrap()`/`expect()` in nicht-Test-Code.
## Server (geplant) ## Server (geplant)
@@ -33,7 +40,8 @@ Das Projekt besteht aus zwei Hälften:
und Apps. Wichtig: Freenet bietet **keine Anonymität** (klar im und Apps. Wichtig: Freenet bietet **keine Anonymität** (klar im
[FAQ](https://freenet.org/about/faq/) benannt) — nicht damit werben. [FAQ](https://freenet.org/about/faq/) benannt) — nicht damit werben.
- Kernfeatures: Multi-Exit-Bandbreiten-Pooling, segmentierte Downloads, - Kernfeatures: Multi-Exit-Bandbreiten-Pooling, segmentierte Downloads,
Fairness-Scheduler, Nachbarschafts-Cache Fairness-Scheduler, Nachbarschafts-Cache, **Leech-Modus** (Empfangen ohne
Exit-Bereitstellung ist ausdrücklich erlaubt — Netz unter Nachbarn)
- Status: Konzeptphase, Details in `server/README.md` - Status: Konzeptphase, Details in `server/README.md`
## Git / Gitea ## Git / Gitea
+8 -2
View File
@@ -17,8 +17,14 @@ der Fairness-Scheduler (siehe Architektur) ist unsere Währung.
Jeder Haushalt bekommt standardmäßig einen gleichberechtigten, fairen Anteil Jeder Haushalt bekommt standardmäßig einen gleichberechtigten, fairen Anteil
(max-min Fairness). Stärkere Anschlüsse teilen freiwillig — genau das ist der (max-min Fairness). Stärkere Anschlüsse teilen freiwillig — genau das ist der
"anarcho-kommunistische" Kern: voneinander abhängig, freiwillig, ohne Zwang "anarcho-kommunistische" Kern: voneinander abhängig, freiwillig, ohne Zwang
und ohne Markt. Dauernutzung ohne Gegenleistung wird fair gedealt (Gespräch, und ohne Markt.
Karma, Drosselung als letztes Mittel) — nicht bestraft.
**Leechen ist erlaubt.** Wer nichts beiträgt (kein Exit, kein Cache,
keine Faser), darf trotzdem empfangen — Nachbarschaftskultur ist Nachsicht,
nicht Gegenleistungszwang. Der Scheduler behandelt "Leeched" als niedrigste
Priorität bei Knappheit, aber nie als Strafe. Es gibt keine Bezahlung und
keine Pflicht zum Mitmachen; Andenken an Fairness ist Sache des Viertels,
nicht der Software.
## 3. Freiwilligkeit und Do-ocracy ## 3. Freiwilligkeit und Do-ocracy
+13
View File
@@ -61,6 +61,19 @@ Jeder Haushalt bietet seinem Node an, wie viel Uplink er "spendiert"
(Kontingent, standardmäßig fair-share). Der Exit-Pool ist die aggregierte (Kontingent, standardmäßig fair-share). Der Exit-Pool ist die aggregierte
Kapazität. Exit ist **opt-in pro Haushalt und jederzeit widerruflich**. Kapazität. Exit ist **opt-in pro Haushalt und jederzeit widerruflich**.
### Leech-Modus
Wer seinen Uplink nicht teilen will (oder kann), schaltet Sharing einfach
aus und läuft im **Leech-Modus**: rein empfangen, nichts beitragen. Das ist
ausdrücklich legitim — "Netz unter Nachbarn" heißt Nachsicht, nicht
Gegenseitigkeitszwang. Technisch gilt:
- Leeched Nodes bekommen im Fairness-Scheduler die niedrigste (aber
weiterhin faire) Priorität, wenn Kapazität knapp ist.
- Bei Überlast wird Leeched-Nodes zuerst gedrosselt, ohne sie auszuschließen.
- Der Status ist sichtbar (Karma/Anzeige), aber es gibt keine Strafe und
keine Zwangsfreischaltung.
### Segmentierter Multi-Exit-Download (`aki-fetch`) ### Segmentierter Multi-Exit-Download (`aki-fetch`)
```mermaid ```mermaid
+6 -1
View File
@@ -85,7 +85,12 @@
Damit Agents und Developer das im Code umsetzen: Damit Agents und Developer das im Code umsetzen:
1. Exit ist opt-in, dokumentiert und jederzeit widerrufbar. 0. **Haftungsausschluss ist Pflicht:** Die Software wird ohne jegliche
Garantie ausgeliefert (AGPL §§ 15/16); README, Startup-Banner und UI
weisen klar darauf hin, dass wir keine Verantwortung für die Verwendung
übernehmen und Inhalte in der Verantwortung der Nutzer:innen liegen.
1. Exit ist opt-in, dokumentiert und jederzeit widerrufbar (Leech-Modus
ist immer möglich).
2. Node kann einzelne Teilnehmer/Segmente sperren (Sperrpflicht-Umsetzung). 2. Node kann einzelne Teilnehmer/Segmente sperren (Sperrpflicht-Umsetzung).
3. Logs: minimal, lokal, keine Inhaltslogs. 3. Logs: minimal, lokal, keine Inhaltslogs.
4. Keine Funktion, deren alleiniger Zweck das Verstecken von Rechtsbrüchen ist. 4. Keine Funktion, deren alleiniger Zweck das Verstecken von Rechtsbrüchen ist.
+44 -1
View File
@@ -3,6 +3,18 @@
Die Software, die aus "Nachbarschafts-LAN" ein gepooltes Bandbreitennetz Die Software, die aus "Nachbarschafts-LAN" ein gepooltes Bandbreitennetz
macht. Sprache: **Rust**. Status: **Konzeptphase — noch nichts implementiert.** macht. Sprache: **Rust**. Status: **Konzeptphase — noch nichts implementiert.**
## Haftungsausschluss (muss im Produkt sichtbar sein)
> **KEINE GARANTIE.** Diese Software wird "as is" ohne jegliche Garantie
> bereitgestellt (AGPL §§ 15/16). Die Betreiber und Contributor:innen dieses
> Projekts übernehmen **keinerlei Verantwortung oder Haftung** dafür, wozu
> Nutzer:innen die Software verwenden oder welche Inhalte über sie übertragen
> werden. Die Verantwortung für gesendete und empfangene Inhalte liegt
> vollständig bei den Nutzer:innen.
Dieser Hinweis muss prominent sichtbar sein: im README, im Startup-Banner
des Daemons und in der Weboberfläche.
## Zielbild ## Zielbild
Pro Haushalt läuft ein AKI-Node (Mini-PC oder Einplatinenrechner), der: Pro Haushalt läuft ein AKI-Node (Mini-PC oder Einplatinenrechner), der:
@@ -42,7 +54,38 @@ Kleinster brauchbarer Schnitt:
- Keine Bezahl-/Krypto-Infrastruktur (Kontrast: Althea) - Keine Bezahl-/Krypto-Infrastruktur (Kontrast: Althea)
- Keine Anonymitätsversprechen (Freenet selbst bietet keine; wir auch nicht) - Keine Anonymitätsversprechen (Freenet selbst bietet keine; wir auch nicht)
- Kein Zentralserver, keine zentrale Datensammlung - Kein Zentralserver, keine zentrale Datensammlung
- Kein "Piracy as a Feature" (siehe `documentation/ideen/recht.md`) - Keine inhaltliche Kontrolle oder Zensur durch die Software selbst —
die Software transportiert Dateien/Webseiten aller Art; was übertragen
wird, liegt in der Verantwortung der Nutzer:innen (Haftungsausschluss oben)
## Code-Standards: maximale Type-Safety in Rust
Der Code soll so sicher sein, dass ganze Fehlerklassen schon beim Kompilieren
unmöglich werden. Verbindliche Regeln für jede Crate in `server/`:
1. **`#![forbid(unsafe_code)]`** in jedem Crate-Root (und `unwrap`,
`expect` nur in `#[cfg(test)]`-Kontext).
2. **Newtypes statt roher Primitive** für alles, was Bedeutung hat:
`struct NodeId(NonZeroU64)`, `struct BytesPerSecond(u64)`,
`struct SegmentIndex(u32)`, `struct ExitQuotaBytes(…)` — keine nackten
`u64`/`String` in Domänen-Typen.
3. **Exhaustive Enums statt Strings/Bool-Flags** für Zustände (z. B.
`enum ExitState { OptedIn(Quota), Leeching, Suspended }`),
`match` ohne `_`-Arm, damit Compiler-Checks beim Erweitern greifen.
4. **Typestate-Pattern** für Protokoll-/Lebenszyklus-Zustände (z. B.
`Download<Started>` → `Download<Split>` → `Download<Assembled>`),
damit illegale Zustandsübergänge nicht kompilieren.
5. **`TryFrom`/`TryInto` statt stiller Konvertierung**, keine panicking
Operationen in nicht-Test-Code; Fehler via `thiserror`-Enums, Bubble-up
statt Logging-and-continue.
6. **Parsed-data-is-validated:** unsichere Eingaben (Konfig, Netzwerk) werden
direkt beim Einlesen in validierte Typen transformiert; danach trägt der
Typ die Invariante (z. B. `struct ValidatedConfig(ConfigInner)` statt
`Config` mit Optionals).
7. **Keine globalen `Mutex`/`static mut`**; Shared State explizit als
Besitz-/Kanal-Struktur (`tokio::sync` primitives mit bewusster Wahl).
8. `deny(clippy::all, clippy::pedantic)`-basierte CI-Checks, sobald
Code existiert; `cargo-deny` für Dependencies.
## Technologiestack (Vorschlag) ## Technologiestack (Vorschlag)