immudb-node
Version:
Node.js SDK for immudb written in TypeScript
126 lines • 4.33 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const schemaTypes = __importStar(require("./proto/schema_pb"));
const util_1 = require("./util");
const consts_1 = require("./consts");
class HTree {
constructor(maxWidth) {
this.width = 0;
this.root = new Uint8Array();
if (maxWidth < 1) {
throw new Error("Illegal HTree arguments");
}
else {
this.maxWidth = maxWidth;
let lw = 1;
while (lw < maxWidth) {
lw = lw << 1;
}
const height = util_1.bitLength(maxWidth - 1) + 1;
this.levels = new Array(height);
for (let l = 0; l < height; l++) {
this.levels[l] = new Array(lw >> l);
}
}
}
buildWith(digests) {
if (digests.length > this.maxWidth) {
throw new Error('HTree max width exceeded');
}
if (digests.length === 0) {
throw new Error('Illegal HTree buildWith');
}
for (let i = 0; i < digests.length; i++) {
const digest = digests[i];
const leaf = util_1.withLeafPrefix(digest);
this.levels[0][i] = util_1.hashUint8Array(leaf);
}
let l = 0;
let w = digests.length;
while (w > 1) {
let wn = 0;
let i = 0;
while (i + 1 < w) {
const level1 = this.levels[l][i];
const level2 = this.levels[l][i + 1];
const b = new Uint8Array(consts_1.NODE_PREFIX.length + level1.length + level2.length);
b.set(consts_1.NODE_PREFIX);
b.set(level1, consts_1.NODE_PREFIX.length);
b.set(level2, consts_1.NODE_PREFIX.length + level1.length);
this.levels[l + 1][wn] = util_1.hashUint8Array(b);
wn++;
i += 2;
}
if (w % 2 === 1) {
this.levels[l + 1][wn] = this.levels[l][w - 1];
wn++;
}
l++;
w = wn;
}
this.width = digests.length;
this.root = this.levels[l][0];
}
inclusionProof(i) {
if (i >= this.width) {
throw new Error("Illegal inclusionProof arguments");
}
let m = i;
let n = this.width;
let offset = 0;
const proof = new schemaTypes.InclusionProof();
proof.setLeaf(i);
proof.setWidth(this.width);
if (this.width === 1) {
return proof;
}
while (true) {
const d = util_1.bitLength(n - 1);
const k = 1 << (d - 1);
let l;
let r;
if (m < k) {
l = offset + k;
r = offset + n - 1;
n = k;
}
else {
l = offset;
r = offset + k - 1;
m = m - k;
n = n - k;
offset += k;
}
const layer = util_1.bitLength(r - l);
const index = l / (1 << layer);
const a = this.levels[layer][index];
const b = proof.getTermsList_asU8();
const termsList = b.concat(a);
proof.setTermsList(termsList);
if (n < 1 || (n === 1 && m === 0)) {
return proof;
}
}
}
}
exports.default = HTree;
//# sourceMappingURL=htree.js.map
;