miden_objects/note/
header.rs

1use alloc::vec::Vec;
2
3use super::{
4    ByteReader,
5    ByteWriter,
6    Deserializable,
7    DeserializationError,
8    Felt,
9    NoteId,
10    NoteMetadata,
11    Serializable,
12    Word,
13};
14use crate::Hasher;
15
16// NOTE HEADER
17// ================================================================================================
18
19/// Holds the strictly required, public information of a note.
20///
21/// See [NoteId] and [NoteMetadata] for additional details.
22#[derive(Debug, Copy, Clone, PartialEq, Eq)]
23pub struct NoteHeader {
24    note_id: NoteId,
25    note_metadata: NoteMetadata,
26}
27
28impl NoteHeader {
29    /// Returns a new [NoteHeader] instantiated from the specified note ID and metadata.
30    pub fn new(note_id: NoteId, note_metadata: NoteMetadata) -> Self {
31        Self { note_id, note_metadata }
32    }
33
34    /// Returns the note's identifier.
35    ///
36    /// The [NoteId] value is both an unique identifier and a commitment to the note.
37    pub fn id(&self) -> NoteId {
38        self.note_id
39    }
40
41    /// Returns the note's metadata.
42    pub fn metadata(&self) -> &NoteMetadata {
43        &self.note_metadata
44    }
45
46    /// Returns a commitment to the note and its metadata.
47    ///
48    /// > hash(NOTE_ID || NOTE_METADATA)
49    ///
50    /// This value is used primarily for authenticating notes consumed when they are consumed
51    /// in a transaction.
52    pub fn commitment(&self) -> Word {
53        compute_note_commitment(self.id(), self.metadata())
54    }
55}
56
57// UTILITIES
58// ================================================================================================
59
60/// Returns a commitment to the note and its metadata.
61///
62/// > hash(NOTE_ID || NOTE_METADATA)
63///
64/// This value is used primarily for authenticating notes consumed when they are consumed
65/// in a transaction.
66pub fn compute_note_commitment(id: NoteId, metadata: &NoteMetadata) -> Word {
67    Hasher::merge(&[id.as_word(), Word::from(metadata)])
68}
69
70// CONVERSIONS FROM NOTE HEADER
71// ================================================================================================
72
73impl From<NoteHeader> for [Felt; 8] {
74    fn from(note_header: NoteHeader) -> Self {
75        (&note_header).into()
76    }
77}
78
79impl From<NoteHeader> for [Word; 2] {
80    fn from(note_header: NoteHeader) -> Self {
81        (&note_header).into()
82    }
83}
84
85impl From<NoteHeader> for [u8; 64] {
86    fn from(note_header: NoteHeader) -> Self {
87        (&note_header).into()
88    }
89}
90
91impl From<&NoteHeader> for [Felt; 8] {
92    fn from(note_header: &NoteHeader) -> Self {
93        let mut elements: [Felt; 8] = Default::default();
94        elements[..4].copy_from_slice(note_header.note_id.as_elements());
95        elements[4..].copy_from_slice(Word::from(note_header.metadata()).as_elements());
96        elements
97    }
98}
99
100impl From<&NoteHeader> for [Word; 2] {
101    fn from(note_header: &NoteHeader) -> Self {
102        let mut elements: [Word; 2] = Default::default();
103        elements[0].copy_from_slice(note_header.note_id.as_elements());
104        elements[1].copy_from_slice(Word::from(note_header.metadata()).as_elements());
105        elements
106    }
107}
108
109impl From<&NoteHeader> for [u8; 64] {
110    fn from(note_header: &NoteHeader) -> Self {
111        let mut elements: [u8; 64] = [0; 64];
112        let note_metadata_bytes = Word::from(note_header.metadata())
113            .iter()
114            .flat_map(|x| x.as_int().to_le_bytes())
115            .collect::<Vec<u8>>();
116        elements[..32].copy_from_slice(&note_header.note_id.as_bytes());
117        elements[32..].copy_from_slice(&note_metadata_bytes);
118        elements
119    }
120}
121
122// SERIALIZATION
123// ================================================================================================
124
125impl Serializable for NoteHeader {
126    fn write_into<W: ByteWriter>(&self, target: &mut W) {
127        self.note_id.write_into(target);
128        self.note_metadata.write_into(target);
129    }
130}
131
132impl Deserializable for NoteHeader {
133    fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
134        let note_id = NoteId::read_from(source)?;
135        let note_metadata = NoteMetadata::read_from(source)?;
136
137        Ok(Self { note_id, note_metadata })
138    }
139}