@aztec/prover-client 0.55.0 → 0.56.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/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +6 -27
- package/dest/mocks/test_context.d.ts +4 -5
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +7 -9
- package/dest/orchestrator/block-building-helpers.d.ts +12 -3
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +34 -32
- package/dest/orchestrator/{proving-state.d.ts → block-proving-state.d.ts} +17 -13
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/block-proving-state.js +170 -0
- package/dest/orchestrator/epoch-proving-state.d.ts +57 -0
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/epoch-proving-state.js +151 -0
- package/dest/orchestrator/orchestrator.d.ts +32 -11
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +246 -139
- package/dest/orchestrator/tx-proving-state.d.ts +3 -2
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.js +54 -26
- package/dest/prover-agent/memory-proving-queue.d.ts +11 -5
- package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
- package/dest/prover-agent/memory-proving-queue.js +16 -6
- package/dest/prover-agent/prover-agent.d.ts.map +1 -1
- package/dest/prover-agent/prover-agent.js +10 -10
- package/dest/prover-agent/rpc.d.ts.map +1 -1
- package/dest/prover-agent/rpc.js +8 -2
- package/dest/test/mock_prover.d.ts +27 -0
- package/dest/test/mock_prover.d.ts.map +1 -0
- package/dest/test/mock_prover.js +58 -0
- package/package.json +13 -11
- package/src/mocks/fixtures.ts +5 -49
- package/src/mocks/test_context.ts +7 -12
- package/src/orchestrator/block-building-helpers.ts +90 -57
- package/src/orchestrator/{proving-state.ts → block-proving-state.ts} +42 -40
- package/src/orchestrator/epoch-proving-state.ts +232 -0
- package/src/orchestrator/orchestrator.ts +410 -244
- package/src/orchestrator/tx-proving-state.ts +63 -27
- package/src/prover-agent/memory-proving-queue.ts +30 -16
- package/src/prover-agent/prover-agent.ts +11 -9
- package/src/prover-agent/rpc.ts +9 -0
- package/src/test/mock_prover.ts +170 -0
- package/dest/orchestrator/proving-state.d.ts.map +0 -1
- package/dest/orchestrator/proving-state.js +0 -170
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
var PROVING_STATE_LIFECYCLE;
|
|
2
|
-
(function (PROVING_STATE_LIFECYCLE) {
|
|
3
|
-
PROVING_STATE_LIFECYCLE[PROVING_STATE_LIFECYCLE["PROVING_STATE_CREATED"] = 0] = "PROVING_STATE_CREATED";
|
|
4
|
-
PROVING_STATE_LIFECYCLE[PROVING_STATE_LIFECYCLE["PROVING_STATE_FULL"] = 1] = "PROVING_STATE_FULL";
|
|
5
|
-
PROVING_STATE_LIFECYCLE[PROVING_STATE_LIFECYCLE["PROVING_STATE_RESOLVED"] = 2] = "PROVING_STATE_RESOLVED";
|
|
6
|
-
PROVING_STATE_LIFECYCLE[PROVING_STATE_LIFECYCLE["PROVING_STATE_REJECTED"] = 3] = "PROVING_STATE_REJECTED";
|
|
7
|
-
})(PROVING_STATE_LIFECYCLE || (PROVING_STATE_LIFECYCLE = {}));
|
|
8
|
-
/**
|
|
9
|
-
* The current state of the proving schedule. Contains the raw inputs (txs) and intermediate state to generate every constituent proof in the tree.
|
|
10
|
-
* Carries an identifier so we can identify if the proving state is discarded and a new one started.
|
|
11
|
-
* Captures resolve and reject callbacks to provide a promise base interface to the consumer of our proving.
|
|
12
|
-
*/
|
|
13
|
-
export class ProvingState {
|
|
14
|
-
constructor(totalNumTxs, completionCallback, rejectionCallback, globalVariables, newL1ToL2Messages, numRootParityInputs, messageTreeSnapshot, messageTreeRootSiblingPath) {
|
|
15
|
-
this.totalNumTxs = totalNumTxs;
|
|
16
|
-
this.completionCallback = completionCallback;
|
|
17
|
-
this.rejectionCallback = rejectionCallback;
|
|
18
|
-
this.globalVariables = globalVariables;
|
|
19
|
-
this.newL1ToL2Messages = newL1ToL2Messages;
|
|
20
|
-
this.messageTreeSnapshot = messageTreeSnapshot;
|
|
21
|
-
this.messageTreeRootSiblingPath = messageTreeRootSiblingPath;
|
|
22
|
-
this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED;
|
|
23
|
-
this.mergeRollupInputs = [];
|
|
24
|
-
this.rootParityInputs = [];
|
|
25
|
-
this.txs = [];
|
|
26
|
-
this.rootParityInputs = Array.from({ length: numRootParityInputs }).map(_ => undefined);
|
|
27
|
-
}
|
|
28
|
-
// Returns the number of levels of merge rollups
|
|
29
|
-
get numMergeLevels() {
|
|
30
|
-
return BigInt(Math.ceil(Math.log2(this.totalNumTxs)) - 1);
|
|
31
|
-
}
|
|
32
|
-
// Calculates the index and level of the parent rollup circuit
|
|
33
|
-
// Based on tree implementation in unbalanced_tree.ts -> batchInsert()
|
|
34
|
-
findMergeLevel(currentLevel, currentIndex) {
|
|
35
|
-
const moveUpMergeLevel = (levelSize, index, nodeToShift) => {
|
|
36
|
-
levelSize /= 2;
|
|
37
|
-
if (levelSize & 1) {
|
|
38
|
-
[levelSize, nodeToShift] = nodeToShift ? [levelSize + 1, false] : [levelSize - 1, true];
|
|
39
|
-
}
|
|
40
|
-
index >>= 1n;
|
|
41
|
-
return { thisLevelSize: levelSize, thisIndex: index, shiftUp: nodeToShift };
|
|
42
|
-
};
|
|
43
|
-
let [thisLevelSize, shiftUp] = this.totalNumTxs & 1 ? [this.totalNumTxs - 1, true] : [this.totalNumTxs, false];
|
|
44
|
-
const maxLevel = this.numMergeLevels + 1n;
|
|
45
|
-
let placeholder = currentIndex;
|
|
46
|
-
for (let i = 0; i < maxLevel - currentLevel; i++) {
|
|
47
|
-
({ thisLevelSize, thisIndex: placeholder, shiftUp } = moveUpMergeLevel(thisLevelSize, placeholder, shiftUp));
|
|
48
|
-
}
|
|
49
|
-
let thisIndex = currentIndex;
|
|
50
|
-
let mergeLevel = currentLevel;
|
|
51
|
-
while (thisIndex >= thisLevelSize && mergeLevel != 0n) {
|
|
52
|
-
mergeLevel -= 1n;
|
|
53
|
-
({ thisLevelSize, thisIndex, shiftUp } = moveUpMergeLevel(thisLevelSize, thisIndex, shiftUp));
|
|
54
|
-
}
|
|
55
|
-
return [mergeLevel - 1n, thisIndex >> 1n, thisIndex & 1n];
|
|
56
|
-
}
|
|
57
|
-
// Adds a transaction to the proving state, returns it's index
|
|
58
|
-
// Will update the proving life cycle if this is the last transaction
|
|
59
|
-
addNewTx(tx) {
|
|
60
|
-
this.txs.push(tx);
|
|
61
|
-
if (this.txs.length === this.totalNumTxs) {
|
|
62
|
-
this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_FULL;
|
|
63
|
-
}
|
|
64
|
-
return this.txs.length - 1;
|
|
65
|
-
}
|
|
66
|
-
// Returns the number of received transactions
|
|
67
|
-
get transactionsReceived() {
|
|
68
|
-
return this.txs.length;
|
|
69
|
-
}
|
|
70
|
-
// Returns the final set of root parity inputs
|
|
71
|
-
get finalRootParityInput() {
|
|
72
|
-
return this.finalRootParityInputs;
|
|
73
|
-
}
|
|
74
|
-
// Sets the final set of root parity inputs
|
|
75
|
-
set finalRootParityInput(input) {
|
|
76
|
-
this.finalRootParityInputs = input;
|
|
77
|
-
}
|
|
78
|
-
// Returns the set of root parity inputs
|
|
79
|
-
get rootParityInput() {
|
|
80
|
-
return this.rootParityInputs;
|
|
81
|
-
}
|
|
82
|
-
// Returns true if this proving state is still valid, false otherwise
|
|
83
|
-
verifyState() {
|
|
84
|
-
return (this.provingStateLifecycle === PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED ||
|
|
85
|
-
this.provingStateLifecycle === PROVING_STATE_LIFECYCLE.PROVING_STATE_FULL);
|
|
86
|
-
}
|
|
87
|
-
// Returns true if we are still able to accept transactions, false otherwise
|
|
88
|
-
isAcceptingTransactions() {
|
|
89
|
-
return this.provingStateLifecycle === PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED;
|
|
90
|
-
}
|
|
91
|
-
// Returns the complete set of transaction proving state objects
|
|
92
|
-
get allTxs() {
|
|
93
|
-
return this.txs;
|
|
94
|
-
}
|
|
95
|
-
/** Returns the block number as an epoch number. Used for prioritizing proof requests. */
|
|
96
|
-
get epochNumber() {
|
|
97
|
-
return this.globalVariables.blockNumber.toNumber();
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Stores the inputs to a merge circuit and determines if the circuit is ready to be executed
|
|
101
|
-
* @param mergeInputs - The inputs to store
|
|
102
|
-
* @param indexWithinMerge - The index in the set of inputs to this merge circuit
|
|
103
|
-
* @param indexOfMerge - The global index of this merge circuit
|
|
104
|
-
* @returns True if the merge circuit is ready to be executed, false otherwise
|
|
105
|
-
*/
|
|
106
|
-
storeMergeInputs(mergeInputs, indexWithinMerge, indexOfMerge) {
|
|
107
|
-
if (!this.mergeRollupInputs[indexOfMerge]) {
|
|
108
|
-
const mergeInputData = {
|
|
109
|
-
inputs: [undefined, undefined],
|
|
110
|
-
proofs: [undefined, undefined],
|
|
111
|
-
verificationKeys: [undefined, undefined],
|
|
112
|
-
};
|
|
113
|
-
mergeInputData.inputs[indexWithinMerge] = mergeInputs[0];
|
|
114
|
-
mergeInputData.proofs[indexWithinMerge] = mergeInputs[1];
|
|
115
|
-
mergeInputData.verificationKeys[indexWithinMerge] = mergeInputs[2];
|
|
116
|
-
this.mergeRollupInputs[indexOfMerge] = mergeInputData;
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
const mergeInputData = this.mergeRollupInputs[indexOfMerge];
|
|
120
|
-
mergeInputData.inputs[indexWithinMerge] = mergeInputs[0];
|
|
121
|
-
mergeInputData.proofs[indexWithinMerge] = mergeInputs[1];
|
|
122
|
-
mergeInputData.verificationKeys[indexWithinMerge] = mergeInputs[2];
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
// Returns a specific transaction proving state
|
|
126
|
-
getTxProvingState(txIndex) {
|
|
127
|
-
return this.txs[txIndex];
|
|
128
|
-
}
|
|
129
|
-
// Returns a set of merge rollup inputs
|
|
130
|
-
getMergeInputs(indexOfMerge) {
|
|
131
|
-
return this.mergeRollupInputs[indexOfMerge];
|
|
132
|
-
}
|
|
133
|
-
// Returns true if we have sufficient inputs to execute the block root rollup
|
|
134
|
-
isReadyForBlockRootRollup() {
|
|
135
|
-
return !(this.mergeRollupInputs[0] === undefined ||
|
|
136
|
-
this.finalRootParityInput === undefined ||
|
|
137
|
-
this.mergeRollupInputs[0].inputs.findIndex(p => !p) !== -1);
|
|
138
|
-
}
|
|
139
|
-
// Stores a set of root parity inputs at the given index
|
|
140
|
-
setRootParityInputs(inputs, index) {
|
|
141
|
-
this.rootParityInputs[index] = inputs;
|
|
142
|
-
}
|
|
143
|
-
// Returns true if we have sufficient root parity inputs to execute the root parity circuit
|
|
144
|
-
areRootParityInputsReady() {
|
|
145
|
-
return this.rootParityInputs.findIndex(p => !p) === -1;
|
|
146
|
-
}
|
|
147
|
-
// Attempts to reject the proving state promise with a reason of 'cancelled'
|
|
148
|
-
cancel() {
|
|
149
|
-
this.reject('Proving cancelled');
|
|
150
|
-
}
|
|
151
|
-
// Attempts to reject the proving state promise with the given reason
|
|
152
|
-
// Does nothing if not in a valid state
|
|
153
|
-
reject(reason) {
|
|
154
|
-
if (!this.verifyState()) {
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_REJECTED;
|
|
158
|
-
this.rejectionCallback(reason);
|
|
159
|
-
}
|
|
160
|
-
// Attempts to resolve the proving state promise with the given result
|
|
161
|
-
// Does nothing if not in a valid state
|
|
162
|
-
resolve(result) {
|
|
163
|
-
if (!this.verifyState()) {
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_RESOLVED;
|
|
167
|
-
this.completionCallback(result);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmluZy1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcmNoZXN0cmF0b3IvcHJvdmluZy1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUErQkEsSUFBSyx1QkFLSjtBQUxELFdBQUssdUJBQXVCO0lBQzFCLHVHQUFxQixDQUFBO0lBQ3JCLGlHQUFrQixDQUFBO0lBQ2xCLHlHQUFzQixDQUFBO0lBQ3RCLHlHQUFzQixDQUFBO0FBQ3hCLENBQUMsRUFMSSx1QkFBdUIsS0FBdkIsdUJBQXVCLFFBSzNCO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBU3ZCLFlBQ2tCLFdBQW1CLEVBQzNCLGtCQUFtRCxFQUNuRCxpQkFBMkMsRUFDbkMsZUFBZ0MsRUFDaEMsaUJBQXdFLEVBQ3hGLG1CQUEyQixFQUNYLG1CQUEyQyxFQUMzQywwQkFBc0Y7UUFQdEYsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDM0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFpQztRQUNuRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBQ25DLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXVEO1FBRXhFLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBd0I7UUFDM0MsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUE0RDtRQWhCaEcsMEJBQXFCLEdBQUcsdUJBQXVCLENBQUMscUJBQXFCLENBQUM7UUFDdEUsc0JBQWlCLEdBQTJCLEVBQUUsQ0FBQztRQUMvQyxxQkFBZ0IsR0FBc0UsRUFBRSxDQUFDO1FBS3pGLFFBQUcsR0FBcUIsRUFBRSxDQUFDO1FBV2pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRixD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
|