sui_sdk_types/crypto/
validator.rs

1use super::Bls12381PublicKey;
2use super::Bls12381Signature;
3use crate::checkpoint::EpochId;
4use crate::checkpoint::StakeUnit;
5
6/// The Validator Set for a particular epoch.
7///
8/// # BCS
9///
10/// The BCS serialized form for this type is defined by the following ABNF:
11///
12/// ```text
13/// validator-committee = u64 ; epoch
14///                       (vector validator-committee-member)
15/// ```
16#[derive(Clone, Debug, PartialEq, Eq)]
17#[cfg_attr(
18    feature = "serde",
19    derive(serde_derive::Serialize, serde_derive::Deserialize)
20)]
21#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
22pub struct ValidatorCommittee {
23    pub epoch: EpochId,
24    pub members: Vec<ValidatorCommitteeMember>,
25}
26
27/// A member of a Validator Committee
28///
29/// # BCS
30///
31/// The BCS serialized form for this type is defined by the following ABNF:
32///
33/// ```text
34/// validator-committee-member = bls-public-key
35///                              u64 ; stake
36/// ```
37#[derive(Clone, Debug, PartialEq, Eq)]
38#[cfg_attr(
39    feature = "serde",
40    derive(serde_derive::Serialize, serde_derive::Deserialize)
41)]
42#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
43pub struct ValidatorCommitteeMember {
44    pub public_key: Bls12381PublicKey,
45    pub stake: StakeUnit,
46}
47
48/// An aggregated signature from multiple Validators.
49///
50/// # BCS
51///
52/// The BCS serialized form for this type is defined by the following ABNF:
53///
54/// ```text
55/// validator-aggregated-signature = u64               ; epoch
56///                                  bls-signature
57///                                  roaring-bitmap
58/// roaring-bitmap = bytes  ; where the contents of the bytes are valid
59///                         ; according to the serialized spec for
60///                         ; roaring bitmaps
61/// ```
62///
63/// See [here](https://github.com/RoaringBitmap/RoaringFormatSpec) for the specification for the
64/// serialized format of RoaringBitmaps.
65#[derive(Clone, Debug, PartialEq)]
66#[cfg_attr(
67    feature = "serde",
68    derive(serde_derive::Serialize, serde_derive::Deserialize)
69)]
70#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
71pub struct ValidatorAggregatedSignature {
72    pub epoch: EpochId,
73    pub signature: Bls12381Signature,
74    pub bitmap: crate::Bitmap,
75}
76
77/// A signature from a Validator
78///
79/// # BCS
80///
81/// The BCS serialized form for this type is defined by the following ABNF:
82///
83/// ```text
84/// validator-signature = u64               ; epoch
85///                       bls-public-key
86///                       bls-signature
87/// ```
88#[derive(Clone, Debug, PartialEq, Eq)]
89#[cfg_attr(
90    feature = "serde",
91    derive(serde_derive::Serialize, serde_derive::Deserialize)
92)]
93#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
94pub struct ValidatorSignature {
95    pub epoch: EpochId,
96    pub public_key: Bls12381PublicKey,
97    pub signature: Bls12381Signature,
98}
99
100#[cfg(test)]
101mod test {
102    use super::*;
103
104    #[cfg(target_arch = "wasm32")]
105    use wasm_bindgen_test::wasm_bindgen_test as test;
106
107    #[cfg(feature = "serde")]
108    #[test]
109    fn aggregated_signature_fixture() {
110        use base64ct::Base64;
111        use base64ct::Encoding;
112
113        const FIXTURE: &str = "CgAAAAAAAACZrBcXiqa0ttztfwrBxKzQRzIRnZhbmsQV7tqNXwiZQrRC+dVDbdua1Ety9uy2pCUSOjAAAAEAAAAAAAAAEAAAAAAA";
114        let bcs = Base64::decode_vec(FIXTURE).unwrap();
115
116        let signature: ValidatorAggregatedSignature = bcs::from_bytes(&bcs).unwrap();
117        let bytes = bcs::to_bytes(&signature).unwrap();
118        assert_eq!(bcs, bytes);
119    }
120}