cyfs_base/objects/
proof_of_service.rs

1use crate::codec as cyfs_base;
2use crate::*;
3
4use std::convert::TryFrom;
5use std::ops::{Deref, DerefMut};
6//
7// #[derive(Clone, Debug)]
8// pub struct SNContract {
9//     //定价
10//     // SN 没有单独的定价,纯粹看时间
11//     pub price_per_min : u32,//每分钟有效服务的价格
12//     //服务列表
13// }
14//
15// impl RawEncode for SNContract {
16//     fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
17//         Ok(4)
18//     }
19//
20//     fn raw_encode<'a>(&self, buf: &'a mut [u8], _purpose: &Option<RawEncodePurpose>) -> BuckyResult<&'a mut [u8]> {
21//         return self.price_per_min.raw_encode(buf, purpose);
22//     }
23// }
24//
25// impl<'de> RawDecode<'de> for SNContract {
26//     fn raw_decode(_buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
27//         unimplemented!()
28//     }
29// }
30
31#[derive(Clone, Debug)]
32pub struct TrafficContract {
33    //定价
34    pub price_per_kbytes: u32, //每1KB数据的价格
35    //服务列表
36    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    //TODO:可以根据业务需求不断改进
100    //定价
101    pub price_per_kbytes: u32, //每1Kb数据的价格
102    //服务列表
103    pub obj_list: Option<Vec<ObjectId>>, //只传输obj_list中包含的chunk,为None表示无限制
104    pub min_speed: Option<u32>,          //单位为 KB/S 最小带框保证
105    pub max_speed: Option<u32>,          //单位为 KB/S 最大带宽限制
106    pub avg_speed: Option<u32>,          //单位为 KB/S
107    pub max_bytes: Option<u64>,          //最大流量限制
108}
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)]
131// pub struct DSGContract {
132//     //TODO:先不实现
133// }
134//
135// impl RawEncode for DSGContract {
136//     fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
137//         unimplemented!()
138//     }
139//
140//     fn raw_encode<'a>(&self, _buf: &'a mut [u8]) -> BuckyResult<&'a mut [u8]> {
141//         unimplemented!()
142//     }
143// }
144//
145// impl<'de> RawDecode<'de> for DSGContract {
146//     fn raw_decode(_buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
147//         unimplemented!()
148//     }
149// }
150
151#[derive(Clone, Debug)]
152pub enum ServiceContractBody {
153    // SN(SNContract),//SN-Miner
154    Traffic(TrafficContract),       //Proxy-Miner
155    ChunkTrans(ChunkTransContract), //Cache-Miner
156}
157
158#[derive(Clone, Debug)]
159pub struct ServiceContract {
160    buyer: ObjectId,
161    seller: ObjectId,
162    customer: Option<ObjectId>, //为NULL表示和buyer相同。TODO:是否允许后绑定?
163    service_type: u32,
164    service_start: u64, //服务生效时间
165    service_end: u64,
166
167    coin_id: Option<u8>,          //交易使用的币种,默认为0
168    total_price: Option<u64>,     //基于本合约的交易上限
169    advance_payment: Option<u64>, //需要buyer充入的最小预付款
170    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//-------------------------------------------------------
263
264#[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>, //这个只能在C回填的时候写
269}
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>, //单位ms
299    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//TODO:使用时可根据需要修改
325//C->S 不带crypto_key
326//S->C 带crypto_key
327//C->B 带crypto_key(通知成功)
328//S->B 带cryto_key(要钱)
329#[derive(Clone, Debug)]
330pub struct ChunkTransReceipt {
331    pub chunk_id: ChunkId,
332    pub crypto_chunk_id: ChunkId,
333    pub valid_length: Option<u64>, //有效传输的数据
334    pub max_speed: Option<u32>,
335    pub min_speed: Option<u32>, //平均速度可以从Chunk大小和服务持续时间推算出来
336    pub crypto_key: Option<u64>, //aes-key的长度是? 这个字段是S->C的时候填写的
337}
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    //TODO:先不实现
362}
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//服务证明(存根部分)
393//由member of seller创建,发送给customer
394//customer如果认可,则进行签名并发回。
395//随后member of seller会把一组Receipt发给buyer,要求对方进行支付
396#[derive(Clone, Debug)]
397pub struct ServiceReceipt {
398    customer: ObjectId, // 谁使用服务
399    service_type: u32,
400    service_start: u64, // 本凭证的开始时间
401    service_end: u64,   // 本凭证的结束时间
402    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//----------------------------------------
432#[derive(Clone, Debug)]
433pub enum Service {
434    Contract(ServiceContract),
435    Receipt(ServiceReceipt),
436    //TODO:加入支付Tx的Body(振爷)
437}
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}