1use crate::*;
2
3use std::convert::TryFrom;
4use std::ops::{Deref, DerefMut};
5#[derive(Clone, Debug)]
31pub struct TrafficContract {
32 pub price_per_kbytes: u32, pub avg_ping_ms: Option<u16>,
36
37 pub max_up_bytes: Option<u64>,
38 pub max_up_speed: Option<u32>,
39 pub min_up_speed: Option<u32>,
40
41 pub max_down_bytes: Option<u64>,
42 pub max_down_speed: Option<u32>,
43 pub min_down_speed: Option<u32>,
44}
45
46impl RawEncode for TrafficContract {
47 fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
48 let mut size: usize = 4;
49 if self.avg_ping_ms.is_some() {
50 size += 2;
51 }
52 if self.max_up_bytes.is_some() {
53 size += 8;
54 }
55 if self.max_up_speed.is_some() {
56 size += 4;
57 }
58 if self.min_up_speed.is_some() {
59 size += 4;
60 }
61 if self.max_up_speed.is_some() {
62 size += 8;
63 }
64 if self.max_down_speed.is_some() {
65 size += 4;
66 }
67 if self.min_down_speed.is_some() {
68 size += 4;
69 }
70
71 Ok(size)
72 }
73
74 fn raw_encode<'a>(
75 &self,
76 buf: &'a mut [u8],
77 purpose: &Option<RawEncodePurpose>,
78 ) -> BuckyResult<&'a mut [u8]> {
79 let buf = self
80 .price_per_kbytes
81 .raw_encode(buf, purpose)
82 .map_err(|e| {
83 log::error!("TrafficContract::raw_encode/price_per_kbytes error:{}", e);
84 e
85 })?;
86 Ok(buf)
87 }
88}
89
90impl<'de> RawDecode<'de> for TrafficContract {
91 fn raw_decode(_buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
92 unimplemented!()
93 }
94}
95
96#[derive(Clone, Debug)]
97pub struct ChunkTransContract {
98 pub price_per_kbytes: u32, pub obj_list: Option<Vec<ObjectId>>, pub min_speed: Option<u32>, pub max_speed: Option<u32>, pub avg_speed: Option<u32>, pub max_bytes: Option<u64>, }
108
109impl RawEncode for ChunkTransContract {
110 fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
111 unimplemented!()
112 }
113
114 fn raw_encode<'a>(
115 &self,
116 _buf: &'a mut [u8],
117 _purpose: &Option<RawEncodePurpose>,
118 ) -> BuckyResult<&'a mut [u8]> {
119 unimplemented!()
120 }
121}
122
123impl<'de> RawDecode<'de> for ChunkTransContract {
124 fn raw_decode(_buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
125 unimplemented!()
126 }
127}
128
129#[derive(Clone, Debug)]
151pub enum ServiceContractBody {
152 Traffic(TrafficContract), ChunkTrans(ChunkTransContract), }
156
157#[derive(Clone, Debug)]
158pub struct ServiceContract {
159 buyer: ObjectId,
160 seller: ObjectId,
161 customer: Option<ObjectId>, service_type: u32,
163 service_start: u64, service_end: u64,
165
166 coin_id: Option<u8>, total_price: Option<u64>, advance_payment: Option<u64>, contract_body: ServiceContractBody,
170}
171
172impl ServiceContract {
173 pub fn new() -> ServiceContract {
174 unimplemented!();
175 }
176}
177
178impl RawEncode for ServiceContract {
179 fn raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
180 let mut size: usize;
181
182 size = self.buyer.raw_measure(purpose).map_err(|e| {
183 log::error!("ServiceContract::raw_measure/buyer error:{}", e);
184 e
185 })?;
186
187 size += self.seller.raw_measure(purpose).map_err(|e| {
188 log::error!("ServiceContract::raw_measure/seller error:{}", e);
189 e
190 })?;
191
192 if self.customer.is_some() {
193 size += self.customer.unwrap().raw_measure(purpose).map_err(|e| {
194 log::error!("ServiceContract::raw_measure/customer error:{}", e);
195 e
196 })?;
197 }
198
199 size += self.service_type.raw_measure(purpose).map_err(|e| {
200 log::error!("ServiceContract::service_type/customer error:{}", e);
201 e
202 })?;
203
204 size += self.service_start.raw_measure(purpose).map_err(|e| {
205 log::error!("ServiceContract::service_type/service_start error:{}", e);
206 e
207 })?;
208
209 size += self.service_end.raw_measure(purpose).map_err(|e| {
210 log::error!("ServiceContract::service_type/service_end error:{}", e);
211 e
212 })?;
213
214 if self.coin_id.is_some() {
215 size += self.coin_id.unwrap().raw_measure(purpose).map_err(|e| {
216 log::error!("ServiceContract::service_type/coin_id error:{}", e);
217 e
218 })?;
219 }
220
221 if self.total_price.is_some() {
222 size += self
223 .total_price
224 .unwrap()
225 .raw_measure(purpose)
226 .map_err(|e| {
227 log::error!("ServiceContract::service_type/total_price error:{}", e);
228 e
229 })?;
230 }
231
232 if self.advance_payment.is_some() {
233 size += self
234 .advance_payment
235 .unwrap()
236 .raw_measure(purpose)
237 .map_err(|e| {
238 log::error!("ServiceContract::service_type/advance_payment error:{}", e);
239 e
240 })?;
241 }
242
243 Ok(size)
244 }
245
246 fn raw_encode<'a>(
247 &self,
248 _buf: &'a mut [u8],
249 _purpose: &Option<RawEncodePurpose>,
250 ) -> BuckyResult<&'a mut [u8]> {
251 unimplemented!()
252 }
253}
254
255impl<'de> RawDecode<'de> for ServiceContract {
256 fn raw_decode(_buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
257 unimplemented!()
258 }
259}
260
261#[derive(Clone, Debug)]
264pub struct SNReceipt {
265 pub ping_count: Option<u32>,
266 pub called_count: Option<u32>,
267 pub success_called_count: Option<u32>, }
269
270impl RawEncode for SNReceipt {
271 fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
272 unimplemented!()
273 }
274
275 fn raw_encode<'a>(
276 &self,
277 _buf: &'a mut [u8],
278 _purpose: &Option<RawEncodePurpose>,
279 ) -> BuckyResult<&'a mut [u8]> {
280 unimplemented!()
281 }
282}
283
284impl<'de> RawDecode<'de> for SNReceipt {
285 fn raw_decode(_buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
286 unimplemented!()
287 }
288}
289
290#[derive(Clone, Debug)]
291pub struct TrafficReceipt {
292 pub up_bytes: u64,
293 pub down_bytes: u64,
294 pub total_package: u64,
295 pub max_speed: Option<u32>,
296 pub min_speed: Option<u32>,
297 pub avg_ping_ms: Option<u16>, pub stream_count: Option<u32>,
299 pub failed_stream_count: Option<u32>,
300 pub break_stream_count: Option<u32>,
301}
302
303impl RawEncode for TrafficReceipt {
304 fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
305 unimplemented!()
306 }
307
308 fn raw_encode<'a>(
309 &self,
310 _buf: &'a mut [u8],
311 _purpose: &Option<RawEncodePurpose>,
312 ) -> BuckyResult<&'a mut [u8]> {
313 unimplemented!()
314 }
315}
316
317impl<'de> RawDecode<'de> for TrafficReceipt {
318 fn raw_decode(_buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
319 unimplemented!()
320 }
321}
322
323#[derive(Clone, Debug)]
329pub struct ChunkTransReceipt {
330 pub chunk_id: ChunkId,
331 pub crypto_chunk_id: ChunkId,
332 pub valid_length: Option<u64>, pub max_speed: Option<u32>,
334 pub min_speed: Option<u32>, pub crypto_key: Option<u64>, }
337
338impl RawEncode for ChunkTransReceipt {
339 fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
340 unimplemented!()
341 }
342
343 fn raw_encode<'a>(
344 &self,
345 _buf: &'a mut [u8],
346 _purpose: &Option<RawEncodePurpose>,
347 ) -> BuckyResult<&'a mut [u8]> {
348 unimplemented!()
349 }
350}
351
352impl<'de> RawDecode<'de> for ChunkTransReceipt {
353 fn raw_decode(_buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
354 unimplemented!()
355 }
356}
357
358#[derive(Clone, Debug)]
359pub struct DSGReceipt {
360 }
362
363impl RawEncode for DSGReceipt {
364 fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
365 unimplemented!()
366 }
367
368 fn raw_encode<'a>(
369 &self,
370 _buf: &'a mut [u8],
371 _purpose: &Option<RawEncodePurpose>,
372 ) -> BuckyResult<&'a mut [u8]> {
373 unimplemented!()
374 }
375}
376
377impl<'de> RawDecode<'de> for DSGReceipt {
378 fn raw_decode(_buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
379 unimplemented!()
380 }
381}
382
383#[derive(Clone, Debug)]
384pub enum ServiceReceiptBody {
385 SN(SNReceipt),
386 Traffic(TrafficReceipt),
387 ChunkTrans(ChunkTransReceipt),
388 DSG(DSGReceipt),
389}
390
391#[derive(Clone, Debug)]
396pub struct ServiceReceipt {
397 customer: ObjectId, service_type: u32,
399 service_start: u64, service_end: u64, receipt_body: ServiceReceiptBody,
402}
403
404impl ServiceReceipt {
405 fn new() -> ServiceReceipt {
406 unimplemented!();
407 }
408}
409
410impl RawEncode for ServiceReceipt {
411 fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
412 unimplemented!()
413 }
414
415 fn raw_encode<'a>(
416 &self,
417 _buf: &'a mut [u8],
418 _purpose: &Option<RawEncodePurpose>,
419 ) -> BuckyResult<&'a mut [u8]> {
420 unimplemented!()
421 }
422}
423
424impl<'de> RawDecode<'de> for ServiceReceipt {
425 fn raw_decode(_buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
426 unimplemented!()
427 }
428}
429
430#[derive(Clone, Debug)]
432pub enum Service {
433 Contract(ServiceContract),
434 Receipt(ServiceReceipt),
435 }
437
438const CONTRACT_SN_BODY_CODE: u8 = 0_u8;
439const CONTRACT_TRAFFIC_BODY_CODE: u8 = 1_u8;
440const CONTRACT_CHUNK_TRANS_BODY_CODE: u8 = 2_u8;
441const CONTRACT_DSG_BODY_CODE: u8 = 3_u8;
442const RECEIPT_SN_BODY_CODE: u8 = 10_u8;
443const RECEIPT_TRAFFIC_BODY_CODE: u8 = 11_u8;
444const RECEIPT_CHUNK_TRANS_BODY_CODE: u8 = 12_u8;
445const RECEIPT_DSG_BODY_CODE: u8 = 13_u8;
446
447#[derive(Clone, Copy, Debug, PartialEq, RawEncode, RawDecode)]
448enum SnServiceReceiptVersion {
449 Invalid = 0,
450 Current = 1,
451}
452
453#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Ord, Eq, RawEncode, RawDecode)]
454enum SnServiceGrade {
455 None = 0,
456 Discard = 1,
457 Passable = 2,
458 Normal = 3,
459 Fine = 4,
460 Wonderfull = 5,
461}
462
463impl SnServiceGrade {
464 pub fn is_accept(&self) -> bool {
465 *self >= SnServiceGrade::Passable
466 }
467 pub fn is_refuse(&self) -> bool {
468 !self.is_accept()
469 }
470}
471
472#[derive(Clone, Debug, RawEncode, RawDecode)]
473struct ProofOfSNService {
474 pub version: SnServiceReceiptVersion,
475 pub grade: SnServiceGrade,
476 pub rto: u64,
477 pub duration: u64,
478 pub start_time: u64,
479 pub ping_count: u64,
480 pub ping_resp_count: u64,
481 pub called_count: u64,
482 pub call_peer_count: u64,
483 pub connect_peer_count: u64,
484 pub call_delay: u64,
485}
486
487#[derive(Clone, Debug, RawEncode, RawDecode)]
488pub struct ProofOfDSG {}
489
490#[derive(Clone, Debug, RawEncode, RawDecode)]
491pub enum ProofTypeCode {
492 DSGStorage,
493 DSGStorageCheck,
494 DSGMerkleProof,
495}
496
497#[derive(Clone, Debug, RawEncode, RawDecode)]
498pub struct ProofOfServiceDescContent<T> {
499 pub proof_type: ProofTypeCode,
500 pub data: T,
501}
502
503impl<T> Deref for ProofOfServiceDescContent<T> {
504 type Target = T;
505
506 fn deref(&self) -> &Self::Target {
507 &self.data
508 }
509}
510
511impl<T> DerefMut for ProofOfServiceDescContent<T> {
512 fn deref_mut(&mut self) -> &mut Self::Target {
513 &mut self.data
514 }
515}
516
517#[derive(Clone, Debug, RawEncode, RawDecode)]
518pub struct ProofData {
519 data: Vec<u8>,
520}
521
522impl<T> DescContent for ProofOfServiceDescContent<T> {
523 fn obj_type() -> u16 {
524 ObjectTypeCode::ProofOfService.into()
525 }
526
527 type OwnerType = Option<ObjectId>;
528 type AreaType = SubDescNone;
529 type AuthorType = SubDescNone;
530 type PublicKeyType = SubDescNone;
531}
532
533#[derive(Clone, Debug, RawEncode, RawDecode)]
534pub struct ProofOfServiceBodyContent<T> {
535 pub data: T,
536}
537
538impl<T> BodyContent for ProofOfServiceBodyContent<T> {}
539
540impl<T> Deref for ProofOfServiceBodyContent<T> {
541 type Target = T;
542
543 fn deref(&self) -> &Self::Target {
544 &self.data
545 }
546}
547
548impl<T> DerefMut for ProofOfServiceBodyContent<T> {
549 fn deref_mut(&mut self) -> &mut Self::Target {
550 &mut self.data
551 }
552}
553
554type ProofOfServiceBodyContentProofData = ProofOfServiceBodyContent<ProofData>;
555
556pub type ProofOfServiceType =
557 NamedObjType<ProofOfServiceDescContent<ProofData>, ProofOfServiceBodyContent<ProofData>>;
558pub type ProofOfServiceBuilder =
559 NamedObjectBuilder<ProofOfServiceDescContent<ProofData>, ProofOfServiceBodyContent<ProofData>>;
560
561pub type ProofOfServiceDesc = NamedObjectDesc<ProofOfServiceDescContent<ProofData>>;
562pub type ProofOfServiceId = NamedObjectId<ProofOfServiceType>;
563pub type ProofOfService = NamedObjectBase<ProofOfServiceType>;
564
565impl ProofOfServiceDesc {
566 pub fn proof_of_service_id(&self) -> ProofOfServiceId {
567 ProofOfServiceId::try_from(self.calculate_id()).unwrap()
568 }
569}
570
571impl NamedObjectBase<ProofOfServiceType> {
572 pub fn new(desc_content: ProofOfServiceDescContent<ProofData>) -> ProofOfServiceBuilder {
573 let body_content = ProofOfServiceBodyContent {
574 data: ProofData { data: Vec::new() },
575 };
576
577 ProofOfServiceBuilder::new(desc_content, body_content)
578 }
579}