From 4d4f959ddda5e151f6d82db2be5c7465c901013e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Venturo?= Date: Fri, 17 May 2024 17:51:19 +0000 Subject: [PATCH] Fix poor performance in value_note.derement() --- noir-projects/aztec-nr/value-note/src/utils.nr | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/noir-projects/aztec-nr/value-note/src/utils.nr b/noir-projects/aztec-nr/value-note/src/utils.nr index 4c4ba85021c..466cf660d3f 100644 --- a/noir-projects/aztec-nr/value-note/src/utils.nr +++ b/noir-projects/aztec-nr/value-note/src/utils.nr @@ -47,10 +47,23 @@ pub fn decrement_by_at_most( let options = create_note_getter_options_for_decreasing_balance(max_amount); let opt_notes = balance.get_notes(options); + let owner_npk_m_hash = get_npk_m_hash(balance.context.private.unwrap(), owner); + let mut decremented = 0; for i in 0..opt_notes.len() { if opt_notes[i].is_some() { - decremented += destroy_note(balance, owner, opt_notes[i].unwrap_unchecked()); + let note = opt_notes[i].unwrap_unchecked(); + + // This is similar to destroy_note, except we only compute the owner_npk_m_hash once instead of doing it in + // each loop iteration. + + // Ensure the note is actually owned by the owner (to prevent user from generating a valid proof while + // spending someone else's notes). + // TODO (#6312): This will break with key rotation. Fix this. Will not be able to pass this after rotating keys. + assert(note.npk_m_hash.eq(owner_npk_m_hash)); + decremented += note.value; + + balance.remove(note); } }