
* feat(smt): impl constructing leaves that don't yet exist This commit implements 'prospective leaf construction' -- computing sparse Merkle tree leaves for a key-value insertion without actually performing that insertion. For SimpleSmt, this is trivial, since the leaf type is simply the value being inserted. For the full Smt, the new leaf payload depends on the existing payload in that leaf. Since almost all leaves are very small, we can just clone the leaf and modify a copy. This will allow us to perform more general prospective changes on Merkle trees. * feat(smt): export get_value() in the trait * feat(smt): implement generic prospective insertions This commit adds two methods to SparseMerkleTree: compute_mutations() and apply_mutations(), which respectively create and consume a new MutationSet type. This type represents as set of changes to a SparseMerkleTree that haven't happened yet, and can be queried on to ensure a set of insertions result in the correct tree root before finalizing and committing the mutation. This is a direct step towards issue 222, and will directly enable removing Merkle tree clones in miden-node InnerState::apply_block(). As part of this change, SparseMerkleTree now requires its Key to be Ord and its Leaf to be Clone (both bounds which were already met by existing implementations). The Ord bound could instead be changed to Eq + Hash, if MutationSet were changed to use a HashMap instead of a BTreeMap. * chore(smt): refactor empty node construction to helper function
4.9 KiB
4.9 KiB
0.11.0 (TBD)
- [BREAKING]: renamed
Mmr::open()
intoMmr::open_at()
andMmr::peaks()
intoMmr::peaks_at()
(#234). - Added
Mmr::open()
andMmr::peaks()
which rely onMmr::open_at()
andMmr::peaks()
respectively (#234). - Standardised CI and Makefile across Miden repos (#323).
- Added
Smt::compute_mutations()
andSmt::apply_mutations()
for validation-checked insertions (#327).
0.10.0 (2024-08-06)
- Added more
RpoDigest
andRpxDigest
conversions (#311). - [BREAKING] Migrated to Winterfell v0.9 (#315).
- Fixed encoding of Falcon secret key (#319).
0.9.3 (2024-04-24)
- Added
RpxRandomCoin
struct (#307).
0.9.2 (2024-04-21)
- Implemented serialization for the
Smt
struct (#304). - Fixed a bug in Falcon signature generation (#305).
0.9.1 (2024-04-02)
- Added
num_leaves()
method toSimpleSmt
(#302).
0.9.0 (2024-03-24)
- [BREAKING] Removed deprecated re-exports from liballoc/libstd (#290).
- [BREAKING] Refactored RpoFalcon512 signature to work with pure Rust (#285).
- [BREAKING] Added
RngCore
as supertrait forFeltRng
(#299).
0.8.4 (2024-03-17)
- Re-added unintentionally removed re-exported liballoc macros (
vec
andformat
macros).
0.8.3 (2024-03-17)
- Re-added unintentionally removed re-exported liballoc macros (#292).
0.8.2 (2024-03-17)
- Updated
no-std
approach to be in sync with winterfell v0.8.3 release (#290).
0.8.1 (2024-02-21)
- Fixed clippy warnings (#280)
0.8.0 (2024-02-14)
- Implemented the
PartialMmr
data structure (#195). - Implemented RPX hash function (#201).
- Added
FeltRng
andRpoRandomCoin
(#237). - Accelerated RPO/RPX hash functions using AVX512 instructions (#234).
- Added
inner_nodes()
method toPartialMmr
(#238). - Improved
PartialMmr::apply_delta()
(#242). - Refactored
SimpleSmt
struct (#245). - Replaced
TieredSmt
struct withSmt
struct (#254, #277). - Updated Winterfell dependency to v0.8 (#275).
0.7.1 (2023-10-10)
- Fixed RPO Falcon signature build on Windows.
0.7.0 (2023-10-05)
- Replaced
MerklePathSet
withPartialMerkleTree
(#165). - Implemented clearing of nodes in
TieredSmt
(#173). - Added ability to generate inclusion proofs for
TieredSmt
(#174). - Implemented Falcon DSA (#179).
- Added conditional `serde`` support for various structs (#180).
- Implemented benchmarking for
TieredSmt
(#182). - Added more leaf traversal methods for
MerkleStore
(#185). - Added SVE acceleration for RPO hash function (#189).
0.6.0 (2023-06-25)
- [BREAKING] Added support for recording capabilities for
MerkleStore
(#162). - [BREAKING] Refactored Merkle struct APIs to use
RpoDigest
instead ofWord
(#157). - Added initial implementation of
PartialMerkleTree
(#156).
0.5.0 (2023-05-26)
- Implemented
TieredSmt
(#152, #153). - Implemented ability to extract a subset of a
MerkleStore
(#151). - Cleaned up
SimpleSmt
interface (#149). - Decoupled hashing and padding of peaks in
Mmr
(#148). - Added
inner_nodes()
toMerkleStore
(#146).
0.4.0 (2023-04-21)
- Exported
MmrProof
from the crate (#137). - Allowed merging of leaves in
MerkleStore
(#138). - [BREAKING] Refactored how existing data structures are added to
MerkleStore
(#139).
0.3.0 (2023-04-08)
- Added
depth
parameter to SMT constructors inMerkleStore
(#115). - Optimized MMR peak hashing for Miden VM (#120).
- Added
get_leaf_depth
method toMerkleStore
(#119). - Added inner node iterators to
MerkleTree
,SimpleSmt
, andMmr
(#117, #118, #121).
0.2.0 (2023-03-24)
- Implemented
Mmr
and related structs (#67). - Implemented
MerkleStore
(#93, #94, #95, #107 #112). - Added benchmarks for
MerkleStore
vs. other structs (#97). - Added Merkle path containers (#99).
- Fixed depth handling in
MerklePathSet
(#110). - Updated Winterfell dependency to v0.6.
0.1.4 (2023-02-22)
- Re-export winter-crypto Hasher, Digest & ElementHasher (#72)
0.1.3 (2023-02-20)
- Updated Winterfell dependency to v0.5.1 (#68)
0.1.2 (2023-02-17)
- Fixed
Rpo256::hash
pad that was panicking on input (#44) - Added
MerklePath
wrapper to encapsulate Merkle opening verification and root computation (#53) - Added
NodeIndex
Merkle wrapper to encapsulate Merkle tree traversal and mappings (#54)
0.1.1 (2023-02-06)
- Introduced
merge_in_domain
for the RPO hash function, to allow using a specified domain value in the second capacity register when hashing two digests together. - Added a simple sparse Merkle tree implementation.
- Added re-exports of Winterfell RandomCoin and RandomCoinError.
0.1.0 (2022-12-02)
- Initial release on crates.io containing the cryptographic primitives used in Miden VM and the Miden Rollup.
- Hash module with the BLAKE3 and Rescue Prime Optimized hash functions.
- BLAKE3 is implemented with 256-bit, 192-bit, or 160-bit output.
- RPO is implemented with 256-bit output.
- Merkle module, with a set of data structures related to Merkle trees, implemented using the RPO hash function.