@sip-protocol/sdk 0.7.2 → 0.7.4
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 +267 -0
- package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
- package/dist/browser.d.mts +10 -4
- package/dist/browser.d.ts +10 -4
- package/dist/browser.js +48874 -18336
- package/dist/browser.mjs +674 -48
- package/dist/chunk-4GRJ5MAW.mjs +152 -0
- package/dist/chunk-5D7A3L3W.mjs +717 -0
- package/dist/chunk-64AYA5F5.mjs +7834 -0
- package/dist/chunk-GMDGB22A.mjs +379 -0
- package/dist/chunk-I534WKN7.mjs +328 -0
- package/dist/chunk-IBZVA5Y7.mjs +1003 -0
- package/dist/chunk-PRRZAWJE.mjs +223 -0
- package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
- package/dist/chunk-YWGJ77A2.mjs +33806 -0
- package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
- package/dist/constants-LHAAUC2T.mjs +51 -0
- package/dist/dist-2OGQ7FED.mjs +3957 -0
- package/dist/dist-IFHPYLDX.mjs +254 -0
- package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
- package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
- package/dist/index-DXh2IGkz.d.ts +24681 -0
- package/dist/index-DeE1ZzA4.d.mts +24681 -0
- package/dist/index.d.mts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +48676 -17318
- package/dist/index.mjs +583 -19
- package/dist/interface-Bf7w1PLW.d.mts +679 -0
- package/dist/interface-Bf7w1PLW.d.ts +679 -0
- package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
- package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
- package/dist/proofs/halo2.d.mts +151 -0
- package/dist/proofs/halo2.d.ts +151 -0
- package/dist/proofs/halo2.js +350 -0
- package/dist/proofs/halo2.mjs +11 -0
- package/dist/proofs/kimchi.d.mts +160 -0
- package/dist/proofs/kimchi.d.ts +160 -0
- package/dist/proofs/kimchi.js +431 -0
- package/dist/proofs/kimchi.mjs +13 -0
- package/dist/proofs/noir.d.mts +1 -1
- package/dist/proofs/noir.d.ts +1 -1
- package/dist/proofs/noir.js +74 -18
- package/dist/proofs/noir.mjs +84 -24
- package/dist/solana-U3MEGU7W.mjs +280 -0
- package/dist/validity_proof-3POXLPNY.mjs +21 -0
- package/package.json +54 -21
- package/src/adapters/index.ts +41 -0
- package/src/adapters/jupiter.ts +571 -0
- package/src/adapters/near-intents.ts +135 -0
- package/src/advisor/advisor.ts +653 -0
- package/src/advisor/index.ts +54 -0
- package/src/advisor/tools.ts +303 -0
- package/src/advisor/types.ts +164 -0
- package/src/chains/ethereum/announcement.ts +536 -0
- package/src/chains/ethereum/bnb-optimizations.ts +474 -0
- package/src/chains/ethereum/commitment.ts +522 -0
- package/src/chains/ethereum/constants.ts +462 -0
- package/src/chains/ethereum/deployment.ts +596 -0
- package/src/chains/ethereum/gas-estimation.ts +538 -0
- package/src/chains/ethereum/index.ts +268 -0
- package/src/chains/ethereum/optimizations.ts +614 -0
- package/src/chains/ethereum/privacy-adapter.ts +855 -0
- package/src/chains/ethereum/registry.ts +584 -0
- package/src/chains/ethereum/rpc.ts +905 -0
- package/src/chains/ethereum/stealth.ts +491 -0
- package/src/chains/ethereum/token.ts +790 -0
- package/src/chains/ethereum/transfer.ts +637 -0
- package/src/chains/ethereum/types.ts +456 -0
- package/src/chains/ethereum/viewing-key.ts +455 -0
- package/src/chains/near/commitment.ts +608 -0
- package/src/chains/near/constants.ts +284 -0
- package/src/chains/near/function-call.ts +871 -0
- package/src/chains/near/history.ts +654 -0
- package/src/chains/near/implicit-account.ts +840 -0
- package/src/chains/near/index.ts +393 -0
- package/src/chains/near/native-transfer.ts +658 -0
- package/src/chains/near/nep141.ts +775 -0
- package/src/chains/near/privacy-adapter.ts +889 -0
- package/src/chains/near/resolver.ts +971 -0
- package/src/chains/near/rpc.ts +1016 -0
- package/src/chains/near/stealth.ts +419 -0
- package/src/chains/near/types.ts +317 -0
- package/src/chains/near/viewing-key.ts +876 -0
- package/src/chains/solana/anchor-transfer.ts +386 -0
- package/src/chains/solana/commitment.ts +577 -0
- package/src/chains/solana/constants.ts +126 -12
- package/src/chains/solana/ephemeral-keys.ts +543 -0
- package/src/chains/solana/index.ts +276 -1
- package/src/chains/solana/key-derivation.ts +418 -0
- package/src/chains/solana/kit-compat.ts +334 -0
- package/src/chains/solana/optimizations.ts +560 -0
- package/src/chains/solana/privacy-adapter.ts +605 -0
- package/src/chains/solana/providers/generic.ts +201 -0
- package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
- package/src/chains/solana/providers/helius-enhanced.ts +623 -0
- package/src/chains/solana/providers/helius.ts +402 -0
- package/src/chains/solana/providers/index.ts +85 -0
- package/src/chains/solana/providers/interface.ts +221 -0
- package/src/chains/solana/providers/quicknode.ts +409 -0
- package/src/chains/solana/providers/triton.ts +426 -0
- package/src/chains/solana/providers/webhook.ts +790 -0
- package/src/chains/solana/rpc-client.ts +1150 -0
- package/src/chains/solana/scan.ts +170 -73
- package/src/chains/solana/sol-transfer.ts +732 -0
- package/src/chains/solana/spl-transfer.ts +886 -0
- package/src/chains/solana/stealth-scanner.ts +703 -0
- package/src/chains/solana/sunspot-verifier.ts +453 -0
- package/src/chains/solana/transaction-builder.ts +755 -0
- package/src/chains/solana/transfer.ts +74 -5
- package/src/chains/solana/types.ts +77 -7
- package/src/chains/solana/utils.ts +110 -0
- package/src/chains/solana/viewing-key.ts +807 -0
- package/src/compliance/fireblocks.ts +921 -0
- package/src/compliance/index.ts +37 -0
- package/src/compliance/range-sas.ts +956 -0
- package/src/config/endpoints.ts +100 -0
- package/src/crypto.ts +11 -8
- package/src/errors.ts +82 -0
- package/src/evm/erc4337-relayer.ts +830 -0
- package/src/evm/index.ts +47 -0
- package/src/fees/calculator.ts +396 -0
- package/src/fees/index.ts +87 -0
- package/src/fees/near-contract.ts +429 -0
- package/src/fees/types.ts +268 -0
- package/src/index.ts +785 -1
- package/src/intent.ts +6 -3
- package/src/logger.ts +324 -0
- package/src/network/index.ts +80 -0
- package/src/network/proxy.ts +691 -0
- package/src/optimizations/index.ts +541 -0
- package/src/oracle/types.ts +1 -0
- package/src/privacy-backends/arcium-types.ts +727 -0
- package/src/privacy-backends/arcium.ts +719 -0
- package/src/privacy-backends/combined-privacy.ts +866 -0
- package/src/privacy-backends/cspl-token.ts +595 -0
- package/src/privacy-backends/cspl-types.ts +512 -0
- package/src/privacy-backends/cspl.ts +907 -0
- package/src/privacy-backends/health.ts +488 -0
- package/src/privacy-backends/inco-types.ts +323 -0
- package/src/privacy-backends/inco.ts +616 -0
- package/src/privacy-backends/index.ts +336 -0
- package/src/privacy-backends/interface.ts +906 -0
- package/src/privacy-backends/lru-cache.ts +343 -0
- package/src/privacy-backends/magicblock.ts +458 -0
- package/src/privacy-backends/mock.ts +258 -0
- package/src/privacy-backends/privacycash-types.ts +278 -0
- package/src/privacy-backends/privacycash.ts +456 -0
- package/src/privacy-backends/private-swap.ts +570 -0
- package/src/privacy-backends/rate-limiter.ts +683 -0
- package/src/privacy-backends/registry.ts +690 -0
- package/src/privacy-backends/router.ts +626 -0
- package/src/privacy-backends/shadowwire.ts +449 -0
- package/src/privacy-backends/sip-native.ts +256 -0
- package/src/privacy-logger.ts +191 -0
- package/src/production-safety.ts +373 -0
- package/src/proofs/aggregator.ts +1029 -0
- package/src/proofs/browser-composer.ts +1150 -0
- package/src/proofs/browser.ts +113 -25
- package/src/proofs/cache/index.ts +127 -0
- package/src/proofs/cache/interface.ts +545 -0
- package/src/proofs/cache/key-generator.ts +188 -0
- package/src/proofs/cache/lru-cache.ts +481 -0
- package/src/proofs/cache/multi-tier-cache.ts +575 -0
- package/src/proofs/cache/persistent-cache.ts +788 -0
- package/src/proofs/compliance-proof.ts +872 -0
- package/src/proofs/composer/base.ts +923 -0
- package/src/proofs/composer/index.ts +25 -0
- package/src/proofs/composer/interface.ts +518 -0
- package/src/proofs/composer/types.ts +383 -0
- package/src/proofs/converters/halo2.ts +452 -0
- package/src/proofs/converters/index.ts +208 -0
- package/src/proofs/converters/interface.ts +363 -0
- package/src/proofs/converters/kimchi.ts +462 -0
- package/src/proofs/converters/noir.ts +451 -0
- package/src/proofs/fallback.ts +888 -0
- package/src/proofs/halo2.ts +42 -0
- package/src/proofs/index.ts +471 -0
- package/src/proofs/interface.ts +13 -0
- package/src/proofs/kimchi.ts +42 -0
- package/src/proofs/lazy.ts +1004 -0
- package/src/proofs/mock.ts +25 -1
- package/src/proofs/noir.ts +111 -30
- package/src/proofs/orchestrator.ts +960 -0
- package/src/proofs/parallel/concurrency.ts +297 -0
- package/src/proofs/parallel/dependency-graph.ts +602 -0
- package/src/proofs/parallel/executor.ts +420 -0
- package/src/proofs/parallel/index.ts +131 -0
- package/src/proofs/parallel/interface.ts +685 -0
- package/src/proofs/parallel/worker-pool.ts +644 -0
- package/src/proofs/providers/halo2.ts +560 -0
- package/src/proofs/providers/index.ts +34 -0
- package/src/proofs/providers/kimchi.ts +641 -0
- package/src/proofs/validator.ts +881 -0
- package/src/proofs/verifier.ts +867 -0
- package/src/quantum/index.ts +112 -0
- package/src/quantum/winternitz-vault.ts +639 -0
- package/src/quantum/wots.ts +611 -0
- package/src/settlement/backends/direct-chain.ts +1 -0
- package/src/settlement/index.ts +9 -0
- package/src/settlement/router.ts +732 -46
- package/src/solana/index.ts +72 -0
- package/src/solana/jito-relayer.ts +687 -0
- package/src/solana/noir-verifier-types.ts +430 -0
- package/src/solana/noir-verifier.ts +816 -0
- package/src/stealth/address-derivation.ts +193 -0
- package/src/stealth/ed25519.ts +431 -0
- package/src/stealth/index.ts +233 -0
- package/src/stealth/meta-address.ts +221 -0
- package/src/stealth/secp256k1.ts +368 -0
- package/src/stealth/utils.ts +194 -0
- package/src/stealth.ts +50 -1504
- package/src/surveillance/algorithms/address-reuse.ts +143 -0
- package/src/surveillance/algorithms/cluster.ts +247 -0
- package/src/surveillance/algorithms/exchange.ts +295 -0
- package/src/surveillance/algorithms/temporal.ts +337 -0
- package/src/surveillance/analyzer.ts +442 -0
- package/src/surveillance/index.ts +64 -0
- package/src/surveillance/scoring.ts +372 -0
- package/src/surveillance/types.ts +264 -0
- package/src/sync/index.ts +106 -0
- package/src/sync/manager.ts +504 -0
- package/src/sync/mock-provider.ts +318 -0
- package/src/sync/oblivious.ts +625 -0
- package/src/tokens/index.ts +15 -0
- package/src/tokens/registry.ts +301 -0
- package/src/utils/deprecation.ts +94 -0
- package/src/utils/index.ts +9 -0
- package/src/wallet/ethereum/index.ts +68 -0
- package/src/wallet/ethereum/metamask-privacy.ts +420 -0
- package/src/wallet/ethereum/multi-wallet.ts +646 -0
- package/src/wallet/ethereum/privacy-adapter.ts +700 -0
- package/src/wallet/ethereum/types.ts +3 -1
- package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
- package/src/wallet/hardware/index.ts +10 -0
- package/src/wallet/hardware/ledger-privacy.ts +414 -0
- package/src/wallet/index.ts +71 -0
- package/src/wallet/near/adapter.ts +626 -0
- package/src/wallet/near/index.ts +86 -0
- package/src/wallet/near/meteor-wallet.ts +1153 -0
- package/src/wallet/near/my-near-wallet.ts +790 -0
- package/src/wallet/near/wallet-selector.ts +702 -0
- package/src/wallet/solana/adapter.ts +6 -4
- package/src/wallet/solana/index.ts +13 -0
- package/src/wallet/solana/privacy-adapter.ts +567 -0
- package/src/wallet/sui/types.ts +6 -4
- package/src/zcash/rpc-client.ts +13 -6
- package/dist/chunk-3INS3PR5.mjs +0 -884
- package/dist/chunk-3OVABDRH.mjs +0 -17096
- package/dist/chunk-DLDWZFYC.mjs +0 -1495
- package/dist/chunk-E6SZWREQ.mjs +0 -57
- package/dist/chunk-G33LB27A.mjs +0 -16166
- package/dist/chunk-HGU6HZRC.mjs +0 -231
- package/dist/chunk-L2K34JCU.mjs +0 -1496
- package/dist/chunk-SN4ZDTVW.mjs +0 -16166
- package/dist/constants-VOI7BSLK.mjs +0 -27
- package/dist/index-BYZbDjal.d.ts +0 -11390
- package/dist/index-CHB3KuOB.d.mts +0 -11859
- package/dist/index-CzWPI6Le.d.ts +0 -11859
- package/dist/index-xbWjohNq.d.mts +0 -11390
- package/dist/solana-5EMCTPTS.mjs +0 -46
- package/dist/solana-Q4NAVBTS.mjs +0 -46
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel Proof Executor
|
|
3
|
+
*
|
|
4
|
+
* @module proofs/parallel/executor
|
|
5
|
+
* @description Main executor for parallel proof generation with dependency resolution
|
|
6
|
+
*
|
|
7
|
+
* M20-12: Optimize proof generation parallelization (#307)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { SingleProof } from '@sip-protocol/types'
|
|
11
|
+
import type {
|
|
12
|
+
DependencyNode,
|
|
13
|
+
ParallelExecutionOptions,
|
|
14
|
+
ParallelProgressEvent,
|
|
15
|
+
ParallelExecutionResult,
|
|
16
|
+
ParallelExecutionStats,
|
|
17
|
+
ParallelExecutionError,
|
|
18
|
+
ProofTask,
|
|
19
|
+
IParallelExecutor,
|
|
20
|
+
IDependencyAnalyzer,
|
|
21
|
+
IWorkerPool,
|
|
22
|
+
IConcurrencyManager,
|
|
23
|
+
} from './interface'
|
|
24
|
+
import { DependencyAnalyzer } from './dependency-graph'
|
|
25
|
+
import { ConcurrencyManager } from './concurrency'
|
|
26
|
+
import { WorkerPool } from './worker-pool'
|
|
27
|
+
import type { ComposableProofProvider } from '../composer'
|
|
28
|
+
|
|
29
|
+
// ─── Parallel Executor Implementation ────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Executes proofs in parallel with dependency resolution and resource optimization
|
|
33
|
+
*/
|
|
34
|
+
export class ParallelExecutor implements IParallelExecutor {
|
|
35
|
+
private readonly analyzer: IDependencyAnalyzer
|
|
36
|
+
private readonly concurrencyManager: IConcurrencyManager
|
|
37
|
+
private pool: IWorkerPool | null = null
|
|
38
|
+
private readonly providerFactory: () => ComposableProofProvider
|
|
39
|
+
|
|
40
|
+
private running = false
|
|
41
|
+
private cancelled = false
|
|
42
|
+
private completed = 0
|
|
43
|
+
private total = 0
|
|
44
|
+
|
|
45
|
+
constructor(providerFactory: () => ComposableProofProvider) {
|
|
46
|
+
this.analyzer = new DependencyAnalyzer()
|
|
47
|
+
this.concurrencyManager = new ConcurrencyManager()
|
|
48
|
+
this.providerFactory = providerFactory
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Execute proofs in parallel with dependency resolution
|
|
53
|
+
*/
|
|
54
|
+
async execute(
|
|
55
|
+
nodes: DependencyNode[],
|
|
56
|
+
options?: ParallelExecutionOptions
|
|
57
|
+
): Promise<ParallelExecutionResult> {
|
|
58
|
+
if (nodes.length === 0) {
|
|
59
|
+
return this.createEmptyResult()
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
this.running = true
|
|
63
|
+
this.cancelled = false
|
|
64
|
+
this.completed = 0
|
|
65
|
+
this.total = nodes.length
|
|
66
|
+
|
|
67
|
+
const startTime = Date.now()
|
|
68
|
+
const errors: ParallelExecutionError[] = []
|
|
69
|
+
const proofMap = new Map<string, SingleProof>()
|
|
70
|
+
const completedSet = new Set<string>()
|
|
71
|
+
|
|
72
|
+
// Analyze dependencies
|
|
73
|
+
const analysis = this.analyzer.analyze(nodes)
|
|
74
|
+
|
|
75
|
+
if (analysis.hasCycles) {
|
|
76
|
+
throw new Error(
|
|
77
|
+
`Dependency cycle detected: ${analysis.cyclePath?.join(' -> ')}`
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Initialize worker pool
|
|
82
|
+
const poolConfig = {
|
|
83
|
+
minWorkers: 1,
|
|
84
|
+
maxWorkers: Math.min(
|
|
85
|
+
analysis.suggestedParallelism,
|
|
86
|
+
this.concurrencyManager.getCurrentLimit()
|
|
87
|
+
),
|
|
88
|
+
...options?.poolConfig,
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
this.pool = new WorkerPool(poolConfig, this.providerFactory)
|
|
92
|
+
|
|
93
|
+
// Start concurrency monitoring
|
|
94
|
+
this.concurrencyManager.startMonitoring()
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
// Process in levels (parallel within level, sequential across levels)
|
|
98
|
+
let currentLevel = 0
|
|
99
|
+
let maxParallelism = 0
|
|
100
|
+
let totalParallelism = 0
|
|
101
|
+
let parallelismSamples = 0
|
|
102
|
+
let criticalPathTime = 0
|
|
103
|
+
const levelStartTimes = new Map<number, number>()
|
|
104
|
+
|
|
105
|
+
for (const level of analysis.executionLevels) {
|
|
106
|
+
if (this.cancelled) break
|
|
107
|
+
|
|
108
|
+
levelStartTimes.set(currentLevel, Date.now())
|
|
109
|
+
const levelTasks: Promise<{ id: string; proof: SingleProof }>[] = []
|
|
110
|
+
|
|
111
|
+
// Track parallelism
|
|
112
|
+
maxParallelism = Math.max(maxParallelism, level.length)
|
|
113
|
+
totalParallelism += level.length
|
|
114
|
+
parallelismSamples++
|
|
115
|
+
|
|
116
|
+
// Submit all tasks in this level
|
|
117
|
+
for (const nodeId of level) {
|
|
118
|
+
if (this.cancelled) break
|
|
119
|
+
|
|
120
|
+
const node = analysis.graph.nodes.get(nodeId)!
|
|
121
|
+
const task = this.createTask(node)
|
|
122
|
+
|
|
123
|
+
// Emit progress event
|
|
124
|
+
this.emitProgress(options, {
|
|
125
|
+
type: 'task_started',
|
|
126
|
+
taskId: nodeId,
|
|
127
|
+
completed: this.completed,
|
|
128
|
+
total: this.total,
|
|
129
|
+
percentage: Math.round((this.completed / this.total) * 100),
|
|
130
|
+
elapsedMs: Date.now() - startTime,
|
|
131
|
+
currentParallelism: level.length,
|
|
132
|
+
poolStats: this.pool?.getStats(),
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
const taskPromise = this.pool!
|
|
136
|
+
.submit(task, {
|
|
137
|
+
priority: task.priority,
|
|
138
|
+
maxRetries: task.maxRetries,
|
|
139
|
+
timeoutMs: options?.timeoutMs ?? 120000,
|
|
140
|
+
onComplete: () => {
|
|
141
|
+
this.completed++
|
|
142
|
+
completedSet.add(nodeId)
|
|
143
|
+
|
|
144
|
+
this.emitProgress(options, {
|
|
145
|
+
type: 'task_completed',
|
|
146
|
+
taskId: nodeId,
|
|
147
|
+
completed: this.completed,
|
|
148
|
+
total: this.total,
|
|
149
|
+
percentage: Math.round((this.completed / this.total) * 100),
|
|
150
|
+
elapsedMs: Date.now() - startTime,
|
|
151
|
+
estimatedRemainingMs: this.estimateRemainingTime(startTime),
|
|
152
|
+
currentParallelism: levelTasks.length,
|
|
153
|
+
poolStats: this.pool?.getStats(),
|
|
154
|
+
})
|
|
155
|
+
},
|
|
156
|
+
onError: (t, error) => {
|
|
157
|
+
errors.push({
|
|
158
|
+
taskId: t.id,
|
|
159
|
+
message: error.message,
|
|
160
|
+
stack: error.stack,
|
|
161
|
+
retryCount: t.retryCount,
|
|
162
|
+
wasRetried: t.retryCount > 0,
|
|
163
|
+
timestamp: Date.now(),
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
this.emitProgress(options, {
|
|
167
|
+
type: 'task_failed',
|
|
168
|
+
taskId: nodeId,
|
|
169
|
+
completed: this.completed,
|
|
170
|
+
total: this.total,
|
|
171
|
+
percentage: Math.round((this.completed / this.total) * 100),
|
|
172
|
+
elapsedMs: Date.now() - startTime,
|
|
173
|
+
currentParallelism: levelTasks.length,
|
|
174
|
+
poolStats: this.pool?.getStats(),
|
|
175
|
+
})
|
|
176
|
+
},
|
|
177
|
+
})
|
|
178
|
+
.then((proof) => ({ id: nodeId, proof }))
|
|
179
|
+
|
|
180
|
+
levelTasks.push(taskPromise)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Wait for all tasks in this level to complete
|
|
184
|
+
const results = await Promise.allSettled(levelTasks)
|
|
185
|
+
|
|
186
|
+
// Collect successful results
|
|
187
|
+
for (const result of results) {
|
|
188
|
+
if (result.status === 'fulfilled') {
|
|
189
|
+
proofMap.set(result.value.id, result.value.proof)
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Track critical path time (if this level is on critical path)
|
|
194
|
+
const levelTime = Date.now() - (levelStartTimes.get(currentLevel) ?? startTime)
|
|
195
|
+
const isCriticalPathLevel = level.some((id) =>
|
|
196
|
+
analysis.graph.criticalPath.includes(id)
|
|
197
|
+
)
|
|
198
|
+
if (isCriticalPathLevel) {
|
|
199
|
+
criticalPathTime += levelTime
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
this.emitProgress(options, {
|
|
203
|
+
type: 'batch_completed',
|
|
204
|
+
completed: this.completed,
|
|
205
|
+
total: this.total,
|
|
206
|
+
percentage: Math.round((this.completed / this.total) * 100),
|
|
207
|
+
elapsedMs: Date.now() - startTime,
|
|
208
|
+
currentParallelism: 0,
|
|
209
|
+
poolStats: this.pool?.getStats(),
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
currentLevel++
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const totalTime = Date.now() - startTime
|
|
216
|
+
const averageParallelism =
|
|
217
|
+
parallelismSamples > 0 ? totalParallelism / parallelismSamples : 1
|
|
218
|
+
|
|
219
|
+
// Calculate speedup vs sequential execution
|
|
220
|
+
const sequentialTime = this.estimateSequentialTime(nodes)
|
|
221
|
+
const speedupFactor = sequentialTime > 0 ? totalTime / sequentialTime : 1
|
|
222
|
+
const efficiency = averageParallelism > 0 ? speedupFactor / averageParallelism : 1
|
|
223
|
+
|
|
224
|
+
this.emitProgress(options, {
|
|
225
|
+
type: 'all_completed',
|
|
226
|
+
completed: this.completed,
|
|
227
|
+
total: this.total,
|
|
228
|
+
percentage: 100,
|
|
229
|
+
elapsedMs: totalTime,
|
|
230
|
+
currentParallelism: 0,
|
|
231
|
+
poolStats: this.pool?.getStats(),
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
// Build ordered proof array
|
|
235
|
+
const orderedProofs: SingleProof[] = []
|
|
236
|
+
if (options?.preserveOrder !== false) {
|
|
237
|
+
// Use execution order
|
|
238
|
+
const executionOrder = this.analyzer.getExecutionOrder(analysis.graph)
|
|
239
|
+
for (const nodeId of executionOrder) {
|
|
240
|
+
const proof = proofMap.get(nodeId)
|
|
241
|
+
if (proof) {
|
|
242
|
+
orderedProofs.push(proof)
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
} else {
|
|
246
|
+
orderedProofs.push(...proofMap.values())
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const stats: ParallelExecutionStats = {
|
|
250
|
+
totalTimeMs: totalTime,
|
|
251
|
+
criticalPathTimeMs: criticalPathTime,
|
|
252
|
+
maxParallelism,
|
|
253
|
+
averageParallelism,
|
|
254
|
+
tasksCompleted: this.completed,
|
|
255
|
+
tasksFailed: errors.length,
|
|
256
|
+
workSteals: this.pool?.getStats().workSteals ?? 0,
|
|
257
|
+
peakMemoryUsage: this.pool?.getStats().peakMemoryUsage ?? 0,
|
|
258
|
+
speedupFactor,
|
|
259
|
+
efficiency,
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return {
|
|
263
|
+
proofs: orderedProofs,
|
|
264
|
+
proofMap,
|
|
265
|
+
stats,
|
|
266
|
+
errors,
|
|
267
|
+
success: errors.length === 0,
|
|
268
|
+
}
|
|
269
|
+
} finally {
|
|
270
|
+
this.running = false
|
|
271
|
+
this.concurrencyManager.stopMonitoring()
|
|
272
|
+
await this.pool?.shutdown()
|
|
273
|
+
this.pool = null
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Cancel ongoing execution
|
|
279
|
+
*/
|
|
280
|
+
async cancel(): Promise<void> {
|
|
281
|
+
this.cancelled = true
|
|
282
|
+
if (this.pool) {
|
|
283
|
+
await this.pool.shutdown()
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Get current execution status
|
|
289
|
+
*/
|
|
290
|
+
getStatus(): {
|
|
291
|
+
readonly running: boolean
|
|
292
|
+
readonly progress: number
|
|
293
|
+
readonly completed: number
|
|
294
|
+
readonly total: number
|
|
295
|
+
} {
|
|
296
|
+
return {
|
|
297
|
+
running: this.running,
|
|
298
|
+
progress: this.total > 0 ? Math.round((this.completed / this.total) * 100) : 0,
|
|
299
|
+
completed: this.completed,
|
|
300
|
+
total: this.total,
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Get the dependency analyzer
|
|
306
|
+
*/
|
|
307
|
+
getAnalyzer(): IDependencyAnalyzer {
|
|
308
|
+
return this.analyzer
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Get the worker pool
|
|
313
|
+
*/
|
|
314
|
+
getPool(): IWorkerPool {
|
|
315
|
+
if (!this.pool) {
|
|
316
|
+
throw new Error('Worker pool not initialized. Call execute() first.')
|
|
317
|
+
}
|
|
318
|
+
return this.pool
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Get the concurrency manager
|
|
323
|
+
*/
|
|
324
|
+
getConcurrencyManager(): IConcurrencyManager {
|
|
325
|
+
return this.concurrencyManager
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// ─── Private Methods ─────────────────────────────────────────────────────────
|
|
329
|
+
|
|
330
|
+
private createTask(node: DependencyNode): ProofTask {
|
|
331
|
+
return {
|
|
332
|
+
id: node.id,
|
|
333
|
+
node,
|
|
334
|
+
priority: this.getPriority(node),
|
|
335
|
+
status: 'pending',
|
|
336
|
+
createdAt: Date.now(),
|
|
337
|
+
retryCount: 0,
|
|
338
|
+
maxRetries: 2,
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
private getPriority(node: DependencyNode): ProofTask['priority'] {
|
|
343
|
+
if (node.priority !== undefined) {
|
|
344
|
+
if (node.priority >= 3) return 'critical'
|
|
345
|
+
if (node.priority >= 2) return 'high'
|
|
346
|
+
if (node.priority >= 1) return 'normal'
|
|
347
|
+
return 'low'
|
|
348
|
+
}
|
|
349
|
+
return 'normal'
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
private createEmptyResult(): ParallelExecutionResult {
|
|
353
|
+
return {
|
|
354
|
+
proofs: [],
|
|
355
|
+
proofMap: new Map(),
|
|
356
|
+
stats: {
|
|
357
|
+
totalTimeMs: 0,
|
|
358
|
+
criticalPathTimeMs: 0,
|
|
359
|
+
maxParallelism: 0,
|
|
360
|
+
averageParallelism: 0,
|
|
361
|
+
tasksCompleted: 0,
|
|
362
|
+
tasksFailed: 0,
|
|
363
|
+
workSteals: 0,
|
|
364
|
+
peakMemoryUsage: 0,
|
|
365
|
+
speedupFactor: 1,
|
|
366
|
+
efficiency: 1,
|
|
367
|
+
},
|
|
368
|
+
errors: [],
|
|
369
|
+
success: true,
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
private emitProgress(
|
|
374
|
+
options: ParallelExecutionOptions | undefined,
|
|
375
|
+
event: ParallelProgressEvent
|
|
376
|
+
): void {
|
|
377
|
+
if (options?.enableProgress !== false && options?.onProgress) {
|
|
378
|
+
options.onProgress(event)
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
private estimateRemainingTime(startTime: number): number {
|
|
383
|
+
if (this.completed === 0) {
|
|
384
|
+
return 0
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
const elapsedMs = Date.now() - startTime
|
|
388
|
+
const avgTimePerTask = elapsedMs / this.completed
|
|
389
|
+
const remaining = this.total - this.completed
|
|
390
|
+
|
|
391
|
+
return Math.round(avgTimePerTask * remaining)
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
private estimateSequentialTime(nodes: DependencyNode[]): number {
|
|
395
|
+
// Sum of all estimated costs (normalized to ms)
|
|
396
|
+
// Assuming 1 cost unit = 10ms
|
|
397
|
+
return nodes.reduce((sum, node) => sum + node.estimatedCost * 10, 0)
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Create a parallel executor instance
|
|
403
|
+
*/
|
|
404
|
+
export function createParallelExecutor(
|
|
405
|
+
providerFactory: () => ComposableProofProvider
|
|
406
|
+
): IParallelExecutor {
|
|
407
|
+
return new ParallelExecutor(providerFactory)
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Execute proofs in parallel (convenience function)
|
|
412
|
+
*/
|
|
413
|
+
export async function executeParallel(
|
|
414
|
+
nodes: DependencyNode[],
|
|
415
|
+
providerFactory: () => ComposableProofProvider,
|
|
416
|
+
options?: ParallelExecutionOptions
|
|
417
|
+
): Promise<ParallelExecutionResult> {
|
|
418
|
+
const executor = createParallelExecutor(providerFactory)
|
|
419
|
+
return executor.execute(nodes, options)
|
|
420
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel Proof Generation Module
|
|
3
|
+
*
|
|
4
|
+
* @module proofs/parallel
|
|
5
|
+
* @description Optimized parallel proof generation with dependency resolution,
|
|
6
|
+
* work stealing, and resource-aware concurrency control
|
|
7
|
+
*
|
|
8
|
+
* M20-12: Optimize proof generation parallelization (#307)
|
|
9
|
+
*
|
|
10
|
+
* ## Overview
|
|
11
|
+
*
|
|
12
|
+
* This module provides infrastructure for executing multiple proof generation
|
|
13
|
+
* tasks in parallel with:
|
|
14
|
+
*
|
|
15
|
+
* - **Dependency Graph Analysis**: Determines optimal execution order
|
|
16
|
+
* - **Worker Pool**: Manages parallel workers with work stealing
|
|
17
|
+
* - **Concurrency Control**: CPU/memory-aware dynamic concurrency
|
|
18
|
+
* - **Progress Tracking**: Real-time execution progress events
|
|
19
|
+
*
|
|
20
|
+
* ## Usage
|
|
21
|
+
*
|
|
22
|
+
* ```typescript
|
|
23
|
+
* import {
|
|
24
|
+
* createParallelExecutor,
|
|
25
|
+
* createDependencyNode,
|
|
26
|
+
* } from '@sip-protocol/sdk/proofs/parallel'
|
|
27
|
+
*
|
|
28
|
+
* // Create proof nodes with dependencies
|
|
29
|
+
* const nodes = [
|
|
30
|
+
* createDependencyNode('proof-1', 'commitment', 'noir'),
|
|
31
|
+
* createDependencyNode('proof-2', 'funding', 'noir', {
|
|
32
|
+
* dependencies: ['proof-1'],
|
|
33
|
+
* }),
|
|
34
|
+
* createDependencyNode('proof-3', 'validity', 'halo2', {
|
|
35
|
+
* dependencies: ['proof-1'],
|
|
36
|
+
* }),
|
|
37
|
+
* createDependencyNode('proof-4', 'fulfillment', 'noir', {
|
|
38
|
+
* dependencies: ['proof-2', 'proof-3'],
|
|
39
|
+
* }),
|
|
40
|
+
* ]
|
|
41
|
+
*
|
|
42
|
+
* // Execute in parallel
|
|
43
|
+
* const executor = createParallelExecutor(() => myProofProvider)
|
|
44
|
+
* const result = await executor.execute(nodes, {
|
|
45
|
+
* onProgress: (event) => console.log(`${event.percentage}% complete`),
|
|
46
|
+
* })
|
|
47
|
+
*
|
|
48
|
+
* console.log(`Generated ${result.proofs.length} proofs`)
|
|
49
|
+
* console.log(`Speedup: ${result.stats.speedupFactor}x`)
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
// ─── Types and Interfaces ────────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
export type {
|
|
56
|
+
// Dependency Graph
|
|
57
|
+
DependencyNode,
|
|
58
|
+
DependencyEdge,
|
|
59
|
+
DependencyGraph,
|
|
60
|
+
GraphAnalysis,
|
|
61
|
+
// Worker Pool
|
|
62
|
+
WorkerStatus,
|
|
63
|
+
WorkerInfo,
|
|
64
|
+
WorkerPoolConfig,
|
|
65
|
+
WorkerPoolStats,
|
|
66
|
+
// Tasks
|
|
67
|
+
TaskStatus,
|
|
68
|
+
TaskPriority,
|
|
69
|
+
ProofTask,
|
|
70
|
+
TaskSubmitOptions,
|
|
71
|
+
// Concurrency
|
|
72
|
+
SystemResources,
|
|
73
|
+
ConcurrencyConfig,
|
|
74
|
+
ConcurrencyDecision,
|
|
75
|
+
// Work Stealing
|
|
76
|
+
WorkerStealingStats,
|
|
77
|
+
WorkStealEvent,
|
|
78
|
+
// Execution
|
|
79
|
+
ParallelExecutionOptions,
|
|
80
|
+
ParallelProgressEvent,
|
|
81
|
+
ParallelExecutionResult,
|
|
82
|
+
ParallelExecutionStats,
|
|
83
|
+
ParallelExecutionError,
|
|
84
|
+
// Scheduler
|
|
85
|
+
SchedulingStrategy,
|
|
86
|
+
SchedulerConfig,
|
|
87
|
+
// Interface contracts
|
|
88
|
+
IDependencyAnalyzer,
|
|
89
|
+
IWorkerPool,
|
|
90
|
+
IConcurrencyManager,
|
|
91
|
+
IWorkStealingScheduler,
|
|
92
|
+
IParallelExecutor,
|
|
93
|
+
} from './interface'
|
|
94
|
+
|
|
95
|
+
export {
|
|
96
|
+
DEFAULT_WORKER_POOL_CONFIG,
|
|
97
|
+
DEFAULT_CONCURRENCY_CONFIG,
|
|
98
|
+
DEFAULT_SCHEDULER_CONFIG,
|
|
99
|
+
} from './interface'
|
|
100
|
+
|
|
101
|
+
// ─── Dependency Graph ────────────────────────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
export {
|
|
104
|
+
DependencyAnalyzer,
|
|
105
|
+
createDependencyAnalyzer,
|
|
106
|
+
createDependencyNode,
|
|
107
|
+
} from './dependency-graph'
|
|
108
|
+
|
|
109
|
+
// ─── Concurrency Management ──────────────────────────────────────────────────
|
|
110
|
+
|
|
111
|
+
export {
|
|
112
|
+
ConcurrencyManager,
|
|
113
|
+
createConcurrencyManager,
|
|
114
|
+
getRecommendedConcurrency,
|
|
115
|
+
} from './concurrency'
|
|
116
|
+
|
|
117
|
+
// ─── Worker Pool ─────────────────────────────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
export {
|
|
120
|
+
WorkerPool,
|
|
121
|
+
WorkStealingScheduler,
|
|
122
|
+
createWorkerPool,
|
|
123
|
+
} from './worker-pool'
|
|
124
|
+
|
|
125
|
+
// ─── Parallel Executor ───────────────────────────────────────────────────────
|
|
126
|
+
|
|
127
|
+
export {
|
|
128
|
+
ParallelExecutor,
|
|
129
|
+
createParallelExecutor,
|
|
130
|
+
executeParallel,
|
|
131
|
+
} from './executor'
|