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
use crate::{
epoch_change::Verifier,
ledger_info::{LedgerInfo, LedgerInfoWithSignatures},
validator_verifier::ValidatorVerifier,
};
use anyhow::ensure;
#[cfg(any(test, feature = "fuzzing"))]
use proptest_derive::Arbitrary;
use serde::{Deserialize, Serialize};
use std::{collections::BTreeMap, fmt};
#[derive(Clone, Deserialize, Eq, PartialEq, Serialize)]
#[cfg_attr(any(test, feature = "fuzzing"), derive(Arbitrary))]
pub struct EpochState {
pub epoch: u64,
pub verifier: ValidatorVerifier,
}
impl EpochState {
pub fn empty() -> Self {
Self {
epoch: 0,
verifier: ValidatorVerifier::new(BTreeMap::new()),
}
}
}
impl Verifier for EpochState {
fn verify(&self, ledger_info: &LedgerInfoWithSignatures) -> anyhow::Result<()> {
ensure!(
self.epoch == ledger_info.ledger_info().epoch(),
"LedgerInfo has unexpected epoch {}, expected {}",
ledger_info.ledger_info().epoch(),
self.epoch
);
ledger_info.verify_signatures(&self.verifier)?;
Ok(())
}
fn epoch_change_verification_required(&self, epoch: u64) -> bool {
self.epoch < epoch
}
fn is_ledger_info_stale(&self, ledger_info: &LedgerInfo) -> bool {
ledger_info.epoch() < self.epoch
}
}
impl fmt::Debug for EpochState {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self)
}
}
impl fmt::Display for EpochState {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"EpochState [epoch: {}, validator: {}]",
self.epoch, self.verifier
)
}
}