0xMiden / 0xMiden/protocol

Wire `BatchNoteTree` into batch & block construction

Đang mở
#3,020 0 bình luận 1 reaction 1 người được giao Được @mmagician nhận Xem trên GitHub
Ngôn ngữ chính
Rust
Star
132
Fork
167
Merge trung bình
1 ngày 23 giờ
Pull request đã merge (30 ngày)
110

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.