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
45pub 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_seed(id: u32) -> [u8; 32] {
111 let mut seed = [0; 32];
112 for chunk in seed.chunks_mut(4) {
113 chunk.copy_from_slice(&id.to_le_bytes());
114 }
115 seed
116 }
117
118 pub fn trivial(id: u32) -> Self {
119 Self::from_seed(&Self::trivial_seed(id))
120 }
121
122 pub fn public(&self, metadata: ValidatorMetadata) -> ValKeyset {
123 ValKeyset {
124 ed25519: self.ed25519.public(),
125 bandersnatch: self.bandersnatch.public(),
126 bls: bls::Public::default(),
127 metadata,
128 }
129 }
130}
131
132#[test]
134fn validator_keyset_order_assumptions() {
135 let keyset = SecretKeyset::trivial(0).public(Default::default());
136 let buf = keyset.encode();
137 let opaque = jam_types::OpaqueValKeyset::decode(&mut &buf[..]).unwrap();
138 assert_eq!(keyset.bandersnatch.encode(), opaque.bandersnatch[..]);
139 assert_eq!(keyset.ed25519.encode(), opaque.ed25519[..]);
140 assert_eq!(keyset.bls.encode(), opaque.bls[..]);
141 assert_eq!(keyset.metadata.encode(), opaque.metadata[..]);
142 let buf = opaque.encode();
143 let keyset2 = ValKeyset::decode(&mut &buf[..]).unwrap();
144 assert_eq!(keyset, keyset2);
145}