/** * Minimum surface a backend exposes to drive a MerkleTree. Sync * everywhere: the merkle layer is synchronous and consumers that need * async IO wrap externally. * * Storage records only perfect aligned subtree hashes. Roots of * partial right-edge subtrees are recomputed on demand by the tree. */ export interface MerkleStorage { /** Number of leaves appended so far. */ size(): number; /** Record a leaf hash at the given index. The implementation must reject out-of-order indices. */ appendLeaf(leafIndex: number, leafHash: Uint8Array): void; /** Read the leaf hash at index. Throws if absent. */ getLeaf(leafIndex: number): Uint8Array; /** Record an internal node hash at the given (level, index). */ putNode(level: number, index: number, hash: Uint8Array): void; /** Read an internal-node hash. Throws if absent. */ getNode(level: number, index: number): Uint8Array; /** Probe an internal-node slot without throwing. */ hasNode(level: number, index: number): boolean; } /** * In-process storage backed by a Map keyed on `${level}:${index}`. Sync. * Suitable for tests, witnesses without persistent storage, and the * MerkleVerifier short-lived flow. Production logs that need durability * implement MerkleStorage over a file or DB and feed it to a * MerkleTree the same way. */ export declare class MemoryStorage implements MerkleStorage { private leafCount; private readonly nodes; private static key; size(): number; appendLeaf(leafIndex: number, leafHash: Uint8Array): void; getLeaf(leafIndex: number): Uint8Array; putNode(level: number, index: number, hash: Uint8Array): void; getNode(level: number, index: number): Uint8Array; hasNode(level: number, index: number): boolean; }