merkle: refactor loops.

This commit is contained in:
Christopher Jeffrey 2017-07-20 01:04:44 -07:00
parent a4a16f6ec0
commit bd56c75d0d
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD

View File

@ -24,13 +24,14 @@ exports.createTree = function createTree(leaves) {
let nodes = leaves; let nodes = leaves;
let size = leaves.length; let size = leaves.length;
let malleated = false; let malleated = false;
let i = 0;
if (size === 0) { if (size === 0) {
nodes.push(Buffer.alloc(32)); nodes.push(Buffer.alloc(32));
return [nodes, malleated]; return [nodes, malleated];
} }
for (let i = 0; size > 1; size = (size + 1) >>> 1) { while (size > 1) {
for (let j = 0; j < size; j += 2) { for (let j = 0; j < size; j += 2) {
let k = Math.min(j + 1, size - 1); let k = Math.min(j + 1, size - 1);
let left = nodes[i + j]; let left = nodes[i + j];
@ -47,6 +48,8 @@ exports.createTree = function createTree(leaves) {
nodes.push(hash); nodes.push(hash);
} }
i += size; i += size;
size += 1;
size >>>= 1;
} }
return [nodes, malleated]; 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 {Number} index
* @param {Buffer[]} leaves * @param {Buffer[]} leaves
* @returns {Buffer[]} branch * @returns {Buffer[]} branch
@ -75,33 +78,36 @@ exports.createBranch = function createBranch(index, leaves) {
let size = leaves.length; let size = leaves.length;
let [nodes] = exports.createTree(leaves); let [nodes] = exports.createTree(leaves);
let branch = []; 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); let j = Math.min(index ^ 1, size - 1);
branch.push(nodes[i + j]); branch.push(nodes[i + j]);
index >>>= 1; index >>>= 1;
i += size; i += size;
size += 1;
size >>>= 1;
} }
return branch; return branch;
}; };
/** /**
* Check a merkle branch at vector index. * Derive merkle root from branch.
* @param {Buffer} hash * @param {Buffer} hash
* @param {Buffer[]} branch * @param {Buffer[]} branch
* @param {Number} index * @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; let root = hash;
for (let otherside of branch) { for (let hash of branch) {
if (index & 1) if (index & 1)
root = digest.root256(otherside, root); root = digest.root256(hash, root);
else else
root = digest.root256(root, otherside); root = digest.root256(root, hash);
index >>>= 1; index >>>= 1;
} }