-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathStateTransitionFlow.ts
More file actions
104 lines (95 loc) · 3.04 KB
/
StateTransitionFlow.ts
File metadata and controls
104 lines (95 loc) · 3.04 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import { inject, injectable, Lifecycle, scoped } from "tsyringe";
import {
MandatoryProtocolModulesRecord,
Protocol,
StateTransitionProof,
StateTransitionProverPublicInput,
StateTransitionProverPublicOutput,
} from "@proto-kit/protocol";
import { Field } from "o1js";
import { FlowCreator } from "../../../worker/flow/Flow";
import {
StateTransitionProofParameters,
StateTransitionTask,
} from "../tasks/StateTransitionTask";
import { StateTransitionReductionTask } from "../tasks/StateTransitionReductionTask";
import { ReductionTaskFlow } from "./ReductionTaskFlow";
import { dependencyFactory, DependencyRecord } from "@proto-kit/common";
@injectable()
@scoped(Lifecycle.ContainerScoped)
@dependencyFactory()
export class StateTransitionFlow {
public constructor(
@inject("Protocol")
private readonly protocol: Protocol<MandatoryProtocolModulesRecord>,
private readonly flowCreator: FlowCreator,
private readonly stateTransitionTask: StateTransitionTask,
private readonly stateTransitionReductionTask: StateTransitionReductionTask
) {}
public static dependencies(): DependencyRecord {
return {
stateTransitionTask: {
useClass: StateTransitionTask,
},
stateTransitionReductionTask: {
useClass: StateTransitionReductionTask,
},
};
}
private async dummySTProof(): Promise<StateTransitionProof> {
const emptyInputOutput: StateTransitionProverPublicInput &
StateTransitionProverPublicOutput = {
root: Field(0),
currentBatchStateHash: Field(0),
batchesHash: Field(0),
witnessedRootsHash: Field(0),
};
return await this.protocol.stateTransitionProver.zkProgrammable.zkProgram[0].Proof.dummy(
emptyInputOutput,
emptyInputOutput,
2
);
}
private createFlow(name: string, inputLength: number) {
return new ReductionTaskFlow(
{
name,
inputLength,
mappingTask: this.stateTransitionTask,
reductionTask: this.stateTransitionReductionTask,
mergableFunction: (a, b) =>
a.publicOutput.root
.equals(b.publicInput.root)
.and(
a.publicOutput.witnessedRootsHash.equals(
b.publicInput.witnessedRootsHash
)
)
.and(
a.publicOutput.currentBatchStateHash.equals(
b.publicInput.currentBatchStateHash
)
)
.and(a.publicOutput.batchesHash.equals(b.publicInput.batchesHash))
.toBoolean(),
},
this.flowCreator
);
}
public async executeBatches(
trace: StateTransitionProofParameters[],
batchId: number,
callback: (result: StateTransitionProof) => Promise<void>
) {
if (trace.length > 0) {
const flow = this.createFlow(`st-proof-${batchId}`, trace.length);
await flow.flow.forEach(trace, async (input) => {
await flow.pushInput(input);
});
flow.onCompletion(callback);
} else {
const dummy = await this.dummySTProof();
await callback(dummy);
}
}
}