bucky_objects/objects/
proof_of_service.rs

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