UNPKG

immudb-node

Version:

Node.js SDK for immudb written in TypeScript

126 lines 4.33 kB
"use strict"; 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