miden_protocol/transaction/
tx_header.rs1use alloc::vec::Vec;
2
3use crate::Word;
4use crate::note::NoteHeader;
5use crate::transaction::{
6 AccountId,
7 ExecutedTransaction,
8 InputNoteCommitment,
9 InputNotes,
10 ProvenTransaction,
11 RawOutputNotes,
12 TransactionId,
13};
14use crate::utils::serde::{
15 ByteReader,
16 ByteWriter,
17 Deserializable,
18 DeserializationError,
19 Serializable,
20};
21
22#[derive(Debug, Clone, PartialEq, Eq)]
30pub struct TransactionHeader {
31 id: TransactionId,
32 account_id: AccountId,
33 initial_state_commitment: Word,
34 final_state_commitment: Word,
35 input_notes: InputNotes<InputNoteCommitment>,
36 output_notes: Vec<NoteHeader>,
37}
38
39impl TransactionHeader {
40 pub fn new(
54 account_id: AccountId,
55 initial_state_commitment: Word,
56 final_state_commitment: Word,
57 input_notes: InputNotes<InputNoteCommitment>,
58 output_notes: Vec<NoteHeader>,
59 ) -> Self {
60 let input_notes_commitment = input_notes.commitment();
61 let output_notes_commitment = RawOutputNotes::compute_commitment(output_notes.iter());
62
63 let id = TransactionId::new(
64 initial_state_commitment,
65 final_state_commitment,
66 input_notes_commitment,
67 output_notes_commitment,
68 );
69
70 Self {
71 id,
72 account_id,
73 initial_state_commitment,
74 final_state_commitment,
75 input_notes,
76 output_notes,
77 }
78 }
79
80 pub fn new_unchecked(
87 id: TransactionId,
88 account_id: AccountId,
89 initial_state_commitment: Word,
90 final_state_commitment: Word,
91 input_notes: InputNotes<InputNoteCommitment>,
92 output_notes: Vec<NoteHeader>,
93 ) -> Self {
94 Self {
95 id,
96 account_id,
97 initial_state_commitment,
98 final_state_commitment,
99 input_notes,
100 output_notes,
101 }
102 }
103
104 pub fn id(&self) -> TransactionId {
109 self.id
110 }
111
112 pub fn account_id(&self) -> AccountId {
114 self.account_id
115 }
116
117 pub fn initial_state_commitment(&self) -> Word {
121 self.initial_state_commitment
122 }
123
124 pub fn final_state_commitment(&self) -> Word {
126 self.final_state_commitment
127 }
128
129 pub fn input_notes(&self) -> &InputNotes<InputNoteCommitment> {
137 &self.input_notes
138 }
139
140 pub fn output_notes(&self) -> &[NoteHeader] {
148 &self.output_notes
149 }
150}
151
152impl From<&ProvenTransaction> for TransactionHeader {
153 fn from(tx: &ProvenTransaction) -> Self {
155 TransactionHeader::new_unchecked(
158 tx.id(),
159 tx.account_id(),
160 tx.account_update().initial_state_commitment(),
161 tx.account_update().final_state_commitment(),
162 tx.input_notes().clone(),
163 tx.output_notes().iter().map(<&NoteHeader>::from).cloned().collect(),
164 )
165 }
166}
167
168impl From<&ExecutedTransaction> for TransactionHeader {
169 fn from(tx: &ExecutedTransaction) -> Self {
171 TransactionHeader::new_unchecked(
172 tx.id(),
173 tx.account_id(),
174 tx.initial_account().initial_commitment(),
175 tx.final_account().to_commitment(),
176 tx.input_notes().to_commitments(),
177 tx.output_notes().iter().map(|n| *n.header()).collect(),
178 )
179 }
180}
181
182impl Serializable for TransactionHeader {
186 fn write_into<W: ByteWriter>(&self, target: &mut W) {
187 let Self {
188 id: _,
189 account_id,
190 initial_state_commitment,
191 final_state_commitment,
192 input_notes,
193 output_notes,
194 } = self;
195
196 account_id.write_into(target);
197 initial_state_commitment.write_into(target);
198 final_state_commitment.write_into(target);
199 input_notes.write_into(target);
200 output_notes.write_into(target);
201 }
202}
203
204impl Deserializable for TransactionHeader {
205 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
206 let account_id = <AccountId>::read_from(source)?;
207 let initial_state_commitment = <Word>::read_from(source)?;
208 let final_state_commitment = <Word>::read_from(source)?;
209 let input_notes = <InputNotes<InputNoteCommitment>>::read_from(source)?;
210 let output_notes = <Vec<NoteHeader>>::read_from(source)?;
211
212 let tx_header = Self::new(
213 account_id,
214 initial_state_commitment,
215 final_state_commitment,
216 input_notes,
217 output_notes,
218 );
219
220 Ok(tx_header)
221 }
222}