# bm ![Crates.io](https://img.shields.io/crates/v/bm.svg) ![Docs](https://docs.rs/bm/badge.svg) Binary merkle tree implementation with support of merkleization, de-merkliezation and in-place tree modification. * SimpleSerialize (ssz) compliant. * Garbage collection support. ## Concepts We distingish `Intermediate` values and `End` values so that implementations can better handle preimage attacks. * `Intermediate`: a node that has two direct children `left` and `right`. * `End`: a node without any child. ## Backend The library `bm` provides two basic backends: * `InMemoryBackend`: a backend that stores all merkle nodes in-memory. * `NoopBackend`: dummy backend that discards any `set` operation, and return error on any `get` operation. This is useful if you're interested in the merkle root but does not actually need the merkle tree. ## In-place Tree Modification You can use `bm` library for in-place tree modification. To use the ssz compliant variant, choose `new_with_inherited_empty` when creating the backend and set `List`, `PackedList`'s maximum length to an approriate value. * `Raw`: Raw binary merkle tree that allows directly operating on generalized merkle index. * `List`: Variable-sized vector list. * `Vector`: Fixed-sized tuple list. * `PackedList`: Packed variable-sized vector list. * `PackedVector`: Packed fixed-sized tuple list. ## Merkleization You can use `bm-le` library for merkleization. It is ssz compatibile and with some extensions to make it work better in certain environments. If you're only interested in the merkle root, use `tree_root` function. Otherwise, use `IntoTree` trait. In order to merkleize vectors and lists, use `FixedVec` and `VariableVec` wrapper type. To merkleize bitvectors and bitlists, use `FixedVec` and `VariableVec`. ## Demerkleization Because some information are not available on type (like vector's length, and vector and list's maximum length), we use three traits for demerkleization support -- `FromTree`, `FromListTree` and `FromVectorTree`. ## Basic Usage See `tests/ssz.rs` for basic usage examples.