UNPKG

@waku/rln

Version:

RLN (Rate Limiting Nullifier) implementation for Waku

76 lines (73 loc) 3.26 kB
import '../../../node_modules/multiformats/dist/src/bases/base10.js'; import '../../../node_modules/multiformats/dist/src/bases/base16.js'; import '../../../node_modules/multiformats/dist/src/bases/base2.js'; import '../../../node_modules/multiformats/dist/src/bases/base256emoji.js'; import '../../../node_modules/multiformats/dist/src/bases/base32.js'; import '../../../node_modules/multiformats/dist/src/bases/base36.js'; import '../../../node_modules/multiformats/dist/src/bases/base58.js'; import '../../../node_modules/multiformats/dist/src/bases/base64.js'; import '../../../node_modules/multiformats/dist/src/bases/base8.js'; import '../../../node_modules/multiformats/dist/src/bases/identity.js'; import '../../../node_modules/multiformats/dist/src/codecs/json.js'; import { Logger } from '../../utils/dist/logger.js'; import __wbg_init, { initPanicHook, newRLN } from '../../../node_modules/@waku/zerokit-rln-wasm/rln_wasm.js'; import { DEFAULT_RATE_LIMIT } from './contract/constants.js'; import { RLNCredentialsManager } from './credentials_manager.js'; import { builder } from './resources/witness_calculator.js'; import { Zerokit } from './zerokit.js'; const log = new Logger("rln"); class RLNInstance extends RLNCredentialsManager { zerokit; /** * Create an instance of RLN * @returns RLNInstance */ static async create() { try { await __wbg_init(); initPanicHook(); const witnessCalculator = await RLNInstance.loadWitnessCalculator(); const zkey = await RLNInstance.loadZkey(); const zkRLN = newRLN(zkey); const zerokit = new Zerokit(zkRLN, witnessCalculator, DEFAULT_RATE_LIMIT); return new RLNInstance(zerokit); } catch (error) { log.error("Failed to initialize RLN:", error); throw error; } } constructor(zerokit) { super(zerokit); this.zerokit = zerokit; } static async loadWitnessCalculator() { try { const url = new URL("./resources/rln.wasm", import.meta.url); const response = await fetch(url); if (!response.ok) { throw new Error(`Failed to fetch witness calculator: ${response.status} ${response.statusText}`); } return await builder(new Uint8Array(await response.arrayBuffer()), false); } catch (error) { log.error("Error loading witness calculator:", error); throw new Error(`Failed to load witness calculator: ${error instanceof Error ? error.message : String(error)}`); } } static async loadZkey() { try { const url = new URL("./resources/rln_final.zkey", import.meta.url); const response = await fetch(url); if (!response.ok) { throw new Error(`Failed to fetch zkey: ${response.status} ${response.statusText}`); } return new Uint8Array(await response.arrayBuffer()); } catch (error) { log.error("Error loading zkey:", error); throw new Error(`Failed to load zkey: ${error instanceof Error ? error.message : String(error)}`); } } } export { RLNInstance };