Skip to content

Commit 0d5d991

Browse files
authored
StakeHistory size const (#399)
* `StakeHistory` size const * `StakeHistory` size const * add additional const assertion
1 parent 25edff5 commit 0d5d991

2 files changed

Lines changed: 23 additions & 10 deletions

File tree

interface/src/stake_history.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@ use std::ops::Deref;
77

88
pub const MAX_ENTRIES: usize = 512; // it should never take as many as 512 epochs to warm up or cool down
99

10+
/// Serialized size of a single `(Epoch, StakeHistoryEntry)` tuple
11+
pub(crate) const EPOCH_AND_ENTRY_SERIALIZED_SIZE: usize = 32;
12+
const _: () =
13+
assert!(EPOCH_AND_ENTRY_SERIALIZED_SIZE == size_of::<u64>() + size_of::<StakeHistoryEntry>());
14+
15+
const LEN_PREFIX: usize = size_of::<u64>();
16+
17+
/// Serialized size of `StakeHistory` sysvar account
18+
pub const SIZE: usize = LEN_PREFIX + MAX_ENTRIES * EPOCH_AND_ENTRY_SERIALIZED_SIZE;
19+
const _: () = assert!(SIZE == 16_392);
20+
1021
#[repr(C)]
1122
#[cfg_attr(feature = "frozen-abi", derive(solana_frozen_abi_macro::AbiExample))]
1223
#[cfg_attr(

interface/src/sysvar/stake_history.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@
4444
//! ```
4545
4646
use {
47-
crate::stake_history::{StakeHistory, StakeHistoryEntry, StakeHistoryGetEntry, MAX_ENTRIES},
47+
crate::stake_history::{
48+
StakeHistory, StakeHistoryEntry, StakeHistoryGetEntry, EPOCH_AND_ENTRY_SERIALIZED_SIZE,
49+
MAX_ENTRIES,
50+
},
4851
solana_clock::Epoch,
4952
solana_sysvar::{get_sysvar, Sysvar},
5053
solana_sysvar_id::declare_sysvar_id,
@@ -58,9 +61,6 @@ impl Sysvar for StakeHistory {}
5861
#[derive(Debug, PartialEq, Eq, Clone)]
5962
pub struct StakeHistorySysvar(pub Epoch);
6063

61-
// precompute so we can statically allocate buffer
62-
const EPOCH_AND_ENTRY_SERIALIZED_SIZE: u64 = 32;
63-
6464
impl StakeHistoryGetEntry for StakeHistorySysvar {
6565
fn get_entry(&self, target_epoch: Epoch) -> Option<StakeHistoryEntry> {
6666
let current_epoch = self.0;
@@ -80,15 +80,15 @@ impl StakeHistoryGetEntry for StakeHistorySysvar {
8080

8181
// offset is the number of bytes to our desired entry, including eight for vector length
8282
let offset = epoch_delta
83-
.checked_mul(EPOCH_AND_ENTRY_SERIALIZED_SIZE)?
83+
.checked_mul(EPOCH_AND_ENTRY_SERIALIZED_SIZE as u64)?
8484
.checked_add(std::mem::size_of::<u64>() as u64)?;
8585

86-
let mut entry_buf = [0; EPOCH_AND_ENTRY_SERIALIZED_SIZE as usize];
86+
let mut entry_buf = [0; EPOCH_AND_ENTRY_SERIALIZED_SIZE];
8787
let result = get_sysvar(
8888
&mut entry_buf,
8989
&id(),
9090
offset,
91-
EPOCH_AND_ENTRY_SERIALIZED_SIZE,
91+
EPOCH_AND_ENTRY_SERIALIZED_SIZE as u64,
9292
);
9393

9494
match result {
@@ -147,6 +147,8 @@ mod tests {
147147

148148
#[test]
149149
fn test_size_of() {
150+
use crate::stake_history::SIZE;
151+
150152
let mut stake_history = StakeHistory::default();
151153
for i in 0..MAX_ENTRIES as u64 {
152154
stake_history.add(
@@ -160,16 +162,16 @@ mod tests {
160162

161163
assert_eq!(
162164
bincode::serialized_size(&stake_history).unwrap() as usize,
163-
size_of::<u64>() + MAX_ENTRIES * EPOCH_AND_ENTRY_SERIALIZED_SIZE as usize
165+
SIZE,
164166
);
165167

166168
let stake_history_inner: Vec<(Epoch, StakeHistoryEntry)> =
167169
bincode::deserialize(&bincode::serialize(&stake_history).unwrap()).unwrap();
168170
let epoch_entry = stake_history_inner.into_iter().next().unwrap();
169171

170172
assert_eq!(
171-
bincode::serialized_size(&epoch_entry).unwrap(),
172-
EPOCH_AND_ENTRY_SERIALIZED_SIZE
173+
bincode::serialized_size(&epoch_entry).unwrap() as usize,
174+
EPOCH_AND_ENTRY_SERIALIZED_SIZE,
173175
);
174176
}
175177

0 commit comments

Comments
 (0)