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 inputs(&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 outputs(&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"), 0xffeea8bfcb59f9f0.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>) {
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        }
74
75        fn pseudorandom_args(&self, seed: [u8; 32], _: Option<BenchmarkCase>) -> Self::Args {
76            StdRng::from_seed(seed).random()
77        }
78    }
79
80    #[test]
81    fn rust_shadow() {
82        ShadowedClosure::new(Commit).test();
83    }
84}
85
86#[cfg(test)]
87mod benches {
88    use super::*;
89    use crate::test_prelude::*;
90
91    #[test]
92    fn benchmark() {
93        ShadowedClosure::new(Commit).bench();
94    }
95}