forked from wetube/bitcloud
-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.lisp
251 lines (192 loc) · 4.62 KB
/
server.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
(defpackage :bitcloud
(:use :cl :cl-who :hunchentoot :parenscript))
(in-package :bitcloud)
(defclass worker ()
(alias
private-key
public-key
banned?
banned-time
protected?))
(defclass user (worker)
(votes
wallet
favorites
moderators
history
updloads))
(defclass stream ()
(nodes
contents))
(defclass content ()
(name
description
owner
owner-signature
release-date
expiration-date
tags ; categories
files
mimetype
puntuations
comments
link
min-speed-requirement
updates))
(defclass file ()
(version
version-description
data
hash
owner-signature))
(defclass moderator (worker)
(contents
trusted-users
supermoderators
advertisers
ads-price
ads-share-to-users
tags))
(defclass moderated-content ()
(content
rename
retags))
(defclass wallet ()
(worker
balance
transactions))
(defclass transaction ()
(hash
date
confirmations
sender
reciever
sender-signature
amount
(escrow nil)
(escrow-expiration-date nil)
(escrow-origin-coin-type nil)
(escrow-origin-coin-address nil)))
(defclass block ()
(transactions
worker-bans))
(defvar *current-pool* nil)
(defvar *last-pool* nil)
(defvar *new-pool-time* 600)
(defvar *current-block* nil)
(defvar *blockchain* '())
(defconstant *new-block-time* 600) ;seconds
(defgeneric create-user (credentials))
(defgeneric submit (thing))
(defgeneric sign (thing key))
;agent generics -- proof of work
(defclass node (worker)
(max-download-speed
max-upload-speed
max-space
signature
accepted-coins
moderators
preferential-moderators
cloud-moderators
protected?
shutdown-date))
(defclass pool ()
(nodes))
(defclass file-cache ()
(path
file
insert-date
expiration
partial-views-count
complete-views-count))
(defclass cache ()
(max-size
files))
(defgeneric ban (worker))
(defun check-pool (pool)
(let ((nodes (select-pseudorandom (nodes p))))
(mapcan #'ban
(;check real serving bandwidth
;check agent working
;check nodes assigments
;check content correctness in serving
;check users correctness
;check short circuit
))
(submit pool)))
; blockchain
(defun generate-primordial-block ())
(defun generate-first-pool ())
;;;;;;;;; p2p protocol
(defclass node-stats ()
(node
speed-load
node-connections
user-connections
moderator-connections
cache
space-load
hunchentoot-accepter))
(defclass connection ()
(worker
worker-signature
node-signature
origin-ip
exit-ip
start-date
expiration-date
protected?
last-command
last-command-date
last-error
last-error-date))
(defgeneric connect (from to)) ; => connection
(defun start-node-server-daemon (node)) ; => node-stats
(defmacro irm (connection &body body)) ;; query interpreter
(defun order (connection commands))
(defun run (connection commands))
;routing
(defun select-pseudorandom-nodes (pool &key (amount 8)))
(defclass stream-block ()
(size
hash))
(defconstant +how-many-nodes+ 3)
(defun request-nodes (node &key (amount +how-many-nodes+))) ; => entry node
(defun request-protected-circuit (node &key (amount +how-many-nodes+))) ; => entry node
(defun request-node-stats (pool node))
;money transactions
(defgeneric check-coin-daemon (wallet))
(defgeneric launch-coin-daemon (wallet))
(defgeneric send-money (transaction))
(defgeneric exchange-to-foreign-coin (transaction foreign-wallet))
(defgeneric exchange-from-foreign-coin (transaction foreign-wallet))
;interface
(defgeneric log (worker message))
(defun launch-interface (output))
(defun console (node))
;proof of stake
(defgeneric judge-time (worker connection))
(defgeneric judge-bandwidth (worker connection))
(defgeneric judge-storage (worker connection))
(defgeneric judge-moderation (worker connection))
(defgeneric judge-transactions (worker connection))
(defun apply-rules-to-node (node)
(proof-of-bandwidth node)
(proof-of-storage node)
(proof-of-moderation node)
(proof-of-transactions node))
(defmethod judge-bandwidth ((node NODE) connection))
(defmethod judge-bandwidth ((moderator MODERATOR) connection))
(defmethod judge-bandwidth ((user USER) connection))
(verdict :law 'bandwidth :correct t :reward 0.2345 :beneficiary a-worker)
(verdict :law 'storage :correct nil :penalization 1.3 :victim a-worker :ban 6)
(defmacro with-laws-enforce-to (node &body judments))
(with-laws-enforce-to worker
judge-bandwidth
judge-storage
...)
(defgeneric enforce (worker verdict))
(defmethod enforce ((node NODE) verdict))
(defun request-time (node))
(defgeneric judge-timestamps (node connection))