Wire `BatchNoteTree` into batch & block construction
- 主要语言
- Rust
- 星标
- 132
- 派生
- 167
- 平均合并
- 1 天 23 小时
- 30 天内合并 PR
- 110
描述
## 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)
贡献指南
评估
这个 Issue 还没有评估数据。