mithril_stm/protocol/aggregate_signature/
aggregate_key.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{
4    ClosedKeyRegistration, MembershipDigest, Stake,
5    membership_commitment::{
6        MerkleBatchPath, MerkleTreeBatchCommitment, MerkleTreeConcatenationLeaf,
7    },
8};
9
10/// Stm aggregate key (batch compatible), which contains the merkle tree commitment and the total stake of the system.
11/// Batch Compat Merkle tree commitment includes the number of leaves in the tree in order to obtain batch path.
12#[derive(Debug, Clone, Serialize, Deserialize)]
13#[serde(bound(
14    serialize = "MerkleBatchPath<D::ConcatenationHash>: Serialize",
15    deserialize = "MerkleBatchPath<D::ConcatenationHash>: Deserialize<'de>"
16))]
17pub struct AggregateVerificationKey<D: MembershipDigest> {
18    mt_commitment: MerkleTreeBatchCommitment<D::ConcatenationHash, MerkleTreeConcatenationLeaf>,
19    total_stake: Stake,
20}
21
22impl<D: MembershipDigest> AggregateVerificationKey<D> {
23    pub(crate) fn get_merkle_tree_batch_commitment(
24        &self,
25    ) -> MerkleTreeBatchCommitment<D::ConcatenationHash, MerkleTreeConcatenationLeaf> {
26        self.mt_commitment.clone()
27    }
28
29    #[deprecated(
30        since = "0.5.0",
31        note = "Use `get_merkle_tree_batch_commitment` instead"
32    )]
33    pub fn get_mt_commitment(
34        &self,
35    ) -> MerkleTreeBatchCommitment<D::ConcatenationHash, MerkleTreeConcatenationLeaf> {
36        Self::get_merkle_tree_batch_commitment(self)
37    }
38
39    pub fn get_total_stake(&self) -> Stake {
40        self.total_stake
41    }
42}
43
44impl<D: MembershipDigest> PartialEq for AggregateVerificationKey<D> {
45    fn eq(&self, other: &Self) -> bool {
46        self.mt_commitment == other.mt_commitment && self.total_stake == other.total_stake
47    }
48}
49
50impl<D: MembershipDigest> Eq for AggregateVerificationKey<D> {}
51
52impl<D: MembershipDigest> From<&ClosedKeyRegistration<D>> for AggregateVerificationKey<D> {
53    fn from(reg: &ClosedKeyRegistration<D>) -> Self {
54        Self {
55            mt_commitment: reg.merkle_tree.to_merkle_tree_batch_commitment(),
56            total_stake: reg.total_stake,
57        }
58    }
59}