-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstructured_data.rs
More file actions
78 lines (71 loc) · 3.14 KB
/
structured_data.rs
File metadata and controls
78 lines (71 loc) · 3.14 KB
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
use std::fmt;
use routing::NameType;
use sodiumoxide::crypto::sign;
use time;
/// Top-level type: a representation of "Structured Data".
#[derive(Debug)]
pub struct Data {
/// Immutable attributes which apply to the entire `Data` instance.
pub fixed_attributes: FixedAttributes,
/// Attributes which apply to the entire `Data` instance, but which can be changed with proper
/// authorisation.
pub mutable_attributes: MutableAttributes,
/// The most recent (which could encompass all) versions of the `Data` instance. Cannot be
/// empty.
pub versions: Vec<Version>,
}
/// Attributes of the `Data` which can never change once initially set. These define the identity,
/// type and some of the rules the network will employ for handling the `Data`. It can also hold
/// arbitrary data which will likely be meaningless to the network.
#[derive(Debug)]
pub struct FixedAttributes {
/// Identifier of the `Data` type.
pub type_tag: u64,
/// Identity of the piece of `Data`.
pub id: NameType,
/// Maximum number of versions allowed.
pub max_versions: u64,
/// Number of versions to retain when archiving a "full" piece of `Data` (minimum value of 1).
pub min_retained_count: u8,
/// Arbitrary, immutable, `Data`-wide information. May be empty.
pub data: Vec<u8>,
}
/// A representation of an owner's public key and the bias which should be given to that key when
/// a mutating request is received by the network.
pub struct KeyAndWeight {
/// Owner's public key.
pub key: sign::PublicKey,
/// Bias given to this public key (minimum value of 1).
pub weight: u64
}
impl fmt::Debug for KeyAndWeight {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "key: {:?}, weight: {}", self.key.0, self.weight)
}
}
/// Attributes of the `Data` which can be changed via a properly-authorised request to the network.
/// These define the current owner's public keys, further rules the network will employ for handling
/// the `Data` and also arbitrary data which will likely be meaningless to the network.
#[derive(Debug)]
pub struct MutableAttributes {
/// Current owner or owners' public keys. Cannot be empty.
pub owner_keys: Vec<KeyAndWeight>,
/// Minimum total weight of signatories' keys to allow a mutation of the piece of `Data` (at
/// least one signature will be required regardless of this minimum).
pub min_weight_for_consensus: u64,
/// Coarse-grained expiry date around which time the piece of `Data` will be removed from the
/// network.
pub expiry_date: time::Tm,
/// Arbitrary, mutable, `Data`-wide information. May be empty.
pub data: Vec<u8>,
}
/// A representation of a single version. The `index` allows provision of strict total ordering of
/// the `Version`s. It can also hold arbitrary data specific to that particular `Version`, e.g.
/// encrypted content or the name of a piece of "Immutable Data".
#[derive(Debug)]
pub struct Version {
/// Sequential number to provide strict total order of versions.
pub index: u64,
/// Arbitrary, version-specific information. May be empty.
pub data: Vec<u8>,
}