Created
September 15, 2017 01:46
-
-
Save ChrisCates/a252ba60d6aa1d6e8a0477e105e0a728 to your computer and use it in GitHub Desktop.
Basic Merkle Tree Implementation in Node.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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