@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,134 @@
1
+ /**
2
+ * @fileoverview Public inputs builder for ZK proofs.
3
+ *
4
+ * Location: packages/midnight-prover/src/midnight/public-inputs.ts
5
+ *
6
+ * Summary:
7
+ * This module handles the construction and serialization of public inputs
8
+ * for various ZK proof types. Public inputs are values that are visible
9
+ * to verifiers and form part of the proof statement.
10
+ *
11
+ * Usage:
12
+ * Used by proof generators to construct the public component of proofs.
13
+ * Public inputs are included in the proof and can be verified on-chain.
14
+ *
15
+ * Related files:
16
+ * - hash-chain-proof.ts: Uses buildPublicInputs for hash-chain proofs
17
+ * - witness-builder.ts: Builds the corresponding private witness
18
+ * - types.ts: Type definitions for public inputs
19
+ */
20
+ import type { ProofType, HashChainPublicInputs, PolicyPublicInputs, AttestationPublicInputs, DisclosurePublicInputs, InferencePublicInputs, AnyPublicInputs } from "../types.js";
21
+ import type { TeeType } from "@fluxpointstudios/orynq-sdk-attestor";
22
+ /**
23
+ * Input data for building hash-chain public inputs.
24
+ */
25
+ export interface HashChainPublicInputData {
26
+ rootHash: string;
27
+ eventCount: number;
28
+ cardanoAnchorTxHash: string;
29
+ }
30
+ /**
31
+ * Input data for building policy compliance public inputs.
32
+ */
33
+ export interface PolicyPublicInputData {
34
+ promptHash: string;
35
+ policyId: string;
36
+ policyVersion: string;
37
+ compliant: boolean;
38
+ cardanoAnchorTxHash: string;
39
+ }
40
+ /**
41
+ * Input data for building attestation public inputs.
42
+ */
43
+ export interface AttestationPublicInputData {
44
+ teeType: TeeType;
45
+ measurementMatch: boolean;
46
+ boundHash: string;
47
+ cardanoAnchorTxHash: string;
48
+ }
49
+ /**
50
+ * Input data for building disclosure public inputs.
51
+ */
52
+ export interface DisclosurePublicInputData {
53
+ spanHash: string;
54
+ merkleRoot: string;
55
+ cardanoAnchorTxHash: string;
56
+ }
57
+ /**
58
+ * Input data for building inference public inputs.
59
+ */
60
+ export interface InferencePublicInputData {
61
+ modelWeightDigest: string;
62
+ inputHash: string;
63
+ outputHash: string;
64
+ paramsHash: string;
65
+ cardanoAnchorTxHash: string;
66
+ }
67
+ /**
68
+ * Union type for all public input data types.
69
+ */
70
+ export type AnyPublicInputData = {
71
+ type: "hash-chain";
72
+ data: HashChainPublicInputData;
73
+ } | {
74
+ type: "policy-compliance";
75
+ data: PolicyPublicInputData;
76
+ } | {
77
+ type: "attestation-valid";
78
+ data: AttestationPublicInputData;
79
+ } | {
80
+ type: "selective-disclosure";
81
+ data: DisclosurePublicInputData;
82
+ } | {
83
+ type: "zkml-inference";
84
+ data: InferencePublicInputData;
85
+ };
86
+ /**
87
+ * Build public inputs for a ZK proof.
88
+ *
89
+ * This function constructs the public input structure for a given proof type.
90
+ * Public inputs are the values that verifiers can see and check against
91
+ * on-chain commitments (e.g., the Cardano anchor transaction).
92
+ *
93
+ * @param type - The type of proof to build public inputs for
94
+ * @param data - The input data for constructing public inputs
95
+ * @returns The constructed public inputs
96
+ * @throws Error if the data is invalid for the proof type
97
+ *
98
+ * @example
99
+ * ```typescript
100
+ * const publicInputs = buildPublicInputs("hash-chain", {
101
+ * rootHash: "abc123...",
102
+ * eventCount: 42,
103
+ * cardanoAnchorTxHash: "def456...",
104
+ * });
105
+ * ```
106
+ */
107
+ export declare function buildPublicInputs(type: "hash-chain", data: HashChainPublicInputData): HashChainPublicInputs;
108
+ export declare function buildPublicInputs(type: "policy-compliance", data: PolicyPublicInputData): PolicyPublicInputs;
109
+ export declare function buildPublicInputs(type: "attestation-valid", data: AttestationPublicInputData): AttestationPublicInputs;
110
+ export declare function buildPublicInputs(type: "selective-disclosure", data: DisclosurePublicInputData): DisclosurePublicInputs;
111
+ export declare function buildPublicInputs(type: "zkml-inference", data: InferencePublicInputData): InferencePublicInputs;
112
+ export declare function buildPublicInputs(type: ProofType, data: unknown): AnyPublicInputs;
113
+ /**
114
+ * Serialize public inputs to a binary format for circuit consumption.
115
+ *
116
+ * The binary format is:
117
+ * - 1 byte: proof type ID
118
+ * - N bytes: type-specific fields (fixed-size binary encoding)
119
+ *
120
+ * @param type - Proof type
121
+ * @param publicInputs - Public inputs to serialize
122
+ * @returns Serialized public inputs as Uint8Array
123
+ */
124
+ export declare function serializePublicInputs(type: ProofType, publicInputs: AnyPublicInputs): Uint8Array;
125
+ /**
126
+ * Compute a hash commitment to public inputs.
127
+ * This can be used to create a compact reference to the full public inputs.
128
+ *
129
+ * @param type - Proof type
130
+ * @param publicInputs - Public inputs to hash
131
+ * @returns Promise resolving to the hash as a hex string
132
+ */
133
+ export declare function hashPublicInputs(type: ProofType, publicInputs: AnyPublicInputs): Promise<string>;
134
+ //# sourceMappingURL=public-inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-inputs.d.ts","sourceRoot":"","sources":["../../src/midnight/public-inputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,338 @@
1
+ /**
2
+ * @fileoverview Public inputs builder for ZK proofs.
3
+ *
4
+ * Location: packages/midnight-prover/src/midnight/public-inputs.ts
5
+ *
6
+ * Summary:
7
+ * This module handles the construction and serialization of public inputs
8
+ * for various ZK proof types. Public inputs are values that are visible
9
+ * to verifiers and form part of the proof statement.
10
+ *
11
+ * Usage:
12
+ * Used by proof generators to construct the public component of proofs.
13
+ * Public inputs are included in the proof and can be verified on-chain.
14
+ *
15
+ * Related files:
16
+ * - hash-chain-proof.ts: Uses buildPublicInputs for hash-chain proofs
17
+ * - witness-builder.ts: Builds the corresponding private witness
18
+ * - types.ts: Type definitions for public inputs
19
+ */
20
+ import { hexToBytes, bytesToHex, } from "@fluxpointstudios/orynq-sdk-core/utils";
21
+ export function buildPublicInputs(type, data) {
22
+ switch (type) {
23
+ case "hash-chain":
24
+ return buildHashChainPublicInputs(data);
25
+ case "policy-compliance":
26
+ return buildPolicyPublicInputs(data);
27
+ case "attestation-valid":
28
+ return buildAttestationPublicInputs(data);
29
+ case "selective-disclosure":
30
+ return buildDisclosurePublicInputs(data);
31
+ case "zkml-inference":
32
+ return buildInferencePublicInputs(data);
33
+ default:
34
+ throw new Error(`Unknown proof type: ${type}`);
35
+ }
36
+ }
37
+ // =============================================================================
38
+ // TYPE-SPECIFIC BUILDERS
39
+ // =============================================================================
40
+ /**
41
+ * Build public inputs for hash-chain proof.
42
+ */
43
+ function buildHashChainPublicInputs(data) {
44
+ validateHexHash(data.rootHash, "rootHash");
45
+ validateHexHash(data.cardanoAnchorTxHash, "cardanoAnchorTxHash");
46
+ validatePositiveInteger(data.eventCount, "eventCount");
47
+ return {
48
+ rootHash: normalizeHash(data.rootHash),
49
+ eventCount: data.eventCount,
50
+ cardanoAnchorTxHash: normalizeHash(data.cardanoAnchorTxHash),
51
+ };
52
+ }
53
+ /**
54
+ * Build public inputs for policy compliance proof.
55
+ */
56
+ function buildPolicyPublicInputs(data) {
57
+ validateHexHash(data.promptHash, "promptHash");
58
+ validateHexHash(data.cardanoAnchorTxHash, "cardanoAnchorTxHash");
59
+ validateNonEmptyString(data.policyId, "policyId");
60
+ validateNonEmptyString(data.policyVersion, "policyVersion");
61
+ return {
62
+ promptHash: normalizeHash(data.promptHash),
63
+ policyId: data.policyId,
64
+ policyVersion: data.policyVersion,
65
+ compliant: Boolean(data.compliant),
66
+ cardanoAnchorTxHash: normalizeHash(data.cardanoAnchorTxHash),
67
+ };
68
+ }
69
+ /**
70
+ * Build public inputs for attestation validity proof.
71
+ */
72
+ function buildAttestationPublicInputs(data) {
73
+ validateHexHash(data.boundHash, "boundHash");
74
+ validateHexHash(data.cardanoAnchorTxHash, "cardanoAnchorTxHash");
75
+ validateTeeType(data.teeType);
76
+ return {
77
+ teeType: data.teeType,
78
+ measurementMatch: Boolean(data.measurementMatch),
79
+ boundHash: normalizeHash(data.boundHash),
80
+ cardanoAnchorTxHash: normalizeHash(data.cardanoAnchorTxHash),
81
+ };
82
+ }
83
+ /**
84
+ * Build public inputs for selective disclosure proof.
85
+ */
86
+ function buildDisclosurePublicInputs(data) {
87
+ validateHexHash(data.spanHash, "spanHash");
88
+ validateHexHash(data.merkleRoot, "merkleRoot");
89
+ validateHexHash(data.cardanoAnchorTxHash, "cardanoAnchorTxHash");
90
+ return {
91
+ spanHash: normalizeHash(data.spanHash),
92
+ merkleRoot: normalizeHash(data.merkleRoot),
93
+ cardanoAnchorTxHash: normalizeHash(data.cardanoAnchorTxHash),
94
+ };
95
+ }
96
+ /**
97
+ * Build public inputs for zkML inference proof.
98
+ */
99
+ function buildInferencePublicInputs(data) {
100
+ validateHexHash(data.modelWeightDigest, "modelWeightDigest");
101
+ validateHexHash(data.inputHash, "inputHash");
102
+ validateHexHash(data.outputHash, "outputHash");
103
+ validateHexHash(data.paramsHash, "paramsHash");
104
+ validateHexHash(data.cardanoAnchorTxHash, "cardanoAnchorTxHash");
105
+ return {
106
+ modelWeightDigest: normalizeHash(data.modelWeightDigest),
107
+ inputHash: normalizeHash(data.inputHash),
108
+ outputHash: normalizeHash(data.outputHash),
109
+ paramsHash: normalizeHash(data.paramsHash),
110
+ cardanoAnchorTxHash: normalizeHash(data.cardanoAnchorTxHash),
111
+ };
112
+ }
113
+ // =============================================================================
114
+ // SERIALIZATION
115
+ // =============================================================================
116
+ /**
117
+ * Serialize public inputs to a binary format for circuit consumption.
118
+ *
119
+ * The binary format is:
120
+ * - 1 byte: proof type ID
121
+ * - N bytes: type-specific fields (fixed-size binary encoding)
122
+ *
123
+ * @param type - Proof type
124
+ * @param publicInputs - Public inputs to serialize
125
+ * @returns Serialized public inputs as Uint8Array
126
+ */
127
+ export function serializePublicInputs(type, publicInputs) {
128
+ const typeId = getProofTypeId(type);
129
+ switch (type) {
130
+ case "hash-chain":
131
+ return serializeHashChainInputs(typeId, publicInputs);
132
+ case "policy-compliance":
133
+ return serializePolicyInputs(typeId, publicInputs);
134
+ case "attestation-valid":
135
+ return serializeAttestationInputs(typeId, publicInputs);
136
+ case "selective-disclosure":
137
+ return serializeDisclosureInputs(typeId, publicInputs);
138
+ case "zkml-inference":
139
+ return serializeInferenceInputs(typeId, publicInputs);
140
+ default:
141
+ throw new Error(`Cannot serialize unknown proof type: ${type}`);
142
+ }
143
+ }
144
+ /**
145
+ * Get a numeric ID for a proof type.
146
+ */
147
+ function getProofTypeId(type) {
148
+ const typeIds = {
149
+ "hash-chain": 1,
150
+ "policy-compliance": 2,
151
+ "attestation-valid": 3,
152
+ "selective-disclosure": 4,
153
+ "zkml-inference": 5,
154
+ };
155
+ return typeIds[type];
156
+ }
157
+ /**
158
+ * Serialize hash-chain public inputs.
159
+ * Format: 1 byte type + 32 bytes rootHash + 4 bytes eventCount + 32 bytes anchorTx
160
+ */
161
+ function serializeHashChainInputs(typeId, inputs) {
162
+ const buffer = new Uint8Array(1 + 32 + 4 + 32);
163
+ const view = new DataView(buffer.buffer);
164
+ let offset = 0;
165
+ buffer[offset++] = typeId;
166
+ const rootHashBytes = hexToBytes(inputs.rootHash);
167
+ buffer.set(rootHashBytes, offset);
168
+ offset += 32;
169
+ view.setUint32(offset, inputs.eventCount, false);
170
+ offset += 4;
171
+ const anchorBytes = hexToBytes(inputs.cardanoAnchorTxHash);
172
+ buffer.set(anchorBytes, offset);
173
+ return buffer;
174
+ }
175
+ /**
176
+ * Serialize policy compliance public inputs.
177
+ */
178
+ function serializePolicyInputs(typeId, inputs) {
179
+ // Variable length due to policyId and policyVersion strings
180
+ const policyIdBytes = new TextEncoder().encode(inputs.policyId);
181
+ const policyVersionBytes = new TextEncoder().encode(inputs.policyVersion);
182
+ const buffer = new Uint8Array(1 + 32 + 2 + policyIdBytes.length + 2 + policyVersionBytes.length + 1 + 32);
183
+ const view = new DataView(buffer.buffer);
184
+ let offset = 0;
185
+ buffer[offset++] = typeId;
186
+ const promptHashBytes = hexToBytes(inputs.promptHash);
187
+ buffer.set(promptHashBytes, offset);
188
+ offset += 32;
189
+ view.setUint16(offset, policyIdBytes.length, false);
190
+ offset += 2;
191
+ buffer.set(policyIdBytes, offset);
192
+ offset += policyIdBytes.length;
193
+ view.setUint16(offset, policyVersionBytes.length, false);
194
+ offset += 2;
195
+ buffer.set(policyVersionBytes, offset);
196
+ offset += policyVersionBytes.length;
197
+ buffer[offset++] = inputs.compliant ? 1 : 0;
198
+ const anchorBytes = hexToBytes(inputs.cardanoAnchorTxHash);
199
+ buffer.set(anchorBytes, offset);
200
+ return buffer;
201
+ }
202
+ /**
203
+ * Serialize attestation public inputs.
204
+ */
205
+ function serializeAttestationInputs(typeId, inputs) {
206
+ const teeTypeId = getTeeTypeId(inputs.teeType);
207
+ const buffer = new Uint8Array(1 + 1 + 1 + 32 + 32);
208
+ let offset = 0;
209
+ buffer[offset++] = typeId;
210
+ buffer[offset++] = teeTypeId;
211
+ buffer[offset++] = inputs.measurementMatch ? 1 : 0;
212
+ const boundHashBytes = hexToBytes(inputs.boundHash);
213
+ buffer.set(boundHashBytes, offset);
214
+ offset += 32;
215
+ const anchorBytes = hexToBytes(inputs.cardanoAnchorTxHash);
216
+ buffer.set(anchorBytes, offset);
217
+ return buffer;
218
+ }
219
+ /**
220
+ * Serialize disclosure public inputs.
221
+ */
222
+ function serializeDisclosureInputs(typeId, inputs) {
223
+ const buffer = new Uint8Array(1 + 32 + 32 + 32);
224
+ let offset = 0;
225
+ buffer[offset++] = typeId;
226
+ const spanHashBytes = hexToBytes(inputs.spanHash);
227
+ buffer.set(spanHashBytes, offset);
228
+ offset += 32;
229
+ const merkleRootBytes = hexToBytes(inputs.merkleRoot);
230
+ buffer.set(merkleRootBytes, offset);
231
+ offset += 32;
232
+ const anchorBytes = hexToBytes(inputs.cardanoAnchorTxHash);
233
+ buffer.set(anchorBytes, offset);
234
+ return buffer;
235
+ }
236
+ /**
237
+ * Serialize inference public inputs.
238
+ */
239
+ function serializeInferenceInputs(typeId, inputs) {
240
+ const buffer = new Uint8Array(1 + 32 + 32 + 32 + 32 + 32);
241
+ let offset = 0;
242
+ buffer[offset++] = typeId;
243
+ const modelBytes = hexToBytes(inputs.modelWeightDigest);
244
+ buffer.set(modelBytes, offset);
245
+ offset += 32;
246
+ const inputBytes = hexToBytes(inputs.inputHash);
247
+ buffer.set(inputBytes, offset);
248
+ offset += 32;
249
+ const outputBytes = hexToBytes(inputs.outputHash);
250
+ buffer.set(outputBytes, offset);
251
+ offset += 32;
252
+ const paramsBytes = hexToBytes(inputs.paramsHash);
253
+ buffer.set(paramsBytes, offset);
254
+ offset += 32;
255
+ const anchorBytes = hexToBytes(inputs.cardanoAnchorTxHash);
256
+ buffer.set(anchorBytes, offset);
257
+ return buffer;
258
+ }
259
+ /**
260
+ * Get numeric ID for TEE type.
261
+ * TeeType values: "sev-snp" | "tdx" | "sgx" | "nitro" | "gpu-cc"
262
+ */
263
+ function getTeeTypeId(teeType) {
264
+ const teeTypeIds = {
265
+ "sev-snp": 1,
266
+ "tdx": 2,
267
+ "sgx": 3,
268
+ "nitro": 4,
269
+ "gpu-cc": 5,
270
+ };
271
+ return teeTypeIds[teeType] ?? 0;
272
+ }
273
+ // =============================================================================
274
+ // HASHING
275
+ // =============================================================================
276
+ /**
277
+ * Compute a hash commitment to public inputs.
278
+ * This can be used to create a compact reference to the full public inputs.
279
+ *
280
+ * @param type - Proof type
281
+ * @param publicInputs - Public inputs to hash
282
+ * @returns Promise resolving to the hash as a hex string
283
+ */
284
+ export async function hashPublicInputs(type, publicInputs) {
285
+ const serialized = serializePublicInputs(type, publicInputs);
286
+ // Copy to a fresh ArrayBuffer to ensure compatibility with crypto.subtle.digest
287
+ const buffer = new ArrayBuffer(serialized.byteLength);
288
+ new Uint8Array(buffer).set(serialized);
289
+ const hashBuffer = await crypto.subtle.digest("SHA-256", buffer);
290
+ return bytesToHex(new Uint8Array(hashBuffer));
291
+ }
292
+ // =============================================================================
293
+ // VALIDATION HELPERS
294
+ // =============================================================================
295
+ /**
296
+ * Validate a hex hash string.
297
+ */
298
+ function validateHexHash(value, fieldName) {
299
+ // Remove 0x prefix if present
300
+ const cleanHex = value.startsWith("0x") ? value.slice(2) : value;
301
+ if (!/^[0-9a-fA-F]{64}$/.test(cleanHex)) {
302
+ throw new Error(`Invalid ${fieldName}: expected 64-character hex string, got "${value}"`);
303
+ }
304
+ }
305
+ /**
306
+ * Validate a positive integer.
307
+ */
308
+ function validatePositiveInteger(value, fieldName) {
309
+ if (!Number.isInteger(value) || value < 0) {
310
+ throw new Error(`Invalid ${fieldName}: expected non-negative integer, got ${value}`);
311
+ }
312
+ }
313
+ /**
314
+ * Validate a non-empty string.
315
+ */
316
+ function validateNonEmptyString(value, fieldName) {
317
+ if (typeof value !== "string" || value.trim() === "") {
318
+ throw new Error(`Invalid ${fieldName}: expected non-empty string, got "${value}"`);
319
+ }
320
+ }
321
+ /**
322
+ * Validate TEE type.
323
+ * TeeType values: "sev-snp" | "tdx" | "sgx" | "nitro" | "gpu-cc"
324
+ */
325
+ function validateTeeType(teeType) {
326
+ const validTypes = ["sev-snp", "tdx", "sgx", "nitro", "gpu-cc"];
327
+ if (!validTypes.includes(teeType)) {
328
+ throw new Error(`Invalid teeType: "${teeType}"`);
329
+ }
330
+ }
331
+ /**
332
+ * Normalize a hash to lowercase without 0x prefix.
333
+ */
334
+ function normalizeHash(hash) {
335
+ const cleanHex = hash.startsWith("0x") ? hash.slice(2) : hash;
336
+ return cleanHex.toLowerCase();
337
+ }
338
+ //# sourceMappingURL=public-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-inputs.js","sourceRoot":"","sources":["../../src/midnight/public-inputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @fileoverview Witness builder for hash-chain ZK proofs.
3
+ *
4
+ * Location: packages/midnight-prover/src/midnight/witness-builder.ts
5
+ *
6
+ * Summary:
7
+ * This module converts trace events into a circuit-compatible witness format
8
+ * for the hash-chain validity proof. The witness contains the private inputs
9
+ * needed by the ZK circuit to prove that a sequence of events produces
10
+ * the expected rolling hash.
11
+ *
12
+ * Usage:
13
+ * Used by HashChainProver to prepare data for proof generation.
14
+ * The witness format matches the expected Compact circuit input structure.
15
+ *
16
+ * Related files:
17
+ * - hash-chain-proof.ts: Uses this to build witnesses for proof generation
18
+ * - public-inputs.ts: Builds corresponding public inputs
19
+ * - @fluxpointstudios/orynq-sdk-process-trace: TraceEvent types
20
+ */
21
+ import type { TraceEvent } from "@fluxpointstudios/orynq-sdk-process-trace";
22
+ /**
23
+ * Witness for a single event in the hash chain.
24
+ * Contains both the serialized event data and its computed hash.
25
+ */
26
+ export interface EventWitness {
27
+ /**
28
+ * Sequence number (for ordering verification).
29
+ */
30
+ seq: number;
31
+ /**
32
+ * Serialized event data as bytes (canonical JSON).
33
+ */
34
+ eventData: Uint8Array;
35
+ /**
36
+ * SHA-256 hash of the event (domain-separated).
37
+ */
38
+ eventHash: string;
39
+ }
40
+ /**
41
+ * Complete witness for hash-chain proof.
42
+ * Contains all private inputs needed by the ZK circuit.
43
+ */
44
+ export interface HashChainWitness {
45
+ /**
46
+ * Genesis hash (initial state of the rolling hash).
47
+ */
48
+ genesisHash: string;
49
+ /**
50
+ * Array of event witnesses in sequence order.
51
+ */
52
+ events: EventWitness[];
53
+ /**
54
+ * Computed rolling hash after processing all events.
55
+ * Used for internal verification before submitting to circuit.
56
+ */
57
+ computedRollingHash: string;
58
+ /**
59
+ * Total number of events in the chain.
60
+ */
61
+ eventCount: number;
62
+ }
63
+ /**
64
+ * Build a hash-chain witness from trace events.
65
+ *
66
+ * This function converts an array of TraceEvents into a circuit-compatible
67
+ * witness format. The witness contains:
68
+ * 1. The genesis hash (starting point)
69
+ * 2. Each event serialized as bytes with its hash
70
+ * 3. The computed rolling hash for verification
71
+ *
72
+ * The rolling hash computation matches the algorithm in process-trace:
73
+ * - Events are sorted by seq number
74
+ * - Each event hash is H(domain + canonical(event - hash field))
75
+ * - Rolling hash is H(domain + prevHash + "|" + eventHash)
76
+ *
77
+ * @param events - Array of trace events to build witness from
78
+ * @param genesisHash - Initial hash state (hex string, typically from initRollingHash)
79
+ * @returns Promise resolving to the complete hash chain witness
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const witness = await buildHashChainWitness(traceBundle.privateRun.events, genesisHash);
84
+ * console.log(witness.eventCount); // Number of events
85
+ * console.log(witness.computedRollingHash); // Final hash
86
+ * ```
87
+ */
88
+ export declare function buildHashChainWitness(events: TraceEvent[], genesisHash: string): Promise<HashChainWitness>;
89
+ /**
90
+ * Serialize a hash chain witness to a compact binary format.
91
+ * Used for transmitting witness data to the proof server.
92
+ *
93
+ * Format:
94
+ * - 4 bytes: event count (uint32 big-endian)
95
+ * - 32 bytes: genesis hash
96
+ * - For each event:
97
+ * - 4 bytes: event data length (uint32 big-endian)
98
+ * - N bytes: event data
99
+ * - 32 bytes: event hash
100
+ *
101
+ * @param witness - The witness to serialize
102
+ * @returns Serialized witness as Uint8Array
103
+ */
104
+ export declare function serializeWitness(witness: HashChainWitness): Uint8Array;
105
+ /**
106
+ * Compute the total size of a witness for resource estimation.
107
+ *
108
+ * @param witness - The witness to measure
109
+ * @returns Size in bytes
110
+ */
111
+ export declare function computeWitnessSize(witness: HashChainWitness): number;
112
+ /**
113
+ * Validate that a witness is well-formed.
114
+ *
115
+ * @param witness - The witness to validate
116
+ * @returns Array of validation errors (empty if valid)
117
+ */
118
+ export declare function validateWitness(witness: HashChainWitness): string[];
119
+ //# sourceMappingURL=witness-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"witness-builder.d.ts","sourceRoot":"","sources":["../../src/midnight/witness-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAuB5E;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,SAAS,EAAE,UAAU,CAAC;IAEtB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,MAAM,EAAE,YAAY,EAAE,CAAC;IAEvB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,UAAU,EAAE,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAwB3B;AAyED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAqCtE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,EAAE,CA6CnE"}