miden_objects/note/
header.rs1use 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#[derive(Debug, Copy, Clone, PartialEq, Eq)]
23pub struct NoteHeader {
24 note_id: NoteId,
25 note_metadata: NoteMetadata,
26}
27
28impl NoteHeader {
29 pub fn new(note_id: NoteId, note_metadata: NoteMetadata) -> Self {
31 Self { note_id, note_metadata }
32 }
33
34 pub fn id(&self) -> NoteId {
38 self.note_id
39 }
40
41 pub fn metadata(&self) -> &NoteMetadata {
43 &self.note_metadata
44 }
45
46 pub fn commitment(&self) -> Word {
53 compute_note_commitment(self.id(), self.metadata())
54 }
55}
56
57pub fn compute_note_commitment(id: NoteId, metadata: &NoteMetadata) -> Word {
67 Hasher::merge(&[id.as_word(), Word::from(metadata)])
68}
69
70impl From<NoteHeader> for [Felt; 8] {
74 fn from(note_header: NoteHeader) -> Self {
75 (¬e_header).into()
76 }
77}
78
79impl From<NoteHeader> for [Word; 2] {
80 fn from(note_header: NoteHeader) -> Self {
81 (¬e_header).into()
82 }
83}
84
85impl From<NoteHeader> for [u8; 64] {
86 fn from(note_header: NoteHeader) -> Self {
87 (¬e_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(¬e_header.note_id.as_bytes());
117 elements[32..].copy_from_slice(¬e_metadata_bytes);
118 elements
119 }
120}
121
122impl 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}