@fluxpointstudios/orynq-sdk-midnight-prover 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.
Files changed (82) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.d.ts +78 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +89 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/linking/cardano-anchor-link.d.ts +250 -0
  7. package/dist/linking/cardano-anchor-link.d.ts.map +1 -0
  8. package/dist/linking/cardano-anchor-link.js +447 -0
  9. package/dist/linking/cardano-anchor-link.js.map +1 -0
  10. package/dist/linking/index.d.ts +33 -0
  11. package/dist/linking/index.d.ts.map +1 -0
  12. package/dist/linking/index.js +31 -0
  13. package/dist/linking/index.js.map +1 -0
  14. package/dist/linking/proof-publication.d.ts +217 -0
  15. package/dist/linking/proof-publication.d.ts.map +1 -0
  16. package/dist/linking/proof-publication.js +385 -0
  17. package/dist/linking/proof-publication.js.map +1 -0
  18. package/dist/midnight/index.d.ts +30 -0
  19. package/dist/midnight/index.d.ts.map +1 -0
  20. package/dist/midnight/index.js +27 -0
  21. package/dist/midnight/index.js.map +1 -0
  22. package/dist/midnight/proof-server-client.d.ts +236 -0
  23. package/dist/midnight/proof-server-client.d.ts.map +1 -0
  24. package/dist/midnight/proof-server-client.js +422 -0
  25. package/dist/midnight/proof-server-client.js.map +1 -0
  26. package/dist/midnight/public-inputs.d.ts +134 -0
  27. package/dist/midnight/public-inputs.d.ts.map +1 -0
  28. package/dist/midnight/public-inputs.js +338 -0
  29. package/dist/midnight/public-inputs.js.map +1 -0
  30. package/dist/midnight/witness-builder.d.ts +119 -0
  31. package/dist/midnight/witness-builder.d.ts.map +1 -0
  32. package/dist/midnight/witness-builder.js +238 -0
  33. package/dist/midnight/witness-builder.js.map +1 -0
  34. package/dist/proofs/hash-chain-proof.d.ts +171 -0
  35. package/dist/proofs/hash-chain-proof.d.ts.map +1 -0
  36. package/dist/proofs/hash-chain-proof.js +437 -0
  37. package/dist/proofs/hash-chain-proof.js.map +1 -0
  38. package/dist/proofs/index.d.ts +35 -0
  39. package/dist/proofs/index.d.ts.map +1 -0
  40. package/dist/proofs/index.js +34 -0
  41. package/dist/proofs/index.js.map +1 -0
  42. package/dist/proofs/policy-compliance-proof.d.ts +165 -0
  43. package/dist/proofs/policy-compliance-proof.d.ts.map +1 -0
  44. package/dist/proofs/policy-compliance-proof.js +514 -0
  45. package/dist/proofs/policy-compliance-proof.js.map +1 -0
  46. package/dist/proofs/selective-disclosure.d.ts +213 -0
  47. package/dist/proofs/selective-disclosure.d.ts.map +1 -0
  48. package/dist/proofs/selective-disclosure.js +629 -0
  49. package/dist/proofs/selective-disclosure.js.map +1 -0
  50. package/dist/prover-interface.d.ts +288 -0
  51. package/dist/prover-interface.d.ts.map +1 -0
  52. package/dist/prover-interface.js +114 -0
  53. package/dist/prover-interface.js.map +1 -0
  54. package/dist/prover.d.ts +163 -0
  55. package/dist/prover.d.ts.map +1 -0
  56. package/dist/prover.js +417 -0
  57. package/dist/prover.js.map +1 -0
  58. package/dist/types.d.ts +410 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +128 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +59 -0
  63. package/src/__tests__/hash-chain-proof.test.ts +709 -0
  64. package/src/__tests__/midnight-prover.test.ts +716 -0
  65. package/src/__tests__/policy-compliance.test.ts +567 -0
  66. package/src/__tests__/proof-publication.test.ts +644 -0
  67. package/src/__tests__/selective-disclosure.test.ts +921 -0
  68. package/src/index.ts +260 -0
  69. package/src/linking/cardano-anchor-link.ts +682 -0
  70. package/src/linking/index.ts +58 -0
  71. package/src/linking/proof-publication.ts +557 -0
  72. package/src/midnight/index.ts +73 -0
  73. package/src/midnight/proof-server-client.ts +595 -0
  74. package/src/midnight/public-inputs.ts +590 -0
  75. package/src/midnight/witness-builder.ts +341 -0
  76. package/src/proofs/hash-chain-proof.ts +610 -0
  77. package/src/proofs/index.ts +77 -0
  78. package/src/proofs/policy-compliance-proof.ts +717 -0
  79. package/src/proofs/selective-disclosure.ts +839 -0
  80. package/src/prover-interface.ts +410 -0
  81. package/src/prover.ts +537 -0
  82. package/src/types.ts +551 -0
@@ -0,0 +1,410 @@
1
+ /**
2
+ * @fileoverview MidnightProver interface definition.
3
+ *
4
+ * Location: packages/midnight-prover/src/prover-interface.ts
5
+ *
6
+ * Summary:
7
+ * This file defines the abstract interface for ZK proof generation using the Midnight network.
8
+ * Implementations will connect to the Midnight proof server and generate various types of
9
+ * zero-knowledge proofs for PoI trace verification.
10
+ *
11
+ * Usage:
12
+ * The MidnightProver interface is implemented by concrete prover classes that connect to
13
+ * the Midnight proof server. It integrates with:
14
+ * - poi-process-trace: For TraceEvent and TraceBundle data
15
+ * - poi-attestor: For AttestationBundle verification in ZK
16
+ * - poi-anchors-cardano: For cross-chain binding to Cardano L1 anchors
17
+ *
18
+ * The prover is used after a trace is recorded and anchored on Cardano,
19
+ * enabling privacy-preserving verification of trace properties.
20
+ */
21
+
22
+ import type {
23
+ ProofServerConfig,
24
+ HashChainInput,
25
+ HashChainProof,
26
+ PolicyInput,
27
+ PolicyProof,
28
+ AttestationInput,
29
+ AttestationProof,
30
+ DisclosureInput,
31
+ DisclosureProof,
32
+ InferenceInput,
33
+ InferenceProof,
34
+ AnyProof,
35
+ PublicationResult,
36
+ ProofVerificationResult,
37
+ } from "./types.js";
38
+
39
+ /**
40
+ * Abstract interface for Midnight ZK prover.
41
+ *
42
+ * The MidnightProver provides methods to:
43
+ * 1. Connect to a Midnight proof server
44
+ * 2. Generate various types of ZK proofs
45
+ * 3. Publish proofs to the Midnight network
46
+ * 4. Verify existing proofs
47
+ *
48
+ * All proofs are bound to a Cardano anchor transaction, creating a
49
+ * cross-chain link between the PoI trace on Cardano and the ZK proof on Midnight.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * import { MidnightProver, createMidnightProver } from '@fluxpointstudios/orynq-sdk-midnight-prover';
54
+ *
55
+ * const prover = createMidnightProver();
56
+ * await prover.connect({ proofServerUrl: 'https://proof.midnight.network', timeout: 300000, retries: 3 });
57
+ *
58
+ * // Generate hash chain proof
59
+ * const proof = await prover.proveHashChain({
60
+ * events: traceBundle.privateRun.events,
61
+ * genesisHash: '0x00...00',
62
+ * expectedRootHash: traceBundle.rootHash,
63
+ * cardanoAnchorTxHash: 'abc123...',
64
+ * });
65
+ *
66
+ * // Publish to Midnight
67
+ * const result = await prover.publish(proof);
68
+ * console.log('Published:', result.midnightTxHash);
69
+ * ```
70
+ */
71
+ export interface MidnightProver {
72
+ // ===========================================================================
73
+ // CONNECTION
74
+ // ===========================================================================
75
+
76
+ /**
77
+ * Connect to the Midnight proof server.
78
+ * Must be called before generating proofs.
79
+ *
80
+ * @param config - Proof server configuration
81
+ * @throws MidnightProverException on connection failure
82
+ */
83
+ connect(config: ProofServerConfig): Promise<void>;
84
+
85
+ /**
86
+ * Disconnect from the proof server.
87
+ * Releases any held resources.
88
+ */
89
+ disconnect(): Promise<void>;
90
+
91
+ /**
92
+ * Check if connected to the proof server.
93
+ */
94
+ isConnected(): boolean;
95
+
96
+ /**
97
+ * Get the current connection configuration.
98
+ * Returns undefined if not connected.
99
+ */
100
+ getConfig(): ProofServerConfig | undefined;
101
+
102
+ // ===========================================================================
103
+ // PROOF GENERATION
104
+ // ===========================================================================
105
+
106
+ /**
107
+ * Generate a hash chain validity proof.
108
+ *
109
+ * Proves that a sequence of events produces the expected rolling hash
110
+ * without revealing the event contents. This is the most common proof type.
111
+ *
112
+ * @param input - Hash chain input with events and expected hash
113
+ * @returns Hash chain proof with public inputs
114
+ * @throws MidnightProverException on failure
115
+ */
116
+ proveHashChain(input: HashChainInput): Promise<HashChainProof>;
117
+
118
+ /**
119
+ * Generate a policy compliance proof.
120
+ *
121
+ * Proves that content passed a specified policy without revealing
122
+ * the actual content. Useful for demonstrating compliance with
123
+ * content moderation or safety policies.
124
+ *
125
+ * @param input - Policy input with content hashes and policy definition
126
+ * @returns Policy compliance proof
127
+ * @throws MidnightProverException on failure
128
+ */
129
+ provePolicyCompliance(input: PolicyInput): Promise<PolicyProof>;
130
+
131
+ /**
132
+ * Generate an attestation validity proof.
133
+ *
134
+ * Proves that a TEE attestation is valid and binds to the expected
135
+ * hash, without revealing the full attestation evidence. This allows
136
+ * verifying authenticity without exposing TEE-specific details.
137
+ *
138
+ * @param input - Attestation input with bundle and policy
139
+ * @returns Attestation validity proof
140
+ * @throws MidnightProverException on failure
141
+ */
142
+ proveAttestation(input: AttestationInput): Promise<AttestationProof>;
143
+
144
+ /**
145
+ * Generate a selective disclosure proof.
146
+ *
147
+ * Proves that a specific span exists in a trace bundle (via Merkle
148
+ * membership) without revealing other spans. Optionally includes
149
+ * the span data for full disclosure.
150
+ *
151
+ * @param input - Disclosure input with bundle and span ID
152
+ * @returns Selective disclosure proof with optional span data
153
+ * @throws MidnightProverException on failure
154
+ */
155
+ proveSelectiveDisclosure(input: DisclosureInput): Promise<DisclosureProof>;
156
+
157
+ /**
158
+ * Generate a zkML inference proof.
159
+ *
160
+ * WARNING: This is extremely expensive. Only use for high-stakes scenarios.
161
+ *
162
+ * Proves that a model produced a specific output for a given input,
163
+ * demonstrating correctness of inference. Limited to small models
164
+ * due to circuit constraints.
165
+ *
166
+ * @param input - Inference input with model and token data
167
+ * @returns Inference proof with metrics
168
+ * @throws MidnightProverException on failure (may be unsupported)
169
+ */
170
+ proveInference?(input: InferenceInput): Promise<InferenceProof>;
171
+
172
+ // ===========================================================================
173
+ // PUBLICATION
174
+ // ===========================================================================
175
+
176
+ /**
177
+ * Publish a proof to the Midnight network.
178
+ *
179
+ * The proof is recorded on-chain and linked to the Cardano anchor
180
+ * specified in the proof's public inputs.
181
+ *
182
+ * @param proof - Any proof type to publish
183
+ * @returns Publication result with Midnight transaction hash
184
+ * @throws MidnightProverException on failure
185
+ */
186
+ publish(proof: AnyProof): Promise<PublicationResult>;
187
+
188
+ // ===========================================================================
189
+ // VERIFICATION
190
+ // ===========================================================================
191
+
192
+ /**
193
+ * Verify a proof locally (without on-chain verification).
194
+ *
195
+ * This checks the proof's cryptographic validity but does not
196
+ * verify on-chain publication or Cardano anchor linkage.
197
+ *
198
+ * @param proof - Proof to verify
199
+ * @returns Verification result
200
+ */
201
+ verify(proof: AnyProof): Promise<ProofVerificationResult>;
202
+
203
+ /**
204
+ * Fetch a proof from the Midnight network by ID.
205
+ *
206
+ * @param proofId - Unique proof identifier
207
+ * @returns The proof if found, undefined otherwise
208
+ */
209
+ fetchProof(proofId: string): Promise<AnyProof | undefined>;
210
+
211
+ /**
212
+ * Check if a proof has been published to Midnight.
213
+ *
214
+ * @param proofId - Unique proof identifier
215
+ * @returns True if the proof exists on-chain
216
+ */
217
+ isPublished(proofId: string): Promise<boolean>;
218
+ }
219
+
220
+ /**
221
+ * Factory function type for creating MidnightProver instances.
222
+ */
223
+ export type MidnightProverFactory = () => MidnightProver;
224
+
225
+ /**
226
+ * Options for creating a MidnightProver.
227
+ */
228
+ export interface CreateMidnightProverOptions {
229
+ /**
230
+ * Enable debug logging.
231
+ */
232
+ debug?: boolean;
233
+
234
+ /**
235
+ * Custom circuit definitions directory.
236
+ */
237
+ circuitsDir?: string;
238
+
239
+ /**
240
+ * Enable zkML inference proofs (experimental).
241
+ */
242
+ enableInference?: boolean;
243
+ }
244
+
245
+ // =============================================================================
246
+ // ABSTRACT BASE CLASS
247
+ // =============================================================================
248
+
249
+ /**
250
+ * Abstract base class for MidnightProver implementations.
251
+ * Provides common functionality and state management.
252
+ */
253
+ export abstract class AbstractMidnightProver implements MidnightProver {
254
+ protected config: ProofServerConfig | undefined;
255
+ protected connected = false;
256
+
257
+ /**
258
+ * Connect to the proof server.
259
+ */
260
+ async connect(config: ProofServerConfig): Promise<void> {
261
+ this.config = config;
262
+ await this.doConnect(config);
263
+ this.connected = true;
264
+ }
265
+
266
+ /**
267
+ * Disconnect from the proof server.
268
+ */
269
+ async disconnect(): Promise<void> {
270
+ if (this.connected) {
271
+ await this.doDisconnect();
272
+ this.connected = false;
273
+ }
274
+ }
275
+
276
+ /**
277
+ * Check connection status.
278
+ */
279
+ isConnected(): boolean {
280
+ return this.connected;
281
+ }
282
+
283
+ /**
284
+ * Get current configuration.
285
+ */
286
+ getConfig(): ProofServerConfig | undefined {
287
+ return this.config;
288
+ }
289
+
290
+ /**
291
+ * Ensure connected before operations.
292
+ * @throws MidnightProverException if not connected
293
+ */
294
+ protected ensureConnected(): void {
295
+ if (!this.connected) {
296
+ throw new Error("Not connected to proof server. Call connect() first.");
297
+ }
298
+ }
299
+
300
+ // Abstract methods for subclasses to implement
301
+ protected abstract doConnect(config: ProofServerConfig): Promise<void>;
302
+ protected abstract doDisconnect(): Promise<void>;
303
+
304
+ abstract proveHashChain(input: HashChainInput): Promise<HashChainProof>;
305
+ abstract provePolicyCompliance(input: PolicyInput): Promise<PolicyProof>;
306
+ abstract proveAttestation(input: AttestationInput): Promise<AttestationProof>;
307
+ abstract proveSelectiveDisclosure(input: DisclosureInput): Promise<DisclosureProof>;
308
+ abstract proveInference?(input: InferenceInput): Promise<InferenceProof>;
309
+ abstract publish(proof: AnyProof): Promise<PublicationResult>;
310
+ abstract verify(proof: AnyProof): Promise<ProofVerificationResult>;
311
+ abstract fetchProof(proofId: string): Promise<AnyProof | undefined>;
312
+ abstract isPublished(proofId: string): Promise<boolean>;
313
+ }
314
+
315
+ // =============================================================================
316
+ // REGISTRY
317
+ // =============================================================================
318
+
319
+ /**
320
+ * Registry for MidnightProver implementations.
321
+ * Allows pluggable prover backends.
322
+ */
323
+ export interface MidnightProverRegistry {
324
+ /**
325
+ * Register a prover factory.
326
+ *
327
+ * @param name - Unique name for this prover backend
328
+ * @param factory - Factory function to create the prover
329
+ */
330
+ register(name: string, factory: MidnightProverFactory): void;
331
+
332
+ /**
333
+ * Get a prover by name.
334
+ *
335
+ * @param name - Name of the registered prover
336
+ * @returns Prover instance or undefined if not found
337
+ */
338
+ get(name: string): MidnightProver | undefined;
339
+
340
+ /**
341
+ * Get the default prover.
342
+ *
343
+ * @returns Default prover instance
344
+ * @throws Error if no default is registered
345
+ */
346
+ getDefault(): MidnightProver;
347
+
348
+ /**
349
+ * List registered prover names.
350
+ */
351
+ listProvers(): string[];
352
+
353
+ /**
354
+ * Set the default prover name.
355
+ *
356
+ * @param name - Name of the prover to use as default
357
+ */
358
+ setDefault(name: string): void;
359
+ }
360
+
361
+ /**
362
+ * Default implementation of MidnightProverRegistry.
363
+ */
364
+ export class DefaultMidnightProverRegistry implements MidnightProverRegistry {
365
+ private factories = new Map<string, MidnightProverFactory>();
366
+ private defaultName: string | undefined;
367
+
368
+ register(name: string, factory: MidnightProverFactory): void {
369
+ this.factories.set(name, factory);
370
+ // First registered becomes default
371
+ if (this.defaultName === undefined) {
372
+ this.defaultName = name;
373
+ }
374
+ }
375
+
376
+ get(name: string): MidnightProver | undefined {
377
+ const factory = this.factories.get(name);
378
+ if (factory === undefined) {
379
+ return undefined;
380
+ }
381
+ return factory();
382
+ }
383
+
384
+ getDefault(): MidnightProver {
385
+ if (this.defaultName === undefined) {
386
+ throw new Error("No prover registered");
387
+ }
388
+ const prover = this.get(this.defaultName);
389
+ if (prover === undefined) {
390
+ throw new Error(`Default prover '${this.defaultName}' not found`);
391
+ }
392
+ return prover;
393
+ }
394
+
395
+ listProvers(): string[] {
396
+ return Array.from(this.factories.keys());
397
+ }
398
+
399
+ setDefault(name: string): void {
400
+ if (!this.factories.has(name)) {
401
+ throw new Error(`Prover '${name}' not registered`);
402
+ }
403
+ this.defaultName = name;
404
+ }
405
+ }
406
+
407
+ /**
408
+ * Global prover registry instance.
409
+ */
410
+ export const proverRegistry = new DefaultMidnightProverRegistry();