jam_std_common/
keyset.rs

1use codec::{ConstEncodedLen, Decode, Encode, MaxEncodedLen};
2use jam_types::{FixedVec, OpaqueValidatorMetadata};
3
4use crate::{bandersnatch, ed25519, hash_raw_concat, PeerAddr, PeerDetails, PeerId};
5
6#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode, MaxEncodedLen)]
7pub struct ValidatorMetadata {
8	pub addr: PeerAddr,
9	pub rest1: [u8; 14],
10	pub rest2: [u32; 24],
11}
12impl ConstEncodedLen for ValidatorMetadata {}
13
14impl Default for ValidatorMetadata {
15	fn default() -> Self {
16		Self {
17			addr: PeerAddr { ip: Default::default(), port: 0 },
18			rest1: Default::default(),
19			rest2: Default::default(),
20		}
21	}
22}
23
24impl std::fmt::Debug for ValidatorMetadata {
25	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
26		write!(f, "{}", self.addr)
27	}
28}
29
30impl TryFrom<OpaqueValidatorMetadata> for ValidatorMetadata {
31	type Error = codec::Error;
32	fn try_from(opaque: OpaqueValidatorMetadata) -> Result<Self, Self::Error> {
33		Self::decode(&mut &opaque[..])
34	}
35}
36
37impl From<ValidatorMetadata> for OpaqueValidatorMetadata {
38	fn from(metadata: ValidatorMetadata) -> Self {
39		let mut opaque = OpaqueValidatorMetadata::default();
40		metadata.encode_to(&mut opaque.as_mut_slice());
41		opaque
42	}
43}
44
45/// BLS Placeholder
46pub mod bls {
47	use codec::{Decode, Encode, MaxEncodedLen};
48	use jam_types::OpaqueBlsPublic;
49
50	pub const BLS_PUBLIC_SERIALIZED_LEN: usize = 144;
51
52	#[derive(Copy, Clone, Encode, Decode, Debug, Eq, PartialEq, MaxEncodedLen)]
53	pub struct Public(pub [u8; BLS_PUBLIC_SERIALIZED_LEN]);
54
55	impl Default for Public {
56		fn default() -> Self {
57			Public([0u8; BLS_PUBLIC_SERIALIZED_LEN])
58		}
59	}
60
61	impl From<OpaqueBlsPublic> for Public {
62		fn from(opaque: OpaqueBlsPublic) -> Self {
63			Self(opaque.0)
64		}
65	}
66
67	impl From<Public> for OpaqueBlsPublic {
68		fn from(public: Public) -> Self {
69			Self(public.0)
70		}
71	}
72}
73
74#[derive(Copy, Clone, Encode, Decode, Debug, Eq, PartialEq, MaxEncodedLen, Default)]
75pub struct ValKeyset {
76	pub bandersnatch: bandersnatch::Public,
77	pub ed25519: ed25519::Public,
78	pub bls: bls::Public,
79	pub metadata: ValidatorMetadata,
80}
81
82impl From<&ValKeyset> for PeerDetails {
83	fn from(keyset: &ValKeyset) -> PeerDetails {
84		PeerDetails { id: PeerId(keyset.ed25519), addr: keyset.metadata.addr }
85	}
86}
87
88pub type ValKeysets = FixedVec<ValKeyset, jam_types::ValCount>;
89pub type EdKeys = FixedVec<ed25519::Public, jam_types::ValCount>;
90
91pub struct SecretKeyset {
92	pub bandersnatch: bandersnatch::Secret,
93	pub ed25519: ed25519::Secret,
94}
95
96impl SecretKeyset {
97	pub fn from_seed(seed: &[u8; 32]) -> Self {
98		Self {
99			bandersnatch: bandersnatch::Secret::from_seed(hash_raw_concat([
100				b"jam_val_key_bandersnatch".as_slice(),
101				seed.as_slice(),
102			])),
103			ed25519: ed25519::Secret::from_seed(hash_raw_concat([
104				b"jam_val_key_ed25519".as_slice(),
105				seed.as_slice(),
106			])),
107		}
108	}
109
110	pub fn trivial(id: u32) -> Self {
111		[id; 8].using_encoded(|data| {
112			Self::from_seed(data.try_into().expect("data is always 32 bytes"))
113		})
114	}
115
116	pub fn public(&self, metadata: ValidatorMetadata) -> ValKeyset {
117		ValKeyset {
118			ed25519: self.ed25519.public(),
119			bandersnatch: self.bandersnatch.public(),
120			bls: bls::Public::default(),
121			metadata,
122		}
123	}
124}
125
126// Items order of ValKeyset and OpaqueValKeyset must match
127#[test]
128fn validator_keyset_order_assumptions() {
129	let keyset = SecretKeyset::trivial(0).public(Default::default());
130	let buf = keyset.encode();
131	let opaque = jam_types::OpaqueValKeyset::decode(&mut &buf[..]).unwrap();
132	assert_eq!(keyset.bandersnatch.encode(), opaque.bandersnatch[..]);
133	assert_eq!(keyset.ed25519.encode(), opaque.ed25519[..]);
134	assert_eq!(keyset.bls.encode(), opaque.bls[..]);
135	assert_eq!(keyset.metadata.encode(), opaque.metadata[..]);
136	let buf = opaque.encode();
137	let keyset2 = ValKeyset::decode(&mut &buf[..]).unwrap();
138	assert_eq!(keyset, keyset2);
139}