mithril_stm/protocol/participant/
signer.rs

1use crate::{
2    ClosedKeyRegistration, MembershipDigest, Parameters, SignerIndex, SingleSignature, Stake,
3    StmResult, VerificationKeyForConcatenation, proof_system::ConcatenationProofSigner,
4};
5
6/// Single signature generator. Contains the signer's registration index and the signature
7/// generators of each proof system. For now, it only includes the signer of concatenation proof.
8#[derive(Debug, Clone)]
9pub struct Signer<D: MembershipDigest> {
10    /// Index of the signer in registration
11    pub signer_index: SignerIndex,
12    /// Single signature generation of concatenation proof system
13    pub(crate) concatenation_proof_signer: ConcatenationProofSigner<D>,
14    stake: Stake,
15    pub closed_key_registration: ClosedKeyRegistration,
16    pub parameters: Parameters,
17}
18
19impl<D: MembershipDigest> Signer<D> {
20    /// Creates a new single signature generator
21    pub(crate) fn new(
22        signer_index: SignerIndex,
23        concatenation_proof_signer: ConcatenationProofSigner<D>,
24        closed_key_registration: ClosedKeyRegistration,
25        parameters: Parameters,
26        stake: Stake,
27    ) -> Self {
28        Self {
29            signer_index,
30            concatenation_proof_signer,
31            stake,
32            closed_key_registration,
33            parameters,
34        }
35    }
36
37    /// Creates and returns a single signature for the given message.
38    pub fn create_single_signature(&self, message: &[u8]) -> StmResult<SingleSignature> {
39        let concatenation_signature =
40            self.concatenation_proof_signer.create_single_signature(message)?;
41        Ok(SingleSignature {
42            concatenation_signature,
43            signer_index: self.signer_index,
44        })
45    }
46
47    /// Signing function that returns an Option type.
48    pub fn sign(&self, message: &[u8]) -> Option<SingleSignature> {
49        let result = self.create_single_signature(message);
50        result.ok()
51    }
52
53    /// Gets the BLS verification key.
54    pub fn get_bls_verification_key(&self) -> VerificationKeyForConcatenation {
55        self.concatenation_proof_signer.get_verification_key()
56    }
57
58    /// Gets the stake associated with the signer.
59    pub fn get_stake(&self) -> Stake {
60        self.stake
61    }
62}