@jackallabs/dogwood-tree
Version:
Jackal Labs JS Merkletree implementation
298 lines (280 loc) • 9.24 kB
TypeScript
export declare interface IGenericObject {
[key: string]: any;
}
/**
* @interface IHashFunctionOptions
* @desc - Merkletree hashing options.
* @since 1.0.0
*
* @prop {function} sha3_512 - Hashes using SHA3-512.
*/
export declare interface IHashFunctionOptions {
blake3: (a: ArrayBuffer) => ArrayBuffer;
sha3_512: (a: ArrayBuffer) => ArrayBuffer;
}
/**
* @interface IMerkletree
* @desc - Merkletree Proving Structure.
* @since 1.0.0
*
* @prop {getRoot} getRoot
* @prop {getRootAsHex} getRootAsHex
* @prop {getSalt} getSalt
* @prop {generatePollard} generatePollard
* @prop {generateProof} generateProof
*/
export declare interface IMerkletree {
/**
* @method getRoot
* @desc - Get raw merkletree root node.
* @returns {ArrayBuffer}
*/
getRoot(): ArrayBuffer;
/**
* @method getRootAsHex
* @desc - Get merkletree root node as hex encoding.
* @returns {string}
*/
getRootAsHex(): string;
/**
* @method getSalt
* @desc - Check if salt was used in creating merkletree.
* @returns {boolean}
*/
getSalt(): boolean;
/**
* @method generatePollard
* @desc - Generate IPollard instance from merkletree.
* @param {number} height - Height to use for creating pollard.
* @returns {IPollard}
*/
generatePollard(height: number): IPollard;
/**
* @method generateProof
* @desc - Generate IProof instance from merkletree.
* @param {ArrayBuffer} data - ArrayBuffer to check for comparison.
* @param {number} height - Height to use for creating internal pollard.
* @returns {IProof}
*/
generateProof(data: ArrayBuffer, height: number): IProof;
}
/**
* @interface IMerkletreeCompact
* @desc - Memory efficient Merkletree Hashing Structure.
* @since 1.1.0
*
* @prop {getRoot} getRoot
* @prop {getRootAsHex} getRootAsHex
*/
export declare interface IMerkletreeCompact {
/**
* @method getRoot
* @desc - Get raw merkletree root node.
* @returns {ArrayBuffer}
*/
getRoot(): ArrayBuffer;
/**
* @method getRootAsHex
* @desc - Get merkletree root node as hex encoding.
* @returns {string}
*/
getRootAsHex(): string;
}
/**
* @interface IMerkletreeCompactSource
* @desc - Memory efficient Merkletree creation parameters.
* @since 1.1.0
*
* @prop {File} [raw] - Raw File source to use default pre-processing.
* @prop {ArrayBuffer} [seed] - Raw ArrayBuffer to use default pre-processing.
* @prop {Array<ArrayBuffer>} [sapling] - Prepared array of ArrayBuffers.
* @prop {number} [chunkSize] - Chunk size to use with seed.
* @prop {string} [hashType] - Tag of hashing type to use, currently only supports SHA3_512.
*/
export declare interface IMerkletreeCompactSource {
raw?: File;
seed?: ArrayBuffer;
sapling?: Array<ArrayBuffer>;
chunkSize?: number;
hashType?: TBranchHashOptionKeys;
}
/**
* @interface IMerkletreeSource
* @desc - Merkletree creation parameters.
* @since 1.0.0
*
* @prop {ArrayBuffer} [seed] - Raw ArrayBuffer to use default pre-processing.
* @prop {Array<ArrayBuffer>} [sapling] - Prepared array of ArrayBuffers.
* @prop {number} [chunkSize] - Chunk size to use with seed.
* @prop {string} [hashType] - Tag of hashing type to use, currently only supports SHA3_512.
* @prop {boolean} [useSalt] - If merkletree should be salted, not yet implemented.
* @prop {boolean} [sort] - If merkletree should be sorted, not yet implemented.
* @prop {boolean} [preserve] - If merkletree should preserve full tree or only final root.
*/
export declare interface IMerkletreeSource {
seed?: ArrayBuffer;
sapling?: Array<ArrayBuffer>;
chunkSize?: number;
hashType?: TBranchHashOptionKeys;
useSalt?: boolean;
sort?: boolean;
preserve?: boolean;
}
export declare interface IMultiProof {
verify(data: Array<ArrayBuffer>): Promise<boolean>;
}
/**
* @interface IPollard
* @desc - Merkletree Pollard.
* @since 1.0.0
*
* @prop {getHashes} getHashes
* @prop {getHeight} getHeight
* @prop {getLength} getLength
* @prop {verify} verify
*/
export declare interface IPollard {
/**
* @method getHashes
* @desc - Get hashes in pollard.
* @returns {Array<ArrayBuffer>}
*/
getHashes(): Array<ArrayBuffer>;
/**
* @method getHeight
* @desc - Get height in parent merkletree of this pollard.
* @returns {number}
*/
getHeight(): number;
/**
* @method getLength
* @desc - Get number of hashes in pollard.
* @returns {number}
*/
getLength(): number;
/**
* @method verify
* @desc - Async check if this is a valid merkletree pollard.
* @returns {Promise<boolean>}
*/
verify(): Promise<boolean>;
}
/**
* @interface IProof
* @desc - Merkletree Proof.
* @since 1.0.0
*
* @prop {verify} verify
*/
export declare interface IProof {
/**
* @method verify
* @desc - Async check if ArrayBuffer is present in merkletree.
* @param {ArrayBuffer} data - ArrayBuffer to check for comparison.
* @returns {Promise<boolean>}
*/
verify(data: ArrayBuffer): Promise<boolean>;
}
/**
* @class Merkletree
* @desc - Merkletree instance.
* @see {IMerkletree}
*/
export declare class Merkletree implements IMerkletree {
protected readonly root: ArrayBuffer;
protected readonly source: Array<ArrayBuffer>;
protected readonly nodes: Array<ArrayBuffer>;
protected readonly hash: TBranchHashOptionKeys;
protected readonly salted: boolean;
protected readonly sorted: boolean;
/**
* @constructor Merkletree
* @protected
*/
protected constructor(r: ArrayBuffer, p: boolean, sap: Array<ArrayBuffer>, n: Array<ArrayBuffer>, h: TBranchHashOptionKeys, u: boolean, s: boolean);
/**
* @constructor Merkletree
* @param {IMerkletreeSource} input - Merkletree creation parameters.
* @returns {Promise<IMerkletree>}
*/
static grow(input: IMerkletreeSource): Promise<IMerkletree>;
getRoot(): ArrayBuffer;
getRootAsHex(): string;
getSalt(): boolean;
generatePollard(height: number): IPollard;
generateProof(data: ArrayBuffer, height: number): IProof;
}
/**
* @class MerkletreeCompact
* @desc - Merkletree Compact instance.
* @see {IMerkletreeCompact}
*/
export declare class MerkletreeCompact implements IMerkletreeCompact {
protected readonly root: ArrayBuffer;
/**
* @constructor MerkletreeCompact
* @protected
*/
protected constructor(r: ArrayBuffer);
/**
* @constructor MerkletreeCompact
* @param {IMerkletreeCompactSource} input - Merkletree Compact creation parameters.
* @returns {Promise<IMerkletreeCompact>}
*/
static grow(input: IMerkletreeCompactSource): Promise<IMerkletreeCompact>;
getRoot(): ArrayBuffer;
getRootAsHex(): string;
}
export declare class MultiProof implements IMultiProof {
constructor();
verify(data: Array<ArrayBuffer>): Promise<boolean>;
}
export declare type OneOf<T, V extends any[], NK extends keyof V = Exclude<keyof V, keyof any[]>> = {
[K in NK]: T extends V[K] ? V[K] : never;
}[NK];
/**
* @class Pollard
* @desc - Merkletree Pollard.
* @see {IPollard}
*/
export declare class Pollard implements IPollard {
protected readonly hashes: Array<ArrayBuffer>;
protected readonly hashType: TBranchHashOptionKeys;
protected readonly height: number;
/**
* @constructor Pollard
* @param {Array<ArrayBuffer>} hashes - Merkletree hashes.
* @param {TBranchHashOptionKeys} hashType - Merkletree hash type used.
* @param {number} height - Height in Merkletree.
*/
constructor(hashes: Array<ArrayBuffer>, hashType: TBranchHashOptionKeys, height: number);
getHashes(): Array<ArrayBuffer>;
getHeight(): number;
getLength(): number;
verify(): Promise<boolean>;
}
/**
* @class Proof
* @desc - Merkletree Proof.
* @see {IProof}
*/
export declare class Proof implements IProof {
protected readonly hashes: Array<ArrayBuffer>;
protected readonly index: number;
protected readonly hashType: TBranchHashOptionKeys;
protected readonly salted: boolean;
protected readonly pollard: IPollard;
/**
* @constructor Proof
* @param {Array<ArrayBuffer>} hashes - Merkletree hashes.
* @param {number} index - Merkletree index.
* @param {TBranchHashOptionKeys} hashType - Merkletree hash type used.
* @param {boolean} salted - If merkletree was salted.
* @param {IPollard} pollard - Pollard instance to use as source.
*/
constructor(hashes: Array<ArrayBuffer>, index: number, hashType: TBranchHashOptionKeys, salted: boolean, pollard: IPollard);
verify(data: ArrayBuffer): Promise<boolean>;
}
export declare type TBranchHashOptionKeys = 'sha3_512';
export declare type TTypedArrays = Uint8Array | Uint16Array | Uint32Array;
export { }