DHT: ECC Auth and PoW.
[brdnet.git] / dhtPersist.pas
blobcf5f6e7e6d0d334715e01476c2c14e4c2b603c0b
1 unit dhtPersist;
3 Initialize DHT local node ID from file.
4 Restore DHT routing table from file.
5 Save DHT routing table on exit and periodically.
8 INTERFACE
10 IMPLEMENTATION
11 uses NetAddr,ServerLoop,DHT,SysUtils,Store1,ECC;
13 const ndfn='nodes.dat';
14 const idfn='idhash.txt';
16 procedure Save;
17 var nd: FILE of tPeerPub;
18 var node:tPeerPub;
19 var nnp:pointer=nil;
20 var nni:byte=0;
21 begin
22 assign(nd,'_'+ndfn);
23 ReWrite(nd);
24 try
25 repeat
26 dht.GetNextNode(nnp,nni,node);
27 if node.addr.isNil then break;
28 //writeln('dhtPersist: save ',string(node.addr));
29 write(nd,node);
30 until false;
31 finally
32 close(nd);
33 end;
34 rename(nd,ndfn);
35 end;
37 procedure Load;
38 var nd: FILE of tPeerPub;
39 var node:tPeerPub;
40 var pos:Word;
41 begin
42 assign(nd,ndfn);
43 try
44 ReSet(nd);
45 except
46 writeln('dhtPersist: can not open state file ',ndfn);
47 exit end;
48 {need to read the file backwards}
49 pos:=FileSize(nd);
50 if pos=0 then exit;
51 for pos:=pos-1 downto 0 do begin
52 Seek(nd,pos);
53 Read(nd,node);
54 //writeln('dhtPersist: load ',string(node.addr));
55 dht.InsertNode(node);
56 end;
57 close(nd);
58 end;
60 procedure LoadID;
61 var nd: TextFile;
62 var line:string;
63 begin
64 assign(nd,idfn);
65 try
66 ReSet(nd);
67 except
68 writeln('dhtPersist: can not open id file ',idfn);
69 exit end;
70 readln(nd,line);
71 writeln('dhtPersist: set ID to ',line,' from '+idfn);
72 dht.MyID:=line;
73 close(nd);
74 end;
76 procedure LoadIDFromECC;
77 var id:dht.tPID;
78 begin
79 Move(ECC.PublicKey,id,20);
80 writeln('dhtPersist: set ID to ',string(id),' from ECC');
81 dht.MyID:=id;
82 end;
84 procedure LoadIDFromArgs;
85 var oi:word;
86 const opt='-id';
87 begin
88 oi:=OptIndex(opt);
89 if oi>0 then begin
90 assert(OptParamCount(oi)=1,opt+'(pid:sha1)');
91 writeln('dhtPersist: set ID to '+paramstr(oi+1),' from '+opt);
92 MyID:=tPID(paramstr(oi+1));
93 end;
94 end;
95 procedure LoadIDRandom;
96 var oi:word;
97 const opt='-id-rnd';
98 var b:byte;
99 begin
100 oi:=OptIndex(opt);
101 if oi>0 then begin
102 assert(OptParamCount(oi)=0,opt+'()');
103 for b:=0 to 19 do MyID[b]:=Random(256);
104 writeln('dhtPersist: set ID to ',string(MyID),' random');
105 end;
106 end;
108 type t=object
109 pot:procedure;
110 procedure Init;
111 procedure doPeriodic;
112 procedure doSoon;
113 end;
115 procedure doLast;
116 begin
117 Save;
118 end;
120 procedure t.doSoon;
121 begin
122 Load;
123 end;
125 procedure t.doPeriodic;
126 begin
127 Save;
128 Shedule(61273,@doPeriodic);
129 end;
131 procedure t.Init;
132 begin
133 (*LoadID*);
134 LoadIDFromECC;
135 LoadIDFromArgs;
136 LoadIDRandom;
137 Shedule(2000,@doSoon);
138 Shedule(25000,@doPeriodic);
140 pot:=ServerLoop.OnTerminate;
141 ServerLoop.OnTerminate:=@doLast;
143 end;
145 var o:t;
146 BEGIN
147 o.init;
148 END.