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
110
111
112
113
114
115
116
117
118
119
120
pub mod payload;
pub mod state;
use std::error::Error;
use sha2::{Digest, Sha512};
pub const SABRE_PROTOCOL_VERSION: &str = "1";
pub const ADMINISTRATORS_SETTING_KEY: &str = "sawtooth.swa.administrators";
pub const ADMINISTRATORS_SETTING_ADDRESS: &str =
"000000a87cb5eafdcca6a814e4add97c4b517d3c530c2f44b31d18e3b0c44298fc1c14";
pub const NAMESPACE_REGISTRY_ADDRESS_PREFIX: &str = "00ec00";
pub const CONTRACT_REGISTRY_ADDRESS_PREFIX: &str = "00ec01";
pub const CONTRACT_ADDRESS_PREFIX: &str = "00ec02";
pub const SMART_PERMISSION_ADDRESS_PREFIX: &str = "00ec03";
pub const AGENT_ADDRESS_PREFIX: &str = "cad11d00";
pub const ORG_ADDRESS_PREFIX: &str = "cad11d01";
pub const ADMINISTRATORS_SETTING_ADDRESS_BYTES: &[u8] = &[
0, 0, 0, 168, 124, 181, 234, 253, 204, 166, 168, 20, 228, 173, 217, 124, 75, 81, 125, 60, 83,
12, 47, 68, 179, 29, 24, 227, 176, 196, 66, 152, 252, 28, 20,
];
pub const NAMESPACE_REGISTRY_ADDRESS_PREFIX_BYTES: &[u8] = &[0, 236, 0];
pub const CONTRACT_REGISTRY_ADDRESS_PREFIX_BYTES: &[u8] = &[0, 236, 1];
pub const CONTRACT_ADDRESS_PREFIX_BYTES: &[u8] = &[0, 236, 2];
pub const SMART_PERMISSION_ADDRESS_PREFIX_BYTES: &[u8] = &[0, 236, 3];
pub const AGENT_ADDRESS_PREFIX_BYTES: &[u8] = &[202, 209, 29, 0];
pub const ORG_ADDRESS_PREFIX_BYTES: &[u8] = &[202, 209, 29, 1];
pub fn compute_namespace_registry_address(namespace: &str) -> Result<Vec<u8>, AddressingError> {
let prefix = match namespace.get(..6) {
Some(x) => x,
None => {
return Err(AddressingError::InvalidInput(format!(
"namespace '{}' is less than 6 characters long",
namespace,
)));
}
};
let hash = Sha512::digest(prefix.as_bytes());
Ok([NAMESPACE_REGISTRY_ADDRESS_PREFIX_BYTES, &hash[..32]].concat())
}
pub fn compute_contract_registry_address(name: &str) -> Result<Vec<u8>, AddressingError> {
let hash = Sha512::digest(name.as_bytes());
Ok([CONTRACT_REGISTRY_ADDRESS_PREFIX_BYTES, &hash[..32]].concat())
}
pub fn compute_contract_address(name: &str, version: &str) -> Result<Vec<u8>, AddressingError> {
let s = String::from(name) + "," + version;
let hash = Sha512::digest(s.as_bytes());
Ok([CONTRACT_ADDRESS_PREFIX_BYTES, &hash[..32]].concat())
}
pub fn compute_agent_address(name: &[u8]) -> Result<Vec<u8>, AddressingError> {
let hash = Sha512::digest(name);
Ok([AGENT_ADDRESS_PREFIX_BYTES, &hash[..31]].concat())
}
pub fn compute_org_address(id: &str) -> Result<Vec<u8>, AddressingError> {
let hash = Sha512::digest(id.as_bytes());
Ok([ORG_ADDRESS_PREFIX_BYTES, &hash[..31]].concat())
}
#[derive(Debug)]
pub enum AddressingError {
InvalidInput(String),
}
impl Error for AddressingError {}
impl std::fmt::Display for AddressingError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
AddressingError::InvalidInput(msg) => write!(f, "addressing input is invalid: {}", msg),
}
}
}