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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
use maidsafe_utilities::serialisation;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::fmt::{self, Debug, Formatter};
use tiny_keccak::sha3_256;
use xor_name::XorName;
pub const MAX_IMMUTABLE_DATA_SIZE_IN_BYTES: u64 = 1024 * 1024 + 10 * 1024;
#[derive(Hash, Clone, Eq, PartialEq, Ord, PartialOrd)]
pub struct ImmutableData {
name: XorName,
value: Vec<u8>,
}
impl ImmutableData {
pub fn new(value: Vec<u8>) -> ImmutableData {
ImmutableData {
name: XorName(sha3_256(&value)),
value,
}
}
pub fn value(&self) -> &Vec<u8> {
&self.value
}
pub fn name(&self) -> &XorName {
&self.name
}
pub fn payload_size(&self) -> usize {
self.value.len()
}
pub fn serialised_size(&self) -> u64 {
serialisation::serialised_size(self)
}
pub fn validate_size(&self) -> bool {
self.serialised_size() <= MAX_IMMUTABLE_DATA_SIZE_IN_BYTES
}
}
impl Serialize for ImmutableData {
fn serialize<S: Serializer>(&self, serialiser: S) -> Result<S::Ok, S::Error> {
self.value.serialize(serialiser)
}
}
impl<'de> Deserialize<'de> for ImmutableData {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<ImmutableData, D::Error> {
let value: Vec<u8> = Deserialize::deserialize(deserializer)?;
Ok(ImmutableData::new(value))
}
}
impl Debug for ImmutableData {
fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
write!(formatter, "ImmutableData {:?}", self.name())
}
}
#[cfg(test)]
mod tests {
use super::*;
use hex::encode;
use maidsafe_utilities::{serialisation, SeededRng};
use rand::Rng;
#[test]
fn deterministic_test() {
let value = "immutable data value".to_owned().into_bytes();
let immutable_data = ImmutableData::new(value);
let immutable_data_name = encode(immutable_data.name().0.as_ref());
let expected_name = "fac2869677ee06277633c37ac7e8e5c655f3d652f707c7a79fab930d584a3016";
assert_eq!(&expected_name, &immutable_data_name);
}
#[test]
fn serialisation() {
let mut rng = SeededRng::thread_rng();
let len = rng.gen_range(1, 10_000);
let value = rng.gen_iter().take(len).collect();
let immutable_data = ImmutableData::new(value);
let serialised = unwrap!(serialisation::serialise(&immutable_data));
let parsed = unwrap!(serialisation::deserialise(&serialised));
assert_eq!(immutable_data, parsed);
}
}