---
# System prepended metadata

title: Hash-Based Commitment Lib API Reference Doc

---

# Hash-Based Commitment Lib API Reference Doc

## MerkleTree
**MerkleTree**(hash_function: callable, automake: bool = True, number_vectors_to_commit: int, aggregate_leafs: (bool, List[type] List[callable]) = , fixed_depth: (bool, bool, int), prefilled: bool, default_vector: List[AnyImmutable], verify_transition: Callable)

## MerkleMountainRange

**MerkleMountainRange**(hash_function: callable, automake: bool, aggregate_leafs: (bool, List[type] List[callable]), verify_transition: Callable)

## HashChain

**HashChain**(hash_function: callable, automake: bool, aggregate_leafs: (bool, List[type] List[callable]), verify_transition: List[Callable], rehash: bool = True)

### Parameters

**hash_function**: hash function used by the Merkle Tree

**automake**: Compute the Merkle Tree at every commitment

**number_vectors_to_commit**: provides the numbers of children to commit

**aggregate_leafs**: Assuming same vector format at every leafs, commit children and the added value point-wise of the children. 
* First parameter give True/False if the user needs the option.
* Second parameter gives the expected variable type at every position. 
* Third parameter gives the function to compute the children values on.

**verify_transition**: Checks that the transition from previous vector and new vector is correct according to defined rules

### Merkle Tree Specific parameters

**fixed_depth**: Gives the ability to define a dynamic or fixed sized tree.
* First parameter give True/False if the user wants a fixed size
* Second parameter gives the right to increase/decrease the size later
* Third parameter gives the depth if the Tree is of fixed size

**prefilled**: Gives the ability to define a tree is prefilled with a default vector

**default_vector**: Provides for a prefilled tree the default vector. It can be a singleton or an Iterable of Immutables variables.

### HashChain Specific Methods

**rehash**: If the hash function allows and flag at False, does incremental commitment instead of rehashing

#### Nota Bene 

* All Peaks Are Merkle Tree objects
* Could be implemented:
> SpeaksCommitmentStrategy: An optimization to consider is to commit to both a Tree depending on the number of peaks: A chainhash, a merkle tree or a mix of the two
>

---

### Method

add(commitment: List[Hashable]) -> add a leaf and turn isReady to False

addAtIndex(commitment: List[Hashable], index: int) -> add a leaf at specific index and turn isReady to False

update(commitment: List[Hashable], index: int) -> modify a leaf and turn isReady to False

remove(index: int) -> burn a leaf and goes to default vector and turn isReady to False

size -> number of leafs

reset() -> empty a tree and turn isReady to False

resetSubTree(depth: int, index: int) -> empty a subtree at depth and index and turn isReady to False

make() -> compute tree and turn isReady to True

isReady -> Bool: MerkleTree has been constructed

root -> get Merkle Root. Raise Error if not make()

getPath(index: int) -> provide Path to root

getBatchPaths(indexes: List[int]) -> provide path to root

verifyPath(index: int, path: List[Hashable]) -> check path to root

batchVerifyPaths(indexes: List[int], paths: List[List[Hashable]])-> verify multiple paths at the same time

decommit(index: int) -> returns the committed vector

batchDecommit(indexes: List[int]) -> returns a batch of committed vectors

extractNode(depth: int, index: int) -> Get a specific node from the tree. Return an object from the same class than the parent

display() -> Displey a representation of the tree

serialize() -> Store an object

unserialize() -> Load an object

### Merkle Tree Specific Methods

**expand**(new_depth:int) -> turn a Merkle Tree into a subtree of a default vector filled tree

**convertToMerkleMountainRange**() -> turn a Merkle Tree into a Merkle Mountain Range

**convertToHashChain**() -> turn a Merkle Tree into a HashChain

### Merkle Mountain Range Specific Methods

**extractPeaks**() -> output peak

**convertToMerkleTree**(default_vector: List[AnyImmutable]) -> turn a Merkle Mountain range into a Merkle Tree

**convertToHashChain**() -> turn a Merkle Tree into a HashChain

### HashChain Specific Methods

**convertToMerkleTree**(default_vector: List[AnyImmutable]) -> turn a HashChain into a Merkle Tree

**convertToMerkleMountainRange**() -> turn a HashChain into a Merkle Mountain Range

### Helpers

**concat**(trees: List[MerkleTreesObjects]) -> Turn a list of Merkle Tree into a MerkleTree

---

## Bonus - Efficient Secret Storage

### *Elkrem*

**Elkrem**(hash_function: callable, entropy: AnyImmutable = secret.token_bytes(32), depth: int = 32)

### *HashChain*

**Elkrem**(hash_function: callable, entropy: AnyImmutable = secret.token_bytes(32), lenght: int = 2000, checkpoint: int)

#### Parameters

**entropy**: provides the seed

**depth**: defined the max number of secrets as 2^depth

#### Methods

**getNewSecret**(): provides a new secret

**getSecretAtIndex**(index: int): provides the secret at corresponding index

**getBatchSecretxAtIndex**(indexes: List[int]): provides the secret at corresponding index

**addSecret**(secret: Union(int,str,bytes)): accumulate a new value into storage

**compressSecrets**(secrets: List[Union(int,str,bytes)]): Assuming correct sequentionality of secret, returns the values to store to recover the secrets

**retrieveSecret**(seed: Union(int,str,bytes), index: int): returns the secret at corresponding index

---