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
use crate::{on_chain_config::OnChainConfig, validator_info::ValidatorInfo};
#[cfg(any(test, feature = "fuzzing"))]
use proptest_derive::Arbitrary;
use serde::{Deserialize, Serialize};
use std::{fmt, iter::IntoIterator, vec};
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[cfg_attr(any(test, feature = "fuzzing"), derive(Arbitrary))]
#[repr(u8)]
pub enum ConsensusScheme {
Ed25519 = 0,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[cfg_attr(any(test, feature = "fuzzing"), derive(Arbitrary))]
pub struct ValidatorSet {
scheme: ConsensusScheme,
payload: Vec<ValidatorInfo>,
}
impl fmt::Display for ValidatorSet {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "[")?;
for validator in self.payload().iter() {
write!(f, "{} ", validator)?;
}
write!(f, "]")
}
}
impl ValidatorSet {
pub fn new(payload: Vec<ValidatorInfo>) -> Self {
Self {
scheme: ConsensusScheme::Ed25519,
payload,
}
}
pub fn payload(&self) -> &[ValidatorInfo] {
&self.payload
}
pub fn empty() -> Self {
ValidatorSet::new(Vec::new())
}
}
impl OnChainConfig for ValidatorSet {
const IDENTIFIER: &'static str = "DiemSystem";
}
impl IntoIterator for ValidatorSet {
type Item = ValidatorInfo;
type IntoIter = vec::IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
self.payload.into_iter()
}
}