@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,629 @@
1
+ /**
2
+ * @fileoverview Selective disclosure proof generation and verification.
3
+ *
4
+ * Location: packages/midnight-prover/src/proofs/selective-disclosure.ts
5
+ *
6
+ * Summary:
7
+ * This module implements the SelectiveDisclosureProver class which generates ZK proofs
8
+ * demonstrating that a specific span exists in a trace bundle without revealing other
9
+ * spans. It uses Merkle proofs for inclusion verification and supports optional
10
+ * disclosure of the span and event data.
11
+ *
12
+ * Usage:
13
+ * - Used by the MidnightProver to generate selective disclosure proofs
14
+ * - Integrates with process-trace Merkle tree utilities
15
+ * - Binds proofs to Cardano anchor transactions for cross-chain verification
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * import { SelectiveDisclosureProver } from './selective-disclosure.js';
20
+ *
21
+ * const prover = new SelectiveDisclosureProver();
22
+ *
23
+ * const proof = await prover.generateProof({
24
+ * bundle: traceBundle,
25
+ * spanId: 'span-123',
26
+ * merkleRoot: traceBundle.merkleRoot,
27
+ * cardanoAnchorTxHash: 'txhash...',
28
+ * });
29
+ *
30
+ * const isValid = await prover.verifyProof(proof);
31
+ * ```
32
+ */
33
+ import { sha256StringHex, canonicalize, } from "@fluxpointstudios/orynq-sdk-core/utils";
34
+ import { MidnightProverError, MidnightProverException, } from "../types.js";
35
+ /**
36
+ * Domain separation prefixes for selective disclosure proofs.
37
+ */
38
+ const DISCLOSURE_DOMAIN_PREFIXES = {
39
+ proof: "poi-prover:disclosure:v1|",
40
+ witness: "poi-prover:disclosure-witness:v1|",
41
+ publicInput: "poi-prover:disclosure-input:v1|",
42
+ span: "poi-trace:span:v1|",
43
+ leaf: "poi-trace:leaf:v1|",
44
+ node: "poi-trace:node:v1|",
45
+ };
46
+ // =============================================================================
47
+ // MERKLE UTILITIES
48
+ // =============================================================================
49
+ /**
50
+ * Compute the hash for a span including its event hashes.
51
+ *
52
+ * The span hash is computed as:
53
+ * H("poi-trace:span:v1|" + canon(spanHeaderWithoutHash) + "|" + eventHashes joined by "|")
54
+ *
55
+ * @param span - The span to compute hash for
56
+ * @param eventHashes - Array of event hashes in sequence order
57
+ * @returns Promise resolving to the span hash as a hex string
58
+ */
59
+ export async function computeSpanHash(span, eventHashes) {
60
+ // Extract span header (all fields except hash)
61
+ const spanHeader = {
62
+ id: span.id,
63
+ spanSeq: span.spanSeq,
64
+ name: span.name,
65
+ status: span.status,
66
+ visibility: span.visibility,
67
+ startedAt: span.startedAt,
68
+ eventIds: span.eventIds,
69
+ childSpanIds: span.childSpanIds,
70
+ };
71
+ // Include optional fields only if they exist
72
+ if (span.parentSpanId !== undefined) {
73
+ spanHeader.parentSpanId = span.parentSpanId;
74
+ }
75
+ if (span.endedAt !== undefined) {
76
+ spanHeader.endedAt = span.endedAt;
77
+ }
78
+ if (span.durationMs !== undefined) {
79
+ spanHeader.durationMs = span.durationMs;
80
+ }
81
+ if (span.metadata !== undefined) {
82
+ spanHeader.metadata = span.metadata;
83
+ }
84
+ // Canonicalize the span header
85
+ const canonicalHeader = canonicalize(spanHeader, { removeNulls: true });
86
+ // Build the hash input: prefix + canon(header) + "|" + eventHashes joined by "|"
87
+ let hashInput = DISCLOSURE_DOMAIN_PREFIXES.span + canonicalHeader;
88
+ // Append event hashes if any exist
89
+ if (eventHashes.length > 0) {
90
+ hashInput += "|" + eventHashes.join("|");
91
+ }
92
+ return sha256StringHex(hashInput);
93
+ }
94
+ /**
95
+ * Compute the leaf hash for a span.
96
+ *
97
+ * The leaf hash is computed as: H("poi-trace:leaf:v1|" + spanHash)
98
+ *
99
+ * @param spanHash - The span hash
100
+ * @returns Promise resolving to the leaf hash
101
+ */
102
+ export async function computeLeafHash(spanHash) {
103
+ return sha256StringHex(DISCLOSURE_DOMAIN_PREFIXES.leaf + spanHash);
104
+ }
105
+ /**
106
+ * Compute the parent node hash from two children.
107
+ *
108
+ * The node hash is computed as: H("poi-trace:node:v1|" + left + "|" + right)
109
+ *
110
+ * @param left - Left child hash
111
+ * @param right - Right child hash
112
+ * @returns Promise resolving to the parent node hash
113
+ */
114
+ export async function computeNodeHash(left, right) {
115
+ return sha256StringHex(DISCLOSURE_DOMAIN_PREFIXES.node + left + "|" + right);
116
+ }
117
+ /**
118
+ * Generate a Merkle inclusion proof for a span in a bundle.
119
+ *
120
+ * @param bundle - The trace bundle containing the span
121
+ * @param spanId - ID of the span to prove inclusion for
122
+ * @returns MerkleInclusionResult with proof and span data
123
+ * @throws MidnightProverException if span not found
124
+ */
125
+ export async function generateMerkleInclusionProof(bundle, spanId) {
126
+ const { privateRun } = bundle;
127
+ const spans = privateRun.spans;
128
+ const events = privateRun.events;
129
+ // Find the span
130
+ const span = spans.find((s) => s.id === spanId);
131
+ if (!span) {
132
+ throw new MidnightProverException(MidnightProverError.SPAN_NOT_FOUND, `Span not found: ${spanId}`);
133
+ }
134
+ // Create event map for quick lookup
135
+ const eventMap = new Map();
136
+ for (const event of events) {
137
+ eventMap.set(event.id, event);
138
+ }
139
+ // Get events for this span in seq order
140
+ const spanEvents = span.eventIds
141
+ .map((id) => eventMap.get(id))
142
+ .filter((e) => e !== undefined)
143
+ .sort((a, b) => a.seq - b.seq);
144
+ const eventHashes = spanEvents.map((e) => e.hash ?? "");
145
+ // Compute span hash
146
+ const spanHash = await computeSpanHash(span, eventHashes);
147
+ // Sort spans by spanSeq for consistent ordering
148
+ const sortedSpans = [...spans].sort((a, b) => a.spanSeq - b.spanSeq);
149
+ const spanIndex = sortedSpans.findIndex((s) => s.id === spanId);
150
+ if (spanIndex === -1) {
151
+ throw new MidnightProverException(MidnightProverError.SPAN_NOT_FOUND, `Span not found in sorted spans: ${spanId}`);
152
+ }
153
+ // Build leaf hashes for all spans
154
+ const leafHashes = [];
155
+ for (const s of sortedSpans) {
156
+ const sEvents = s.eventIds
157
+ .map((id) => eventMap.get(id))
158
+ .filter((e) => e !== undefined)
159
+ .sort((a, b) => a.seq - b.seq);
160
+ const sEventHashes = sEvents.map((e) => e.hash ?? "");
161
+ const sSpanHash = await computeSpanHash(s, sEventHashes);
162
+ const sLeafHash = await computeLeafHash(sSpanHash);
163
+ leafHashes.push(sLeafHash);
164
+ }
165
+ // Compute the leaf hash for the target span
166
+ const leafHash = await computeLeafHash(spanHash);
167
+ // Generate Merkle proof (sibling path from leaf to root)
168
+ const siblings = [];
169
+ if (leafHashes.length > 1) {
170
+ let currentLevel = [...leafHashes];
171
+ let currentIndex = spanIndex;
172
+ while (currentLevel.length > 1) {
173
+ const isLeftChild = currentIndex % 2 === 0;
174
+ const siblingIndex = isLeftChild ? currentIndex + 1 : currentIndex - 1;
175
+ // Handle odd-leaf case: if no sibling exists, duplicate current
176
+ let siblingHash;
177
+ if (siblingIndex >= currentLevel.length) {
178
+ const currentHash = currentLevel[currentIndex];
179
+ if (!currentHash) {
180
+ throw new MidnightProverException(MidnightProverError.PROOF_GENERATION_FAILED, "Unexpected undefined hash at current index");
181
+ }
182
+ siblingHash = currentHash;
183
+ }
184
+ else {
185
+ const hash = currentLevel[siblingIndex];
186
+ if (!hash) {
187
+ throw new MidnightProverException(MidnightProverError.PROOF_GENERATION_FAILED, "Unexpected undefined hash at sibling index");
188
+ }
189
+ siblingHash = hash;
190
+ }
191
+ siblings.push({
192
+ hash: siblingHash,
193
+ position: isLeftChild ? "right" : "left",
194
+ });
195
+ // Build next level
196
+ const nextLevel = [];
197
+ for (let i = 0; i < currentLevel.length; i += 2) {
198
+ const left = currentLevel[i] ?? "";
199
+ const right = i + 1 < currentLevel.length ? (currentLevel[i + 1] ?? left) : left;
200
+ const parentHash = await computeNodeHash(left, right);
201
+ nextLevel.push(parentHash);
202
+ }
203
+ currentLevel = nextLevel;
204
+ currentIndex = Math.floor(currentIndex / 2);
205
+ }
206
+ }
207
+ // Compute root hash for verification
208
+ const rootHash = leafHashes.length === 1 ? leafHashes[0] : await computeMerkleRoot(leafHashes);
209
+ if (!rootHash) {
210
+ throw new MidnightProverException(MidnightProverError.PROOF_GENERATION_FAILED, "Failed to compute Merkle root");
211
+ }
212
+ const merkleProof = {
213
+ leafHash,
214
+ leafIndex: spanIndex,
215
+ siblings,
216
+ rootHash,
217
+ };
218
+ return {
219
+ spanHash,
220
+ leafHash,
221
+ merkleProof,
222
+ span,
223
+ events: spanEvents,
224
+ };
225
+ }
226
+ /**
227
+ * Compute the Merkle root from leaf hashes.
228
+ *
229
+ * @param leafHashes - Array of leaf hashes
230
+ * @returns Promise resolving to the Merkle root hash
231
+ */
232
+ export async function computeMerkleRoot(leafHashes) {
233
+ if (leafHashes.length === 0) {
234
+ return "";
235
+ }
236
+ if (leafHashes.length === 1) {
237
+ return leafHashes[0] ?? "";
238
+ }
239
+ let currentLevel = [...leafHashes];
240
+ while (currentLevel.length > 1) {
241
+ const nextLevel = [];
242
+ for (let i = 0; i < currentLevel.length; i += 2) {
243
+ const left = currentLevel[i] ?? "";
244
+ const right = i + 1 < currentLevel.length ? (currentLevel[i + 1] ?? left) : left;
245
+ const parentHash = await computeNodeHash(left, right);
246
+ nextLevel.push(parentHash);
247
+ }
248
+ currentLevel = nextLevel;
249
+ }
250
+ return currentLevel[0] ?? "";
251
+ }
252
+ /**
253
+ * Verify a Merkle inclusion proof.
254
+ *
255
+ * @param proof - The Merkle proof to verify
256
+ * @returns Promise resolving to true if valid
257
+ */
258
+ export async function verifyMerkleProof(proof) {
259
+ let currentHash = proof.leafHash;
260
+ for (const sibling of proof.siblings) {
261
+ let left;
262
+ let right;
263
+ if (sibling.position === "left") {
264
+ left = sibling.hash;
265
+ right = currentHash;
266
+ }
267
+ else {
268
+ left = currentHash;
269
+ right = sibling.hash;
270
+ }
271
+ currentHash = await computeNodeHash(left, right);
272
+ }
273
+ return currentHash === proof.rootHash;
274
+ }
275
+ /**
276
+ * Verify span inclusion using the proof and span data.
277
+ *
278
+ * @param proof - The Merkle proof
279
+ * @param span - The span data
280
+ * @param events - The events belonging to the span
281
+ * @returns Promise resolving to true if span is validly included
282
+ */
283
+ export async function verifySpanInclusion(proof, span, events) {
284
+ // Sort events by seq for deterministic order
285
+ const sortedEvents = [...events].sort((a, b) => a.seq - b.seq);
286
+ const eventHashes = sortedEvents.map((e) => e.hash ?? "");
287
+ // Recompute span hash
288
+ const spanHash = await computeSpanHash(span, eventHashes);
289
+ // Compute expected leaf hash
290
+ const computedLeafHash = await computeLeafHash(spanHash);
291
+ // Verify leaf hash matches
292
+ if (computedLeafHash !== proof.leafHash) {
293
+ return false;
294
+ }
295
+ // Verify Merkle proof
296
+ return verifyMerkleProof(proof);
297
+ }
298
+ // =============================================================================
299
+ // SELECTIVE DISCLOSURE PROVER
300
+ // =============================================================================
301
+ /**
302
+ * SelectiveDisclosureProver generates and verifies ZK proofs of span membership.
303
+ *
304
+ * This prover creates a proof that a specific span exists in a trace bundle
305
+ * without revealing other spans. The proof uses Merkle tree inclusion proofs
306
+ * and optionally includes the disclosed span and event data.
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * const prover = new SelectiveDisclosureProver();
311
+ * const proof = await prover.generateProof(input);
312
+ *
313
+ * // Proof includes optional span data for verification
314
+ * console.log(proof.disclosedSpan?.name); // e.g., "inference"
315
+ * ```
316
+ */
317
+ export class SelectiveDisclosureProver {
318
+ debug;
319
+ includeSpanData;
320
+ includeEventData;
321
+ /**
322
+ * Create a new SelectiveDisclosureProver instance.
323
+ *
324
+ * @param options - Configuration options
325
+ */
326
+ constructor(options = {}) {
327
+ this.debug = options.debug ?? false;
328
+ this.includeSpanData = options.includeSpanData ?? true;
329
+ this.includeEventData = options.includeEventData ?? true;
330
+ }
331
+ /**
332
+ * Generate a selective disclosure proof.
333
+ *
334
+ * This method creates a ZK proof that a specific span exists in the
335
+ * trace bundle's Merkle tree. The proof binds to the Cardano anchor
336
+ * transaction for cross-chain verification.
337
+ *
338
+ * @param input - Selective disclosure input
339
+ * @returns Promise resolving to the disclosure proof
340
+ * @throws MidnightProverException on validation or generation failure
341
+ */
342
+ async generateProof(input) {
343
+ const startTime = performance.now();
344
+ // Validate input
345
+ this.validateInput(input);
346
+ if (this.debug) {
347
+ console.log("[SelectiveDisclosureProver] Generating proof for span:", input.spanId);
348
+ }
349
+ // Generate Merkle inclusion proof
350
+ const inclusionResult = await generateMerkleInclusionProof(input.bundle, input.spanId);
351
+ // Verify the computed root matches the expected root
352
+ if (inclusionResult.merkleProof.rootHash !== input.merkleRoot) {
353
+ throw new MidnightProverException(MidnightProverError.HASH_MISMATCH, `Computed Merkle root ${inclusionResult.merkleProof.rootHash} does not match expected ${input.merkleRoot}`);
354
+ }
355
+ // Generate proof bytes (mock implementation)
356
+ const proofBytes = await this.generateProofBytes(input, inclusionResult);
357
+ const endTime = performance.now();
358
+ const provingTimeMs = Math.round(endTime - startTime);
359
+ // Construct public inputs
360
+ const publicInputs = {
361
+ spanHash: inclusionResult.spanHash,
362
+ merkleRoot: input.merkleRoot,
363
+ cardanoAnchorTxHash: input.cardanoAnchorTxHash,
364
+ };
365
+ // Generate proof ID
366
+ const proofId = await this.generateProofId(publicInputs);
367
+ const proof = {
368
+ proofType: "selective-disclosure",
369
+ proofId,
370
+ proof: proofBytes,
371
+ createdAt: new Date().toISOString(),
372
+ provingTimeMs,
373
+ proofSizeBytes: proofBytes.length,
374
+ publicInputs,
375
+ disclosedSpan: this.includeSpanData ? inclusionResult.span : undefined,
376
+ disclosedEvents: this.includeEventData ? inclusionResult.events : undefined,
377
+ };
378
+ if (this.debug) {
379
+ console.log("[SelectiveDisclosureProver] Proof generated:", {
380
+ proofId,
381
+ spanHash: inclusionResult.spanHash,
382
+ leafIndex: inclusionResult.merkleProof.leafIndex,
383
+ siblingCount: inclusionResult.merkleProof.siblings.length,
384
+ provingTimeMs,
385
+ });
386
+ }
387
+ return proof;
388
+ }
389
+ /**
390
+ * Verify a selective disclosure proof.
391
+ *
392
+ * This method verifies the cryptographic validity of the proof and
393
+ * optionally verifies that disclosed span data matches the proof.
394
+ *
395
+ * @param proof - The disclosure proof to verify
396
+ * @returns Promise resolving to true if valid
397
+ */
398
+ async verifyProof(proof) {
399
+ try {
400
+ // Validate proof structure
401
+ if (proof.proofType !== "selective-disclosure") {
402
+ return false;
403
+ }
404
+ if (!proof.proof || proof.proof.length === 0) {
405
+ return false;
406
+ }
407
+ // Validate public inputs
408
+ const { publicInputs } = proof;
409
+ if (!publicInputs.spanHash || publicInputs.spanHash.length !== 64) {
410
+ return false;
411
+ }
412
+ if (!publicInputs.merkleRoot || publicInputs.merkleRoot.length !== 64) {
413
+ return false;
414
+ }
415
+ if (!publicInputs.cardanoAnchorTxHash || publicInputs.cardanoAnchorTxHash.length === 0) {
416
+ return false;
417
+ }
418
+ // Verify proof ID matches public inputs
419
+ const expectedProofId = await this.generateProofId(publicInputs);
420
+ if (proof.proofId !== expectedProofId) {
421
+ return false;
422
+ }
423
+ // Extract Merkle proof from proof bytes and verify
424
+ const merkleProofValid = await this.verifyProofBytes(proof.proof, publicInputs);
425
+ if (!merkleProofValid) {
426
+ return false;
427
+ }
428
+ // If disclosed span data is provided, verify it matches the span hash
429
+ if (proof.disclosedSpan && proof.disclosedEvents) {
430
+ // Note: This simplified verification doesn't check full Merkle path
431
+ // In production, we'd extract and verify the full Merkle proof
432
+ const sortedEvents = [...proof.disclosedEvents].sort((a, b) => a.seq - b.seq);
433
+ const eventHashes = sortedEvents.map((e) => e.hash ?? "");
434
+ const recomputedSpanHash = await computeSpanHash(proof.disclosedSpan, eventHashes);
435
+ if (recomputedSpanHash !== publicInputs.spanHash) {
436
+ return false;
437
+ }
438
+ }
439
+ return true;
440
+ }
441
+ catch (error) {
442
+ if (this.debug) {
443
+ console.error("[SelectiveDisclosureProver] Verification error:", error);
444
+ }
445
+ return false;
446
+ }
447
+ }
448
+ /**
449
+ * Generate a proof without disclosure (membership proof only).
450
+ *
451
+ * This creates a proof that demonstrates span existence without
452
+ * revealing any span or event data.
453
+ *
454
+ * @param input - Selective disclosure input
455
+ * @returns Promise resolving to the disclosure proof without span data
456
+ */
457
+ async generateMembershipProof(input) {
458
+ // Create a new prover instance with disclosure disabled
459
+ const membershipProver = new SelectiveDisclosureProver({
460
+ debug: this.debug,
461
+ includeSpanData: false,
462
+ includeEventData: false,
463
+ });
464
+ return membershipProver.generateProof(input);
465
+ }
466
+ // ===========================================================================
467
+ // PRIVATE METHODS
468
+ // ===========================================================================
469
+ /**
470
+ * Validate disclosure input.
471
+ */
472
+ validateInput(input) {
473
+ if (!input.bundle) {
474
+ throw new MidnightProverException(MidnightProverError.MISSING_REQUIRED_FIELD, "Trace bundle is required");
475
+ }
476
+ if (!input.spanId || input.spanId.length === 0) {
477
+ throw new MidnightProverException(MidnightProverError.MISSING_REQUIRED_FIELD, "Span ID is required");
478
+ }
479
+ if (!input.merkleRoot || input.merkleRoot.length !== 64) {
480
+ throw new MidnightProverException(MidnightProverError.INVALID_INPUT, "Invalid Merkle root: must be 64-character hex string");
481
+ }
482
+ if (!input.cardanoAnchorTxHash || input.cardanoAnchorTxHash.length === 0) {
483
+ throw new MidnightProverException(MidnightProverError.MISSING_REQUIRED_FIELD, "Cardano anchor transaction hash is required");
484
+ }
485
+ }
486
+ /**
487
+ * Generate mock proof bytes.
488
+ * In a real implementation, this would call the Midnight proof server.
489
+ */
490
+ async generateProofBytes(input, inclusion) {
491
+ // Construct witness data (private inputs)
492
+ const witnessData = canonicalize({
493
+ spanId: input.spanId,
494
+ spanHash: inclusion.spanHash,
495
+ leafHash: inclusion.leafHash,
496
+ leafIndex: inclusion.merkleProof.leafIndex,
497
+ siblings: inclusion.merkleProof.siblings,
498
+ merkleRoot: input.merkleRoot,
499
+ cardanoAnchorTxHash: input.cardanoAnchorTxHash,
500
+ });
501
+ // Generate witness hash
502
+ const witnessHash = await sha256StringHex(DISCLOSURE_DOMAIN_PREFIXES.witness + witnessData);
503
+ // Construct public input commitment
504
+ const publicInputData = canonicalize({
505
+ spanHash: inclusion.spanHash,
506
+ merkleRoot: input.merkleRoot,
507
+ cardanoAnchorTxHash: input.cardanoAnchorTxHash,
508
+ });
509
+ const publicInputHash = await sha256StringHex(DISCLOSURE_DOMAIN_PREFIXES.publicInput + publicInputData);
510
+ // Generate mock proof: commitment to witness + public inputs
511
+ const proofCommitment = await sha256StringHex(DISCLOSURE_DOMAIN_PREFIXES.proof + witnessHash + "|" + publicInputHash);
512
+ // Encode Merkle proof siblings for inclusion in proof bytes
513
+ const siblingData = inclusion.merkleProof.siblings.map((s) => ({
514
+ hash: s.hash,
515
+ pos: s.position === "left" ? 0 : 1,
516
+ }));
517
+ const siblingJson = JSON.stringify(siblingData);
518
+ const siblingBytes = new TextEncoder().encode(siblingJson);
519
+ // Construct proof bytes:
520
+ // - version (1 byte)
521
+ // - commitment (32 bytes)
522
+ // - witness hash (32 bytes)
523
+ // - sibling count (2 bytes)
524
+ // - sibling data (variable)
525
+ const proofBytes = new Uint8Array(67 + siblingBytes.length);
526
+ proofBytes[0] = 0x01; // Version 1
527
+ // Copy commitment hash
528
+ const commitmentBytes = this.hexToBytes(proofCommitment);
529
+ proofBytes.set(commitmentBytes, 1);
530
+ // Copy witness hash
531
+ const witnessBytes = this.hexToBytes(witnessHash);
532
+ proofBytes.set(witnessBytes, 33);
533
+ // Write sibling count (big-endian)
534
+ const siblingCount = inclusion.merkleProof.siblings.length;
535
+ proofBytes[65] = (siblingCount >> 8) & 0xff;
536
+ proofBytes[66] = siblingCount & 0xff;
537
+ // Copy sibling data
538
+ proofBytes.set(siblingBytes, 67);
539
+ return proofBytes;
540
+ }
541
+ /**
542
+ * Verify mock proof bytes.
543
+ */
544
+ async verifyProofBytes(proofBytes, publicInputs) {
545
+ // Check minimum proof size
546
+ if (proofBytes.length < 67) {
547
+ return false;
548
+ }
549
+ // Check version byte
550
+ if (proofBytes[0] !== 0x01) {
551
+ return false;
552
+ }
553
+ // Extract and verify commitment is non-zero
554
+ const commitmentBytes = proofBytes.slice(1, 33);
555
+ const witnessHashBytes = proofBytes.slice(33, 65);
556
+ const commitmentNonZero = commitmentBytes.some((b) => b !== 0);
557
+ const witnessNonZero = witnessHashBytes.some((b) => b !== 0);
558
+ if (!commitmentNonZero || !witnessNonZero) {
559
+ return false;
560
+ }
561
+ // Extract sibling count
562
+ const siblingCount = (proofBytes[65] << 8) | proofBytes[66];
563
+ // Extract and parse sibling data if present
564
+ if (siblingCount > 0 && proofBytes.length > 67) {
565
+ try {
566
+ const siblingJson = new TextDecoder().decode(proofBytes.slice(67));
567
+ const siblings = JSON.parse(siblingJson);
568
+ if (siblings.length !== siblingCount) {
569
+ return false;
570
+ }
571
+ // Reconstruct Merkle proof and verify
572
+ const merkleProof = {
573
+ leafHash: await computeLeafHash(publicInputs.spanHash),
574
+ leafIndex: 0, // Not needed for verification
575
+ siblings: siblings.map((s) => ({
576
+ hash: s.hash,
577
+ position: s.pos === 0 ? "left" : "right",
578
+ })),
579
+ rootHash: publicInputs.merkleRoot,
580
+ };
581
+ return verifyMerkleProof(merkleProof);
582
+ }
583
+ catch {
584
+ // JSON parse error or other issue
585
+ return false;
586
+ }
587
+ }
588
+ // For single-leaf trees (no siblings), verify leaf hash equals root
589
+ if (siblingCount === 0) {
590
+ const leafHash = await computeLeafHash(publicInputs.spanHash);
591
+ return leafHash === publicInputs.merkleRoot;
592
+ }
593
+ return true;
594
+ }
595
+ /**
596
+ * Generate proof ID from public inputs.
597
+ */
598
+ async generateProofId(publicInputs) {
599
+ const data = canonicalize({
600
+ type: "selective-disclosure",
601
+ ...publicInputs,
602
+ });
603
+ const hash = await sha256StringHex(data);
604
+ return `disclosure-proof-${hash.slice(0, 16)}`;
605
+ }
606
+ /**
607
+ * Convert hex string to bytes.
608
+ */
609
+ hexToBytes(hex) {
610
+ const bytes = new Uint8Array(hex.length / 2);
611
+ for (let i = 0; i < hex.length; i += 2) {
612
+ bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);
613
+ }
614
+ return bytes;
615
+ }
616
+ }
617
+ // =============================================================================
618
+ // FACTORY FUNCTION
619
+ // =============================================================================
620
+ /**
621
+ * Create a new SelectiveDisclosureProver instance.
622
+ *
623
+ * @param options - Configuration options
624
+ * @returns New prover instance
625
+ */
626
+ export function createSelectiveDisclosureProver(options) {
627
+ return new SelectiveDisclosureProver(options);
628
+ }
629
+ //# sourceMappingURL=selective-disclosure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selective-disclosure.js","sourceRoot":"","sources":["../../src/proofs/selective-disclosure.ts"],"names":[],"mappings":"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"}