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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
use casper_types::{
bytesrepr::{U64_SERIALIZED_LENGTH, U8_SERIALIZED_LENGTH},
KEY_HASH_LENGTH,
};
use crate::shared::{system_config::SystemConfig, wasm_config::WasmConfig};
pub const DEFAULT_MAX_QUERY_DEPTH: u64 = 5;
pub const DEFAULT_MAX_ASSOCIATED_KEYS: u32 = 100;
pub const DEFAULT_MAX_RUNTIME_CALL_STACK_HEIGHT: u32 = 12;
pub const DEFAULT_MAX_STORED_VALUE_SIZE: u32 = 8 * 1024 * 1024;
pub const DEFAULT_MAX_DELEGATOR_SIZE_LIMIT: u32 = 950;
pub const DEFAULT_MINIMUM_DELEGATION_AMOUNT: u64 = 500 * 1_000_000_000;
const SIZE_PER_DELEGATOR_ENTRY: u32 = 44;
const FIXED_SIZE_PER_VALIDATOR: u32 = 45;
const FIXED_SIZE_PER_ERA: u32 = U64_SERIALIZED_LENGTH as u32;
const KEY_HASH_SERIALIZED_LENGTH: u32 = KEY_HASH_LENGTH as u32 + 1;
#[doc(hidden)]
pub const fn compute_max_delegator_size_limit(
max_stored_value_size: u32,
auction_delay: u64,
validator_slots: u32,
) -> u32 {
let size_limit_per_snapshot =
(max_stored_value_size - U8_SERIALIZED_LENGTH as u32 - KEY_HASH_SERIALIZED_LENGTH)
/ (auction_delay + 1) as u32;
let size_per_seigniorage_recipients = size_limit_per_snapshot - FIXED_SIZE_PER_ERA;
let size_limit_per_validator =
(size_per_seigniorage_recipients / validator_slots) - FIXED_SIZE_PER_VALIDATOR;
size_limit_per_validator / SIZE_PER_DELEGATOR_ENTRY
}
#[derive(Debug, Copy, Clone)]
pub struct EngineConfig {
pub(crate) max_query_depth: u64,
max_associated_keys: u32,
max_runtime_call_stack_height: u32,
max_stored_value_size: u32,
max_delegator_size_limit: u32,
minimum_delegation_amount: u64,
wasm_config: WasmConfig,
system_config: SystemConfig,
}
impl Default for EngineConfig {
fn default() -> Self {
EngineConfig {
max_query_depth: DEFAULT_MAX_QUERY_DEPTH,
max_associated_keys: DEFAULT_MAX_ASSOCIATED_KEYS,
max_runtime_call_stack_height: DEFAULT_MAX_RUNTIME_CALL_STACK_HEIGHT,
max_stored_value_size: DEFAULT_MAX_STORED_VALUE_SIZE,
max_delegator_size_limit: DEFAULT_MAX_DELEGATOR_SIZE_LIMIT,
minimum_delegation_amount: DEFAULT_MINIMUM_DELEGATION_AMOUNT,
wasm_config: WasmConfig::default(),
system_config: SystemConfig::default(),
}
}
}
impl EngineConfig {
#[allow(clippy::too_many_arguments)]
pub fn new(
max_query_depth: u64,
max_associated_keys: u32,
max_runtime_call_stack_height: u32,
max_stored_value_size: u32,
max_delegator_size_limit: u32,
minimum_delegation_amount: u64,
wasm_config: WasmConfig,
system_config: SystemConfig,
) -> EngineConfig {
EngineConfig {
max_query_depth,
max_associated_keys,
max_runtime_call_stack_height,
max_stored_value_size,
max_delegator_size_limit,
minimum_delegation_amount,
wasm_config,
system_config,
}
}
pub fn max_associated_keys(&self) -> u32 {
self.max_associated_keys
}
pub fn max_runtime_call_stack_height(&self) -> u32 {
self.max_runtime_call_stack_height
}
pub fn max_stored_value_size(&self) -> u32 {
self.max_stored_value_size
}
pub fn max_delegator_size_limit(&self) -> u32 {
self.max_delegator_size_limit
}
pub fn wasm_config(&self) -> &WasmConfig {
&self.wasm_config
}
pub fn system_config(&self) -> &SystemConfig {
&self.system_config
}
pub fn minimum_delegation_amount(&self) -> u64 {
self.minimum_delegation_amount
}
}