iota_constants/
lib.rs

1#![deny(unused_extern_crates)]
2#![warn(
3    missing_debug_implementations,
4    missing_docs,
5    rust_2018_idioms,
6    unreachable_pub
7)]
8
9//! Constants used throughout iota related crates
10
11/// A char array holding all acceptable characters in the tryte
12/// alphabet. Used because strings can't be cheaply indexed in rust.
13pub const TRYTE_ALPHABET: [char; 27] = [
14    '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
15    'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
16];
17
18/// Default Minimum Weight Magnitude on IOTA mainnet
19pub const DEFAULT_MWM: usize = 14;
20
21/// The minimum value a trit can have
22pub const MIN_TRIT_VALUE: i8 = -1;
23/// The maximum value a trit can have
24pub const MAX_TRIT_VALUE: i8 = 1;
25/// The minimum value a tryte can have
26pub const MIN_TRYTE_VALUE: i8 = -13;
27/// The maximum value a tryte can have
28pub const MAX_TRYTE_VALUE: i8 = 13;
29
30/// Radix of ternary numeral system
31pub const TRINARY_RADIX: usize = 3;
32
33/// Size of hash in trits
34pub const HASH_TRINARY_SIZE: usize = 243;
35/// Size of hash in trytes
36pub const HASH_TRYTES_SIZE: usize = HASH_TRINARY_SIZE / 3;
37/// Size of hash in bytes
38pub const HASH_BYTES_SIZE: usize = 48;
39/// Size of key segment per fragment
40pub const KEY_SEGMENTS_PER_FRAGMENT: usize = 27;
41/// Round of key segment hash
42pub const KEY_SEGMENT_HASH_ROUNDS: usize = 26;
43/// Lenght of key fragment which is 6561
44pub const KEY_FRAGMENT_LENGTH: usize = HASH_TRINARY_SIZE * KEY_SEGMENTS_PER_FRAGMENT;
45
46/// Size of address checksum in trytes
47pub const ADDRESS_CHECKSUM_TRYTES_SIZE: usize = 9;
48/// Size of address with checksum in trytes
49pub const ADDRESS_WITH_CHECKSUM_TRYTES_SIZE: usize =
50    HASH_TRYTES_SIZE + ADDRESS_CHECKSUM_TRYTES_SIZE;
51/// Size of minimum checksum
52pub const MIN_CHECKSUM_TRYTES_SIZE: usize = 3;
53
54/// Maximum value of attachment timstamp
55pub const UPPER_BOUND_ATTACHMENT_TIMESTAMP: usize = (3 ^ 27 - 1) / 2;
56/// Minimum value of attachment timstamp
57pub const LOWER_BOUND_ATTACHMENT_TIMESTAMP: usize = 0;
58
59/// The number of trits in a byte
60pub const TRITS_PER_BYTE: usize = 5;
61/// The number of trits in a tryte
62pub const TRITS_PER_TRYTE: usize = 3;
63/// The maximum allowed seed length
64pub const SEED_LENGTH_MAX: usize = 81;
65/// The length of an address without a checksum
66pub const ADDRESS_LENGTH_WITHOUT_CHECKSUM: usize = 81;
67/// The length of an address with a checksum
68pub const ADDRESS_LENGTH_WITH_CHECKSUM: usize = 90;
69/// The mandatory length of a message segment
70pub const MESSAGE_LENGTH: usize = 2187;
71/// The mandatory length of a tag segment
72pub const TAG_LENGTH: usize = 27;
73
74/// Size of signature message fragment in trtis
75pub const SIGNATURE_MESSAGE_FRAGMENT_TRINARY_SIZE: usize = 6561;
76/// Size of address in trtis
77pub const ADDRESS_TRINARY_SIZE: usize = 243;
78/// Size of value in trtis
79pub const VALUE_SIZE_TRINARY: usize = 81;
80/// Size of obselte tag in trtis
81pub const OBSOLETE_TAG_TRINARY_SIZE: usize = 81;
82/// Size of timestamp in trtis
83pub const TIMESTAMP_TRINARY_SIZE: usize = 27;
84/// Size of current index in trtis
85pub const CURRENT_INDEX_TRINARY_SIZE: usize = 27;
86/// Size of last index trinary in trtis
87pub const LAST_INDEX_TRINARY_SIZE: usize = 27;
88/// Size of bundle hash in trtis
89pub const BUNDLE_TRINARY_SIZE: usize = 243;
90/// Size of trunk transaction hash in trtis
91pub const TRUNK_TRANSACTION_TRINARY_SIZE: usize = 243;
92/// Size of brnach transaction hash in trtis
93pub const BRANCH_TRANSACTION_TRINARY_SIZE: usize = 243;
94/// Size of tag in trtis
95pub const TAG_TRINARY_SIZE: usize = 81;
96/// Size of attachment timestamp in trtis
97pub const ATTACHMENT_TIMESTAMP_TRINARY_SIZE: usize = 27;
98/// Size of upper bound attachment timestamp in trtis
99pub const ATTACHMENT_TIMESTAMP_LOWER_BOUND_TRINARY_SIZE: usize = 27;
100/// Size of lower bound attachment timestamp in trtis
101pub const ATTACHMENT_TIMESTAMP_UPPER_BOUND_TRINARY_SIZE: usize = 27;
102/// Size of nonce in trtis
103pub const NONCE_TRINARY_SIZE: usize = 81;
104
105/// Size of a whole transaction object in trits
106pub const TRANSACTION_TRINARY_SIZE: usize = SIGNATURE_MESSAGE_FRAGMENT_TRINARY_SIZE
107    + ADDRESS_TRINARY_SIZE
108    + VALUE_SIZE_TRINARY
109    + OBSOLETE_TAG_TRINARY_SIZE
110    + TIMESTAMP_TRINARY_SIZE
111    + CURRENT_INDEX_TRINARY_SIZE
112    + LAST_INDEX_TRINARY_SIZE
113    + BUNDLE_TRINARY_SIZE
114    + TRUNK_TRANSACTION_TRINARY_SIZE
115    + BRANCH_TRANSACTION_TRINARY_SIZE
116    + TAG_TRINARY_SIZE
117    + ATTACHMENT_TIMESTAMP_TRINARY_SIZE
118    + ATTACHMENT_TIMESTAMP_LOWER_BOUND_TRINARY_SIZE
119    + ATTACHMENT_TIMESTAMP_UPPER_BOUND_TRINARY_SIZE
120    + NONCE_TRINARY_SIZE;
121
122/// INVALID_TRYTES_INPUT_ERROR
123pub const INVALID_TRYTES_INPUT_ERROR: &str = "Invalid trytes provided.";
124/// INVALID_HASHES_INPUT_ERROR
125pub const INVALID_HASHES_INPUT_ERROR: &str = "Invalid hashes provided.";
126/// INVALID_TAIL_HASH_INPUT_ERROR
127pub const INVALID_TAIL_HASH_INPUT_ERROR: &str = "Invalid tail hash provided.";
128/// INVALID_SEED_INPUT_ERROR
129pub const INVALID_SEED_INPUT_ERROR: &str = "Invalid seed provided.";
130/// INVALID_SECURITY_LEVEL_INPUT_ERROR
131pub const INVALID_SECURITY_LEVEL_INPUT_ERROR: &str = "Invalid security level provided.";
132/// INVALID_ATTACHED_TRYTES_INPUT_ERROR
133pub const INVALID_ATTACHED_TRYTES_INPUT_ERROR: &str = "Invalid attached trytes provided.";
134/// INVALID_TRANSFERS_INPUT_ERROR
135pub const INVALID_TRANSFERS_INPUT_ERROR: &str = "Invalid transfers provided.";
136/// INVALID_ADDRESSES_INPUT_ERROR
137pub const INVALID_ADDRESSES_INPUT_ERROR: &str = "Invalid addresses provided.";
138/// INVALID_INPUT_ERROR
139pub const INVALID_INPUT_ERROR: &str = "Invalid input provided.";
140
141/// INVALID_BUNDLE_ERROR
142pub const INVALID_BUNDLE_ERROR: &str = "Invalid bundle.";
143/// INVALID_BUNDLE_SUM_ERROR
144pub const INVALID_BUNDLE_SUM_ERROR: &str = "Invalid bundle sum.";
145/// INVALID_BUNDLE_HASH_ERROR
146pub const INVALID_BUNDLE_HASH_ERROR: &str = "Invalid bundle hash.";
147/// INVALID_SIGNATURES_ERROR
148pub const INVALID_SIGNATURES_ERROR: &str = "Invalid signatures.";
149/// INVALID_VALUE_TRANSFER_ERROR
150pub const INVALID_VALUE_TRANSFER_ERROR: &str =
151    "Invalid value transfer: the transfer does not require a signature.";
152
153/// NOT_ENOUGH_BALANCE_ERROR
154pub const NOT_ENOUGH_BALANCE_ERROR: &str = "Not enough balance.";
155/// NO_REMAINDER_ADDRESS_ERROR
156pub const NO_REMAINDER_ADDRESS_ERROR: &str = "No remainder address defined.";
157
158/// GET_TRYTES_RESPONSE_ERROR
159pub const GET_TRYTES_RESPONSE_ERROR: &str = "Get trytes response was null.";
160/// GET_BUNDLE_RESPONSE_ERROR
161pub const GET_BUNDLE_RESPONSE_ERROR: &str = "Get bundle response was null.";
162/// GET_INCLUSION_STATE_RESPONSE_ERROR
163pub const GET_INCLUSION_STATE_RESPONSE_ERROR: &str = "Get inclusion state response was null.";
164
165/// SENDING_TO_USED_ADDRESS_ERROR
166pub const SENDING_TO_USED_ADDRESS_ERROR: &str = "Sending to a used address.";
167/// PRIVATE_KEY_REUSE_ERROR
168pub const PRIVATE_KEY_REUSE_ERROR: &str = "Private key reuse detect!";
169/// SEND_TO_INPUTS_ERROR
170pub const SEND_TO_INPUTS_ERROR: &str = "Send to inputs!";
171
172/// Security levels of a private key and address pair. The greater the security
173/// level, the larger and more secure the signature of a spent address is
174/// against brute force attacks.
175#[derive(Copy, Clone, Debug, PartialEq)]
176pub enum SecurityLevel {
177    /// lowest security
178    Low = 1,
179    /// used by Trinity
180    Medium = 2,
181    /// most secure
182    High = 3,
183}
184
185/// Number of Iota Signature Scheme fragments
186pub const ISS_FRAGMENTS: usize = 27;
187/// Length of Iota Signature Scheme key
188pub const ISS_KEY_LENGTH: usize = HASH_TRINARY_SIZE * ISS_FRAGMENTS;
189/// Lenght of Iota Signature Scheme chunk
190pub const ISS_CHUNK_LENGTH: usize = HASH_TRINARY_SIZE / TRINARY_RADIX;