0xMiden / 0xMiden/protocol

Wire `BatchNoteTree` into batch & block construction

Abierto
#3,020 0 comentarios 1 reacción 1 asignado Reclamado por @mmagician Ver en GitHub
Lenguaje dominante
Rust
Estrellas
132
Forks
167
Merge medio
1 d 23 h
PR fusionados (30 d)
110

Descripción

## 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 `BatchNoteTree`s 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`. 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` 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` 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

- PR #2904 (batch kernel skeleton)
- PR #2905 (batch kernel wiring)
- Discussion [#3008](https://github.com/0xMiden/protocol/discussions/3008)

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.