@longarc/mdash 3.0.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/README.md +278 -0
- package/dist/checkpoint/engine.d.ts +208 -0
- package/dist/checkpoint/engine.d.ts.map +1 -0
- package/dist/checkpoint/engine.js +369 -0
- package/dist/checkpoint/engine.js.map +1 -0
- package/dist/context/engine.d.ts +197 -0
- package/dist/context/engine.d.ts.map +1 -0
- package/dist/context/engine.js +392 -0
- package/dist/context/engine.js.map +1 -0
- package/dist/core/commitment.d.ts +154 -0
- package/dist/core/commitment.d.ts.map +1 -0
- package/dist/core/commitment.js +305 -0
- package/dist/core/commitment.js.map +1 -0
- package/dist/core/crypto.d.ts +100 -0
- package/dist/core/crypto.d.ts.map +1 -0
- package/dist/core/crypto.js +243 -0
- package/dist/core/crypto.js.map +1 -0
- package/dist/index.d.ts +121 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +234 -0
- package/dist/index.js.map +1 -0
- package/dist/mcca/engine.d.ts +260 -0
- package/dist/mcca/engine.d.ts.map +1 -0
- package/dist/mcca/engine.js +518 -0
- package/dist/mcca/engine.js.map +1 -0
- package/dist/physics/engine.d.ts +165 -0
- package/dist/physics/engine.d.ts.map +1 -0
- package/dist/physics/engine.js +371 -0
- package/dist/physics/engine.js.map +1 -0
- package/dist/tee/engine.d.ts +285 -0
- package/dist/tee/engine.d.ts.map +1 -0
- package/dist/tee/engine.js +505 -0
- package/dist/tee/engine.js.map +1 -0
- package/dist/warrant/engine.d.ts +195 -0
- package/dist/warrant/engine.d.ts.map +1 -0
- package/dist/warrant/engine.js +409 -0
- package/dist/warrant/engine.js.map +1 -0
- package/dist/zk/engine.d.ts +243 -0
- package/dist/zk/engine.d.ts.map +1 -0
- package/dist/zk/engine.js +489 -0
- package/dist/zk/engine.js.map +1 -0
- package/package.json +25 -0
- package/src/__tests__/phase1.test.ts +1120 -0
- package/src/__tests__/phase2-4.test.ts +898 -0
- package/src/checkpoint/engine.ts +532 -0
- package/src/context/engine.ts +598 -0
- package/src/core/commitment.ts +438 -0
- package/src/core/crypto.ts +304 -0
- package/src/index.ts +320 -0
- package/src/mcca/engine.ts +778 -0
- package/src/physics/engine.ts +563 -0
- package/src/tee/engine.ts +810 -0
- package/src/warrant/engine.ts +625 -0
- package/src/zk/engine.ts +730 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mdash v3.0 - L3 ZK Proofs Layer
|
|
3
|
+
*
|
|
4
|
+
* Mathematically bulletproof attestation for disputes and insurance claims.
|
|
5
|
+
* Uses Plonky2 (STARK-based) for async proof generation.
|
|
6
|
+
*
|
|
7
|
+
* Use Cases:
|
|
8
|
+
* - Insurance claim verification
|
|
9
|
+
* - Legal dispute evidence
|
|
10
|
+
* - Audit compliance
|
|
11
|
+
* - High-value transaction attestation
|
|
12
|
+
*
|
|
13
|
+
* Latency: 100ms - 10s (async, background)
|
|
14
|
+
* Trust: Mathematical only (no hardware dependency)
|
|
15
|
+
*
|
|
16
|
+
* @version 3.0.0
|
|
17
|
+
*/
|
|
18
|
+
import { Hash, Seal, Timestamp } from '../core/crypto.js';
|
|
19
|
+
import { CommitmentEngine } from '../core/commitment.js';
|
|
20
|
+
export type ProofStatus = 'queued' | 'proving' | 'verified' | 'failed' | 'expired';
|
|
21
|
+
export type ProofType = 'commitment_inclusion' | 'warrant_validity' | 'checkpoint_chain' | 'action_compliance' | 'audit_trail' | 'custom';
|
|
22
|
+
/**
|
|
23
|
+
* Plonky2 proof structure
|
|
24
|
+
* Based on Polygon's Plonky2 implementation
|
|
25
|
+
*/
|
|
26
|
+
export interface Plonky2Proof {
|
|
27
|
+
/** Proof bytes (base64 encoded) */
|
|
28
|
+
proof: string;
|
|
29
|
+
/** Public inputs */
|
|
30
|
+
public_inputs: string[];
|
|
31
|
+
/** Verification key hash */
|
|
32
|
+
verifier_key_hash: Hash;
|
|
33
|
+
/** Circuit type */
|
|
34
|
+
circuit: string;
|
|
35
|
+
/** Number of gates */
|
|
36
|
+
num_gates: number;
|
|
37
|
+
/** Proving time (ms) */
|
|
38
|
+
proving_time_ms: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Zero Knowledge Proof Document
|
|
42
|
+
*/
|
|
43
|
+
export interface ZKProofDocument {
|
|
44
|
+
/** Unique proof ID */
|
|
45
|
+
id: string;
|
|
46
|
+
/** Type of proof */
|
|
47
|
+
type: ProofType;
|
|
48
|
+
/** Creation timestamp */
|
|
49
|
+
timestamp: Timestamp;
|
|
50
|
+
/** Status */
|
|
51
|
+
status: ProofStatus;
|
|
52
|
+
/** Statement being proven */
|
|
53
|
+
statement: {
|
|
54
|
+
/** Human readable description */
|
|
55
|
+
description: string;
|
|
56
|
+
/** Structured claim */
|
|
57
|
+
claim: Record<string, unknown>;
|
|
58
|
+
/** Hash of the claim */
|
|
59
|
+
claim_hash: Hash;
|
|
60
|
+
};
|
|
61
|
+
/** The ZK proof itself */
|
|
62
|
+
proof: Plonky2Proof | null;
|
|
63
|
+
/** References to L1/L2 attestations */
|
|
64
|
+
references: {
|
|
65
|
+
commitments: string[];
|
|
66
|
+
attestations: string[];
|
|
67
|
+
};
|
|
68
|
+
/** Verification result */
|
|
69
|
+
verification: {
|
|
70
|
+
verified: boolean;
|
|
71
|
+
verified_at: Timestamp | null;
|
|
72
|
+
verifier: string | null;
|
|
73
|
+
};
|
|
74
|
+
/** Expiry */
|
|
75
|
+
expires_at: Timestamp;
|
|
76
|
+
/** Seal */
|
|
77
|
+
seal: Seal;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Proof request
|
|
81
|
+
*/
|
|
82
|
+
export interface ProofRequest {
|
|
83
|
+
type: ProofType;
|
|
84
|
+
statement: {
|
|
85
|
+
description: string;
|
|
86
|
+
claim: Record<string, unknown>;
|
|
87
|
+
};
|
|
88
|
+
commitmentIds?: string[];
|
|
89
|
+
attestationIds?: string[];
|
|
90
|
+
priority?: 'low' | 'normal' | 'high';
|
|
91
|
+
deadline?: Timestamp;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Circuit configuration
|
|
95
|
+
* Defines the structure for each proof type
|
|
96
|
+
*/
|
|
97
|
+
export interface CircuitConfig {
|
|
98
|
+
name: string;
|
|
99
|
+
numPublicInputs: number;
|
|
100
|
+
numPrivateInputs: number;
|
|
101
|
+
estimatedGates: number;
|
|
102
|
+
estimatedProvingTimeMs: number;
|
|
103
|
+
}
|
|
104
|
+
export declare const CIRCUIT_CONFIGS: Record<ProofType, CircuitConfig>;
|
|
105
|
+
interface QueuedProof {
|
|
106
|
+
request: ProofRequest;
|
|
107
|
+
document: ZKProofDocument;
|
|
108
|
+
priority: number;
|
|
109
|
+
queuedAt: number;
|
|
110
|
+
deadline: number | null;
|
|
111
|
+
}
|
|
112
|
+
declare class ProofQueue {
|
|
113
|
+
private queue;
|
|
114
|
+
private processing;
|
|
115
|
+
private maxConcurrent;
|
|
116
|
+
constructor(maxConcurrent?: number);
|
|
117
|
+
enqueue(item: QueuedProof): void;
|
|
118
|
+
dequeue(): QueuedProof | null;
|
|
119
|
+
complete(id: string): void;
|
|
120
|
+
getStats(): {
|
|
121
|
+
queued: number;
|
|
122
|
+
processing: number;
|
|
123
|
+
totalPending: number;
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export declare class ZKProofsEngine {
|
|
127
|
+
private key;
|
|
128
|
+
private commitmentEngine;
|
|
129
|
+
private documents;
|
|
130
|
+
private queue;
|
|
131
|
+
private verificationKeys;
|
|
132
|
+
private processingInterval;
|
|
133
|
+
private metrics;
|
|
134
|
+
constructor(commitmentEngine: CommitmentEngine, maxConcurrent?: number);
|
|
135
|
+
/**
|
|
136
|
+
* Initialize the ZK proofs engine
|
|
137
|
+
*/
|
|
138
|
+
initialize(sealKey: string): Promise<void>;
|
|
139
|
+
/**
|
|
140
|
+
* Start background proof processing
|
|
141
|
+
*/
|
|
142
|
+
private startProcessing;
|
|
143
|
+
/**
|
|
144
|
+
* Stop background processing
|
|
145
|
+
*/
|
|
146
|
+
stopProcessing(): void;
|
|
147
|
+
/**
|
|
148
|
+
* Request a ZK proof (async)
|
|
149
|
+
* Returns immediately with proof document in 'queued' status
|
|
150
|
+
*/
|
|
151
|
+
requestProof(request: ProofRequest): Promise<ZKProofDocument>;
|
|
152
|
+
/**
|
|
153
|
+
* Process queued proofs
|
|
154
|
+
*/
|
|
155
|
+
private processQueue;
|
|
156
|
+
/**
|
|
157
|
+
* Generate a ZK proof (Plonky2 simulation)
|
|
158
|
+
*/
|
|
159
|
+
private generateProof;
|
|
160
|
+
/**
|
|
161
|
+
* Generate public inputs based on proof type
|
|
162
|
+
*/
|
|
163
|
+
private generatePublicInputs;
|
|
164
|
+
/**
|
|
165
|
+
* Verify a ZK proof
|
|
166
|
+
*/
|
|
167
|
+
verifyProof(document: ZKProofDocument): Promise<{
|
|
168
|
+
valid: boolean;
|
|
169
|
+
errors: string[];
|
|
170
|
+
}>;
|
|
171
|
+
/**
|
|
172
|
+
* Get proof document by ID
|
|
173
|
+
*/
|
|
174
|
+
get(id: string): ZKProofDocument | null;
|
|
175
|
+
/**
|
|
176
|
+
* Wait for proof completion
|
|
177
|
+
*/
|
|
178
|
+
waitForProof(id: string, timeoutMs?: number): Promise<ZKProofDocument>;
|
|
179
|
+
/**
|
|
180
|
+
* Get queue statistics
|
|
181
|
+
*/
|
|
182
|
+
getQueueStats(): ReturnType<ProofQueue['getStats']>;
|
|
183
|
+
/**
|
|
184
|
+
* Get engine statistics
|
|
185
|
+
*/
|
|
186
|
+
getStats(): {
|
|
187
|
+
proofsGenerated: number;
|
|
188
|
+
proofsVerified: number;
|
|
189
|
+
avgProvingTimeMs: number;
|
|
190
|
+
failures: number;
|
|
191
|
+
queueStats: ReturnType<ProofQueue['getStats']>;
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
export declare class ClaimBuilder {
|
|
195
|
+
private type;
|
|
196
|
+
private claim;
|
|
197
|
+
private description;
|
|
198
|
+
private commitmentIds;
|
|
199
|
+
private attestationIds;
|
|
200
|
+
constructor(type: ProofType);
|
|
201
|
+
/**
|
|
202
|
+
* Set claim description
|
|
203
|
+
*/
|
|
204
|
+
withDescription(desc: string): this;
|
|
205
|
+
/**
|
|
206
|
+
* Add claim data
|
|
207
|
+
*/
|
|
208
|
+
withClaim(key: string, value: unknown): this;
|
|
209
|
+
/**
|
|
210
|
+
* Reference L1 commitments
|
|
211
|
+
*/
|
|
212
|
+
withCommitments(...ids: string[]): this;
|
|
213
|
+
/**
|
|
214
|
+
* Reference L2 attestations
|
|
215
|
+
*/
|
|
216
|
+
withAttestations(...ids: string[]): this;
|
|
217
|
+
/**
|
|
218
|
+
* Build the proof request
|
|
219
|
+
*/
|
|
220
|
+
build(priority?: 'low' | 'normal' | 'high'): ProofRequest;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Helper for generating insurance-grade proofs
|
|
224
|
+
*/
|
|
225
|
+
export declare class InsuranceClaimProof {
|
|
226
|
+
private zkEngine;
|
|
227
|
+
constructor(zkEngine: ZKProofsEngine);
|
|
228
|
+
/**
|
|
229
|
+
* Generate proof for an insurance claim
|
|
230
|
+
*/
|
|
231
|
+
generateClaim(params: {
|
|
232
|
+
claimId: string;
|
|
233
|
+
policyId: string;
|
|
234
|
+
incidentDescription: string;
|
|
235
|
+
warrantId: string;
|
|
236
|
+
checkpointIds: string[];
|
|
237
|
+
actionDetails: Record<string, unknown>;
|
|
238
|
+
amount: number;
|
|
239
|
+
currency: string;
|
|
240
|
+
}): Promise<ZKProofDocument>;
|
|
241
|
+
}
|
|
242
|
+
export {};
|
|
243
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/zk/engine.ts"],"names":[],"mappings":"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"}
|