ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/docs/pws2004/freenet.mgp
Revision: 1.8
Committed: Sat Jul 3 01:37:09 2004 UTC (22 years, 4 months ago) by root
Branch: MAIN
CVS Tags: HEAD
Changes since 1.7: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 %include "std.mgp"
2 %%default 1 bimage "gtk/gtk-window.jpg" 1024x768, center
3 %page
4 %charset "iso8859-1"
5 %bimage "bg.png" 1280x1024
6
7 Freenet
8
9
10
11 "I worry about my child and the Internet all
12 the time, even though she's too young to have
13 logged on yet. Here's what I worry about. I
14 worry that 10 or 15 years from now, she will
15 come to me and say 'Daddy, where were you
16 when they took freedom of the press away from
17 the Internet?'"
18
19 --Mike Godwin, Electronic Frontier Foundation
20
21
22 %center
23 %%image "gtk/hello31.jpg" 0 200 200 1
24
25 %page
26
27 Ziele
28
29
30
31
32 Projekt, Dokumentation und Implementation frei und für jeden zugänglich
33 %pause
34
35
36 Informationsfreiheit ohne Zensur
37 %pause
38
39 garantiert anonyme Veröffentlichung
40 %pause
41
42 garantierter Zugang zur Information
43
44 %page
45
46 Implementation
47
48
49
50
51 virtuelles Netzwerk
52 %pause
53 Ausfall auch großer Teile des Netzes werden kompensiert
54
55 %pause
56 einzelne Knoten
57 %pause
58 kennen die gespeicherten Daten nicht
59 %pause
60 können Datenverkehr anderer Knoten nicht lesen
61 %pause
62 kennen Sender und Empfänger von Daten nicht
63
64
65 %page
66
67 Freenet aus "Benutzersicht"
68
69
70 %pause
71 Alle Daten werden in Datenblöcken (keys) organisiert
72
73 %pause
74 Keys werden in das Netzwerk "eingefügt"
75 %pause
76
77 Maximale Größe eines Datenblocks: 1MB
78 %pause
79
80 HTML-Seiten werden üblicherweise in einem Key gespeichert
81 %pause
82
83 Große Dateien werden mit forward error correction in kleinere Blöcke geteilt
84 %pause
85 Algorithm::FEC
86
87
88 %page
89
90 Freenet-URLs
91
92
93 Übliche Form eines Freenet-Links:
94
95 %font "t4"
96 http://localhost:8888/
97 CHK@pfAv9IejYPXDguEkUhiNUMAwI,blzDbhN~q4JrfRWw
98 //Suffix
99 %font "s"
100
101 %pause
102 http://localhost:8888/ nur der Pfad zum HTTP-Proxy des Knotens
103 %pause
104 CHK ist der Typ (hier: Content Hash Key)
105 %pause
106 Dahinter Folgen Parameter (meist Schlüssel u.ä.), "base64"-codiert
107 %pause
108 Suffix (nach //) wird von Freenet ignoriert
109
110 %page
111
112 Content Hash Keys
113
114
115 %font "t3"
116 CHK@pfAv9IejYPLQwaTLXDguEkUhiNUMAwI,blzDbhN~8Q28esq4JrfRWw
117 ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
118 Typ Routing-Key Crypto-Key
119 %font "s"
120
121
122 %pause
123 Crypto-Key wird aus den Daten generiert
124 verschlüsselt die Daten
125
126 %pause
127 Routing-Key wird aus dem Crypto-Key generiert
128 dient zum Indizieren und Suchen der Daten
129
130 %pause
131 Daten können mehrfach eingefügt werden. Da gleiche Daten == gleicher Key wird das Netzwerk nicht belastet
132
133 %page
134
135 Freenet Live
136
137 %system "/opt/bin/links -g -mode 1024x756 http://129.13.162.73:8888/"
138
139 %page
140
141 Abrufen eines Keys (1)
142
143
144 Beispiel: ein Bild der Seite "Thought-Crime":
145
146 %font "t3"
147 CHK@pfAv9IejYPLQwaTLXDguEkUhiNUMAwI,blzDbhN~8Q28esq4JrfRWw
148 %font "s"
149
150 1. Suche nach CHK@pfAvI...kUhiNUMAwI
151 %pause
152 (a5f02ff487a36...e12452188d50c0302)
153 %pause
154 0c == 4k, 0302 == CHK + Twofish
155 %pause
156 Skalierbarkeit durch lineare Suche
157
158 %pause
159 2. Entschlüsseln der Daten mit blzDbhN~8Q28esq4JrfRWw
160 (6e5cc36e137ef10dbc7acab826b7d15b)
161
162 %page
163
164 Abrufen eines Keys (2)
165
166
167 Abgerufene Daten bestehen aus Metadaten und Daten
168
169 Metadaten:
170
171 %font "t3"
172 Revision=1
173 EndPart
174 Document
175 Info.Format=image/png
176 End
177 %font "s"
178
179 Daten:
180
181 %font "t3"
182 PNG^Z...
183 %font "s"
184
185 %page
186
187 Signed Subspace Key
188
189
190 %font "t3"
191 SSK@Sc6qV~D6iFhaYord6HtbjJ8MaEYPAgM,Jrd6HtbjJfw1UO1g/YoYo
192 ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
193 Typ Public Key PAgM Entropie + Daten
194 %font "s"
195
196 %pause
197 Daten werden mit einem private Key signiert
198
199 %pause
200 maximale Größe 32K
201
202 %pause
203 mit einem Schüsselpaar können viele Keys eingefügt werden
204 Unterscheidung über angehängte Daten
205
206 %page
207
208 Und nun: Perl
209
210
211 Net::Freenet::FCP
212 http://www.sf.net/projects/perlfcp
213 %pause
214 stark bei Metadaten
215 %pause
216
217 Net::FCP
218 CPAN
219 %pause
220 stark beim asynchronen Einfügen bzw. Abrufen
221 %pause
222 ist von mir :)
223
224 %page
225
226 Einfache Abfragen
227
228 %pause
229 Abfragen benutzen das Freenet Client Protocol (FCP)
230 %pause
231 ein einziger Horror
232 %pause
233 zum Glück gibt's Perl :)
234 %pause
235
236 %font "t5"
237 use Net::FCP;
238 my $fcp = new Net::FCP;
239
240 %pause
241 my ($meta, $data)
242 = @{ $fcp->client_get (
243 "freenet:SSK@0O....PAgM/fx/3//"
244 15
245 ) };
246
247 %font "s"
248
249 %page
250
251 Fehlerbehandlung
252
253
254 %pause
255 Bei Nichtfinden: die
256 %pause
257 Net::FCP::Exception<<data_not_found,>>
258 %pause
259 einfach nochmal probieren
260
261 %pause
262 Bei Netzwerkfehlern: die
263 %pause
264 Net::FCP::Exception<<short_data,reason:unexpected eof or internal node error>>
265 %pause
266 einfach nochmal probieren
267
268 %pause
269 Bei Schluckauf: die
270 %pause
271 einfach nochmal probieren
272 %pause
273
274 Daher: eval { } benutzen.
275
276 %page
277
278 Metadaten in Perl
279
280
281 %pause
282 Metadaten in Perl: Net::FCP::Metadata-Objekte
283 %pause
284
285 Am besten einmal ausgeben lassen:
286
287 %font "t5"
288 use Data::Dumper;
289 print STDERR Dumper $meta;
290 print $data;
291 %font "s"
292
293 %pause
294 z.B. mit eg/fetch1:
295
296 %font "t4"
297 eg/fetch1 SSK@0OhV.......oPAgM/fx/3// >data
298 %font "s"
299
300 %page
301
302 Metadaten einer Freesite
303
304
305 Stark gekürzt:
306
307 %pause
308 %font "t5"
309 version => { 'revision' => '1' },
310 document => [ {
311 info => { format => 'image/png' },
312 redirect=> { target => 'freenet:CHK@...' },
313 name => 'activelink.png'
314 } ],
315 raw => 'Version
316 Revision=1
317 ...
318 End
319 '
320 };
321 %font "s"
322
323 %page
324
325 Manifest-Metadaten
326
327
328 Beispiele für Keys aus den Metadaten der Freesite:
329
330 %pause
331 %font "t3"
332 Hauptseite
333 SSK@0OhVDWutibbBMbXmbxNXW0M6YFoPAgM/fx/3//
334
335 %pause
336 Icon
337 SSK@0OhVDWutibbBMbXmbxNXW0M6YFoPAgM/fx/3//activelink.png
338 %font "s"
339
340
341 %pause
342 client_get liefert identische Daten
343
344 %pause
345 Freenet ignoriert alles hinter //
346
347 %page
348
349 Manifest-Metadaten
350
351
352 Selbst nachschauen durch Lookup in den Metadaten:
353 %pause
354
355 %font "t5"
356 $link = grep $_->{name} eq "activelink.png",
357 @{ $metadata->{document} };
358 %pause
359 print $link->{redirect};
360 %font "s"
361
362 %pause
363 kein Redirect => Daten sind angehängt
364
365 %page
366
367 Freesite-Management
368
369
370 %pause
371 Wie verändert man Daten, die nicht mehr veränderbar sind?
372
373 %pause
374 Lösung 1: Veränderbare Keys (TUKs)
375 %pause
376 Viel Rauch, wenig Realität
377
378 %pause
379 Lösung 2: Editions
380 %pause
381 Links auf zukünftige Inhalte
382 %pause
383 "verkettete Liste"
384
385 %pause
386 Lösung 3: DBR-Links
387 %pause
388 Date-Based-Redirects
389
390 %page
391
392 Editions (1)
393
394
395 A-HREF + IMG-Element, zeigt auf activelink der nächsten
396 Edition.
397
398 %pause
399 Beispiel: Freesite "Freenet Explained"
400
401 %font "t5"
402 SSK@0OhV...oPAgM/fx/4//
403 # Link-Ziel
404 SSK@0OhV...oPAgM/fx/4//activelink.png
405 # IMG-SRC
406 %font "s"
407
408 %pause
409 Edition 4 existiert noch nicht
410 %pause
411 Editionen werden durchnummeriert
412 %pause
413 Für Spider: .next-Eintrag
414
415 %page
416
417 Editions (2)
418
419
420 %pause
421 Vorteile:
422 %pause
423 "relativ" einfach für Autoren
424 %pause
425 realisierbar mit "Hausmittel"
426 %pause
427 keine Pflege notwendig
428 %pause
429
430 Nachteile:
431 %pause
432 umständlich in der Benutzung
433 %pause
434 "es ist und bleibt ein Hack"
435
436 %page
437
438 Date-Based-Redirects (1)
439
440
441 Unterstützung spezieller Redirects
442 %pause
443 Timestamp statt fortlaufender Nummer
444 %pause
445 Spezielle Metadaten
446 %pause
447
448 Beispiel "The Freenet Help Index":
449 %pause
450
451 %font "t4"
452 'version' => { 'revision' => '1' },
453 'document' => [
454 { 'date_redirect' => {
455 'increment' => '15180',
456 'target' => 'SSK@rjY...8PAgM/FreenetHelp'
457 }
458 }
459 ],
460 %font "s"
461
462 %page
463
464 Date-Based-Redirects (2)
465
466
467 Vorteile:
468 %pause
469 einfach in der Benutzung
470 %pause
471 "sauber" über Metadaten implementiert
472 %pause
473 festgelegter Key
474 %pause
475
476 Nachteile:
477 %pause
478 feste Abstände zwischen Updates
479 %pause
480 häufige Pflege
481 %pause
482 keine inserts == keine Freesite
483
484 %page
485
486 DBRs in Perl
487
488
489 %font "t5"
490 %pause
491 my $D = $metadata->{document}[0];
492
493 %pause
494 my $incr = (hex $D->{increment}) || 86400;
495 my $offs = (hex $D->{offset}) || 0;
496 my $targ = $D->{target} || die;
497
498 %pause
499 my ($head, $tail) = split /\//, $targ, 2;
500
501 %pause
502 my $NOW = time;
503 my $time = $NOW - $NOW % $incr + $offs;
504 %pause
505 my $result = sprintf "%s/%x-%s",
506 $head, $time, $tail;
507 %pause
508 %font "t3"
509
510 SSK@rjYFfgPHfolmcStiaoxESFfBXz8PAgM/40a16900-FreenetHelp
511
512 %page
513
514 Effiziente Freenet-Abfragen
515
516
517 %pause
518 Problem:
519 Freenet == hohe Latenz
520 %pause
521 parallele Anfragen absolut notwendig
522 %pause
523 Implementation über Threads schlecht
524 %pause
525 Perl hat keine echten Threads
526
527 %pause
528 %font "s"
529 Lösung:
530 %pause
531 Ereignisgesteuerung
532 %pause
533 Unterstützung für Coro, Event, Glib, Tk...
534
535 %page
536
537 Transaktionen
538
539
540 %pause
541 Implementation von $fcp->client_get:
542
543 %pause
544 %font "t5"
545 my $txn = $fcp->txn_client_get (...);
546
547 %pause
548 return $txn->result;
549
550 %pause
551 %font "s"
552 Jeder FCP-Requesttyp besitzt eine txn_-Methode.
553
554 %pause
555 Parallelisierung:
556 %pause
557
558 %font "t5"
559 map $_->result,
560 map $_->txn_client_get ($_),
561 @download;
562
563 %page
564
565 Asynchrone Abfragen
566
567
568 %pause
569 Ziel: n ausstehende Anfragen zu jedem Zeitpunkt
570
571 %pause
572 Callback bei Beendigung
573
574
575 %pause
576 %font "t5"
577 my $txn = $fcp->txn_client_get (...)
578 ->cb (\&callback);
579 %font "s"
580
581 %pause
582 txn-Methoden sind i.Allg. "chainbar"
583
584 %page
585
586 Hauptprogramm
587
588
589 Hauptprogramm muß in die Hauptschleife springen:
590
591 %font "t5"
592 use Net::FCP qw(event=Event);
593
594 %pause
595 my $fcp = new Net::FCP;
596 $fcp->txn_client_get ($_)->cb (\&finished)
597 for @ARGV;
598
599 %pause
600 Event::loop;
601
602 %font "s"
603 %pause
604 Angabe des Event-Moduls nur im Hauptprogramm
605
606 %page
607
608 Callback
609
610
611 %font "t5"
612 %pause
613 sub finished {
614 my ($txn) = @_;
615
616 %pause
617 # .. neue txn starten
618
619 %pause
620 my ($meta, $data) = eval {
621 @{ $txn->result }
622 };
623
624 %pause
625 if ($@) {
626 warn "error $@, who cares :)"
627 } else {
628 warn "Lo and Behold! We got soemthing!";
629 # tue etwas
630 }
631 }
632
633 %page
634
635 Callbacks und Threads
636
637
638 Das Coro Modul ermöglicht es,
639 "Callback-Stil" und "Thread-Stil" zu mischen:
640
641 %pause
642 %font "t4"
643 use Net::FCP qw(event=Coro);
644
645 my $fcp = new Net::FCP;
646
647 # Achtung. Pseudocode :)
648 for my $url (@urls) {
649 async {
650 %pause
651 my ($meta, $data) = @{ $fcp->client_get ($url) };
652
653 for (@alle_splitfile_blöcke) {
654 $fcp->txn_client_get (...)
655 ->cb (\&save_splitfile_block);
656 }
657 };
658 }
659
660 %page
661
662 Splitfiles
663
664
665
666
667 %pause
668 Zerteilen von großen Dateien in:
669
670 %pause
671 Segmente (max. 128MB)
672
673 %pause
674 Datenblöcke (max 1MB)
675
676 %pause
677 Checkblöcke (50% der Gesamtzahl)
678
679
680 %page
681
682 Publizieren
683
684
685 Einfügen von Keys ist so einfach(?) wie auslesen
686
687 %pause
688 %font "t4"
689 $fcp->client_put ($uri, $meta, $data, $htl, $remove);
690 %font "s"
691
692 %pause
693 Parallelität mit txn_client_put
694 %pause
695 Key Collisions sind O.K.
696 %pause
697 Key wird automatisch erzeugt:
698
699 %pause
700 %font "t4"
701 my $attr = $fcp->client_put
702 ('CHK@', "", "Daten\n", 20);
703 print "Eingefügte URI: $attr->{uri}\n";
704
705 %pause
706 %font "t3"
707 => freenet:CHK@MT~LuxKHH8fugJehkcgp239h7C4KAwI,378rJzHVZbsQbd7VGMHxSg
708
709 %page
710
711 SSK-Keys generieren
712
713
714 SSK = Spezialfall von SVK
715
716 %pause
717 %font "t4"
718 my ($public, $private, $crypto)
719 = @{ $fcp->generate_svk_pair };
720 %font "s"
721
722 %pause
723 Einfüge- und Ausleseschlüssel:
724
725 %pause
726 %font "t4"
727 my $name = "..."; # beliebig
728 my $get = "SSK\@${public}PAgM,$crypto/$name";
729 %pause
730 my $put = "SSK\@$private,$crypto/$name";
731 %font "s"
732
733 %pause
734 Net::FCP::Key::SSK
735
736 %page
737
738 Erzeugen einer Freesite (1)
739
740
741 %pause
742 %font "t4"
743 perl -MNet::FCP -MNet::FCP::Key::SSK
744 -e 'Net::FCP::Key::SSK->new_from_fcp
745 (Net::FCP->new)
746 ->save ($ARGV[0])' mykey
747
748
749
750 %font "t5"
751 %pause
752 # Definitionen
753 my $edition = 1;
754 my $keyfile = "mykey";
755 my $htl = 10;
756
757 %pause
758 # Module
759 use Net::FCP qw(event=Event);
760 use Net::FCP::Metadata;
761 use Net::FCP::Key::SSK;
762
763 %page
764
765 Erzeugen einer Freesite (2)
766
767
768 %font "t4"
769 %pause
770 # Notwendige Objekte erzeugen/laden
771 my $fcp = new Net::FCP;
772 my $ssk = new_from_file Net::FCP::Key::SSK $keyfile;
773
774 %pause
775 \# Hilfsfunktion zum (asynchronen) Einfügen
776 sub add_key {
777 my ($name, $key, $meta, $data) = @_;
778
779 $fcp->txn_client_put ($chk, $meta, $data, $htl, 1)
780 ->cb (sub {
781 eval {
782 my $attr = $_[0]->result;
783 } or warn "'$name': $@";
784 });
785 }
786
787 %page
788
789 Erzeugen einer Freesite (3)
790
791
792
793 %font "t4"
794 \# Hilfsfunktion für Dateien
795 sub add_file {
796 my ($name, $path, $contenttype) = @_;
797
798 # lies die Datei ein
799 my $data = ...
800
801 my $chk = $fcp->generate_chk ("", $data);
802 $manifest->add_redirect ($name => $chk,
803 format => $contenttype);
804 add_key $name, $chk, "", $data;
805 }
806
807 %page
808
809 Erzeugen einer Freesite (4)
810
811
812 %font "t4"
813 \# Hauptprogramm: Manifest erzeugen
814
815 my $manifest = new Net::FCP::Metadata;
816
817 %pause
818 \# .prev-Link
819 $manifest->add_redirect (
820 ".prev" => $ssk->gen_pub ($edition - 1))
821 if $edition > 1;
822
823 %pause
824 \# .next-Link
825 $manifest->add_redirect (
826 ".next" => $ssk->gen_pub ($edition + 1));
827
828 %page
829
830 Erzeugen einer Freesite (5)
831
832
833 %font "t4"
834 \# Dateien hinzufügen
835
836 %pause
837 add_file "activelink.png" => "logo.png", "image/png";
838 add_file "" => "index.html", "text/html";
839 add_file "index.html" => "index.html", "text/html";
840 add_file "freesite" => "freesite", "text/plain";
841
842 %pause
843 \# Manifest einfügen
844 my $site = $ssk->gen_pub ($edition);
845
846 %pause
847 add_key "manifest", $site, $manifest, "";
848
849 %pause
850 print "site generated as $site//\n";
851
852 %pause
853 Event::loop;
854
855
856 %page
857
858 Erzeugen einer Freesite (6)
859
860
861 Ausgabe des Programms:
862
863 %font "t5"
864 %pause
865 site generated as SSK@wg...gPAgM,Jr...UO1g/1//
866 %pause
867 Insert of 'freesite' (1688 bytes) ok.
868 Insert of 'activelink.png' (1346 bytes) ok.
869 Insert of 'index.html' (200 bytes) ok.
870 Insert of '' (200 bytes) ok.
871 Insert of 'manifest' (0 bytes) ok.
872
873 %page
874
875 Fragen?
876
877
878
879