1use prost::{encode_length_delimiter, length_delimiter_len};
4
5pub mod array;
6pub use array::Array;
7mod time;
8pub use time::SystemTimeExt;
9mod priority_set;
10pub use priority_set::PrioritySet;
11pub mod futures;
12
13pub fn hex(bytes: &[u8]) -> String {
15 let mut hex = String::new();
16 for byte in bytes.iter() {
17 hex.push_str(&format!("{:02x}", byte));
18 }
19 hex
20}
21
22pub fn from_hex(hex: &str) -> Option<Vec<u8>> {
24 if hex.len() % 2 != 0 {
25 return None;
26 }
27
28 (0..hex.len())
29 .step_by(2)
30 .map(|i| match u8::from_str_radix(&hex[i..i + 2], 16) {
31 Ok(byte) => Some(byte),
32 Err(_) => None,
33 })
34 .collect()
35}
36
37pub fn from_hex_formatted(hex: &str) -> Option<Vec<u8>> {
40 let hex = hex.replace(['\t', '\n', '\r', ' '], "");
41 let res = hex.strip_prefix("0x").unwrap_or(&hex);
42 from_hex(res)
43}
44
45pub fn max_faults(n: u32) -> Option<u32> {
47 let f = n.checked_sub(1)? / 3;
48 if f == 0 {
49 return None;
50 }
51 Some(f)
52}
53
54pub fn quorum(n: u32) -> Option<u32> {
58 let f = max_faults(n)?;
59 Some((2 * f) + 1)
60}
61
62pub fn union(a: &[u8], b: &[u8]) -> Vec<u8> {
64 let mut union = Vec::with_capacity(a.len() + b.len());
65 union.extend_from_slice(a);
66 union.extend_from_slice(b);
67 union
68}
69
70pub fn union_unique(namespace: &[u8], msg: &[u8]) -> Vec<u8> {
74 let ld_len = length_delimiter_len(namespace.len());
75 let mut result = Vec::with_capacity(ld_len + namespace.len() + msg.len());
76 encode_length_delimiter(namespace.len(), &mut result).unwrap();
77 result.extend_from_slice(namespace);
78 result.extend_from_slice(msg);
79 result
80}
81
82pub fn modulo(bytes: &[u8], n: u64) -> u64 {
87 let mut result = 0;
88 for &byte in bytes {
89 result = (result << 8) | (byte as u64);
90 result %= n;
91 }
92 result
93}
94
95pub trait SizedSerialize {
97 const SERIALIZED_LEN: usize;
98}
99
100impl SizedSerialize for u8 {
101 const SERIALIZED_LEN: usize = 1;
102}
103
104impl SizedSerialize for u16 {
105 const SERIALIZED_LEN: usize = 2;
106}
107
108impl SizedSerialize for u32 {
109 const SERIALIZED_LEN: usize = 4;
110}
111
112impl SizedSerialize for u64 {
113 const SERIALIZED_LEN: usize = 8;
114}
115
116impl SizedSerialize for u128 {
117 const SERIALIZED_LEN: usize = 16;
118}
119
120#[cfg(test)]
121mod tests {
122 use super::*;
123 use num_bigint::BigUint;
124 use rand::{rngs::StdRng, Rng, SeedableRng};
125
126 #[test]
127 fn test_hex() {
128 let b = &[];
130 let h = hex(b);
131 assert_eq!(h, "");
132 assert_eq!(from_hex(&h).unwrap(), b.to_vec());
133
134 let b = &[0x01];
136 let h = hex(b);
137 assert_eq!(h, "01");
138 assert_eq!(from_hex(&h).unwrap(), b.to_vec());
139
140 let b = &[0x01, 0x02, 0x03];
142 let h = hex(b);
143 assert_eq!(h, "010203");
144 assert_eq!(from_hex(&h).unwrap(), b.to_vec());
145
146 let h = "0102030";
148 assert!(from_hex(h).is_none());
149
150 let h = "01g3";
152 assert!(from_hex(h).is_none());
153 }
154
155 #[test]
156 fn test_from_hex_formatted() {
157 let b = &[];
159 let h = hex(b);
160 assert_eq!(h, "");
161 assert_eq!(from_hex_formatted(&h).unwrap(), b.to_vec());
162
163 let b = &[0x01];
165 let h = hex(b);
166 assert_eq!(h, "01");
167 assert_eq!(from_hex_formatted(&h).unwrap(), b.to_vec());
168
169 let b = &[0x01, 0x02, 0x03];
171 let h = hex(b);
172 assert_eq!(h, "010203");
173 assert_eq!(from_hex_formatted(&h).unwrap(), b.to_vec());
174
175 let h = "0102030";
177 assert!(from_hex_formatted(h).is_none());
178
179 let h = "01g3";
181 assert!(from_hex_formatted(h).is_none());
182
183 let h = "01 02 03";
185 assert_eq!(from_hex_formatted(h).unwrap(), b.to_vec());
186
187 let h = "0x010203";
189 assert_eq!(from_hex_formatted(h).unwrap(), b.to_vec());
190
191 let h = " \n\n0x\r\n01
193 02\t03\n";
194 assert_eq!(from_hex_formatted(h).unwrap(), b.to_vec());
195 }
196
197 #[test]
198 fn test_quorum() {
199 assert_eq!(quorum(3), None);
201
202 assert_eq!(quorum(4), Some(3));
204
205 assert_eq!(quorum(7), Some(5));
207
208 assert_eq!(quorum(10), Some(7));
210 }
211
212 #[test]
213 fn test_union() {
214 assert_eq!(union(&[], &[]), []);
216
217 assert_eq!(union(&[], &[0x01, 0x02, 0x03]), [0x01, 0x02, 0x03]);
219
220 assert_eq!(
222 union(&[0x01, 0x02, 0x03], &[0x04, 0x05, 0x06]),
223 [0x01, 0x02, 0x03, 0x04, 0x05, 0x06]
224 );
225 }
226
227 #[test]
228 fn test_union_unique() {
229 let namespace = b"namespace";
230 let msg = b"message";
231
232 let length_encoding = vec![0b0000_1001];
233 let mut expected = Vec::with_capacity(length_encoding.len() + namespace.len() + msg.len());
234 expected.extend_from_slice(&length_encoding);
235 expected.extend_from_slice(namespace);
236 expected.extend_from_slice(msg);
237
238 let result = union_unique(namespace, msg);
239 assert_eq!(result, expected);
240 assert_eq!(result.len(), result.capacity());
241 }
242
243 #[test]
244 fn test_union_unique_zero_length() {
245 let namespace = b"";
246 let msg = b"message";
247
248 let length_encoding = vec![0];
249 let mut expected = Vec::with_capacity(length_encoding.len() + namespace.len() + msg.len());
250 expected.extend_from_slice(&length_encoding);
251 expected.extend_from_slice(msg);
252
253 let result = union_unique(namespace, msg);
254 assert_eq!(result, expected);
255 assert_eq!(result.len(), result.capacity());
256 }
257
258 #[test]
259 fn test_union_unique_long_length() {
260 let namespace = &b"n".repeat(256);
262 let msg = b"message";
263
264 let length_encoding = vec![0b1000_0000, 0b0000_0010];
265 let mut expected = Vec::with_capacity(length_encoding.len() + namespace.len() + msg.len());
266 expected.extend_from_slice(&length_encoding);
267 expected.extend_from_slice(namespace);
268 expected.extend_from_slice(msg);
269
270 let result = union_unique(namespace, msg);
271 assert_eq!(result, expected);
272 assert_eq!(result.len(), result.capacity());
273 }
274
275 #[test]
276 fn test_modulo() {
277 assert_eq!(modulo(&[], 1), 0);
279
280 assert_eq!(modulo(&[0x01], 1), 0);
282
283 assert_eq!(modulo(&[0x01, 0x02, 0x03], 10), 1);
285
286 let n = 11u64;
288 for i in 0..100 {
289 let mut rng = StdRng::seed_from_u64(i);
290 let bytes: [u8; 32] = rng.gen();
291 let big_modulo = BigUint::from_bytes_be(&bytes) % n;
292 let utils_modulo = modulo(&bytes, n);
293 assert_eq!(big_modulo, BigUint::from(utils_modulo));
294 }
295 }
296}