Skip to content

Instantly share code, notes, and snippets.

@ChrisCates
Created September 15, 2017 01:46
Show Gist options
  • Save ChrisCates/a252ba60d6aa1d6e8a0477e105e0a728 to your computer and use it in GitHub Desktop.
Save ChrisCates/a252ba60d6aa1d6e8a0477e105e0a728 to your computer and use it in GitHub Desktop.
Basic Merkle Tree Implementation in Node.js
const crypto = require('crypto');
class MerkleTree {
constructor(value, depth, width) {
this.depth = depth;
this.width = width;
let nodes = depth * width;
let valueLength = Math.ceil(value.length / nodes);
let valueArray = this.generateArray(value, valueLength);
this.graph = this.generateMerkleTree(valueArray);
}
generateArray(value, valueLength) {
var valueArray = [];
for (var i = 0; i < value.length; i = i + valueLength) {
if (i + valueLength < value.length) {
valueArray.push(value.substring(i, i + valueLength));
} else {
valueArray.push(value.substring(i, value.length));
}
}
return valueArray;
}
generateMerkleTree(valueArray) {
this.merkleTree = [];
valueArray.forEach((item, index) => {
let merkleIndex = index % this.width;
if (!this.merkleTree[merkleIndex]) {
this.merkleTree[merkleIndex] = [];
}
let merkleDepth = this.merkleTree[merkleIndex].length;
var concatHash = "";
this.merkleTree[merkleIndex].forEach((previousHash, index2) => {
crypto.createHash('sha256').update(concatHash + previousHash, 'utf8').digest()
});
this.merkleTree[merkleIndex][merkleDepth] = crypto.createHash('sha256').update(concatHash + item, 'utf8').digest().toString();
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment