AKI Node — Server/Software (Konzeptphase)
Die Software, die aus "Nachbarschafts-LAN" ein gepooltes Bandbreitennetz 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
Pro Haushalt läuft ein AKI-Node (Mini-PC oder Einplatinenrechner), der:
- Das Nachbarschafts-Overlay bildet (Yggdrasil als erste Wahl)
- Seinen eigenen ISP-Uplink als Exit anbietet (opt-in, Kontingent)
- Downloads über alle verfügbaren Exits segmentiert und parallel lädt
- Traffic fair zwischen allen Teilnehmenden aufteilt (max-min Fairness)
- Einen geteilten Nachbarschafts-Cache bedient (lancache-Prinzip)
- (später)
freenet-coreals Sidecar laufen lässt für verteilte Inhalte/Apps
Geplante Komponenten
| Crate/Binary | Zweck |
|---|---|
aki-node |
Daemon: Discovery, Peering, Metriken, Onboarding |
aki-exit |
Exit-Dienst: kontingentierter Uplink-Proxy für Nachbarn (verschlüsselt) |
aki-fetch |
Segmentierter Multi-Exit-Downloader (HTTP-API + CLI) |
aki-fair |
Fairness-Scheduler (max-min, Exit-Kontingente, Karma) |
aki-cache |
Transparenter Nachbarschafts-Cache (DNS-basiert) |
aki-freenet |
Integration von freenet-core (Contracts für Nachbarschafts-Inhalte) |
MVP (Phase 2 der Roadmap)
Kleinster brauchbarer Schnitt:
- Zwei Nodes peeren (Yggdrasil)
- Ein Download wird über beide Uplinks gleichzeitig per HTTP-Range gesplittet, reassembliert, hash-verifiziert
- Fair-Share: zwei gleichzeitige Downloads teilen sich die Gesamt- kapazität fair
- Exit opt-in per Konfig-Datei; Kill-Switch (Exit aus = Node nutzt nur den eigenen Uplink)
Nicht-Ziele (bewusst)
- Keine Bezahl-/Krypto-Infrastruktur (Kontrast: Althea)
- Keine Anonymitätsversprechen (Freenet selbst bietet keine; wir auch nicht)
- Kein Zentralserver, keine zentrale Datensammlung
- 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/:
#![forbid(unsafe_code)]in jedem Crate-Root (undunwrap,expectnur in#[cfg(test)]-Kontext).- Newtypes statt roher Primitive für alles, was Bedeutung hat:
struct NodeId(NonZeroU64),struct BytesPerSecond(u64),struct SegmentIndex(u32),struct ExitQuotaBytes(…)— keine nacktenu64/Stringin Domänen-Typen. - Exhaustive Enums statt Strings/Bool-Flags für Zustände (z. B.
enum ExitState { OptedIn(Quota), Leeching, Suspended }),matchohne_-Arm, damit Compiler-Checks beim Erweitern greifen. - Typestate-Pattern für Protokoll-/Lebenszyklus-Zustände (z. B.
Download<Started>→Download<Split>→Download<Assembled>), damit illegale Zustandsübergänge nicht kompilieren. TryFrom/TryIntostatt stiller Konvertierung, keine panicking Operationen in nicht-Test-Code; Fehler viathiserror-Enums, Bubble-up statt Logging-and-continue.- 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)stattConfigmit Optionals). - Keine globalen
Mutex/static mut; Shared State explizit als Besitz-/Kanal-Struktur (tokio::syncprimitives mit bewusster Wahl). deny(clippy::all, clippy::pedantic)-basierte CI-Checks, sobald Code existiert;cargo-denyfür Dependencies.
Technologiestack (Vorschlag)
- Rust (tokio),
axumfür APIs - Yggdrasil als Overlay (später evtl. Babel + WireGuard)
freenet-stdlib/ WebSocket-API für Freenet-Integration- HTTP Range Requests + SHA-256-Verifizierung für Segmentierung
- Lizenz: AGPL-3.0 (freenet-core ist AGPL-3.0; Nutzung über stdlib/API erlaubt trotzdem freie Wahl — wir wählen aus Ethos-Gründen AGPL)