Docs: leech mode, no-warranty disclaimer, Rust type-safety standards
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user