Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor!: introduce compute_note_hash_for_(consumption/insertion) #4344

Merged
merged 1 commit into from
Jan 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions boxes/token/src/contracts/src/types/token_note.nr
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use dep::aztec::{
note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
},
context::PrivateContext,
state_vars::set::Set,
Expand Down Expand Up @@ -65,7 +65,7 @@ impl NoteInterface for TokenNote {

// docs:start:nullifier
fn compute_nullifier(self, context: &mut PrivateContext) -> Field {
let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(self);
let note_hash_for_nullify = compute_note_hash_for_consumption(self);
let secret = context.request_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand All @@ -77,7 +77,7 @@ impl NoteInterface for TokenNote {
// docs:end:nullifier

fn compute_nullifier_without_context(self) -> Field {
let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(self);
let note_hash_for_nullify = compute_note_hash_for_consumption(self);
let secret = get_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand Down
4 changes: 2 additions & 2 deletions boxes/token/src/contracts/src/types/transparent_note.nr
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use dep::aztec::{
note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
},
hash::{compute_secret_hash, pedersen_hash},
context::PrivateContext,
Expand Down Expand Up @@ -52,7 +52,7 @@ impl NoteInterface for TransparentNote {
}

fn compute_nullifier_without_context(self) -> Field {
let siloed_note_hash = compute_note_hash_for_read_or_nullify(self);
let siloed_note_hash = compute_note_hash_for_consumption(self);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([self.secret, siloed_note_hash],0)
}
Expand Down
10 changes: 9 additions & 1 deletion docs/docs/misc/migration_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,15 @@ impl NoteInterface for CardNote {
self.owner.to_field(),
], 0)
}
``````
```

### Introduce `compute_note_hash_for_consumption` and `compute_note_hash_for_insertion`

Makes a split in logic for note hash computation for consumption and insertion. This is to avoid confusion between the two, and to make it clear that the note hash for consumption is different from the note hash for insertion (sometimes).

`compute_note_hash_for_consumption` replaces `compute_note_hash_for_read_or_nullify`.
`compute_note_hash_for_insertion` is new, and mainly used in `lifecycle.nr``


## 0.22.0

Expand Down
6 changes: 3 additions & 3 deletions yarn-project/aztec-nr/address-note/src/address_note.nr
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use dep::aztec::{
note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
},
oracle::{
rand::rand,
Expand Down Expand Up @@ -55,7 +55,7 @@ impl NoteInterface for AddressNote {
}

fn compute_nullifier(self, context: &mut PrivateContext) -> Field {
let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(self);
let note_hash_for_nullify = compute_note_hash_for_consumption(self);
let secret = context.request_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand All @@ -66,7 +66,7 @@ impl NoteInterface for AddressNote {
}

fn compute_nullifier_without_context(self) -> Field {
let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(self);
let note_hash_for_nullify = compute_note_hash_for_consumption(self);
let secret = get_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand Down
4 changes: 2 additions & 2 deletions yarn-project/aztec-nr/aztec/src/history/note_inclusion.nr
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use dep::std::merkle::compute_merkle_root;
use crate::{
context::PrivateContext,
note::{
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
note_header::NoteHeader,
note_interface::NoteInterface,
},
Expand Down Expand Up @@ -34,7 +34,7 @@ pub fn prove_note_inclusion<Note, N>(
block_number: u32, // The block at which we'll prove that the note exists
context: PrivateContext
) where Note: NoteInterface {
let note_commitment = compute_note_hash_for_read_or_nullify(note_with_header);
let note_commitment = compute_note_hash_for_consumption(note_with_header);

prove_note_commitment_inclusion(note_commitment, block_number, context);
}
22 changes: 11 additions & 11 deletions yarn-project/aztec-nr/aztec/src/note/lifecycle.nr
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use crate::context::{
use crate::note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
utils::{compute_note_hash_for_insertion, compute_note_hash_for_consumption},
};
use crate::oracle::notes::{notify_created_note, notify_nullified_note};
use dep::protocol_types::traits::{Serialize, Deserialize};
Expand All @@ -23,7 +23,7 @@ pub fn create_note<Note, N>(
// TODO: change this to note.setHeader(header) once https://github.com/noir-lang/noir/issues/4095 is fixed
Note::set_header(note, header);
// As `is_transient` is true, this will compute the inner note hsah
let inner_note_hash = compute_note_hash_for_read_or_nullify(*note);
let inner_note_hash = compute_note_hash_for_insertion(*note);

// TODO: Strong typing required because of https://github.com/noir-lang/noir/issues/4088
let serialized_note: [Field; N] = Note::serialize(*note);
Expand All @@ -42,28 +42,28 @@ pub fn create_note_hash_from_public<Note>(context: &mut PublicContext, storage_s
let header = NoteHeader { contract_address, storage_slot, nonce: 0, is_transient: true };
// TODO: change this to note.setHeader(header) once https://github.com/noir-lang/noir/issues/4095 is fixed
Note::set_header(note, header);
let inner_note_hash = compute_note_hash_for_read_or_nullify(*note);
let inner_note_hash = compute_note_hash_for_insertion(*note);

context.push_new_note_hash(inner_note_hash);
}

pub fn destroy_note<Note>(context: &mut PrivateContext, note: Note) where Note: NoteInterface {
let mut nullifier = 0;
let mut nullified_commitment: Field = 0;
let mut consumed_note_hash: Field = 0;
nullifier = note.compute_nullifier(context);

// We also need the note commitment corresponding to the "nullifier"
// We also need the note hash corresponding to the "nullifier"
let header = note.get_header();
// `nullified_commitment` is used to inform the kernel which pending commitment
// `consumed_note_hash` is used to inform the kernel which pending note hash
// the nullifier corresponds to so they can be matched and both squashed/deleted.
// nonzero nonce implies "persistable" nullifier (nullifies a persistent/in-tree
// commitment) in which case `nullified_commitment` is not used since the kernel
// note hash) in which case `consumed_note_hash` is not used since the kernel
// just siloes and forwards the nullifier to its output.
if (header.is_transient) {
// TODO(1718): Can we reuse the note commitment computed in `compute_nullifier`?
nullified_commitment = compute_note_hash_for_read_or_nullify(note);
// TODO(1718): Can we reuse the note hash computed in `compute_nullifier`?
consumed_note_hash = compute_note_hash_for_consumption(note);
}
assert(notify_nullified_note(nullifier, nullified_commitment) == 0);
assert(notify_nullified_note(nullifier, consumed_note_hash) == 0);

context.push_new_nullifier(nullifier, nullified_commitment)
context.push_new_nullifier(nullifier, consumed_note_hash)
}
6 changes: 3 additions & 3 deletions yarn-project/aztec-nr/aztec/src/note/note_getter.nr
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use crate::note::{
note_getter_options::{NoteGetterOptions, Select, Sort, SortOrder, Comparator, NoteStatus},
note_interface::NoteInterface,
note_viewer_options::NoteViewerOptions,
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
};
use crate::oracle;

Expand Down Expand Up @@ -78,7 +78,7 @@ pub fn get_note<Note, N>(

check_note_header(*context, storage_slot, note);

let note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note);
let note_hash_for_read_request = compute_note_hash_for_consumption(note);

context.push_read_request(note_hash_for_read_request);
note
Expand All @@ -104,7 +104,7 @@ pub fn get_notes<Note, N, FILTER_ARGS>(
}
prev_fields = fields;

let note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note);
let note_hash_for_read_request = compute_note_hash_for_consumption(note);
// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1410): test to ensure
// failure if malicious oracle injects 0 nonce here for a "pre-existing" note.
context.push_read_request(note_hash_for_read_request);
Expand Down
11 changes: 9 additions & 2 deletions yarn-project/aztec-nr/aztec/src/note/utils.nr
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,17 @@ pub fn compute_siloed_nullifier<Note>(
pedersen_hash(input, GENERATOR_INDEX__OUTER_NULLIFIER)
}

pub fn compute_note_hash_for_read_or_nullify<Note>(note: Note) -> Field where Note: NoteInterface {
pub fn compute_note_hash_for_insertion<Note>(note: Note) -> Field where Note: NoteInterface {
compute_inner_note_hash(note)
}

pub fn compute_note_hash_for_consumption<Note>(note: Note) -> Field where Note: NoteInterface {
let header = note.get_header();
// There are 3 cases for reading a note intended for consumption:
// 1. The note was inserted in this transaction, and is transient.
// 2. The note was inserted in a previous transaction, and was inserted in public
// 3. The note was inserted in a previous transaction, and was inserted in private

// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386)
if (header.is_transient) {
// If a note is transient, we just read the inner_note_hash (kernel will silo by contract address).
compute_inner_note_hash(note)
Expand Down
4 changes: 2 additions & 2 deletions yarn-project/aztec-nr/aztec/src/state_vars/set.nr
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use crate::note::{
note_header::NoteHeader,
note_interface::NoteInterface,
note_viewer_options::NoteViewerOptions,
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
};

// docs:start:struct
Expand Down Expand Up @@ -74,7 +74,7 @@ impl<Note> Set<Note> {
// docs:start:remove
pub fn remove(self, note: Note) where Note: NoteInterface {
let context = self.context.private.unwrap();
let note_hash = compute_note_hash_for_read_or_nullify(note);
let note_hash = compute_note_hash_for_consumption(note);
let has_been_read = context.read_requests.any(|r: SideEffect| r.value == note_hash);
assert(has_been_read, "Can only remove a note that has been read from the set.");

Expand Down
6 changes: 3 additions & 3 deletions yarn-project/aztec-nr/value-note/src/value_note.nr
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use dep::aztec::{
note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
},
oracle::{
rand::rand,
Expand Down Expand Up @@ -56,7 +56,7 @@ impl NoteInterface for ValueNote {
// docs:start:nullifier

fn compute_nullifier(self, context: &mut PrivateContext) -> Field {
let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(self);
let note_hash_for_nullify = compute_note_hash_for_consumption(self);
let secret = context.request_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand All @@ -69,7 +69,7 @@ impl NoteInterface for ValueNote {
// docs:end:nullifier

fn compute_nullifier_without_context(self) -> Field {
let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(self);
let note_hash_for_nullify = compute_note_hash_for_consumption(self);
let secret = get_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use dep::aztec::{
note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
},
oracle::{
nullifier_key::get_nullifier_secret_key,
Expand Down Expand Up @@ -64,7 +64,7 @@ impl NoteInterface for CardNote {
}

fn compute_nullifier(self, context: &mut PrivateContext) -> Field {
let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(self);
let note_hash_for_nullify = compute_note_hash_for_consumption(self);
let secret = context.request_nullifier_secret_key(self.owner);
pedersen_hash([
note_hash_for_nullify,
Expand All @@ -74,7 +74,7 @@ impl NoteInterface for CardNote {
}

fn compute_nullifier_without_context(self) -> Field {
let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(self);
let note_hash_for_nullify = compute_note_hash_for_consumption(self);
let secret = get_nullifier_secret_key(self.owner);
pedersen_hash([
note_hash_for_nullify,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use dep::aztec::{
note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
},
oracle::{
nullifier_key::get_nullifier_secret_key,
Expand Down Expand Up @@ -81,7 +81,7 @@ impl NoteInterface for EcdsaPublicKeyNote {
}

fn compute_nullifier(self, context: &mut PrivateContext) -> Field {
let unique_siloed_note_hash = compute_note_hash_for_read_or_nullify(self);
let unique_siloed_note_hash = compute_note_hash_for_consumption(self);
let secret = context.request_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand All @@ -92,7 +92,7 @@ impl NoteInterface for EcdsaPublicKeyNote {
}

fn compute_nullifier_without_context(self) -> Field {
let unique_siloed_note_hash = compute_note_hash_for_read_or_nullify(self);
let unique_siloed_note_hash = compute_note_hash_for_consumption(self);
let secret = get_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use dep::aztec::{
note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
},
hash::pedersen_hash,
oracle::{
Expand Down Expand Up @@ -48,7 +48,7 @@ impl Deserialize<PUBLIC_KEY_NOTE_LEN> for PublicKeyNote {
impl NoteInterface for PublicKeyNote {

fn compute_nullifier(self, context: &mut PrivateContext) -> Field {
let unique_siloed_note_hash = compute_note_hash_for_read_or_nullify(self);
let unique_siloed_note_hash = compute_note_hash_for_consumption(self);
let secret = context.request_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand All @@ -59,7 +59,7 @@ impl NoteInterface for PublicKeyNote {
}

fn compute_nullifier_without_context(self) -> Field {
let unique_siloed_note_hash = compute_note_hash_for_read_or_nullify(self);
let unique_siloed_note_hash = compute_note_hash_for_consumption(self);
let secret = get_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ use dep::aztec::note::{
use dep::aztec::note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
};
use crate::types::token_note::TokenNote;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use dep::aztec::{
note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
},
context::PrivateContext,
state_vars::set::Set,
Expand Down Expand Up @@ -61,7 +61,7 @@ impl NoteInterface for TokenNote {

// docs:start:nullifier
fn compute_nullifier(self, context: &mut PrivateContext) -> Field {
let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(self);
let note_hash_for_nullify = compute_note_hash_for_consumption(self);
let secret = context.request_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand All @@ -73,7 +73,7 @@ impl NoteInterface for TokenNote {
// docs:end:nullifier

fn compute_nullifier_without_context(self) -> Field {
let note_hash_for_nullify = compute_note_hash_for_read_or_nullify(self);
let note_hash_for_nullify = compute_note_hash_for_consumption(self);
let secret = get_nullifier_secret_key(self.owner);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use dep::aztec::{
note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
utils::compute_note_hash_for_consumption,
},
hash::{compute_secret_hash, pedersen_hash},
context::PrivateContext,
Expand Down Expand Up @@ -52,8 +52,7 @@ impl NoteInterface for TransparentNote {
}

fn compute_nullifier_without_context(self) -> Field {
// TODO(#1386): should use `compute_note_hash_for_read_or_nullify` once public functions inject nonce!
let siloed_note_hash = compute_note_hash_for_read_or_nullify(self);
let siloed_note_hash = compute_note_hash_for_consumption(self);
// TODO(#1205) Should use a non-zero generator index.
pedersen_hash([self.secret, siloed_note_hash],0)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ use dep::aztec::note::{
};
use dep::aztec::note::{
note_header::NoteHeader,
note_interface::NoteInterface,
utils::compute_note_hash_for_read_or_nullify,
note_interface::NoteInterface
};
use crate::types::token_note::TokenNote;

Expand Down
Loading
Loading