Skip to main content

tasm_lib/neptune/mutator_set/
commit.rs

1use std::collections::HashMap;
2
3use triton_vm::prelude::*;
4
5use crate::prelude::*;
6use crate::traits::basic_snippet::Reviewer;
7use crate::traits::basic_snippet::SignOffFingerprint;
8
9/// Compute the addition record for the mutator set AOCL from an `item`, the
10/// sender's randomness, and the receiver's digest.
11///
12/// ### Behavior
13///
14/// ```text
15/// BEFORE: _ [receiver_digest: Digest] [sender_randomness: Digest] [item: Digest]
16/// AFTER:  _ [commitment: Digest]
17/// ```
18///
19/// ### Preconditions
20///
21/// None.
22///
23/// ### Postconditions
24///
25/// None.
26#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
27pub struct Commit;
28
29impl BasicSnippet for Commit {
30    fn parameters(&self) -> Vec<(DataType, String)> {
31        ["receiver_digest", "sender_randomness", "item"]
32            .map(|name| (DataType::Digest, name.to_string()))
33            .to_vec()
34    }
35
36    fn return_values(&self) -> Vec<(DataType, String)> {
37        vec![(DataType::Digest, "commitment".to_string())]
38    }
39
40    fn entrypoint(&self) -> String {
41        "tasmlib_neptune_mutator_set_commit".to_string()
42    }
43
44    fn code(&self, _: &mut Library) -> Vec<LabelledInstruction> {
45        triton_asm! {
46            {self.entrypoint()}:
47                hash
48                hash
49                return
50        }
51    }
52
53    fn sign_offs(&self) -> HashMap<Reviewer, SignOffFingerprint> {
54        let mut sign_offs = HashMap::new();
55        sign_offs.insert(Reviewer("ferdinand"), 0xbe1bb66a7035660b.into());
56        sign_offs
57    }
58}
59
60#[cfg(test)]
61mod tests {
62    use super::*;
63    use crate::test_prelude::*;
64
65    impl Closure for Commit {
66        type Args = (Digest, Digest, Digest);
67
68        fn rust_shadow(&self, stack: &mut Vec<BFieldElement>) -> Result<(), RustShadowError> {
69            let (receiver_digest, sender_randomness, item) = pop_encodable::<Self::Args>(stack)?;
70            let commitment =
71                Tip5::hash_pair(Tip5::hash_pair(item, sender_randomness), receiver_digest);
72            push_encodable(stack, &commitment);
73            Ok(())
74        }
75
76        fn pseudorandom_args(&self, seed: [u8; 32], _: Option<BenchmarkCase>) -> Self::Args {
77            StdRng::from_seed(seed).random()
78        }
79    }
80
81    #[macro_rules_attr::apply(test)]
82    fn rust_shadow() {
83        ShadowedClosure::new(Commit).test();
84    }
85}
86
87#[cfg(test)]
88mod benches {
89    use super::*;
90    use crate::test_prelude::*;
91
92    #[macro_rules_attr::apply(test)]
93    fn benchmark() {
94        ShadowedClosure::new(Commit).bench();
95    }
96}