<!-- Generated by documentation.js. Update this documentation by updating the source code. -->

### Table of Contents

-   [Trie][1]
    -   [Parameters][2]
    -   [Properties][3]
-   [get][4]
    -   [Parameters][5]
-   [put][6]
    -   [Parameters][7]
-   [del][8]
    -   [Parameters][9]
-   [getRaw][10]
    -   [Parameters][11]
-   [putRaw][12]
    -   [Parameters][13]
-   [delRaw][14]
    -   [Parameters][15]
-   [findPath][16]
    -   [Parameters][17]
-   [\_updateNode][18]
    -   [Parameters][19]
-   [\_saveStack][20]
    -   [Parameters][21]
-   [createReadStream][22]
-   [batch][23]
    -   [Parameters][24]
    -   [Examples][25]
-   [checkRoot][26]
    -   [Parameters][27]
-   [PrioritizedTaskExecutor][28]
    -   [Parameters][29]
    -   [Properties][30]
    -   [execute][31]
        -   [Parameters][32]
-   [checkpoint][33]
-   [commit][34]
    -   [Parameters][35]
-   [revert][36]
    -   [Parameters][37]
-   [Trie.prove][38]
    -   [Parameters][39]
-   [Trie.verifyProof][40]
    -   [Parameters][41]
-   [addHexPrefix][42]
    -   [Parameters][43]
-   [isTerminator][44]
    -   [Parameters][45]
-   [stringToNibbles][46]
    -   [Parameters][47]
-   [nibblesToBuffer][48]
    -   [Parameters][49]
-   [getNodeType][50]
    -   [Parameters][51]
-   [matchingNibbleLength][52]
    -   [Parameters][53]
-   [doKeysMatch][54]
    -   [Parameters][55]
-   [callTogether][56]
-   [asyncFirstSeries][57]
    -   [Parameters][58]
-   [SecureTrie][59]

## Trie

Use `require('merkel-patricia-tree')` for the base interface. In IrChain applications stick with the Secure Trie Overlay `require('merkel-patricia-tree/secure')`. The API for the raw and the secure interface are about the same

### Parameters

-   `db` **[Object][60]?** An instance of [levelup][61] or a compatible API. If the db is `null` or left undefined, then the trie will be stored in memory via [memdown][62]
-   `root` **([Buffer][63] \| [String][64])?** `A hex`String`or`Buffer\` for the root of a previously stored trie

### Properties

-   `root` **[Buffer][63]** The current root of the `trie`
-   `isCheckpoint` **[Boolean][65]** determines if you are saving to a checkpoint or directly to the db
-   `EMPTY_TRIE_ROOT` **[Buffer][63]** the Root for an empty trie

## get

Gets a value given a `key`

### Parameters

-   `key` **([Buffer][63] \| [String][64])** the key to search for
-   `cb` **[Function][66]** A callback `Function` which is given the arguments `err` - for errors that may have occured and `value` - the found value in a `Buffer` or if no value was found `null`

## put

Stores a given `value` at the given `key`

### Parameters

-   `key` **([Buffer][63] \| [String][64])** 
-   `Value` **([Buffer][63] \| [String][64])** 
-   `cb` **[Function][66]** A callback `Function` which is given the argument `err` - for errors that may have occured

## del

deletes a value given a `key`

### Parameters

-   `key` **([Buffer][63] \| [String][64])** 
-   `callback` **[Function][66]** the callback `Function`

## getRaw

Retrieves a raw value in the underlying db

### Parameters

-   `key` **[Buffer][63]** 
-   `callback` **[Function][66]** A callback `Function`, which is given the arguments `err` - for errors that may have occured and `value` - the found value in a `Buffer` or if no value was found `null`.

## putRaw

Writes a value directly to the underlining db

### Parameters

-   `key` **([Buffer][63] \| [String][64])** The key as a `Buffer` or `String`
-   `value` **[Buffer][63]** The value to be stored
-   `callback` **[Function][66]** A callback `Function`, which is given the argument `err` - for errors that may have occured

## delRaw

Removes a raw value in the underlying db

### Parameters

-   `key` **([Buffer][63] \| [String][64])** 
-   `callback` **[Function][66]** A callback `Function`, which is given the argument `err` - for errors that may have occured

## findPath

Trys to find a path to the node for the given key
It returns a `stack` of nodes to the closet node

### Parameters

-   `null-null` **([String][64] \| [Buffer][63])** key - the search key
-   `null-null` **[Function][66]** cb - the callback function. Its is given the following
    arguments-   err - any errors encontered
    -   node - the last node found
    -   keyRemainder - the remaining key nibbles not accounted for
    -   stack - an array of nodes that forms the path to node we are searching for

## \_updateNode

Updates a node

### Parameters

-   `key` **[Buffer][63]** 
-   `value` **([Buffer][63] \| [String][64])** 
-   `keyRemainder` **[Array][67]** 
-   `stack` **[Array][67]** \-
-   `cb` **[Function][66]** the callback

## \_saveStack

saves a stack

### Parameters

-   `key` **[Array][67]** the key. Should follow the stack
-   `stack` **[Array][67]** a stack of nodes to the value given by the key
-   `opStack` **[Array][67]** a stack of levelup operations to commit at the end of this funciton
-   `cb` **[Function][66]** 

## createReadStream

The `data` event is given an `Object` hat has two properties; the `key` and the `value`. Both should be Buffers.

Returns **[stream.Readable][68]** Returns a [stream][69] of the contents of the `trie`

## batch

The given hash of operations (key additions or deletions) are executed on the DB

### Parameters

-   `ops` **[Array][67]** 
-   `cb` **[Function][66]** 

### Examples

```javascript
var ops = [
   { type: 'del', key: 'father' }
 , { type: 'put', key: 'name', value: 'Yuri Irsenovich Kim' }
 , { type: 'put', key: 'dob', value: '16 February 1941' }
 , { type: 'put', key: 'spouse', value: 'Kim Young-sook' }
 , { type: 'put', key: 'occupation', value: 'Clown' }
]
trie.batch(ops)
```

## checkRoot

Checks if a given root exists

### Parameters

-   `root` **[Buffer][63]** 
-   `cb` **[Function][66]** 

## PrioritizedTaskExecutor

Executes tasks up to maxPoolSize at a time, other items are put in a priority queue.

### Parameters

-   `maxPoolSize` **[Number][70]** The maximum size of the pool

### Properties

-   `maxPoolSize` **[Number][70]** The maximum size of the pool
-   `currentPoolSize` **[Number][70]** The current size of the pool
-   `queue` **[Array][67]** The task queue

### execute

Executes the task.

#### Parameters

-   `priority` **[Number][70]** The priority of the task
-   `task` **[Function][66]** The function that accepts the callback, which must be called upon the task completion.

## checkpoint

Creates a checkpoint that can later be reverted to or committed. After this is called, no changes to the trie will be permanently saved until `commit` is called

## commit

commits a checkpoint to disk

### Parameters

-   `cb` **[Function][66]** the callback

## revert

Reverts the trie to the state it was at when `checkpoint` was first called.

### Parameters

-   `cb` **[Function][66]** the callback

## Trie.prove

Returns a merkle proof for a given key

### Parameters

-   `trie` **[Trie][71]** 
-   `key` **[String][64]** 
-   `cb` **[Function][66]** A callback `Function` (arguments {Error} `err`, {Array.<TrieNode>} `proof`)

## Trie.verifyProof

Verifies a merkle proof for a given key

### Parameters

-   `rootHash` **[Buffer][63]** 
-   `key` **[String][64]** 
-   `proof` **[Array][67]&lt;TrieNode>** 
-   `cb` **[Function][66]** A callback `Function` (arguments {Error} `err`, {String} `val`)

## addHexPrefix

### Parameters

-   `key`  
-   `terminator`  
-   `dataArr` **[Array][67]** 

Returns **[Buffer][63]** returns buffer of encoded data
hexPrefix
\*

## isTerminator

Determines if a key has Arnold Schwarzenegger in it.

### Parameters

-   `key` **[Array][67]** an hexprefixed array of nibbles

## stringToNibbles

Converts a string OR a buffer to a nibble array.

### Parameters

-   `key` **([Buffer][63] \| [String][64])** 

## nibblesToBuffer

Converts a nibble array into a buffer.

### Parameters

-   `arr`  

## getNodeType

Determines the node type.

### Parameters

-   `node`  

Returns **[String][64]** the node type-   leaf - if the node is a leaf
-   branch - if the node is a branch
-   extention - if the node is an extention
-   unknown - if something else got borked

## matchingNibbleLength

Returns the number of in order matching nibbles of two give nibble arrayes

### Parameters

-   `nib1` **[Array][67]** 
-   `nib2` **[Array][67]** 

## doKeysMatch

Compare two 'nibble array' keys

### Parameters

-   `keyA`  
-   `keyB`  

## callTogether

Take two or more functions and returns a function  that will execute all of
the given functions

## asyncFirstSeries

Take a collection of async fns, call the cb on the first to return a truthy value.
If all run without a truthy result, return undefined

### Parameters

-   `array`  
-   `iterator`  
-   `cb`  

## SecureTrie

**Extends Trie**

You can create a secure Trie where the keys are automatically hashed using **SHA3** by using `require('icjs-mpt/secure')`. It has the same methods and constuctor as `Trie`

[1]: #trie

[2]: #parameters

[3]: #properties

[4]: #get

[5]: #parameters-1

[6]: #put

[7]: #parameters-2

[8]: #del

[9]: #parameters-3

[10]: #getraw

[11]: #parameters-4

[12]: #putraw

[13]: #parameters-5

[14]: #delraw

[15]: #parameters-6

[16]: #findpath

[17]: #parameters-7

[18]: #_updatenode

[19]: #parameters-8

[20]: #_savestack

[21]: #parameters-9

[22]: #createreadstream

[23]: #batch

[24]: #parameters-10

[25]: #examples

[26]: #checkroot

[27]: #parameters-11

[28]: #prioritizedtaskexecutor

[29]: #parameters-12

[30]: #properties-1

[31]: #execute

[32]: #parameters-13

[33]: #checkpoint

[34]: #commit

[35]: #parameters-14

[36]: #revert

[37]: #parameters-15

[38]: #trieprove

[39]: #parameters-16

[40]: #trieverifyproof

[41]: #parameters-17

[42]: #addhexprefix

[43]: #parameters-18

[44]: #isterminator

[45]: #parameters-19

[46]: #stringtonibbles

[47]: #parameters-20

[48]: #nibblestobuffer

[49]: #parameters-21

[50]: #getnodetype

[51]: #parameters-22

[52]: #matchingnibblelength

[53]: #parameters-23

[54]: #dokeysmatch

[55]: #parameters-24

[56]: #calltogether

[57]: #asyncfirstseries

[58]: #parameters-25

[59]: #securetrie

[60]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object

[61]: https://github.com/rvagg/node-levelup/

[62]: https://github.com/rvagg/memdown

[63]: https://nodejs.org/api/buffer.html

[64]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String

[65]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean

[66]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function

[67]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array

[68]: https://nodejs.org/api/stream.html#stream_class_stream_readable

[69]: https://nodejs.org/dist/latest-v5.x/docs/api/stream.html#stream_class_stream_readable

[70]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number

[71]: #trie
