@izi-noir/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +458 -0
- package/dist/IProvingSystem-D9TnEig0.d.ts +140 -0
- package/dist/IProvingSystem-TKNofoo8.d.cts +140 -0
- package/dist/index.cjs +2793 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1196 -0
- package/dist/index.d.ts +1196 -0
- package/dist/index.js +2730 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/arkworks.cjs +824 -0
- package/dist/providers/arkworks.cjs.map +1 -0
- package/dist/providers/arkworks.d.cts +121 -0
- package/dist/providers/arkworks.d.ts +121 -0
- package/dist/providers/arkworks.js +791 -0
- package/dist/providers/arkworks.js.map +1 -0
- package/dist/providers/barretenberg.cjs +822 -0
- package/dist/providers/barretenberg.cjs.map +1 -0
- package/dist/providers/barretenberg.d.cts +18 -0
- package/dist/providers/barretenberg.d.ts +18 -0
- package/dist/providers/barretenberg.js +790 -0
- package/dist/providers/barretenberg.js.map +1 -0
- package/dist/providers/solana.cjs +262 -0
- package/dist/providers/solana.cjs.map +1 -0
- package/dist/providers/solana.d.cts +223 -0
- package/dist/providers/solana.d.ts +223 -0
- package/dist/providers/solana.js +222 -0
- package/dist/providers/solana.js.map +1 -0
- package/dist/providers/sunspot.cjs +475 -0
- package/dist/providers/sunspot.cjs.map +1 -0
- package/dist/providers/sunspot.d.cts +210 -0
- package/dist/providers/sunspot.d.ts +210 -0
- package/dist/providers/sunspot.js +443 -0
- package/dist/providers/sunspot.js.map +1 -0
- package/dist/types-CaaigonG.d.cts +93 -0
- package/dist/types-CaaigonG.d.ts +93 -0
- package/dist/wasm/nodejs/arkworks_groth16_wasm.js +448 -0
- package/dist/wasm/nodejs/arkworks_groth16_wasm_bg.wasm +0 -0
- package/dist/wasm/web/arkworks_groth16_wasm.js +536 -0
- package/dist/wasm/web/arkworks_groth16_wasm_bg.wasm +0 -0
- package/dist/wasmInit-KV6DTj4J.d.ts +282 -0
- package/dist/wasmInit-iEYiiB8M.d.cts +282 -0
- package/package.json +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/infra/provingSystems/ArkworksWasm.ts","../../src/infra/provingSystems/Barretenberg.ts","../../src/infra/chainFormatters/SolanaFormatter.ts","../../src/providers/arkworks.ts","../../src/domain/types/provider.ts","../../src/infra/wasm/wasmInit.ts","../../src/IziNoir.ts"],"sourcesContent":["/**\n * ArkworksWasm proving system.\n *\n * 100% browser-compatible Groth16 prover using arkworks compiled to WASM.\n * Produces proofs compatible with gnark-verifier-solana for on-chain verification.\n *\n * Features:\n * - Runs entirely in the browser (no CLI dependencies)\n * - Generates compact Groth16 proofs (~256 bytes)\n * - Compatible with gnark-verifier-solana\n * - Uses BN254 curve\n */\n\nimport { compile, createFileManager } from '@noir-lang/noir_wasm';\nimport { Noir } from '@noir-lang/noir_js';\nimport type { IProvingSystem } from '../../domain/interfaces/proving/IProvingSystem.js';\nimport type { CompiledCircuit, InputMap, ProofData } from '../../domain/types.js';\n\n/**\n * Helper to create a ReadableStream from a string\n * Used to write files to the virtual filesystem (browser-compatible)\n */\nfunction stringToStream(content: string): ReadableStream<Uint8Array> {\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(content));\n controller.close();\n },\n });\n}\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNodeJs(): boolean {\n return (\n typeof globalThis.process !== 'undefined' &&\n globalThis.process.versions != null &&\n globalThis.process.versions.node != null\n );\n}\n\n/**\n * Create temp directory in Node.js, or return '/' for browser virtual fs\n */\nasync function createTempDir(): Promise<{ basePath: string; cleanup: (() => Promise<void>) | null }> {\n if (!isNodeJs()) {\n // Browser: use virtual filesystem\n return { basePath: '/', cleanup: null };\n }\n\n // Node.js: create real temp directory\n // Use dynamic import which works in both Node.js ESM and CJS\n const fs = await import('node:fs/promises');\n const os = await import('node:os');\n const path = await import('node:path');\n\n const basePath = await fs.mkdtemp(path.join(os.tmpdir(), 'arkworks-circuit-'));\n const cleanup = async () => {\n await fs.rm(basePath, { recursive: true, force: true });\n };\n\n return { basePath, cleanup };\n}\n\n/**\n * Result of Groth16 setup from arkworks WASM module\n */\nexport interface ArkworksSetupResult {\n /** Base64-encoded proving key */\n proving_key: string;\n /** Base64-encoded verifying key (arkworks format) */\n verifying_key: string;\n /** Base64-encoded verifying key (gnark format for Solana) */\n verifying_key_gnark: string;\n}\n\n/**\n * Result of Groth16 proof generation from arkworks WASM module\n */\nexport interface ArkworksProofResult {\n /** Base64-encoded proof (arkworks format) */\n proof: string;\n /** Base64-encoded proof (gnark format, 256 bytes) */\n proof_gnark: string;\n /** Public inputs as hex strings */\n public_inputs: string[];\n /** Base64-encoded public inputs (gnark format) */\n public_inputs_gnark: string;\n}\n\n/**\n * Interface for the arkworks-groth16-wasm WASM module\n */\nexport interface ArkworksWasmModule {\n setup(acirJson: string): ArkworksSetupResult;\n prove(provingKeyB64: string, acirJson: string, witnessJson: string): ArkworksProofResult;\n verify(verifyingKeyB64: string, proofB64: string, publicInputsJson: string): boolean;\n verify_gnark(\n verifyingKeyGnarkB64: string,\n proofGnarkB64: string,\n publicInputsGnarkB64: string,\n numPublicInputs: number\n ): boolean;\n acir_to_r1cs_info(acirJson: string): {\n num_witnesses: number;\n num_constraints: number;\n public_inputs: number[];\n private_inputs: number[];\n return_values: number[];\n };\n version(): string;\n}\n\n/**\n * Configuration for ArkworksWasm prover\n */\nexport interface ArkworksWasmConfig {\n /** Keep intermediate artifacts for debugging */\n keepArtifacts?: boolean;\n /** Cache proving/verifying keys for repeated proofs */\n cacheKeys?: boolean;\n}\n\n/**\n * Extended CompiledCircuit for ArkworksWasm backend\n */\nexport interface ArkworksCompiledCircuit extends CompiledCircuit {\n /** Marker to identify ArkworksWasm circuits */\n __arkworks: true;\n /** ACIR program as JSON string (used for setup/prove) */\n acirJson: string;\n /** Cached proving key (base64) if cacheKeys is enabled */\n provingKey?: string;\n /** Cached verifying key (base64) if cacheKeys is enabled */\n verifyingKey?: string;\n /** Cached verifying key in gnark format (base64) */\n verifyingKeyGnark?: string;\n}\n\n/**\n * Type guard to check if a circuit is an ArkworksWasm circuit\n */\nexport function isArkworksCircuit(circuit: CompiledCircuit): circuit is ArkworksCompiledCircuit {\n return '__arkworks' in circuit && (circuit as ArkworksCompiledCircuit).__arkworks === true;\n}\n\n// WASM module singleton\nlet wasmModule: ArkworksWasmModule | null = null;\nlet wasmInitPromise: Promise<ArkworksWasmModule> | null = null;\n\n/**\n * Initialize the arkworks WASM module\n * Automatically detects Node.js vs browser and uses the appropriate WASM target.\n */\nasync function initWasm(): Promise<ArkworksWasmModule> {\n if (wasmModule) {\n return wasmModule;\n }\n\n if (wasmInitPromise) {\n return wasmInitPromise;\n }\n\n wasmInitPromise = (async () => {\n try {\n if (isNodeJs()) {\n // Node.js: use the nodejs target which doesn't require fetch\n // Path resolves to dist/wasm/nodejs/ after bundling\n // @ts-ignore - Dynamic import path resolved at runtime\n const module = await import('../wasm/nodejs/arkworks_groth16_wasm.js');\n wasmModule = module as unknown as ArkworksWasmModule;\n } else {\n // Browser: use the web target with init function\n // Path resolves to dist/wasm/web/ after bundling\n // @ts-ignore - Dynamic import path resolved at runtime\n const module = await import('../wasm/web/arkworks_groth16_wasm.js');\n // Initialize WASM (wasm-pack generates an init function for web target)\n if (typeof module.default === 'function') {\n await module.default();\n }\n wasmModule = module as unknown as ArkworksWasmModule;\n }\n return wasmModule;\n } catch (error) {\n wasmInitPromise = null;\n throw new Error(\n `Failed to initialize arkworks-groth16-wasm: ${error instanceof Error ? error.message : String(error)}\\n` +\n 'Make sure the WASM module is built: cd packages/arkworks-groth16-wasm && npm run build'\n );\n }\n })();\n\n return wasmInitPromise;\n}\n\n/**\n * ArkworksWasm proving system using arkworks Groth16 compiled to WASM.\n *\n * This proving system:\n * - Compiles Noir code using @noir-lang/noir_wasm\n * - Generates witness using @noir-lang/noir_js\n * - Performs Groth16 setup/prove/verify using arkworks-groth16-wasm\n *\n * All operations run in the browser with no external dependencies.\n */\nexport class ArkworksWasm implements IProvingSystem {\n private readonly config: ArkworksWasmConfig;\n\n constructor(config: ArkworksWasmConfig = {}) {\n this.config = {\n keepArtifacts: false,\n cacheKeys: true,\n ...config,\n };\n }\n\n /**\n * Compile Noir code to a circuit with ACIR for Groth16 proving\n */\n async compile(noirCode: string): Promise<CompiledCircuit> {\n const wasm = await initWasm();\n const { basePath, cleanup } = await createTempDir();\n const fm = createFileManager(basePath);\n\n const nargoToml = `[package]\nname = \"circuit\"\ntype = \"bin\"\nauthors = [\"\"]\n\n[dependencies]\n`;\n\n try {\n // Write files using ReadableStream (browser-compatible)\n // In Node.js: writeFile is async and must be awaited\n // In browser: writeFile works with virtual fs, should not await for noir_wasm compatibility\n if (isNodeJs()) {\n await fm.writeFile('./src/main.nr', stringToStream(noirCode));\n await fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n } else {\n fm.writeFile('./src/main.nr', stringToStream(noirCode));\n fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n }\n\n // Compile using noir_wasm\n const result = await compile(fm);\n const compiled = (result as any).program as CompiledCircuit;\n\n if (!compiled || !compiled.bytecode) {\n throw new Error('Compilation failed: no bytecode generated');\n }\n\n // Store the ACIR JSON for setup/prove\n // The bytecode is base64-gzipped ACIR\n const acirJson = JSON.stringify({\n functions: [\n {\n current_witness_index: compiled.abi.parameters.length + 1,\n opcodes: [], // Will be extracted from bytecode during prove\n private_parameters: compiled.abi.parameters\n .filter((p) => p.visibility === 'private')\n .map((_, i) => i + 1),\n public_parameters: {\n witnesses: compiled.abi.parameters\n .filter((p) => p.visibility === 'public')\n .map((_, i) => i + 1),\n },\n return_values: { witnesses: [] },\n },\n ],\n });\n\n // Perform setup if caching is enabled\n let provingKey: string | undefined;\n let verifyingKey: string | undefined;\n let verifyingKeyGnark: string | undefined;\n\n if (this.config.cacheKeys) {\n try {\n // Note: For real ACIR, we need to decode the bytecode first\n // This is a placeholder - actual implementation needs to decode\n // the base64-gzipped bytecode to get the ACIR JSON\n const setupResult = wasm.setup(acirJson);\n provingKey = setupResult.proving_key;\n verifyingKey = setupResult.verifying_key;\n verifyingKeyGnark = setupResult.verifying_key_gnark;\n } catch (error) {\n // Setup might fail if ACIR is complex - we'll do it lazily during prove\n console.warn('Deferred setup: will run during proof generation');\n }\n }\n\n const arkworksCircuit: ArkworksCompiledCircuit = {\n ...compiled,\n __arkworks: true,\n acirJson,\n provingKey,\n verifyingKey,\n verifyingKeyGnark,\n };\n\n return arkworksCircuit;\n } finally {\n if (cleanup) {\n await cleanup();\n }\n }\n }\n\n /**\n * Generate a Groth16 proof\n */\n async generateProof(circuit: CompiledCircuit, inputs: InputMap): Promise<ProofData> {\n const wasm = await initWasm();\n\n if (!isArkworksCircuit(circuit)) {\n throw new Error(\n 'ArkworksWasm.generateProof requires an ArkworksCompiledCircuit. Use ArkworksWasm.compile() first.'\n );\n }\n\n // Execute the circuit to generate witness using noir_js\n const noir = new Noir(circuit);\n const { witness } = await noir.execute(inputs);\n\n // Convert witness to the format expected by arkworks-groth16-wasm\n // Witness is a Map<number, string> where values are hex field elements\n const witnessMap: Record<string, string> = {};\n for (const [index, value] of witness.entries()) {\n witnessMap[index.toString()] = String(value);\n }\n const witnessJson = JSON.stringify(witnessMap);\n\n // Ensure we have a proving key\n let provingKey = circuit.provingKey;\n if (!provingKey) {\n const setupResult = wasm.setup(circuit.acirJson);\n provingKey = setupResult.proving_key;\n // Cache for future use\n circuit.provingKey = provingKey;\n circuit.verifyingKey = setupResult.verifying_key;\n circuit.verifyingKeyGnark = setupResult.verifying_key_gnark;\n }\n\n // Generate proof\n const proofResult = wasm.prove(provingKey, circuit.acirJson, witnessJson);\n\n // Return proof in gnark format for Solana compatibility\n const proofBytes = base64ToUint8Array(proofResult.proof_gnark);\n\n return {\n proof: proofBytes,\n publicInputs: proofResult.public_inputs,\n };\n }\n\n /**\n * Verify a Groth16 proof\n */\n async verifyProof(\n circuit: CompiledCircuit,\n proof: Uint8Array,\n publicInputs: string[]\n ): Promise<boolean> {\n const wasm = await initWasm();\n\n if (!isArkworksCircuit(circuit)) {\n throw new Error(\n 'ArkworksWasm.verifyProof requires an ArkworksCompiledCircuit. Use ArkworksWasm.compile() first.'\n );\n }\n\n // Ensure we have a verifying key\n let verifyingKeyGnark = circuit.verifyingKeyGnark;\n if (!verifyingKeyGnark) {\n const setupResult = wasm.setup(circuit.acirJson);\n circuit.provingKey = setupResult.proving_key;\n circuit.verifyingKey = setupResult.verifying_key;\n verifyingKeyGnark = setupResult.verifying_key_gnark;\n circuit.verifyingKeyGnark = verifyingKeyGnark;\n }\n\n // Convert proof to base64\n const proofB64 = uint8ArrayToBase64(proof);\n\n // Convert public inputs to gnark format\n const publicInputsGnarkB64 = publicInputsToGnarkBase64(publicInputs);\n\n // Verify using gnark format\n return wasm.verify_gnark(\n verifyingKeyGnark,\n proofB64,\n publicInputsGnarkB64,\n publicInputs.length\n );\n }\n\n /**\n * Get the verifying key in gnark format for on-chain deployment\n */\n async getVerifyingKeyGnark(circuit: CompiledCircuit): Promise<Uint8Array> {\n const wasm = await initWasm();\n\n if (!isArkworksCircuit(circuit)) {\n throw new Error('getVerifyingKeyGnark requires an ArkworksCompiledCircuit');\n }\n\n if (!circuit.verifyingKeyGnark) {\n const setupResult = wasm.setup(circuit.acirJson);\n circuit.provingKey = setupResult.proving_key;\n circuit.verifyingKey = setupResult.verifying_key;\n circuit.verifyingKeyGnark = setupResult.verifying_key_gnark;\n }\n\n return base64ToUint8Array(circuit.verifyingKeyGnark);\n }\n}\n\n// Utility functions\n\nfunction base64ToUint8Array(b64: string): Uint8Array {\n const binaryString = atob(b64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Convert public inputs (hex strings) to gnark format (32 bytes each, big-endian)\n * Returns base64-encoded result\n */\nfunction publicInputsToGnarkBase64(publicInputs: string[]): string {\n const FIELD_SIZE = 32;\n const bytes = new Uint8Array(publicInputs.length * FIELD_SIZE);\n\n for (let i = 0; i < publicInputs.length; i++) {\n const input = publicInputs[i];\n const hex = input.startsWith('0x') ? input.slice(2) : input;\n const inputBytes = hexToBytes(hex.padStart(64, '0'));\n\n // Copy big-endian bytes\n bytes.set(inputBytes, i * FIELD_SIZE);\n }\n\n return uint8ArrayToBase64(bytes);\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n }\n return bytes;\n}\n","import { compile, createFileManager } from '@noir-lang/noir_wasm';\nimport { Noir } from '@noir-lang/noir_js';\nimport { Barretenberg as BarretenbergBackend, UltraHonkBackend } from '@aztec/bb.js';\nimport type { IProvingSystem } from '../../domain/interfaces/proving/IProvingSystem.js';\nimport type { CompiledCircuit, InputMap, ProofData } from '../../domain/types.js';\n\n/**\n * Helper to create a ReadableStream from a string\n * Used to write files to the virtual filesystem (browser-compatible)\n */\nfunction stringToStream(content: string): ReadableStream<Uint8Array> {\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(content));\n controller.close();\n },\n });\n}\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNodeJs(): boolean {\n return (\n typeof globalThis.process !== 'undefined' &&\n globalThis.process.versions != null &&\n globalThis.process.versions.node != null\n );\n}\n\n/**\n * Create temp directory in Node.js, or return '/' for browser virtual fs\n */\nasync function createTempDir(): Promise<{ basePath: string; cleanup: (() => Promise<void>) | null }> {\n if (!isNodeJs()) {\n // Browser: use virtual filesystem\n return { basePath: '/', cleanup: null };\n }\n\n // Node.js: create real temp directory\n // Use dynamic import which works in both Node.js ESM and CJS\n const fs = await import('node:fs/promises');\n const os = await import('node:os');\n const path = await import('node:path');\n\n const basePath = await fs.mkdtemp(path.join(os.tmpdir(), 'noir-circuit-'));\n const cleanup = async () => {\n await fs.rm(basePath, { recursive: true, force: true });\n };\n\n return { basePath, cleanup };\n}\n\n/**\n * Barretenberg proving system using WASM.\n * Browser compatible, produces UltraHonk proofs (~16KB).\n */\nexport class Barretenberg implements IProvingSystem {\n async compile(noirCode: string): Promise<CompiledCircuit> {\n const { basePath, cleanup } = await createTempDir();\n const fm = createFileManager(basePath);\n\n const nargoToml = `[package]\nname = \"circuit\"\ntype = \"bin\"\nauthors = [\"\"]\n\n[dependencies]\n`;\n\n try {\n // Write files using ReadableStream (browser-compatible)\n // In Node.js: writeFile is async and must be awaited\n // In browser: writeFile works with virtual fs, should not await for noir_wasm compatibility\n if (isNodeJs()) {\n await fm.writeFile('./src/main.nr', stringToStream(noirCode));\n await fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n } else {\n fm.writeFile('./src/main.nr', stringToStream(noirCode));\n fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n }\n\n const result = await compile(fm);\n const compiled = (result as any).program as CompiledCircuit;\n\n if (!compiled || !compiled.bytecode) {\n throw new Error('Compilation failed: no bytecode generated');\n }\n\n return compiled;\n } finally {\n if (cleanup) {\n await cleanup();\n }\n }\n }\n\n async generateProof(circuit: CompiledCircuit, inputs: InputMap): Promise<ProofData> {\n const noir = new Noir(circuit);\n const { witness } = await noir.execute(inputs);\n\n const barretenberg = await BarretenbergBackend.new({ threads: 1 });\n const backend = new UltraHonkBackend(circuit.bytecode, barretenberg);\n\n try {\n const proofData = await backend.generateProof(witness);\n return {\n proof: proofData.proof,\n publicInputs: proofData.publicInputs || [],\n };\n } finally {\n await barretenberg.destroy();\n }\n }\n\n async verifyProof(\n circuit: CompiledCircuit,\n proof: Uint8Array,\n publicInputs: string[]\n ): Promise<boolean> {\n const barretenberg = await BarretenbergBackend.new({ threads: 1 });\n const backend = new UltraHonkBackend(circuit.bytecode, barretenberg);\n\n try {\n return await backend.verifyProof({ proof, publicInputs });\n } finally {\n await barretenberg.destroy();\n }\n }\n}\n","import type { IChainFormatter } from '../../domain/interfaces/chain/IChainFormatter';\nimport type { ProofData, SolanaProofData, CompiledCircuit } from '../../domain/types';\nimport type { CircuitMetadata, SolanaChainMetadata } from '../../domain/types/chain';\nimport type { ArkworksWasm } from '../provingSystems/ArkworksWasm';\n\n// Constants for VK account sizing\nconst G1_SIZE = 64;\nconst G2_SIZE = 128;\n\n/**\n * Formatter for Solana-compatible proof data.\n *\n * Converts generic ProofData into SolanaProofData format with:\n * - Verifying key in gnark format (compatible with gnark-verifier-solana)\n * - Proof bytes (256 bytes Groth16)\n * - Public inputs as 32-byte arrays\n * - VK account size and rent estimates\n *\n * @example\n * ```typescript\n * const formatter = new SolanaFormatter(arkworksProvider);\n * const solanaProof = await formatter.formatProof(proofData, circuit, metadata);\n * ```\n */\nexport class SolanaFormatter implements IChainFormatter<'solana'> {\n readonly chainId = 'solana' as const;\n\n constructor(private arkworksProvider: ArkworksWasm) {}\n\n /**\n * Format a generic proof for Solana on-chain verification.\n *\n * @param proofData - Generic proof data from Arkworks\n * @param circuit - The compiled circuit (must be Arkworks circuit)\n * @param metadata - Circuit metadata with public input count\n * @returns SolanaProofData ready for on-chain verification\n */\n async formatProof(\n proofData: ProofData,\n circuit: CompiledCircuit,\n metadata: CircuitMetadata\n ): Promise<SolanaProofData> {\n // Get verifying key in gnark format\n const vkBytes = await this.arkworksProvider.getVerifyingKeyGnark(circuit);\n const vkBase64 = this.uint8ArrayToBase64(vkBytes);\n\n // Number of public inputs\n const nrPublicInputs = metadata.numPublicInputs;\n\n // Convert public inputs to 32-byte arrays\n const publicInputsBytes = proofData.publicInputs.map((input) => {\n const hex = input.startsWith('0x') ? input.slice(2) : input;\n return this.hexToBytes(hex.padStart(64, '0'));\n });\n\n // Calculate account size and rent\n const { accountSize, estimatedRent } = this.getChainMetadata(nrPublicInputs);\n\n return {\n verifyingKey: {\n base64: vkBase64,\n bytes: vkBytes,\n nrPublicInputs,\n },\n proof: {\n base64: this.uint8ArrayToBase64(proofData.proof),\n bytes: proofData.proof,\n },\n publicInputs: {\n hex: proofData.publicInputs,\n bytes: publicInputsBytes,\n },\n accountSize,\n estimatedRent,\n };\n }\n\n /**\n * Get Solana-specific metadata for a circuit.\n *\n * @param publicInputCount - Number of public inputs in the circuit\n * @returns Solana metadata with account size and rent estimates\n */\n getChainMetadata(publicInputCount: number): SolanaChainMetadata {\n const accountSize = this.calculateVkAccountSize(publicInputCount);\n const estimatedRent = this.calculateVkAccountRent(publicInputCount);\n\n return {\n chainId: 'solana',\n accountSize,\n estimatedRent,\n };\n }\n\n /**\n * Calculate the size of a VK account for a given number of public inputs.\n * Matches the Rust `vk_account_size` function in the Solana program.\n */\n private calculateVkAccountSize(nrPublicInputs: number): number {\n // discriminator (8) + authority (32) + nr_pubinputs (1) + alpha_g1 (64) +\n // beta_g2 (128) + gamma_g2 (128) + delta_g2 (128) + vec_len (4) + k elements\n const fixedSize = 8 + 32 + 1 + G1_SIZE + G2_SIZE * 3 + 4;\n return fixedSize + (nrPublicInputs + 1) * G1_SIZE;\n }\n\n /**\n * Calculate the minimum rent for a VK account.\n */\n private calculateVkAccountRent(\n nrPublicInputs: number,\n rentExemptionPerByte: number = 6960 // approximate lamports per byte\n ): number {\n const size = this.calculateVkAccountSize(nrPublicInputs);\n return size * rentExemptionPerByte;\n }\n\n /**\n * Convert Uint8Array to base64 string.\n */\n private uint8ArrayToBase64(bytes: Uint8Array): string {\n // Browser-compatible\n if (typeof btoa === 'function') {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n // Node.js fallback\n return Buffer.from(bytes).toString('base64');\n }\n\n /**\n * Convert hex string to Uint8Array.\n */\n private hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.substring(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n }\n}\n","/**\n * Arkworks-only entry point for tree-shaking.\n *\n * Import from this module to only include Arkworks in your bundle,\n * excluding Barretenberg and Sunspot dependencies.\n *\n * @example\n * ```typescript\n * import { IziNoir, Provider } from '@izi-noir/sdk/arkworks';\n *\n * const izi = await IziNoir.init({ provider: Provider.Arkworks });\n * ```\n *\n * @module @izi-noir/sdk/arkworks\n */\n\nexport { ArkworksWasm, isArkworksCircuit } from '../infra/provingSystems/ArkworksWasm.js';\nexport type {\n ArkworksWasmConfig,\n ArkworksCompiledCircuit,\n ArkworksWasmModule,\n ArkworksSetupResult,\n ArkworksProofResult,\n} from '../infra/provingSystems/ArkworksWasm.js';\nexport { IziNoir, Provider, type IziNoirConfig, type CircuitPaths } from '../IziNoir.js';\nexport { initNoirWasm, isWasmInitialized } from '../infra/wasm/wasmInit.js';\nexport type { CompiledCircuit, InputMap, ProofData } from '../domain/types.js';\nexport type { IProvingSystem } from '../domain/interfaces/proving/IProvingSystem.js';\n","import { Chain } from './chain.js';\n\n/**\n * Available proving system providers\n */\nexport enum Provider {\n /** Barretenberg backend - browser compatible, UltraHonk proofs (~16KB) */\n Barretenberg = 'barretenberg',\n /** Arkworks WASM backend - browser compatible, Groth16 proofs (~256 bytes) */\n Arkworks = 'arkworks',\n /** Sunspot CLI backend - Node.js only, Groth16 proofs (~256 bytes) */\n Sunspot = 'sunspot',\n}\n\n/**\n * Configuration for circuit paths (required for Sunspot)\n */\nexport interface CircuitPaths {\n /** Path to the proving key file */\n pkPath: string;\n /** Path to the verification key file */\n vkPath: string;\n /** Path to the compiled circuit JSON file */\n circuitPath: string;\n}\n\n/**\n * Configuration for IziNoir initialization\n */\nexport interface IziNoirConfig {\n /** The proving system provider to use */\n provider: Provider;\n /**\n * Target blockchain for proof formatting.\n * If omitted, operates in offchain mode (raw proofs, no chain formatting).\n */\n chain?: Chain;\n /** Circuit paths - required for Sunspot provider */\n circuitPaths?: CircuitPaths;\n}\n\n// Re-export Chain for convenience\nexport { Chain };\n","let wasmInitPromise: Promise<void> | null = null;\nlet wasmInitialized = false;\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNodeJs(): boolean {\n return (\n typeof globalThis.process !== 'undefined' &&\n globalThis.process.versions != null &&\n globalThis.process.versions.node != null\n );\n}\n\n/**\n * Initialize WASM modules for Noir compilation and execution.\n * Automatically detects Node.js vs browser and uses the appropriate WASM target.\n *\n * Uses lazy loading with singleton pattern - safe to call multiple times.\n * Only initializes once, subsequent calls return immediately.\n */\nexport async function initNoirWasm(): Promise<void> {\n if (wasmInitialized) return;\n\n if (!wasmInitPromise) {\n wasmInitPromise = initWasmInternal();\n }\n\n await wasmInitPromise;\n wasmInitialized = true;\n}\n\nasync function initWasmInternal(): Promise<void> {\n if (isNodeJs()) {\n // Node.js: use the nodejs target which doesn't require fetch\n // The nodejs target auto-initializes when imported\n await import('@noir-lang/acvm_js/nodejs/acvm_js.js');\n await import('@noir-lang/noirc_abi/nodejs/noirc_abi_wasm.js');\n } else {\n // Browser: use the web target with default initialization\n // Note: For Vite/bundlers, external initialization with WASM URLs is preferred\n // Use markWasmInitialized() after initializing externally\n const [{ default: initACVM }, { default: initNoirC }] = await Promise.all([\n import('@noir-lang/acvm_js'),\n import('@noir-lang/noirc_abi'),\n ]);\n await Promise.all([initACVM(), initNoirC()]);\n }\n}\n\n/**\n * Check if WASM modules are already initialized\n */\nexport function isWasmInitialized(): boolean {\n return wasmInitialized;\n}\n\n/**\n * Mark WASM as already initialized externally.\n * Use this when WASM has been initialized outside the SDK (e.g., with Vite URL imports).\n *\n * @example\n * ```typescript\n * // In Vite/browser environment\n * import initNoirC from \"@noir-lang/noirc_abi\";\n * import initACVM from \"@noir-lang/acvm_js\";\n * import acvm from \"@noir-lang/acvm_js/web/acvm_js_bg.wasm?url\";\n * import noirc from \"@noir-lang/noirc_abi/web/noirc_abi_wasm_bg.wasm?url\";\n * import { markWasmInitialized } from \"@izi-noir/sdk\";\n *\n * await Promise.all([initACVM(fetch(acvm)), initNoirC(fetch(noirc))]);\n * markWasmInitialized();\n * ```\n */\nexport function markWasmInitialized(): void {\n wasmInitialized = true;\n}\n\n/**\n * Reset WASM initialization state (for testing purposes)\n * @internal\n */\nexport function resetWasmInit(): void {\n wasmInitPromise = null;\n wasmInitialized = false;\n}\n","import {\n Provider,\n Chain,\n type IziNoirConfig,\n type CircuitPaths,\n} from './domain/types/provider.js';\nimport type { IProvingSystem } from './domain/interfaces/proving/IProvingSystem.js';\nimport type {\n CompiledCircuit,\n InputMap,\n ProofData,\n SolanaProofData,\n VerifyingKeyData,\n} from './domain/types.js';\nimport type { IChainFormatter } from './domain/interfaces/chain/IChainFormatter.js';\nimport type { ChainId, CircuitMetadata } from './domain/types/chain.js';\nimport { initNoirWasm } from './infra/wasm/wasmInit.js';\n\n/**\n * Data needed to deploy a verifying key to Solana.\n * Use with SolanaTransactionBuilder or your own transaction logic.\n */\nexport interface SolanaDeployData {\n /** The proof data with VK and public inputs */\n proofData: SolanaProofData;\n /** Program ID to use */\n programId: string;\n /** Compute units for the transaction */\n computeUnits: number;\n}\n\n/**\n * Main class for ZK proof generation with multiple backend providers.\n *\n * @example\n * ```typescript\n * import { IziNoir, Provider, Chain } from '@izi-noir/sdk';\n *\n * // On-chain mode: Initialize with chain for blockchain-specific formatting\n * const izi = await IziNoir.init({\n * provider: Provider.Arkworks,\n * chain: Chain.Solana\n * });\n *\n * await izi.compile(noirCode);\n * const proof = await izi.prove(inputs); // Returns SolanaProofData\n * console.log(izi.vk); // Verifying key available\n *\n * // Offchain mode: No chain specified\n * const iziOffchain = await IziNoir.init({ provider: Provider.Arkworks });\n * const rawProof = await iziOffchain.prove(inputs); // Returns ProofData\n * const verified = await iziOffchain.verify(rawProof.proof, rawProof.publicInputs);\n * ```\n */\nexport class IziNoir {\n private provingSystem: IProvingSystem;\n private compiledCircuit: CompiledCircuit | null = null;\n private chainFormatters: Map<string, IChainFormatter> = new Map();\n private readonly chain?: Chain;\n private _verifyingKey?: VerifyingKeyData;\n private _lastProof?: SolanaProofData | ProofData;\n\n private constructor(provingSystem: IProvingSystem, chain?: Chain) {\n this.provingSystem = provingSystem;\n this.chain = chain;\n }\n\n /**\n * Get the verifying key from the last proof generation.\n * Only available after calling prove() with a chain configured.\n */\n get vk(): VerifyingKeyData | undefined {\n return this._verifyingKey;\n }\n\n /**\n * Get the configured chain, if any.\n */\n get targetChain(): Chain | undefined {\n return this.chain;\n }\n\n /**\n * Check if operating in offchain mode (no chain configured).\n */\n get isOffchain(): boolean {\n return this.chain === undefined;\n }\n\n /**\n * Register a chain formatter for chain-specific proof formatting.\n *\n * @param formatter - The chain formatter to register\n */\n registerChainFormatter<T extends ChainId>(formatter: IChainFormatter<T>): void {\n this.chainFormatters.set(formatter.chainId, formatter);\n }\n\n /**\n * Get a registered chain formatter.\n *\n * @param chainId - The chain ID to get the formatter for\n * @returns The formatter or undefined if not registered\n */\n getChainFormatter<T extends ChainId>(chainId: T): IChainFormatter<T> | undefined {\n return this.chainFormatters.get(chainId) as IChainFormatter<T> | undefined;\n }\n\n /**\n * Initialize IziNoir with the specified provider and optional chain.\n *\n * @param config - Configuration specifying the provider, chain, and optional circuit paths\n * @returns Initialized IziNoir instance\n *\n * @example\n * ```typescript\n * // On-chain mode (Solana)\n * const izi = await IziNoir.init({\n * provider: Provider.Arkworks,\n * chain: Chain.Solana\n * });\n *\n * // Offchain mode (no chain formatting)\n * const iziOffchain = await IziNoir.init({\n * provider: Provider.Arkworks\n * });\n *\n * // Barretenberg (browser-compatible, ~16KB proofs, offchain only)\n * const bb = await IziNoir.init({ provider: Provider.Barretenberg });\n * ```\n */\n static async init(config: IziNoirConfig): Promise<IziNoir> {\n // Initialize WASM (no-op if already initialized)\n await initNoirWasm();\n\n let provingSystem: IProvingSystem;\n\n switch (config.provider) {\n case Provider.Barretenberg: {\n if (config.chain) {\n throw new Error(\n 'Barretenberg provider does not support chain formatting. ' +\n 'Use Provider.Arkworks for on-chain proofs.'\n );\n }\n const { Barretenberg } = await import('./infra/provingSystems/Barretenberg.js');\n provingSystem = new Barretenberg();\n return new IziNoir(provingSystem);\n }\n case Provider.Arkworks: {\n const { ArkworksWasm } = await import('./infra/provingSystems/ArkworksWasm.js');\n const arkworksInstance = new ArkworksWasm();\n provingSystem = arkworksInstance;\n\n const instance = new IziNoir(provingSystem, config.chain);\n\n // Auto-register SolanaFormatter if chain is Solana or for backwards compatibility\n if (config.chain === Chain.Solana || !config.chain) {\n const { SolanaFormatter } = await import('./infra/chainFormatters/SolanaFormatter.js');\n instance.registerChainFormatter(new SolanaFormatter(arkworksInstance));\n }\n\n return instance;\n }\n case Provider.Sunspot: {\n throw new Error(\n 'Sunspot is not available in the main entry point. ' +\n 'Import from \"@izi-noir/sdk/sunspot\" for Sunspot support.'\n );\n }\n default:\n throw new Error(`Unknown provider: ${config.provider}`);\n }\n }\n\n /**\n * Get the underlying proving system instance.\n * Useful for advanced use cases.\n */\n getProvingSystem(): IProvingSystem {\n return this.provingSystem;\n }\n\n /**\n * Get the currently compiled circuit, if any.\n */\n getCompiledCircuit(): CompiledCircuit | null {\n return this.compiledCircuit;\n }\n\n /**\n * Compile Noir code into a circuit.\n *\n * @param noirCode - The Noir source code to compile\n * @returns The compiled circuit\n */\n async compile(noirCode: string): Promise<CompiledCircuit> {\n this.compiledCircuit = await this.provingSystem.compile(noirCode);\n return this.compiledCircuit;\n }\n\n /**\n * Generate a proof for the given inputs.\n *\n * If a chain is configured, returns chain-formatted proof data and stores\n * the verifying key in `this.vk`. Otherwise, returns raw proof data.\n *\n * @param inputs - The inputs (both public and private) for the circuit\n * @param circuit - Optional circuit to use (defaults to last compiled circuit)\n * @returns The proof data - type depends on configured chain\n * @throws Error if no circuit is available\n *\n * @example\n * ```typescript\n * // With chain configured - returns SolanaProofData\n * const izi = await IziNoir.init({ provider: Provider.Arkworks, chain: Chain.Solana });\n * await izi.compile(noirCode);\n * const proof = await izi.prove({ expected: '100', secret: '10' });\n * // proof is SolanaProofData, izi.vk is available\n *\n * // Offchain mode - returns ProofData\n * const iziOffchain = await IziNoir.init({ provider: Provider.Arkworks });\n * await iziOffchain.compile(noirCode);\n * const rawProof = await iziOffchain.prove({ expected: '100', secret: '10' });\n * // rawProof is ProofData, iziOffchain.vk is undefined\n * ```\n */\n async prove(inputs: InputMap, circuit?: CompiledCircuit): Promise<ProofData | SolanaProofData> {\n const circuitToUse = circuit || this.compiledCircuit;\n if (!circuitToUse) {\n throw new Error('No circuit available. Call compile() first or provide a circuit.');\n }\n\n // Generate raw proof\n const rawProof = await this.provingSystem.generateProof(circuitToUse, inputs);\n\n // If no chain configured, return raw proof (offchain mode)\n if (!this.chain) {\n this._lastProof = rawProof;\n return rawProof;\n }\n\n // Get formatter for the configured chain\n const formatter = this.chainFormatters.get(this.chain);\n if (!formatter) {\n throw new Error(\n `No formatter registered for chain: ${this.chain}. ` +\n 'This is an internal error - please report it.'\n );\n }\n\n // Build circuit metadata\n const metadata: CircuitMetadata = {\n numPublicInputs: rawProof.publicInputs.length,\n };\n\n // Format for target chain\n const formattedProof = await formatter.formatProof(rawProof, circuitToUse, metadata);\n const chainProof = formattedProof as unknown as SolanaProofData;\n\n // Store VK on instance\n this._verifyingKey = chainProof.verifyingKey;\n this._lastProof = chainProof;\n\n return chainProof;\n }\n\n /**\n * Verify a proof.\n * Available in both on-chain and offchain modes.\n *\n * @param proof - The proof bytes to verify\n * @param publicInputs - The public inputs that were used\n * @param circuit - Optional circuit to use (defaults to last compiled circuit)\n * @returns true if the proof is valid, false otherwise\n * @throws Error if no circuit is available\n */\n async verify(\n proof: Uint8Array,\n publicInputs: string[],\n circuit?: CompiledCircuit\n ): Promise<boolean> {\n const circuitToUse = circuit || this.compiledCircuit;\n if (!circuitToUse) {\n throw new Error('No circuit available. Call compile() first or provide a circuit.');\n }\n return this.provingSystem.verifyProof(circuitToUse, proof, publicInputs);\n }\n\n /**\n * Convenience method: compile, prove, and verify in one call.\n *\n * @param noirCode - The Noir source code to compile\n * @param inputs - The inputs (both public and private) for the circuit\n * @returns Object containing proof data and verification result\n *\n * @example\n * ```typescript\n * const { proof, verified } = await izi.createProof(noirCode, {\n * x: '100',\n * y: '10',\n * });\n * console.log(`Verified: ${verified}`);\n * ```\n */\n async createProof(\n noirCode: string,\n inputs: InputMap\n ): Promise<{ proof: ProofData | SolanaProofData; verified: boolean }> {\n const circuit = await this.compile(noirCode);\n const proof = await this.prove(inputs, circuit);\n\n // For verification, extract raw proof bytes\n const proofBytes =\n 'proof' in proof && proof.proof instanceof Uint8Array\n ? proof.proof\n : (proof as SolanaProofData).proof.bytes;\n const pubInputs = Array.isArray(proof.publicInputs)\n ? (proof.publicInputs as string[])\n : (proof as SolanaProofData).publicInputs.hex;\n\n const verified = await this.verify(proofBytes, pubInputs, circuit);\n return { proof, verified };\n }\n\n /**\n * Get deployment data for the verifying key.\n * Returns the data needed to deploy to the configured blockchain.\n * Use with SolanaTransactionBuilder to build and send the transaction.\n *\n * @param options - Optional configuration\n * @returns Deployment data that can be used with SolanaTransactionBuilder\n * @throws Error if no chain is configured (offchain mode)\n * @throws Error if prove() hasn't been called yet\n *\n * @example\n * ```typescript\n * const izi = await IziNoir.init({ provider: Provider.Arkworks, chain: Chain.Solana });\n * await izi.compile(noirCode);\n * await izi.prove(inputs);\n *\n * // Get deployment data\n * const deployData = izi.getDeployData();\n *\n * // Use with SolanaTransactionBuilder in your frontend\n * const builder = new SolanaTransactionBuilder({ programId: deployData.programId });\n * const { initVk, rentLamports, accountSize } = builder.buildInitAndVerifyInstructions(\n * deployData.proofData,\n * vkAccountPubkey,\n * authority,\n * payer\n * );\n * ```\n */\n getDeployData(options?: { programId?: string; computeUnits?: number }): SolanaDeployData {\n if (!this.chain) {\n throw new Error('Cannot deploy in offchain mode. Initialize with a chain parameter.');\n }\n\n if (!this._verifyingKey || !this._lastProof) {\n throw new Error('Must call prove() before getDeployData().');\n }\n\n if (this.chain !== Chain.Solana) {\n throw new Error(`Deployment for ${this.chain} is not yet supported.`);\n }\n\n return {\n proofData: this._lastProof as SolanaProofData,\n programId: options?.programId ?? 'EYhRED7EuMyyVjx57aDXUD9h6ArnEKng64qtz8999KrS',\n computeUnits: options?.computeUnits ?? 400_000,\n };\n }\n}\n\n// Re-export Provider, Chain and types for convenience\nexport { Provider, Chain, type IziNoirConfig, type CircuitPaths };\nexport type { SolanaProofData, VerifyingKeyData } from './domain/types.js';\nexport type {\n ChainId,\n CircuitMetadata,\n ChainMetadata,\n SolanaChainMetadata,\n EthereumChainMetadata,\n ChainMetadataFor,\n} from './domain/types/chain.js';\nexport type {\n IChainFormatter,\n ChainProofDataFor,\n} from './domain/interfaces/chain/IChainFormatter.js';\n"],"mappings":"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","names":["module","stringToStream","isNodeJs","createTempDir","import_noir_wasm","import_noir_js","BarretenbergBackend","Provider","wasmInitPromise","isNodeJs","Barretenberg","ArkworksWasm","SolanaFormatter"]}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { d as IProvingSystem } from '../IProvingSystem-TKNofoo8.cjs';
|
|
2
|
+
export { e as CircuitPaths, I as IziNoirConfig, P as Provider } from '../IProvingSystem-TKNofoo8.cjs';
|
|
3
|
+
import { P as ProofData } from '../types-CaaigonG.cjs';
|
|
4
|
+
import { CompiledCircuit, InputMap } from '@noir-lang/types';
|
|
5
|
+
export { CompiledCircuit, InputMap } from '@noir-lang/types';
|
|
6
|
+
export { a as IziNoir, i as initNoirWasm, b as isWasmInitialized } from '../wasmInit-iEYiiB8M.cjs';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* ArkworksWasm proving system.
|
|
10
|
+
*
|
|
11
|
+
* 100% browser-compatible Groth16 prover using arkworks compiled to WASM.
|
|
12
|
+
* Produces proofs compatible with gnark-verifier-solana for on-chain verification.
|
|
13
|
+
*
|
|
14
|
+
* Features:
|
|
15
|
+
* - Runs entirely in the browser (no CLI dependencies)
|
|
16
|
+
* - Generates compact Groth16 proofs (~256 bytes)
|
|
17
|
+
* - Compatible with gnark-verifier-solana
|
|
18
|
+
* - Uses BN254 curve
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Result of Groth16 setup from arkworks WASM module
|
|
23
|
+
*/
|
|
24
|
+
interface ArkworksSetupResult {
|
|
25
|
+
/** Base64-encoded proving key */
|
|
26
|
+
proving_key: string;
|
|
27
|
+
/** Base64-encoded verifying key (arkworks format) */
|
|
28
|
+
verifying_key: string;
|
|
29
|
+
/** Base64-encoded verifying key (gnark format for Solana) */
|
|
30
|
+
verifying_key_gnark: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Result of Groth16 proof generation from arkworks WASM module
|
|
34
|
+
*/
|
|
35
|
+
interface ArkworksProofResult {
|
|
36
|
+
/** Base64-encoded proof (arkworks format) */
|
|
37
|
+
proof: string;
|
|
38
|
+
/** Base64-encoded proof (gnark format, 256 bytes) */
|
|
39
|
+
proof_gnark: string;
|
|
40
|
+
/** Public inputs as hex strings */
|
|
41
|
+
public_inputs: string[];
|
|
42
|
+
/** Base64-encoded public inputs (gnark format) */
|
|
43
|
+
public_inputs_gnark: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Interface for the arkworks-groth16-wasm WASM module
|
|
47
|
+
*/
|
|
48
|
+
interface ArkworksWasmModule {
|
|
49
|
+
setup(acirJson: string): ArkworksSetupResult;
|
|
50
|
+
prove(provingKeyB64: string, acirJson: string, witnessJson: string): ArkworksProofResult;
|
|
51
|
+
verify(verifyingKeyB64: string, proofB64: string, publicInputsJson: string): boolean;
|
|
52
|
+
verify_gnark(verifyingKeyGnarkB64: string, proofGnarkB64: string, publicInputsGnarkB64: string, numPublicInputs: number): boolean;
|
|
53
|
+
acir_to_r1cs_info(acirJson: string): {
|
|
54
|
+
num_witnesses: number;
|
|
55
|
+
num_constraints: number;
|
|
56
|
+
public_inputs: number[];
|
|
57
|
+
private_inputs: number[];
|
|
58
|
+
return_values: number[];
|
|
59
|
+
};
|
|
60
|
+
version(): string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Configuration for ArkworksWasm prover
|
|
64
|
+
*/
|
|
65
|
+
interface ArkworksWasmConfig {
|
|
66
|
+
/** Keep intermediate artifacts for debugging */
|
|
67
|
+
keepArtifacts?: boolean;
|
|
68
|
+
/** Cache proving/verifying keys for repeated proofs */
|
|
69
|
+
cacheKeys?: boolean;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extended CompiledCircuit for ArkworksWasm backend
|
|
73
|
+
*/
|
|
74
|
+
interface ArkworksCompiledCircuit extends CompiledCircuit {
|
|
75
|
+
/** Marker to identify ArkworksWasm circuits */
|
|
76
|
+
__arkworks: true;
|
|
77
|
+
/** ACIR program as JSON string (used for setup/prove) */
|
|
78
|
+
acirJson: string;
|
|
79
|
+
/** Cached proving key (base64) if cacheKeys is enabled */
|
|
80
|
+
provingKey?: string;
|
|
81
|
+
/** Cached verifying key (base64) if cacheKeys is enabled */
|
|
82
|
+
verifyingKey?: string;
|
|
83
|
+
/** Cached verifying key in gnark format (base64) */
|
|
84
|
+
verifyingKeyGnark?: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Type guard to check if a circuit is an ArkworksWasm circuit
|
|
88
|
+
*/
|
|
89
|
+
declare function isArkworksCircuit(circuit: CompiledCircuit): circuit is ArkworksCompiledCircuit;
|
|
90
|
+
/**
|
|
91
|
+
* ArkworksWasm proving system using arkworks Groth16 compiled to WASM.
|
|
92
|
+
*
|
|
93
|
+
* This proving system:
|
|
94
|
+
* - Compiles Noir code using @noir-lang/noir_wasm
|
|
95
|
+
* - Generates witness using @noir-lang/noir_js
|
|
96
|
+
* - Performs Groth16 setup/prove/verify using arkworks-groth16-wasm
|
|
97
|
+
*
|
|
98
|
+
* All operations run in the browser with no external dependencies.
|
|
99
|
+
*/
|
|
100
|
+
declare class ArkworksWasm implements IProvingSystem {
|
|
101
|
+
private readonly config;
|
|
102
|
+
constructor(config?: ArkworksWasmConfig);
|
|
103
|
+
/**
|
|
104
|
+
* Compile Noir code to a circuit with ACIR for Groth16 proving
|
|
105
|
+
*/
|
|
106
|
+
compile(noirCode: string): Promise<CompiledCircuit>;
|
|
107
|
+
/**
|
|
108
|
+
* Generate a Groth16 proof
|
|
109
|
+
*/
|
|
110
|
+
generateProof(circuit: CompiledCircuit, inputs: InputMap): Promise<ProofData>;
|
|
111
|
+
/**
|
|
112
|
+
* Verify a Groth16 proof
|
|
113
|
+
*/
|
|
114
|
+
verifyProof(circuit: CompiledCircuit, proof: Uint8Array, publicInputs: string[]): Promise<boolean>;
|
|
115
|
+
/**
|
|
116
|
+
* Get the verifying key in gnark format for on-chain deployment
|
|
117
|
+
*/
|
|
118
|
+
getVerifyingKeyGnark(circuit: CompiledCircuit): Promise<Uint8Array>;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export { type ArkworksCompiledCircuit, type ArkworksProofResult, type ArkworksSetupResult, ArkworksWasm, type ArkworksWasmConfig, type ArkworksWasmModule, IProvingSystem, ProofData, isArkworksCircuit };
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { d as IProvingSystem } from '../IProvingSystem-D9TnEig0.js';
|
|
2
|
+
export { e as CircuitPaths, I as IziNoirConfig, P as Provider } from '../IProvingSystem-D9TnEig0.js';
|
|
3
|
+
import { P as ProofData } from '../types-CaaigonG.js';
|
|
4
|
+
import { CompiledCircuit, InputMap } from '@noir-lang/types';
|
|
5
|
+
export { CompiledCircuit, InputMap } from '@noir-lang/types';
|
|
6
|
+
export { a as IziNoir, i as initNoirWasm, b as isWasmInitialized } from '../wasmInit-KV6DTj4J.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* ArkworksWasm proving system.
|
|
10
|
+
*
|
|
11
|
+
* 100% browser-compatible Groth16 prover using arkworks compiled to WASM.
|
|
12
|
+
* Produces proofs compatible with gnark-verifier-solana for on-chain verification.
|
|
13
|
+
*
|
|
14
|
+
* Features:
|
|
15
|
+
* - Runs entirely in the browser (no CLI dependencies)
|
|
16
|
+
* - Generates compact Groth16 proofs (~256 bytes)
|
|
17
|
+
* - Compatible with gnark-verifier-solana
|
|
18
|
+
* - Uses BN254 curve
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Result of Groth16 setup from arkworks WASM module
|
|
23
|
+
*/
|
|
24
|
+
interface ArkworksSetupResult {
|
|
25
|
+
/** Base64-encoded proving key */
|
|
26
|
+
proving_key: string;
|
|
27
|
+
/** Base64-encoded verifying key (arkworks format) */
|
|
28
|
+
verifying_key: string;
|
|
29
|
+
/** Base64-encoded verifying key (gnark format for Solana) */
|
|
30
|
+
verifying_key_gnark: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Result of Groth16 proof generation from arkworks WASM module
|
|
34
|
+
*/
|
|
35
|
+
interface ArkworksProofResult {
|
|
36
|
+
/** Base64-encoded proof (arkworks format) */
|
|
37
|
+
proof: string;
|
|
38
|
+
/** Base64-encoded proof (gnark format, 256 bytes) */
|
|
39
|
+
proof_gnark: string;
|
|
40
|
+
/** Public inputs as hex strings */
|
|
41
|
+
public_inputs: string[];
|
|
42
|
+
/** Base64-encoded public inputs (gnark format) */
|
|
43
|
+
public_inputs_gnark: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Interface for the arkworks-groth16-wasm WASM module
|
|
47
|
+
*/
|
|
48
|
+
interface ArkworksWasmModule {
|
|
49
|
+
setup(acirJson: string): ArkworksSetupResult;
|
|
50
|
+
prove(provingKeyB64: string, acirJson: string, witnessJson: string): ArkworksProofResult;
|
|
51
|
+
verify(verifyingKeyB64: string, proofB64: string, publicInputsJson: string): boolean;
|
|
52
|
+
verify_gnark(verifyingKeyGnarkB64: string, proofGnarkB64: string, publicInputsGnarkB64: string, numPublicInputs: number): boolean;
|
|
53
|
+
acir_to_r1cs_info(acirJson: string): {
|
|
54
|
+
num_witnesses: number;
|
|
55
|
+
num_constraints: number;
|
|
56
|
+
public_inputs: number[];
|
|
57
|
+
private_inputs: number[];
|
|
58
|
+
return_values: number[];
|
|
59
|
+
};
|
|
60
|
+
version(): string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Configuration for ArkworksWasm prover
|
|
64
|
+
*/
|
|
65
|
+
interface ArkworksWasmConfig {
|
|
66
|
+
/** Keep intermediate artifacts for debugging */
|
|
67
|
+
keepArtifacts?: boolean;
|
|
68
|
+
/** Cache proving/verifying keys for repeated proofs */
|
|
69
|
+
cacheKeys?: boolean;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extended CompiledCircuit for ArkworksWasm backend
|
|
73
|
+
*/
|
|
74
|
+
interface ArkworksCompiledCircuit extends CompiledCircuit {
|
|
75
|
+
/** Marker to identify ArkworksWasm circuits */
|
|
76
|
+
__arkworks: true;
|
|
77
|
+
/** ACIR program as JSON string (used for setup/prove) */
|
|
78
|
+
acirJson: string;
|
|
79
|
+
/** Cached proving key (base64) if cacheKeys is enabled */
|
|
80
|
+
provingKey?: string;
|
|
81
|
+
/** Cached verifying key (base64) if cacheKeys is enabled */
|
|
82
|
+
verifyingKey?: string;
|
|
83
|
+
/** Cached verifying key in gnark format (base64) */
|
|
84
|
+
verifyingKeyGnark?: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Type guard to check if a circuit is an ArkworksWasm circuit
|
|
88
|
+
*/
|
|
89
|
+
declare function isArkworksCircuit(circuit: CompiledCircuit): circuit is ArkworksCompiledCircuit;
|
|
90
|
+
/**
|
|
91
|
+
* ArkworksWasm proving system using arkworks Groth16 compiled to WASM.
|
|
92
|
+
*
|
|
93
|
+
* This proving system:
|
|
94
|
+
* - Compiles Noir code using @noir-lang/noir_wasm
|
|
95
|
+
* - Generates witness using @noir-lang/noir_js
|
|
96
|
+
* - Performs Groth16 setup/prove/verify using arkworks-groth16-wasm
|
|
97
|
+
*
|
|
98
|
+
* All operations run in the browser with no external dependencies.
|
|
99
|
+
*/
|
|
100
|
+
declare class ArkworksWasm implements IProvingSystem {
|
|
101
|
+
private readonly config;
|
|
102
|
+
constructor(config?: ArkworksWasmConfig);
|
|
103
|
+
/**
|
|
104
|
+
* Compile Noir code to a circuit with ACIR for Groth16 proving
|
|
105
|
+
*/
|
|
106
|
+
compile(noirCode: string): Promise<CompiledCircuit>;
|
|
107
|
+
/**
|
|
108
|
+
* Generate a Groth16 proof
|
|
109
|
+
*/
|
|
110
|
+
generateProof(circuit: CompiledCircuit, inputs: InputMap): Promise<ProofData>;
|
|
111
|
+
/**
|
|
112
|
+
* Verify a Groth16 proof
|
|
113
|
+
*/
|
|
114
|
+
verifyProof(circuit: CompiledCircuit, proof: Uint8Array, publicInputs: string[]): Promise<boolean>;
|
|
115
|
+
/**
|
|
116
|
+
* Get the verifying key in gnark format for on-chain deployment
|
|
117
|
+
*/
|
|
118
|
+
getVerifyingKeyGnark(circuit: CompiledCircuit): Promise<Uint8Array>;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export { type ArkworksCompiledCircuit, type ArkworksProofResult, type ArkworksSetupResult, ArkworksWasm, type ArkworksWasmConfig, type ArkworksWasmModule, IProvingSystem, ProofData, isArkworksCircuit };
|