From bd56c75d0db83bc0f3b68e1914ec1b8dd0547546 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Thu, 20 Jul 2017 01:04:44 -0700 Subject: [PATCH] merkle: refactor loops. --- lib/crypto/merkle.js | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/crypto/merkle.js b/lib/crypto/merkle.js index c54245a3..36ef202e 100644 --- a/lib/crypto/merkle.js +++ b/lib/crypto/merkle.js @@ -24,13 +24,14 @@ exports.createTree = function createTree(leaves) { let nodes = leaves; let size = leaves.length; let malleated = false; + let i = 0; if (size === 0) { nodes.push(Buffer.alloc(32)); return [nodes, malleated]; } - for (let i = 0; size > 1; size = (size + 1) >>> 1) { + while (size > 1) { for (let j = 0; j < size; j += 2) { let k = Math.min(j + 1, size - 1); let left = nodes[i + j]; @@ -47,6 +48,8 @@ exports.createTree = function createTree(leaves) { nodes.push(hash); } i += size; + size += 1; + size >>>= 1; } return [nodes, malleated]; @@ -65,7 +68,7 @@ exports.createRoot = function createRoot(leaves) { }; /** - * Collect a merkle branch at vector index. + * Collect a merkle branch from vector index. * @param {Number} index * @param {Buffer[]} leaves * @returns {Buffer[]} branch @@ -75,33 +78,36 @@ exports.createBranch = function createBranch(index, leaves) { let size = leaves.length; let [nodes] = exports.createTree(leaves); let branch = []; + let i = 0; - for (let i = 0; size > 1; size = (size + 1) >>> 1) { + while (size > 1) { let j = Math.min(index ^ 1, size - 1); branch.push(nodes[i + j]); index >>>= 1; i += size; + size += 1; + size >>>= 1; } return branch; }; /** - * Check a merkle branch at vector index. + * Derive merkle root from branch. * @param {Buffer} hash * @param {Buffer[]} branch * @param {Number} index - * @returns {Buffer} Hash. + * @returns {Buffer} root */ -exports.verifyBranch = function verifyBranch(hash, branch, index) { +exports.deriveRoot = function deriveRoot(hash, branch, index) { let root = hash; - for (let otherside of branch) { + for (let hash of branch) { if (index & 1) - root = digest.root256(otherside, root); + root = digest.root256(hash, root); else - root = digest.root256(root, otherside); + root = digest.root256(root, hash); index >>>= 1; }