Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### Breaking Changes

* [BREAKING][param][rust] `NodeRpcClient::get_nullifier_commit_heights` takes an explicit `block_to` upper bound instead of resolving the chain tip itself. The block range decides how many pages `sync_nullifiers` walks, and the caller is the one that knows how far it can act on an answer; the default implementation is now a single `sync_nullifiers` call.
* [BREAKING][behavior][rust] Foreign `AccountInputs` keep a fetched asset list only when it hashes to the account header's vault root; otherwise (omitted because unchanged, capped as oversize, or malformed) they carry a root-only partial vault, and any assets the foreign code reads are resolved during execution as per-asset witnesses — everything local first (the store's per-asset reads, then the full local vault), falling back to fetching the vault via RPC at the transaction reference block and verifying it against the required root ([#2417](https://github.com/0xMiden/rust-sdk/pull/2417)).
* [BREAKING][behavior][rust] Foreign `AccountInputs` likewise keep a fetched storage-map entry list only when it hashes to the slot's root in the storage header; otherwise (capped as oversize, or malformed) the map is carried root-only and any keys the foreign code reads are resolved during execution as lazy per-key witnesses, instead of syncing an oversized map's full history from genesis before executing ([#2417](https://github.com/0xMiden/rust-sdk/pull/2417)).
* [BREAKING][arch][store] The account SMT forest now persists in SQLite (new `forest_trees`, `forest_entries`, `forest_subtrees` and `forest_revision` tables) through a `LargeSmtForest` backend scoped to the store's own transaction, so forest mutations commit or roll back atomically with the account tables and opening the store no longer rebuilds the forest from account data. Tree inner nodes are persisted as packed subtree blobs, so witness reads load a single leaf plus eight blobs instead of rebuilding the account's tree, making their cost independent of the account's map size at the price of a larger store file. Tree updates are computed path-locally from the persisted leaves and subtree blobs, so committed update cost scales with the size of the change set rather than with the map size. Existing stores are not compatible and must be recreated ([#2333](https://github.com/0xMiden/rust-sdk/pull/2333)).
Expand Down Expand Up @@ -31,6 +32,7 @@

### Enhancements

* [FEATURE][rust] `Client::sync_state` now fetches from the Note Transport Layer and from the node concurrently instead of one after the other, and that includes the note import's own network work: the commitment scan, the authentication data for each commitment block, and the nullifier state of the notes it settles are all fetched inside the concurrent phase. What is left afterwards writes to the store and does not fetch. The chain update is written first and the note import second, so a failure on either side leaves the store untouched, and a private note delivered over the transport settles in the same call even when it was committed inside that sync's own window.
* [FEATURE][rust] A client that only watches a public account now recovers notes the account consumed authenticated, even when it never tracked them by tag. During sync it reads the note references the node attaches to the account's transactions, fetches each note body by id, and surfaces it through `InputNoteReader`. Requires node `0.15.1` ([#2300](https://github.com/0xMiden/rust-sdk/pull/2300)).
* [FEATURE][cli] Added a `--payback-note-type` option to `swap` so the payback note can be created as public or private (defaults to private). Public payback works without any off-band advice now that SWAP derives the payback recipient deterministically ([#2190](https://github.com/0xMiden/rust-sdk/pull/2190)).
* [FEATURE][cli] `init` now also writes the non-fungible faucet, guarded multisig auth and network account auth component packages ([#2356](https://github.com/0xMiden/rust-sdk/pull/2356)).
Expand All @@ -48,6 +50,7 @@

### Fixes

* [FIX][rust] Notes imported from their details — the path the Note Transport Layer uses — are now checked against the chain's nullifiers and recorded as consumed when they were already spent, instead of staying committed and being offered as consumable forever. This reaches history the chain sync structurally cannot: its nullifier search only looks above the client's checkpoint, while a commitment can be discovered arbitrarily far below it. The search runs from the earliest block a note in the batch was actually committed in — a note that is not committed cannot have been spent, and a spend cannot precede its commitment — which keeps the block range the node pages through as tight as the answer allows. The transport also hands the import the note header's metadata, so an expected note has a nullifier and can be consumed locally without waiting to recover it from the chain. Spends above the client's sync height are left to the chain sync, which can also attribute the consuming account. Notes already stuck in the store are only repaired if the transport delivers them again ([#2422](https://github.com/0xMiden/rust-sdk/issues/2422)).
* [FIX][rust] Foreign procedure invocation against a tracked public account with a non-empty vault no longer fails with `ERR_FOREIGN_ACCOUNT_INVALID_COMMITMENT`. The client requests the foreign vault conditionally on its local vault root, and the node's omitted asset list — indistinguishable from an empty vault — was rebuilt into an empty vault and a wrong account commitment. Reconstruction now keeps an asset list only when it hashes to the header's vault root, degrading to a root-only vault served by lazy per-asset witnesses otherwise ([#2417](https://github.com/0xMiden/rust-sdk/pull/2417)).
* [FIX][rust] The lazy storage-map witness fetch is now anchored at the transaction reference block instead of the chain tip, so a foreign procedure reading a storage map of an account updated after the caller's last sync no longer fails merkle verification inside the VM. A proof that still verifies against a different root than the executor requires is rejected with an error naming both roots ([#2417](https://github.com/0xMiden/rust-sdk/pull/2417)).
* [FIX][cli] `miden-client init` now reports invalid remote prover endpoints instead of silently writing a local-prover config ([#2376](https://github.com/0xMiden/rust-sdk/pull/2376)).
Expand Down
Loading