Documentation
# 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<bool>` and `VariableVec<bool>`.

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