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