Skip to content

Commit

Permalink
fix: improve for loop in as-sha256 executeHashComputations
Browse files Browse the repository at this point in the history
  • Loading branch information
twoeths committed May 28, 2024
1 parent bc3eef8 commit 17b8da3
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 30 deletions.
125 changes: 96 additions & 29 deletions packages/persistent-merkle-tree/src/hasher/as-sha256.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {digest2Bytes32, digest64HashObjects, HashObject, batchHash4HashObjectInputs} from "@chainsafe/as-sha256";
import type {Hasher} from "./types";
import {HashComputation} from "../node";
import {HashComputation, Node} from "../node";

export const hasher: Hasher = {
digest64: digest2Bytes32,
Expand Down Expand Up @@ -36,39 +36,106 @@ export const hasher: Hasher = {
}

// HashComputations of the same level are safe to batch
const batch = Math.floor(hcArr.length / 4);
for (let i = 0; i < batch; i++) {
const index = i * 4;
// access array once
const {src0: src0_0, src1: src1_0, dest: dest_0} = hcArr[index];
const {src0: src0_1, src1: src1_1, dest: dest_1} = hcArr[index + 1];
const {src0: src0_2, src1: src1_2, dest: dest_2} = hcArr[index + 2];
const {src0: src0_3, src1: src1_3, dest: dest_3} = hcArr[index + 3];
let src0_0: Node | null = null;
let src1_0: Node | null = null;
let dest_0: Node | null = null;
let src0_1: Node | null = null;
let src1_1: Node | null = null;
let dest_1: Node | null = null;
let src0_2: Node | null = null;
let src1_2: Node | null = null;
let dest_2: Node | null = null;
let src0_3: Node | null = null;
let src1_3: Node | null = null;
let dest_3: Node | null = null;

const [o0, o1, o2, o3] = batchHash4HashObjectInputs([
src0_0,
src1_0,
src0_1,
src1_1,
src0_2,
src1_2,
src0_3,
src1_3,
]);
if (o0 == null || o1 == null || o2 == null || o3 == null) {
throw Error(`batchHash4HashObjectInputs return null at batch ${i} level ${level}`);
for (const [i, hc] of hcArr.entries()) {
const indexInBatch = i % 4;
switch (indexInBatch) {
case 0:
src0_0 = hc.src0;
src1_0 = hc.src1;
dest_0 = hc.dest;
break;
case 1:
src0_1 = hc.src0;
src1_1 = hc.src1;
dest_1 = hc.dest;
break;
case 2:
src0_2 = hc.src0;
src1_2 = hc.src1;
dest_2 = hc.dest;
break;
case 3:
src0_3 = hc.src0;
src1_3 = hc.src1;
dest_3 = hc.dest;
break;
default:
throw Error(`Unexpected indexInBatch ${indexInBatch}`);
}

if (
indexInBatch === 3 &&
src0_0 !== null &&
src1_0 !== null &&
dest_0 !== null &&
src0_1 !== null &&
src1_1 !== null &&
dest_1 !== null &&
src0_2 !== null &&
src1_2 !== null &&
dest_2 !== null &&
src0_3 !== null &&
src1_3 !== null &&
dest_3 !== null
) {
const [o0, o1, o2, o3] = batchHash4HashObjectInputs([
src0_0,
src1_0,
src0_1,
src1_1,
src0_2,
src1_2,
src0_3,
src1_3,
]);
if (o0 == null || o1 == null || o2 == null || o3 == null) {
throw Error(`batchHash4HashObjectInputs return null at batch ${i} level ${level}`);
}
dest_0.applyHash(o0);
dest_1.applyHash(o1);
dest_2.applyHash(o2);
dest_3.applyHash(o3);

src0_0 = null;
src1_0 = null;
dest_0 = null;
src0_1 = null;
src1_1 = null;
dest_1 = null;
src0_2 = null;
src1_2 = null;
dest_2 = null;
src0_3 = null;
src1_3 = null;
dest_3 = null;
}
dest_0.applyHash(o0);
dest_1.applyHash(o1);
dest_2.applyHash(o2);
dest_3.applyHash(o3);
}

// remaining
for (let i = batch * 4; i < hcArr.length; i++) {
const {src0, src1, dest} = hcArr[i];
const output = digest64HashObjects(src0, src1);
dest.applyHash(output);
if (src0_0 !== null && src1_0 !== null && dest_0 !== null) {
dest_0.applyHash(digest64HashObjects(src0_0, src1_0));
}
if (src0_1 !== null && src1_1 !== null && dest_1 !== null) {
dest_1.applyHash(digest64HashObjects(src0_1, src1_1));
}
if (src0_2 !== null && src1_2 !== null && dest_2 !== null) {
dest_2.applyHash(digest64HashObjects(src0_2, src1_2));
}
if (src0_3 !== null && src1_3 !== null && dest_3 !== null) {
dest_3.applyHash(digest64HashObjects(src0_3, src1_3));
}
}
},
Expand Down
2 changes: 1 addition & 1 deletion packages/persistent-merkle-tree/src/node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ export class BranchNode extends Node {
batchHash(): Uint8Array {
const hashComputations: HashComputation[][] = [];
getHashComputations(this, 0, hashComputations);
hasher.executeHashComputations(hashComputations);
executeHashComputations(hashComputations);

if (this.h0 === null) {
throw Error("Root is not computed by batch");
Expand Down

0 comments on commit 17b8da3

Please sign in to comment.