@jharrilim/merkletree-js

JavaScript implementation of a Merkle Tree.

Usage no npm install needed!

<script type="module">
  import jharrilimMerkletreeJs from 'https://cdn.skypack.dev/@jharrilim/merkletree-js';
</script>

README

merkletree-js

NPM Version Issues Pull Requests License Gitter

Merkle Tree for Javascript/Typescript on Node. Currently, browser is not supported. API documentation can be found here.

Build Status Coverage Score Downloads Count
Overall Build Status Codacy Codacy Badge NPM NPM Downloads
Node 8 Node 8 Coveralls Coveralls Github Github Releases
Node 9 Node 9 Codecov Codecov
Node 10 Node 10
Node 11 Node 11

Table of Contents

Install via NPM

npm i @jharrilim/merkletree-js

Usage

Create a Merkle Tree

To create a Merkle Tree, you may do so in one of the following ways:

Without Data

import { MerkleTree } from '@jharrilim/merkletree-js';

// Creates a new instance of the MerkleTree
const newTree = MerkleTree.create();

With Data

You may create a MerkleTree with some data that you already have defined.

import { MerkleTree } from '@jharrilim/merkletree-js';

const data = [ 'some', 'data', { msg: 'of any type', except: 'no nulls, functions, or undefined' }, true ];

(async () => {
    const newTree = await MerkleTree.createWith(data);
})().catch(_ => {});

Add Some Data

To add data, you may use either #addNode to add one thing, or #addNodes to add multiple things.

import { MerkleTree } from '@jharrilim/merkletree-js';

export async function doCoolThings() {
    const newTree = MerkleTree.create();

    await newTree.addNodes(['hello', 'world']);
    await newTree.addNode(42);
}

Compare Data

To make use of the merkle tree, you will want to compare data across multiple trees. You may do so by using MerkleTree#compareWith, or by using MerkleTree#computeRootHash and comparing the hash yourself:

import { MerkleTree } from '@jharrilim/merkletree-js';

export async function compareTrees() {
    const sharedData = ['this', 'is', 'shared', 'data'];
    const firstTree = await MerkleTree.createWith(sharedData);
    const secondTree = await MerkleTree.createWith(sharedData);

    // Does intermediate actions with the hashes
    const attempt1 = await compareAndSave(firstTree, secondTree);

    // Compare directly
    const attempt2 = await firstTree.compareWith(secondTree);

    return attempt1 && attempt2;
}

async function compareAndSave(firstTree, secondTree) {  // This is not price matching

    const firstTreeHash = await firstTree.computeRootHash();
    const secondTreeHash = await secondTree.computeRootHash();
    try {
        // Perhaps do stuff such as
        await SomeMongooseModel.save(firstTreeHash);
        await SomeMongooseModel.save(secondTreeHash);
    } catch (e) {
        uhOhMadeAMistake(e);
        return false;
    }

    return firstTreeHash === secondTreeHash;
}