mithril_common/test/crypto_helper/cardano/
extensions.rs

1use anyhow::Context;
2
3use crate::StdResult;
4use crate::crypto_helper::{MKProof, MKTree, MKTreeNode, MKTreeStoreInMemory, ProtocolParameters};
5
6/// Extension trait adding test utilities to [ProtocolInitializer][crate::crypto_helper::ProtocolInitializer]
7pub trait ProtocolInitializerTestExtension {
8    /// `TEST ONLY` - Override the protocol parameters of the `Initializer`
9    fn override_protocol_parameters(&mut self, protocol_parameters: &ProtocolParameters);
10}
11
12/// Extension trait adding test utilities to [MKProof]
13pub trait MKProofTestExtension {
14    /// `TEST ONLY` - Build a [MKProof] based on the given leaves
15    fn from_leaves<T: Into<MKTreeNode> + Clone>(leaves: &[T]) -> StdResult<MKProof>;
16
17    /// `TEST ONLY` - Build a [MKProof] based on the given leaves
18    fn from_subset_of_leaves<T: Into<MKTreeNode> + Clone>(
19        leaves: &[T],
20        leaves_to_verify: &[T],
21    ) -> StdResult<MKProof>;
22}
23
24impl MKProofTestExtension for MKProof {
25    fn from_leaves<T: Into<MKTreeNode> + Clone>(leaves: &[T]) -> StdResult<MKProof> {
26        Self::from_subset_of_leaves(leaves, leaves)
27    }
28
29    fn from_subset_of_leaves<T: Into<MKTreeNode> + Clone>(
30        leaves: &[T],
31        leaves_to_verify: &[T],
32    ) -> StdResult<MKProof> {
33        fn list_to_mknode<T: Into<MKTreeNode> + Clone>(hashes: &[T]) -> Vec<MKTreeNode> {
34            hashes.iter().map(|h| h.clone().into()).collect()
35        }
36
37        let leaves = list_to_mknode(leaves);
38        let leaves_to_verify = list_to_mknode(leaves_to_verify);
39
40        let mktree = MKTree::<MKTreeStoreInMemory>::new(&leaves)
41            .with_context(|| "MKTree creation should not fail")?;
42        mktree.compute_proof(&leaves_to_verify)
43    }
44}