-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathTransactionReductionTask.ts
More file actions
71 lines (63 loc) · 1.96 KB
/
TransactionReductionTask.ts
File metadata and controls
71 lines (63 loc) · 1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import { inject, injectable, Lifecycle, scoped } from "tsyringe";
import {
MandatoryProtocolModulesRecord,
Protocol,
ProtocolModulesRecord,
TransactionProof,
TransactionProvable,
} from "@proto-kit/protocol";
import {
CompileRegistry,
ProvableMethodExecutionContext,
implement,
} from "@proto-kit/common";
import { TaskWorkerModule } from "../../../worker/worker/TaskWorkerModule";
import { Task, TaskSerializer } from "../../../worker/flow/Task";
import {
PairProofTaskSerializer,
PairTuple,
ProofTaskSerializer,
} from "../../../helpers/utils";
@injectable()
@scoped(Lifecycle.ContainerScoped)
@implement("Task")
export class TransactionReductionTask
extends TaskWorkerModule
implements Task<PairTuple<TransactionProof>, TransactionProof>
{
private readonly transactionProver: TransactionProvable;
public name = "transactionReduction";
public constructor(
@inject("Protocol")
private readonly protocol: Protocol<
MandatoryProtocolModulesRecord & ProtocolModulesRecord
>,
private readonly executionContext: ProvableMethodExecutionContext,
private readonly compileRegistry: CompileRegistry
) {
super();
this.transactionProver = this.protocol.transactionProver;
}
public inputSerializer(): TaskSerializer<PairTuple<TransactionProof>> {
return new PairProofTaskSerializer(
this.transactionProver.zkProgrammable.zkProgram[0].Proof
);
}
public resultSerializer(): TaskSerializer<TransactionProof> {
return new ProofTaskSerializer(
this.transactionProver.zkProgrammable.zkProgram[0].Proof
);
}
public async compute(
input: PairTuple<TransactionProof>
): Promise<TransactionProof> {
const [r1, r2] = input;
await this.transactionProver.merge(r1.publicInput, r1, r2);
return await this.executionContext
.current()
.result.prove<TransactionProof>();
}
public async prepare(): Promise<void> {
await this.transactionProver.compile(this.compileRegistry);
}
}