Skip to content

Wire BatchNoteTree into batch & block construction #3020

Description

@mmagician

Background / motivation

  • The batch kernel should output the root of a BatchNoteTree built over the batch's output notes,
  • The block kernel then aggregates the per-batch BatchNoteTrees into a single BlockNoteTree,

Before the kernel can output (and later verify) BATCH_NOTE_TREE_ROOT in MASM, the Rust side must actually construct the BatchNoteTree during batch construction.

Batch

What already exists:

  • BatchNoteTree is a wrapper over SimpleSmt<BATCH_NOTE_TREE_DEPTH>. It is built via BatchNoteTree::with_contiguous_leaves, which packs note IDs at contiguous leaf indices starting at 0; each leaf value is the note ID (hash(note_details_commitment || note_metadata_commitment)).

The gap:

  • BatchNoteTree is never constructed during batch building. ProposedBatch::new -> new_batch_inner uses NoteTracker to compute and erase output notes, then stores them only as a flat Vec<OutputNote> exposed via ProposedBatch::output_notes(). No BatchNoteTree and no batch-note-tree root is computed or stored on ProposedBatch.

Proposed change:

  • Construct the BatchNoteTree during batch construction. In ProposedBatch::new_batch_inner, after the NoteTracker finalizes and the final (non-erased) output_notes: Vec<OutputNote> is computed, build a BatchNoteTree from those output notes' headers and store it on ProposedBatch. Add an accessor (e.g. batch_note_tree()) and include it in into_parts.

Block

What already exists:

  • BlockNoteTree::insert_batch_note_subtree(batch_idx, batch_note_tree): inserts a BatchNoteTree as a subtree of the BlockNoteTree (depth 16) at batch_idx via SimpleSmt::set_subtree.

The gap:

  • The above BlockNoteTree::insert_batch_note_subtree is never used. At the block level, ProposedBlock currently rebuilds the whole note tree from individual notes, and so the per-batch trees are not used; OutputNoteBatch (= Vec<(usize, OutputNote)>) is the per-batch note list it keeps.

Proposed change:

  • Build the BlockNoteTree by inserting each batch's BatchNoteTree as a subtree via BlockNoteTree::insert_batch_note_subtree(batch_idx, batch_note_tree), instead of rebuilding it note-by-note
  • Remove block-level note erasure: stop erasing output notes across batches. The NoteTracker is still needed at the block level for duplicate detection, unauthenticated-note authentication, and the circular-dependency check, but it must no longer erase output notes (otherwise the per-batch BatchNoteTree roots would no longer match).

References

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Fields

Priority

Low

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions