0xMiden / 0xMiden/protocol

Wire `BatchNoteTree` into batch & block construction

Aberta
#3,020 0 comentários 1 reação 1 responsável Reivindicada por @mmagician Ver no GitHub
Linguagem predominante
Rust
Estrelas
132
Forks
167
Merge médio
1d 23h
PRs com merge (30d)
110

Descrição

## 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)

Guia de contribuição

Abrir o guia de contribuição

Avaliação

Esta issue ainda não foi avaliada.

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.