use crate::{
ClosedKeyRegistration, MembershipDigest, Parameters, SignerIndex, SingleSignature, Stake,
StmResult, VerificationKeyForConcatenation, proof_system::ConcatenationProofSigner,
};
#[cfg(feature = "future_snark")]
use crate::{LotteryTargetValue, VerificationKeyForSnark, proof_system::SnarkProofSigner};
#[derive(Debug, Clone)]
pub struct Signer<D: MembershipDigest> {
pub signer_index: SignerIndex,
pub(crate) concatenation_proof_signer: ConcatenationProofSigner<D>,
stake: Stake,
pub closed_key_registration: ClosedKeyRegistration,
pub parameters: Parameters,
#[cfg(feature = "future_snark")]
pub(crate) snark_proof_signer: Option<SnarkProofSigner<D>>,
}
impl<D: MembershipDigest> Signer<D> {
pub(crate) fn new(
signer_index: SignerIndex,
concatenation_proof_signer: ConcatenationProofSigner<D>,
closed_key_registration: ClosedKeyRegistration,
parameters: Parameters,
stake: Stake,
#[cfg(feature = "future_snark")] snark_proof_signer: Option<SnarkProofSigner<D>>,
) -> Self {
Self {
signer_index,
concatenation_proof_signer,
stake,
closed_key_registration,
parameters,
#[cfg(feature = "future_snark")]
snark_proof_signer,
}
}
pub fn create_single_signature(&self, message: &[u8]) -> StmResult<SingleSignature> {
let concatenation_signature =
self.concatenation_proof_signer.create_single_signature(message)?;
#[cfg(feature = "future_snark")]
let snark_signature = if let Some(snark_signer) = &self.snark_proof_signer {
let mut rng = rand_core::OsRng;
snark_signer.create_single_signature(message, &mut rng).ok()
} else {
None
};
Ok(SingleSignature {
concatenation_signature,
signer_index: self.signer_index,
#[cfg(feature = "future_snark")]
snark_signature,
})
}
pub fn sign(&self, message: &[u8]) -> Option<SingleSignature> {
let result = self.create_single_signature(message);
result.ok()
}
pub fn get_bls_verification_key(&self) -> VerificationKeyForConcatenation {
self.concatenation_proof_signer.get_verification_key()
}
pub fn get_stake(&self) -> Stake {
self.stake
}
#[cfg(feature = "future_snark")]
pub fn get_lottery_target_value(&self) -> Option<LotteryTargetValue> {
self.snark_proof_signer
.as_ref()
.map(|signer| signer.get_lottery_target_value())
}
#[cfg(feature = "future_snark")]
pub fn get_schnorr_verification_key(&self) -> Option<VerificationKeyForSnark> {
self.snark_proof_signer
.as_ref()
.map(|signer| signer.get_verification_key())
}
}