jade_testing/
key.rs

1//! Storage keys
2
3use service::ServiceId;
4
5const STORAGE_PREFIX: [u8; 4] = [255, 255, 255, 255];
6
7/// Compute the storage key
8pub fn storage(service: ServiceId, key: &[u8]) -> [u8; 31] {
9    let mut hashed = STORAGE_PREFIX.to_vec();
10    hashed.extend_from_slice(key);
11    let hash = service::blake2b(hashed.as_slice());
12
13    let mut key = [0u8; 31];
14    let mut hashp = [0; 4];
15    hashp.copy_from_slice(&hash[..4]);
16    key[..8].copy_from_slice(&prefix(service, &hashp));
17    key[8..].copy_from_slice(&hash[4..27]);
18    key
19}
20
21/// Generate a prefix for a storage
22///
23/// service: [0, 2, 4, 6]
24/// prefix: [1, 3, 5, 7]
25pub fn prefix(service: u32, prefix: &[u8; 4]) -> [u8; 8] {
26    let mut key = [0; 8];
27    service
28        .to_le_bytes()
29        .iter()
30        .zip(prefix.iter())
31        .enumerate()
32        .for_each(|(i, (a, b))| {
33            key[i * 2] = *a;
34            key[(i + 1) * 2 - 1] = *b;
35        });
36    key
37}