@aztec/prover-client 0.0.1-commit.b655e406 → 0.0.1-commit.c2595eba
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/config.d.ts +2 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +1 -1
- package/dest/index.d.ts +1 -1
- package/dest/light/index.d.ts +2 -0
- package/dest/light/index.d.ts.map +1 -0
- package/dest/light/index.js +1 -0
- package/dest/light/lightweight_checkpoint_builder.d.ts +45 -0
- package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -0
- package/dest/light/lightweight_checkpoint_builder.js +197 -0
- package/dest/mocks/fixtures.d.ts +1 -4
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +9 -18
- package/dest/mocks/test_context.d.ts +29 -46
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +116 -116
- package/dest/orchestrator/block-building-helpers.d.ts +17 -19
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +88 -113
- package/dest/orchestrator/block-proving-state.d.ts +17 -11
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +81 -20
- package/dest/orchestrator/checkpoint-proving-state.d.ts +22 -9
- package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/checkpoint-proving-state.js +49 -17
- package/dest/orchestrator/epoch-proving-state.d.ts +12 -10
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/epoch-proving-state.js +38 -4
- package/dest/orchestrator/index.d.ts +1 -1
- package/dest/orchestrator/orchestrator.d.ts +26 -11
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +556 -161
- package/dest/orchestrator/orchestrator_metrics.d.ts +1 -3
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator_metrics.js +2 -15
- package/dest/orchestrator/tx-proving-state.d.ts +6 -5
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.js +7 -16
- package/dest/prover-client/factory.d.ts +3 -3
- package/dest/prover-client/factory.d.ts.map +1 -1
- package/dest/prover-client/index.d.ts +1 -1
- package/dest/prover-client/prover-client.d.ts +3 -3
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +7 -4
- package/dest/prover-client/server-epoch-prover.d.ts +8 -7
- package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
- package/dest/prover-client/server-epoch-prover.js +2 -2
- package/dest/proving_broker/broker_prover_facade.d.ts +25 -23
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
- package/dest/proving_broker/broker_prover_facade.js +9 -15
- package/dest/proving_broker/config.d.ts +16 -8
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +14 -2
- package/dest/proving_broker/factory.d.ts +1 -1
- package/dest/proving_broker/fixtures.d.ts +3 -2
- package/dest/proving_broker/fixtures.d.ts.map +1 -1
- package/dest/proving_broker/fixtures.js +3 -2
- package/dest/proving_broker/index.d.ts +1 -1
- package/dest/proving_broker/proof_store/factory.d.ts +2 -2
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +1 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/index.d.ts +1 -1
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts +1 -1
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/proof_store.d.ts +1 -1
- package/dest/proving_broker/proving_agent.d.ts +5 -9
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.js +4 -19
- package/dest/proving_broker/proving_broker.d.ts +2 -2
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +6 -11
- package/dest/proving_broker/proving_broker_database/memory.d.ts +3 -2
- package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.d.ts +5 -3
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.js +392 -3
- package/dest/proving_broker/proving_broker_database.d.ts +3 -2
- package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.d.ts +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.js +15 -35
- package/dest/proving_broker/proving_job_controller.d.ts +5 -3
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.js +8 -6
- package/dest/proving_broker/rpc.d.ts +4 -4
- package/dest/test/mock_proof_store.d.ts +1 -1
- package/dest/test/mock_proof_store.d.ts.map +1 -1
- package/dest/test/mock_prover.d.ts +3 -4
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +4 -4
- package/package.json +20 -18
- package/src/config.ts +1 -1
- package/src/light/index.ts +1 -0
- package/src/light/lightweight_checkpoint_builder.ts +284 -0
- package/src/mocks/fixtures.ts +9 -31
- package/src/mocks/test_context.ts +158 -177
- package/src/orchestrator/block-building-helpers.ts +127 -207
- package/src/orchestrator/block-proving-state.ts +103 -25
- package/src/orchestrator/checkpoint-proving-state.ts +71 -21
- package/src/orchestrator/epoch-proving-state.ts +64 -14
- package/src/orchestrator/orchestrator.ts +158 -149
- package/src/orchestrator/orchestrator_metrics.ts +2 -25
- package/src/orchestrator/tx-proving-state.ts +10 -27
- package/src/prover-client/factory.ts +6 -2
- package/src/prover-client/prover-client.ts +25 -15
- package/src/prover-client/server-epoch-prover.ts +6 -7
- package/src/proving_broker/broker_prover_facade.ts +31 -37
- package/src/proving_broker/config.ts +17 -1
- package/src/proving_broker/fixtures.ts +8 -3
- package/src/proving_broker/proving_agent.ts +6 -19
- package/src/proving_broker/proving_broker.ts +6 -9
- package/src/proving_broker/proving_broker_database/memory.ts +2 -1
- package/src/proving_broker/proving_broker_database/persisted.ts +20 -5
- package/src/proving_broker/proving_broker_database.ts +2 -1
- package/src/proving_broker/proving_broker_instrumentation.ts +14 -35
- package/src/proving_broker/proving_job_controller.ts +13 -7
- package/src/test/mock_prover.ts +2 -14
- package/dest/block-factory/index.d.ts +0 -2
- package/dest/block-factory/index.d.ts.map +0 -1
- package/dest/block-factory/index.js +0 -1
- package/dest/block-factory/light.d.ts +0 -38
- package/dest/block-factory/light.d.ts.map +0 -1
- package/dest/block-factory/light.js +0 -94
- package/dest/proving_broker/proving_agent_instrumentation.d.ts +0 -8
- package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +0 -1
- package/dest/proving_broker/proving_agent_instrumentation.js +0 -16
- package/src/block-factory/index.ts +0 -1
- package/src/block-factory/light.ts +0 -140
- package/src/proving_broker/proving_agent_instrumentation.ts +0 -21
|
@@ -1,29 +1,403 @@
|
|
|
1
|
-
function
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
function applyDecs2203RFactory() {
|
|
2
|
+
function createAddInitializerMethod(initializers, decoratorFinishedRef) {
|
|
3
|
+
return function addInitializer(initializer) {
|
|
4
|
+
assertNotFinished(decoratorFinishedRef, "addInitializer");
|
|
5
|
+
assertCallable(initializer, "An initializer");
|
|
6
|
+
initializers.push(initializer);
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
|
|
10
|
+
var kindStr;
|
|
11
|
+
switch(kind){
|
|
12
|
+
case 1:
|
|
13
|
+
kindStr = "accessor";
|
|
14
|
+
break;
|
|
15
|
+
case 2:
|
|
16
|
+
kindStr = "method";
|
|
17
|
+
break;
|
|
18
|
+
case 3:
|
|
19
|
+
kindStr = "getter";
|
|
20
|
+
break;
|
|
21
|
+
case 4:
|
|
22
|
+
kindStr = "setter";
|
|
23
|
+
break;
|
|
24
|
+
default:
|
|
25
|
+
kindStr = "field";
|
|
26
|
+
}
|
|
27
|
+
var ctx = {
|
|
28
|
+
kind: kindStr,
|
|
29
|
+
name: isPrivate ? "#" + name : name,
|
|
30
|
+
static: isStatic,
|
|
31
|
+
private: isPrivate,
|
|
32
|
+
metadata: metadata
|
|
33
|
+
};
|
|
34
|
+
var decoratorFinishedRef = {
|
|
35
|
+
v: false
|
|
36
|
+
};
|
|
37
|
+
ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
|
|
38
|
+
var get, set;
|
|
39
|
+
if (kind === 0) {
|
|
40
|
+
if (isPrivate) {
|
|
41
|
+
get = desc.get;
|
|
42
|
+
set = desc.set;
|
|
43
|
+
} else {
|
|
44
|
+
get = function() {
|
|
45
|
+
return this[name];
|
|
46
|
+
};
|
|
47
|
+
set = function(v) {
|
|
48
|
+
this[name] = v;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
} else if (kind === 2) {
|
|
52
|
+
get = function() {
|
|
53
|
+
return desc.value;
|
|
54
|
+
};
|
|
55
|
+
} else {
|
|
56
|
+
if (kind === 1 || kind === 3) {
|
|
57
|
+
get = function() {
|
|
58
|
+
return desc.get.call(this);
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (kind === 1 || kind === 4) {
|
|
62
|
+
set = function(v) {
|
|
63
|
+
desc.set.call(this, v);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
ctx.access = get && set ? {
|
|
68
|
+
get: get,
|
|
69
|
+
set: set
|
|
70
|
+
} : get ? {
|
|
71
|
+
get: get
|
|
72
|
+
} : {
|
|
73
|
+
set: set
|
|
74
|
+
};
|
|
75
|
+
try {
|
|
76
|
+
return dec(value, ctx);
|
|
77
|
+
} finally{
|
|
78
|
+
decoratorFinishedRef.v = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function assertNotFinished(decoratorFinishedRef, fnName) {
|
|
82
|
+
if (decoratorFinishedRef.v) {
|
|
83
|
+
throw new Error("attempted to call " + fnName + " after decoration was finished");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function assertCallable(fn, hint) {
|
|
87
|
+
if (typeof fn !== "function") {
|
|
88
|
+
throw new TypeError(hint + " must be a function");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function assertValidReturnValue(kind, value) {
|
|
92
|
+
var type = typeof value;
|
|
93
|
+
if (kind === 1) {
|
|
94
|
+
if (type !== "object" || value === null) {
|
|
95
|
+
throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
|
|
96
|
+
}
|
|
97
|
+
if (value.get !== undefined) {
|
|
98
|
+
assertCallable(value.get, "accessor.get");
|
|
99
|
+
}
|
|
100
|
+
if (value.set !== undefined) {
|
|
101
|
+
assertCallable(value.set, "accessor.set");
|
|
102
|
+
}
|
|
103
|
+
if (value.init !== undefined) {
|
|
104
|
+
assertCallable(value.init, "accessor.init");
|
|
105
|
+
}
|
|
106
|
+
} else if (type !== "function") {
|
|
107
|
+
var hint;
|
|
108
|
+
if (kind === 0) {
|
|
109
|
+
hint = "field";
|
|
110
|
+
} else if (kind === 10) {
|
|
111
|
+
hint = "class";
|
|
112
|
+
} else {
|
|
113
|
+
hint = "method";
|
|
114
|
+
}
|
|
115
|
+
throw new TypeError(hint + " decorators must return a function or void 0");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
|
|
119
|
+
var decs = decInfo[0];
|
|
120
|
+
var desc, init, value;
|
|
121
|
+
if (isPrivate) {
|
|
122
|
+
if (kind === 0 || kind === 1) {
|
|
123
|
+
desc = {
|
|
124
|
+
get: decInfo[3],
|
|
125
|
+
set: decInfo[4]
|
|
126
|
+
};
|
|
127
|
+
} else if (kind === 3) {
|
|
128
|
+
desc = {
|
|
129
|
+
get: decInfo[3]
|
|
130
|
+
};
|
|
131
|
+
} else if (kind === 4) {
|
|
132
|
+
desc = {
|
|
133
|
+
set: decInfo[3]
|
|
134
|
+
};
|
|
135
|
+
} else {
|
|
136
|
+
desc = {
|
|
137
|
+
value: decInfo[3]
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
} else if (kind !== 0) {
|
|
141
|
+
desc = Object.getOwnPropertyDescriptor(base, name);
|
|
142
|
+
}
|
|
143
|
+
if (kind === 1) {
|
|
144
|
+
value = {
|
|
145
|
+
get: desc.get,
|
|
146
|
+
set: desc.set
|
|
147
|
+
};
|
|
148
|
+
} else if (kind === 2) {
|
|
149
|
+
value = desc.value;
|
|
150
|
+
} else if (kind === 3) {
|
|
151
|
+
value = desc.get;
|
|
152
|
+
} else if (kind === 4) {
|
|
153
|
+
value = desc.set;
|
|
154
|
+
}
|
|
155
|
+
var newValue, get, set;
|
|
156
|
+
if (typeof decs === "function") {
|
|
157
|
+
newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
|
|
158
|
+
if (newValue !== void 0) {
|
|
159
|
+
assertValidReturnValue(kind, newValue);
|
|
160
|
+
if (kind === 0) {
|
|
161
|
+
init = newValue;
|
|
162
|
+
} else if (kind === 1) {
|
|
163
|
+
init = newValue.init;
|
|
164
|
+
get = newValue.get || value.get;
|
|
165
|
+
set = newValue.set || value.set;
|
|
166
|
+
value = {
|
|
167
|
+
get: get,
|
|
168
|
+
set: set
|
|
169
|
+
};
|
|
170
|
+
} else {
|
|
171
|
+
value = newValue;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
for(var i = decs.length - 1; i >= 0; i--){
|
|
176
|
+
var dec = decs[i];
|
|
177
|
+
newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
|
|
178
|
+
if (newValue !== void 0) {
|
|
179
|
+
assertValidReturnValue(kind, newValue);
|
|
180
|
+
var newInit;
|
|
181
|
+
if (kind === 0) {
|
|
182
|
+
newInit = newValue;
|
|
183
|
+
} else if (kind === 1) {
|
|
184
|
+
newInit = newValue.init;
|
|
185
|
+
get = newValue.get || value.get;
|
|
186
|
+
set = newValue.set || value.set;
|
|
187
|
+
value = {
|
|
188
|
+
get: get,
|
|
189
|
+
set: set
|
|
190
|
+
};
|
|
191
|
+
} else {
|
|
192
|
+
value = newValue;
|
|
193
|
+
}
|
|
194
|
+
if (newInit !== void 0) {
|
|
195
|
+
if (init === void 0) {
|
|
196
|
+
init = newInit;
|
|
197
|
+
} else if (typeof init === "function") {
|
|
198
|
+
init = [
|
|
199
|
+
init,
|
|
200
|
+
newInit
|
|
201
|
+
];
|
|
202
|
+
} else {
|
|
203
|
+
init.push(newInit);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (kind === 0 || kind === 1) {
|
|
210
|
+
if (init === void 0) {
|
|
211
|
+
init = function(instance, init) {
|
|
212
|
+
return init;
|
|
213
|
+
};
|
|
214
|
+
} else if (typeof init !== "function") {
|
|
215
|
+
var ownInitializers = init;
|
|
216
|
+
init = function(instance, init) {
|
|
217
|
+
var value = init;
|
|
218
|
+
for(var i = 0; i < ownInitializers.length; i++){
|
|
219
|
+
value = ownInitializers[i].call(instance, value);
|
|
220
|
+
}
|
|
221
|
+
return value;
|
|
222
|
+
};
|
|
223
|
+
} else {
|
|
224
|
+
var originalInitializer = init;
|
|
225
|
+
init = function(instance, init) {
|
|
226
|
+
return originalInitializer.call(instance, init);
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
ret.push(init);
|
|
230
|
+
}
|
|
231
|
+
if (kind !== 0) {
|
|
232
|
+
if (kind === 1) {
|
|
233
|
+
desc.get = value.get;
|
|
234
|
+
desc.set = value.set;
|
|
235
|
+
} else if (kind === 2) {
|
|
236
|
+
desc.value = value;
|
|
237
|
+
} else if (kind === 3) {
|
|
238
|
+
desc.get = value;
|
|
239
|
+
} else if (kind === 4) {
|
|
240
|
+
desc.set = value;
|
|
241
|
+
}
|
|
242
|
+
if (isPrivate) {
|
|
243
|
+
if (kind === 1) {
|
|
244
|
+
ret.push(function(instance, args) {
|
|
245
|
+
return value.get.call(instance, args);
|
|
246
|
+
});
|
|
247
|
+
ret.push(function(instance, args) {
|
|
248
|
+
return value.set.call(instance, args);
|
|
249
|
+
});
|
|
250
|
+
} else if (kind === 2) {
|
|
251
|
+
ret.push(value);
|
|
252
|
+
} else {
|
|
253
|
+
ret.push(function(instance, args) {
|
|
254
|
+
return value.call(instance, args);
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
} else {
|
|
258
|
+
Object.defineProperty(base, name, desc);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function applyMemberDecs(Class, decInfos, metadata) {
|
|
263
|
+
var ret = [];
|
|
264
|
+
var protoInitializers;
|
|
265
|
+
var staticInitializers;
|
|
266
|
+
var existingProtoNonFields = new Map();
|
|
267
|
+
var existingStaticNonFields = new Map();
|
|
268
|
+
for(var i = 0; i < decInfos.length; i++){
|
|
269
|
+
var decInfo = decInfos[i];
|
|
270
|
+
if (!Array.isArray(decInfo)) continue;
|
|
271
|
+
var kind = decInfo[1];
|
|
272
|
+
var name = decInfo[2];
|
|
273
|
+
var isPrivate = decInfo.length > 3;
|
|
274
|
+
var isStatic = kind >= 5;
|
|
275
|
+
var base;
|
|
276
|
+
var initializers;
|
|
277
|
+
if (isStatic) {
|
|
278
|
+
base = Class;
|
|
279
|
+
kind = kind - 5;
|
|
280
|
+
staticInitializers = staticInitializers || [];
|
|
281
|
+
initializers = staticInitializers;
|
|
282
|
+
} else {
|
|
283
|
+
base = Class.prototype;
|
|
284
|
+
protoInitializers = protoInitializers || [];
|
|
285
|
+
initializers = protoInitializers;
|
|
286
|
+
}
|
|
287
|
+
if (kind !== 0 && !isPrivate) {
|
|
288
|
+
var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
|
|
289
|
+
var existingKind = existingNonFields.get(name) || 0;
|
|
290
|
+
if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) {
|
|
291
|
+
throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
|
|
292
|
+
} else if (!existingKind && kind > 2) {
|
|
293
|
+
existingNonFields.set(name, kind);
|
|
294
|
+
} else {
|
|
295
|
+
existingNonFields.set(name, true);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
|
|
299
|
+
}
|
|
300
|
+
pushInitializers(ret, protoInitializers);
|
|
301
|
+
pushInitializers(ret, staticInitializers);
|
|
302
|
+
return ret;
|
|
303
|
+
}
|
|
304
|
+
function pushInitializers(ret, initializers) {
|
|
305
|
+
if (initializers) {
|
|
306
|
+
ret.push(function(instance) {
|
|
307
|
+
for(var i = 0; i < initializers.length; i++){
|
|
308
|
+
initializers[i].call(instance);
|
|
309
|
+
}
|
|
310
|
+
return instance;
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
function applyClassDecs(targetClass, classDecs, metadata) {
|
|
315
|
+
if (classDecs.length > 0) {
|
|
316
|
+
var initializers = [];
|
|
317
|
+
var newClass = targetClass;
|
|
318
|
+
var name = targetClass.name;
|
|
319
|
+
for(var i = classDecs.length - 1; i >= 0; i--){
|
|
320
|
+
var decoratorFinishedRef = {
|
|
321
|
+
v: false
|
|
322
|
+
};
|
|
323
|
+
try {
|
|
324
|
+
var nextNewClass = classDecs[i](newClass, {
|
|
325
|
+
kind: "class",
|
|
326
|
+
name: name,
|
|
327
|
+
addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
|
|
328
|
+
metadata
|
|
329
|
+
});
|
|
330
|
+
} finally{
|
|
331
|
+
decoratorFinishedRef.v = true;
|
|
332
|
+
}
|
|
333
|
+
if (nextNewClass !== undefined) {
|
|
334
|
+
assertValidReturnValue(10, nextNewClass);
|
|
335
|
+
newClass = nextNewClass;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return [
|
|
339
|
+
defineMetadata(newClass, metadata),
|
|
340
|
+
function() {
|
|
341
|
+
for(var i = 0; i < initializers.length; i++){
|
|
342
|
+
initializers[i].call(newClass);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
];
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
function defineMetadata(Class, metadata) {
|
|
349
|
+
return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
|
|
350
|
+
configurable: true,
|
|
351
|
+
enumerable: true,
|
|
352
|
+
value: metadata
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
|
|
356
|
+
if (parentClass !== void 0) {
|
|
357
|
+
var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
|
|
358
|
+
}
|
|
359
|
+
var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
|
|
360
|
+
var e = applyMemberDecs(targetClass, memberDecs, metadata);
|
|
361
|
+
if (!classDecs.length) defineMetadata(targetClass, metadata);
|
|
362
|
+
return {
|
|
363
|
+
e: e,
|
|
364
|
+
get c () {
|
|
365
|
+
return applyClassDecs(targetClass, classDecs, metadata);
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
};
|
|
6
369
|
}
|
|
370
|
+
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
371
|
+
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
|
+
}
|
|
373
|
+
var _dec, _dec1, _dec2, _dec3, _dec4, _initProto;
|
|
7
374
|
import { L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH, NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NUM_BASE_PARITY_PER_ROOT_PARITY } from '@aztec/constants';
|
|
375
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
8
376
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
377
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
9
378
|
import { AbortError } from '@aztec/foundation/error';
|
|
10
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
11
379
|
import { createLogger } from '@aztec/foundation/log';
|
|
12
380
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
13
381
|
import { assertLength } from '@aztec/foundation/serialize';
|
|
14
382
|
import { pushTestData } from '@aztec/foundation/testing';
|
|
15
383
|
import { elapsed } from '@aztec/foundation/timer';
|
|
16
|
-
import { readAvmMinimalPublicTxInputsFromFile } from '@aztec/simulator/public/fixtures';
|
|
17
|
-
import { createBlockEndMarker } from '@aztec/stdlib/block';
|
|
18
384
|
import { BlockRootEmptyTxFirstRollupPrivateInputs, BlockRootFirstRollupPrivateInputs, BlockRootSingleTxFirstRollupPrivateInputs, BlockRootSingleTxRollupPrivateInputs, CheckpointRootSingleBlockRollupPrivateInputs, PrivateTxBaseRollupPrivateInputs } from '@aztec/stdlib/rollup';
|
|
19
385
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
20
386
|
import { Attributes, getTelemetryClient, trackSpan, wrapCallbackInSpan } from '@aztec/telemetry-client';
|
|
21
387
|
import { inspect } from 'util';
|
|
22
|
-
import {
|
|
388
|
+
import { buildHeaderFromCircuitOutputs, getLastSiblingPath, getPublicChonkVerifierPrivateInputsFromTx, getRootTreeSiblingPath, getSubtreeSiblingPath, getTreeSnapshot, insertSideEffectsAndBuildBaseRollupHints, validatePartialState, validateTx } from './block-building-helpers.js';
|
|
23
389
|
import { EpochProvingState } from './epoch-proving-state.js';
|
|
24
390
|
import { ProvingOrchestratorMetrics } from './orchestrator_metrics.js';
|
|
25
391
|
import { TxProvingState } from './tx-proving-state.js';
|
|
26
|
-
|
|
392
|
+
_dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
393
|
+
[Attributes.BLOCK_NUMBER]: blockNumber
|
|
394
|
+
})), _dec1 = trackSpan('ProvingOrchestrator.addTxs', (txs)=>({
|
|
395
|
+
[Attributes.BLOCK_TXS_COUNT]: txs.length
|
|
396
|
+
})), _dec2 = trackSpan('ProvingOrchestrator.startChonkVerifierCircuits'), _dec3 = trackSpan('ProvingOrchestrator.setBlockCompleted', (blockNumber)=>({
|
|
397
|
+
[Attributes.BLOCK_NUMBER]: blockNumber
|
|
398
|
+
})), _dec4 = trackSpan('ProvingOrchestrator.prepareBaseRollupInputs', (tx)=>({
|
|
399
|
+
[Attributes.TX_HASH]: tx.hash.toString()
|
|
400
|
+
}));
|
|
27
401
|
/**
|
|
28
402
|
* Implements an event driven proving scheduler to build the recursive proof tree. The idea being:
|
|
29
403
|
* 1. Transactions are provided to the scheduler post simulation.
|
|
@@ -39,19 +413,53 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
39
413
|
dbProvider;
|
|
40
414
|
prover;
|
|
41
415
|
proverId;
|
|
416
|
+
cancelJobsOnStop;
|
|
417
|
+
static{
|
|
418
|
+
({ e: [_initProto] } = _apply_decs_2203_r(this, [
|
|
419
|
+
[
|
|
420
|
+
_dec,
|
|
421
|
+
2,
|
|
422
|
+
"startNewBlock"
|
|
423
|
+
],
|
|
424
|
+
[
|
|
425
|
+
_dec1,
|
|
426
|
+
2,
|
|
427
|
+
"addTxs"
|
|
428
|
+
],
|
|
429
|
+
[
|
|
430
|
+
_dec2,
|
|
431
|
+
2,
|
|
432
|
+
"startChonkVerifierCircuits"
|
|
433
|
+
],
|
|
434
|
+
[
|
|
435
|
+
_dec3,
|
|
436
|
+
2,
|
|
437
|
+
"setBlockCompleted"
|
|
438
|
+
],
|
|
439
|
+
[
|
|
440
|
+
_dec4,
|
|
441
|
+
2,
|
|
442
|
+
"prepareBaseRollupInputs"
|
|
443
|
+
]
|
|
444
|
+
], []));
|
|
445
|
+
}
|
|
42
446
|
provingState;
|
|
43
447
|
pendingProvingJobs;
|
|
44
448
|
provingPromise;
|
|
45
449
|
metrics;
|
|
450
|
+
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
46
451
|
dbs;
|
|
47
|
-
|
|
452
|
+
logger;
|
|
453
|
+
constructor(dbProvider, prover, proverId, cancelJobsOnStop = false, telemetryClient = getTelemetryClient(), bindings){
|
|
48
454
|
this.dbProvider = dbProvider;
|
|
49
455
|
this.prover = prover;
|
|
50
456
|
this.proverId = proverId;
|
|
51
|
-
this.
|
|
457
|
+
this.cancelJobsOnStop = cancelJobsOnStop;
|
|
458
|
+
this.provingState = (_initProto(this), undefined);
|
|
52
459
|
this.pendingProvingJobs = [];
|
|
53
460
|
this.provingPromise = undefined;
|
|
54
461
|
this.dbs = new Map();
|
|
462
|
+
this.logger = createLogger('prover-client:orchestrator', bindings);
|
|
55
463
|
this.metrics = new ProvingOrchestratorMetrics(telemetryClient, 'ProvingOrchestrator');
|
|
56
464
|
}
|
|
57
465
|
get tracer() {
|
|
@@ -60,6 +468,9 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
60
468
|
getProverId() {
|
|
61
469
|
return this.proverId;
|
|
62
470
|
}
|
|
471
|
+
getNumActiveForks() {
|
|
472
|
+
return this.dbs.size;
|
|
473
|
+
}
|
|
63
474
|
stop() {
|
|
64
475
|
this.cancel();
|
|
65
476
|
return Promise.resolve();
|
|
@@ -73,11 +484,18 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
73
484
|
status: 'failure',
|
|
74
485
|
reason
|
|
75
486
|
}));
|
|
76
|
-
logger.info(`Starting epoch ${epochNumber} with ${totalNumCheckpoints} checkpoints.`);
|
|
487
|
+
this.logger.info(`Starting epoch ${epochNumber} with ${totalNumCheckpoints} checkpoints.`);
|
|
77
488
|
this.provingState = new EpochProvingState(epochNumber, totalNumCheckpoints, finalBlobBatchingChallenges, (provingState)=>this.checkAndEnqueueCheckpointRootRollup(provingState), resolve, reject);
|
|
78
489
|
this.provingPromise = promise;
|
|
79
490
|
}
|
|
80
|
-
|
|
491
|
+
/**
|
|
492
|
+
* Starts a new checkpoint.
|
|
493
|
+
* @param checkpointIndex - The index of the checkpoint in the epoch.
|
|
494
|
+
* @param constants - The constants for this checkpoint.
|
|
495
|
+
* @param l1ToL2Messages - The set of L1 to L2 messages to be inserted at the beginning of this checkpoint.
|
|
496
|
+
* @param totalNumBlocks - The total number of blocks expected in the checkpoint (must be at least one).
|
|
497
|
+
* @param headerOfLastBlockInPreviousCheckpoint - The header of the last block in the previous checkpoint.
|
|
498
|
+
*/ async startNewCheckpoint(checkpointIndex, constants, l1ToL2Messages, totalNumBlocks, headerOfLastBlockInPreviousCheckpoint) {
|
|
81
499
|
if (!this.provingState) {
|
|
82
500
|
throw new Error('Empty epoch proving state. Call startNewEpoch before starting a checkpoint.');
|
|
83
501
|
}
|
|
@@ -87,13 +505,16 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
87
505
|
// Fork world state at the end of the immediately previous block.
|
|
88
506
|
const lastBlockNumber = headerOfLastBlockInPreviousCheckpoint.globalVariables.blockNumber;
|
|
89
507
|
const db = await this.dbProvider.fork(lastBlockNumber);
|
|
90
|
-
const firstBlockNumber = lastBlockNumber + 1;
|
|
91
|
-
this.dbs.set(firstBlockNumber,
|
|
508
|
+
const firstBlockNumber = BlockNumber(lastBlockNumber + 1);
|
|
509
|
+
this.dbs.set(firstBlockNumber, {
|
|
510
|
+
fork: db,
|
|
511
|
+
cleanupPromise: undefined
|
|
512
|
+
});
|
|
92
513
|
// Get archive sibling path before any block in this checkpoint lands.
|
|
93
514
|
const lastArchiveSiblingPath = await getLastSiblingPath(MerkleTreeId.ARCHIVE, db);
|
|
94
515
|
// Insert all the l1 to l2 messages into the db. And get the states before and after the insertion.
|
|
95
516
|
const { lastL1ToL2MessageTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath, newL1ToL2MessageTreeSnapshot, newL1ToL2MessageSubtreeRootSiblingPath } = await this.updateL1ToL2MessageTree(l1ToL2Messages, db);
|
|
96
|
-
this.provingState.startNewCheckpoint(checkpointIndex, constants, totalNumBlocks,
|
|
517
|
+
this.provingState.startNewCheckpoint(checkpointIndex, constants, totalNumBlocks, headerOfLastBlockInPreviousCheckpoint, lastArchiveSiblingPath, l1ToL2Messages, lastL1ToL2MessageTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath, newL1ToL2MessageTreeSnapshot, newL1ToL2MessageSubtreeRootSiblingPath);
|
|
97
518
|
}
|
|
98
519
|
/**
|
|
99
520
|
* Starts off a new block
|
|
@@ -113,18 +534,21 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
113
534
|
throw new Error(`Checkpoint not accepting further blocks.`);
|
|
114
535
|
}
|
|
115
536
|
const constants = checkpointProvingState.constants;
|
|
116
|
-
logger.info(`Starting block ${blockNumber} for slot ${constants.slotNumber
|
|
537
|
+
this.logger.info(`Starting block ${blockNumber} for slot ${constants.slotNumber}.`);
|
|
117
538
|
// Fork the db only when it's not already set. The db for the first block is set in `startNewCheckpoint`.
|
|
118
539
|
if (!this.dbs.has(blockNumber)) {
|
|
119
540
|
// Fork world state at the end of the immediately previous block
|
|
120
|
-
const db = await this.dbProvider.fork(blockNumber - 1);
|
|
121
|
-
this.dbs.set(blockNumber,
|
|
541
|
+
const db = await this.dbProvider.fork(BlockNumber(blockNumber - 1));
|
|
542
|
+
this.dbs.set(blockNumber, {
|
|
543
|
+
fork: db,
|
|
544
|
+
cleanupPromise: undefined
|
|
545
|
+
});
|
|
122
546
|
}
|
|
123
|
-
const db = this.dbs.get(blockNumber);
|
|
547
|
+
const db = this.dbs.get(blockNumber).fork;
|
|
124
548
|
// Get archive snapshot and sibling path before any txs in this block lands.
|
|
125
549
|
const lastArchiveTreeSnapshot = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
126
550
|
const lastArchiveSiblingPath = await getRootTreeSiblingPath(MerkleTreeId.ARCHIVE, db);
|
|
127
|
-
const blockProvingState =
|
|
551
|
+
const blockProvingState = checkpointProvingState.startNewBlock(blockNumber, timestamp, totalNumTxs, lastArchiveTreeSnapshot, lastArchiveSiblingPath);
|
|
128
552
|
// Enqueue base parity circuits for the first block in the checkpoint.
|
|
129
553
|
if (blockProvingState.index === 0) {
|
|
130
554
|
for(let i = 0; i < NUM_BASE_PARITY_PER_ROOT_PARITY; i++){
|
|
@@ -134,12 +558,14 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
134
558
|
// Because `addTxs` won't be called for a block without txs, and that's where the sponge blob state is computed.
|
|
135
559
|
// We need to set its end sponge blob here, which will become the start sponge blob for the next block.
|
|
136
560
|
if (totalNumTxs === 0) {
|
|
561
|
+
const endState = await db.getStateReference();
|
|
562
|
+
blockProvingState.setEndState(endState);
|
|
137
563
|
const endSpongeBlob = blockProvingState.getStartSpongeBlob().clone();
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
]);
|
|
564
|
+
const blockEndBlobFields = blockProvingState.getBlockEndBlobFields();
|
|
565
|
+
await endSpongeBlob.absorb(blockEndBlobFields);
|
|
141
566
|
blockProvingState.setEndSpongeBlob(endSpongeBlob);
|
|
142
|
-
//
|
|
567
|
+
// Try to accumulate the out hashes and blobs as far as we can:
|
|
568
|
+
await this.provingState.accumulateCheckpointOutHashes();
|
|
143
569
|
await this.provingState.setBlobAccumulators();
|
|
144
570
|
}
|
|
145
571
|
}
|
|
@@ -153,10 +579,10 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
153
579
|
if (!txs.length) {
|
|
154
580
|
// To avoid an ugly throw below. If we require an empty block, we can just call setBlockCompleted
|
|
155
581
|
// on a block with no txs. We cannot do that here because we cannot find the blockNumber without any txs.
|
|
156
|
-
logger.warn(`Provided no txs to orchestrator addTxs.`);
|
|
582
|
+
this.logger.warn(`Provided no txs to orchestrator addTxs.`);
|
|
157
583
|
return;
|
|
158
584
|
}
|
|
159
|
-
const blockNumber = txs[0].globalVariables.blockNumber;
|
|
585
|
+
const blockNumber = BlockNumber(txs[0].globalVariables.blockNumber);
|
|
160
586
|
const provingState = this.provingState.getBlockProvingStateByBlockNumber(blockNumber);
|
|
161
587
|
if (!provingState) {
|
|
162
588
|
throw new Error(`Proving state for block ${blockNumber} not found. Call startNewBlock first.`);
|
|
@@ -167,8 +593,8 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
167
593
|
if (!provingState.isAcceptingTxs()) {
|
|
168
594
|
throw new Error(`Block ${blockNumber} has been initialized with transactions.`);
|
|
169
595
|
}
|
|
170
|
-
logger.info(`Adding ${txs.length} transactions to block ${blockNumber}`);
|
|
171
|
-
const db = this.dbs.get(blockNumber);
|
|
596
|
+
this.logger.info(`Adding ${txs.length} transactions to block ${blockNumber}`);
|
|
597
|
+
const db = this.dbs.get(blockNumber).fork;
|
|
172
598
|
const lastArchive = provingState.lastArchiveTreeSnapshot;
|
|
173
599
|
const newL1ToL2MessageTreeSnapshot = provingState.newL1ToL2MessageTreeSnapshot;
|
|
174
600
|
const spongeBlobState = provingState.getStartSpongeBlob().clone();
|
|
@@ -178,7 +604,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
178
604
|
throw new Error(`Invalid proving state when adding a tx`);
|
|
179
605
|
}
|
|
180
606
|
validateTx(tx);
|
|
181
|
-
logger.
|
|
607
|
+
this.logger.debug(`Received transaction: ${tx.hash}`);
|
|
182
608
|
const startSpongeBlob = spongeBlobState.clone();
|
|
183
609
|
const [hints, treeSnapshots] = await this.prepareBaseRollupInputs(tx, lastArchive, newL1ToL2MessageTreeSnapshot, startSpongeBlob, db);
|
|
184
610
|
if (!provingState.verifyState()) {
|
|
@@ -189,10 +615,10 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
189
615
|
const txIndex = provingState.addNewTx(txProvingState);
|
|
190
616
|
if (txProvingState.requireAvmProof) {
|
|
191
617
|
this.getOrEnqueueChonkVerifier(provingState, txIndex);
|
|
192
|
-
logger.debug(`Enqueueing public VM for tx ${txIndex}`);
|
|
618
|
+
this.logger.debug(`Enqueueing public VM for tx ${txIndex}`);
|
|
193
619
|
this.enqueueVM(provingState, txIndex);
|
|
194
620
|
} else {
|
|
195
|
-
logger.debug(`Enqueueing base rollup for private-only tx ${txIndex}`);
|
|
621
|
+
this.logger.debug(`Enqueueing base rollup for private-only tx ${txIndex}`);
|
|
196
622
|
this.enqueueBaseRollup(provingState, txIndex);
|
|
197
623
|
}
|
|
198
624
|
} catch (err) {
|
|
@@ -201,11 +627,13 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
201
627
|
});
|
|
202
628
|
}
|
|
203
629
|
}
|
|
204
|
-
await
|
|
205
|
-
|
|
206
|
-
|
|
630
|
+
const endState = await db.getStateReference();
|
|
631
|
+
provingState.setEndState(endState);
|
|
632
|
+
const blockEndBlobFields = provingState.getBlockEndBlobFields();
|
|
633
|
+
await spongeBlobState.absorb(blockEndBlobFields);
|
|
207
634
|
provingState.setEndSpongeBlob(spongeBlobState);
|
|
208
|
-
// Txs have been added to the block. Now try to accumulate the blobs as far as we can:
|
|
635
|
+
// Txs have been added to the block. Now try to accumulate the out hashes and blobs as far as we can:
|
|
636
|
+
await this.provingState.accumulateCheckpointOutHashes();
|
|
209
637
|
await this.provingState.setBlobAccumulators();
|
|
210
638
|
}
|
|
211
639
|
/**
|
|
@@ -220,7 +648,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
220
648
|
const txHash = tx.getTxHash().toString();
|
|
221
649
|
const privateInputs = getPublicChonkVerifierPrivateInputsFromTx(tx, this.proverId.toField());
|
|
222
650
|
const tubeProof = promiseWithResolvers();
|
|
223
|
-
logger.debug(`Starting chonk verifier circuit for tx ${txHash}`);
|
|
651
|
+
this.logger.debug(`Starting chonk verifier circuit for tx ${txHash}`);
|
|
224
652
|
this.doEnqueueChonkVerifier(txHash, privateInputs, (proof)=>{
|
|
225
653
|
tubeProof.resolve(proof);
|
|
226
654
|
});
|
|
@@ -248,61 +676,52 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
248
676
|
if (provingState.isAcceptingTxs()) {
|
|
249
677
|
throw new Error(`Block ${blockNumber} is still accepting txs. Call setBlockCompleted after all txs have been added.`);
|
|
250
678
|
}
|
|
251
|
-
//
|
|
252
|
-
logger.verbose(`Block ${blockNumber} completed. Assembling header.`);
|
|
253
|
-
const header = await
|
|
254
|
-
await this.verifyBuiltBlockAgainstSyncedState(provingState);
|
|
255
|
-
return header;
|
|
256
|
-
}
|
|
257
|
-
async buildL2BlockHeader(provingState, expectedHeader) {
|
|
258
|
-
// Collect all txs in this block to build the header. The function calling this has made sure that all txs have been added.
|
|
259
|
-
const txs = provingState.getProcessedTxs();
|
|
260
|
-
const startSpongeBlob = provingState.getStartSpongeBlob();
|
|
261
|
-
// Get db for this block
|
|
262
|
-
const db = this.dbs.get(provingState.blockNumber);
|
|
263
|
-
// Given we've applied every change from this block, now assemble the block header
|
|
264
|
-
// and update the archive tree, so we're ready to start processing the next block
|
|
265
|
-
const header = await buildBlockHeaderFromTxs(txs, provingState.getGlobalVariables(), startSpongeBlob, db);
|
|
679
|
+
// Given we've applied every change from this block, now assemble the block header:
|
|
680
|
+
this.logger.verbose(`Block ${blockNumber} completed. Assembling header.`);
|
|
681
|
+
const header = await provingState.buildBlockHeader();
|
|
266
682
|
if (expectedHeader && !header.equals(expectedHeader)) {
|
|
267
|
-
logger.error(`Block header mismatch: header=${header} expectedHeader=${expectedHeader}`);
|
|
683
|
+
this.logger.error(`Block header mismatch: header=${header} expectedHeader=${expectedHeader}`);
|
|
268
684
|
throw new Error('Block header mismatch');
|
|
269
685
|
}
|
|
270
|
-
|
|
686
|
+
// Get db for this block
|
|
687
|
+
const db = this.dbs.get(provingState.blockNumber).fork;
|
|
688
|
+
// Update the archive tree, so we're ready to start processing the next block:
|
|
689
|
+
this.logger.verbose(`Updating archive tree with block ${provingState.blockNumber} header ${(await header.hash()).toString()}`);
|
|
271
690
|
await db.updateArchive(header);
|
|
272
|
-
|
|
691
|
+
await this.verifyBuiltBlockAgainstSyncedState(provingState);
|
|
273
692
|
return header;
|
|
274
693
|
}
|
|
275
694
|
// Flagged as protected to disable in certain unit tests
|
|
276
695
|
async verifyBuiltBlockAgainstSyncedState(provingState) {
|
|
277
696
|
const builtBlockHeader = provingState.getBuiltBlockHeader();
|
|
278
697
|
if (!builtBlockHeader) {
|
|
279
|
-
logger.debug('Block header not built yet, skipping header check.');
|
|
698
|
+
this.logger.debug('Block header not built yet, skipping header check.');
|
|
280
699
|
return;
|
|
281
700
|
}
|
|
282
701
|
const output = provingState.getBlockRootRollupOutput();
|
|
283
702
|
if (!output) {
|
|
284
|
-
logger.debug('Block root rollup proof not built yet, skipping header check.');
|
|
703
|
+
this.logger.debug('Block root rollup proof not built yet, skipping header check.');
|
|
285
704
|
return;
|
|
286
705
|
}
|
|
287
706
|
const header = await buildHeaderFromCircuitOutputs(output);
|
|
288
707
|
if (!(await header.hash()).equals(await builtBlockHeader.hash())) {
|
|
289
|
-
logger.error(`Block header mismatch.\nCircuit: ${inspect(header)}\nComputed: ${inspect(builtBlockHeader)}`);
|
|
708
|
+
this.logger.error(`Block header mismatch.\nCircuit: ${inspect(header)}\nComputed: ${inspect(builtBlockHeader)}`);
|
|
290
709
|
provingState.reject(`Block header hash mismatch.`);
|
|
291
710
|
return;
|
|
292
711
|
}
|
|
293
712
|
// Get db for this block
|
|
294
713
|
const blockNumber = provingState.blockNumber;
|
|
295
|
-
const db = this.dbs.get(blockNumber);
|
|
714
|
+
const db = this.dbs.get(blockNumber).fork;
|
|
296
715
|
const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
297
716
|
const syncedArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, this.dbProvider.getSnapshot(blockNumber));
|
|
298
717
|
if (!syncedArchive.equals(newArchive)) {
|
|
299
|
-
logger.error(`Archive tree mismatch for block ${blockNumber}: world state synced to ${inspect(syncedArchive)} but built ${inspect(newArchive)}`);
|
|
718
|
+
this.logger.error(`Archive tree mismatch for block ${blockNumber}: world state synced to ${inspect(syncedArchive)} but built ${inspect(newArchive)}`);
|
|
300
719
|
provingState.reject(`Archive tree mismatch.`);
|
|
301
720
|
return;
|
|
302
721
|
}
|
|
303
722
|
const circuitArchive = output.newArchive;
|
|
304
723
|
if (!newArchive.equals(circuitArchive)) {
|
|
305
|
-
logger.error(`New archive mismatch.\nCircuit: ${output.newArchive}\nComputed: ${newArchive}`);
|
|
724
|
+
this.logger.error(`New archive mismatch.\nCircuit: ${output.newArchive}\nComputed: ${newArchive}`);
|
|
306
725
|
provingState.reject(`New archive mismatch.`);
|
|
307
726
|
return;
|
|
308
727
|
}
|
|
@@ -310,14 +729,17 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
310
729
|
// is aborted and never reaches this point, it will leak the fork. We need to add a global cleanup,
|
|
311
730
|
// but have to make sure it only runs once all operations are completed, otherwise some function here
|
|
312
731
|
// will attempt to access the fork after it was closed.
|
|
313
|
-
|
|
314
|
-
void this.dbs.get(blockNumber)?.close().then(()=>this.dbs.delete(blockNumber)).catch((err)=>logger.error(`Error closing db for block ${blockNumber}`, err));
|
|
732
|
+
void this.cleanupDBFork(blockNumber);
|
|
315
733
|
}
|
|
316
734
|
/**
|
|
317
|
-
* Cancel any further proving
|
|
735
|
+
* Cancel any further proving.
|
|
736
|
+
* If cancelJobsOnStop is true, aborts all pending jobs with the broker (which marks them as 'Aborted').
|
|
737
|
+
* If cancelJobsOnStop is false (default), jobs remain in the broker queue and can be reused on restart/reorg.
|
|
318
738
|
*/ cancel() {
|
|
319
|
-
|
|
320
|
-
controller.
|
|
739
|
+
if (this.cancelJobsOnStop) {
|
|
740
|
+
for (const controller of this.pendingProvingJobs){
|
|
741
|
+
controller.abort();
|
|
742
|
+
}
|
|
321
743
|
}
|
|
322
744
|
this.provingState?.cancel();
|
|
323
745
|
}
|
|
@@ -339,6 +761,22 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
339
761
|
});
|
|
340
762
|
return epochProofResult;
|
|
341
763
|
}
|
|
764
|
+
async cleanupDBFork(blockNumber) {
|
|
765
|
+
this.logger.debug(`Cleaning up world state fork for ${blockNumber}`);
|
|
766
|
+
const fork = this.dbs.get(blockNumber);
|
|
767
|
+
if (!fork) {
|
|
768
|
+
return;
|
|
769
|
+
}
|
|
770
|
+
try {
|
|
771
|
+
if (!fork.cleanupPromise) {
|
|
772
|
+
fork.cleanupPromise = fork.fork.close();
|
|
773
|
+
}
|
|
774
|
+
await fork.cleanupPromise;
|
|
775
|
+
this.dbs.delete(blockNumber);
|
|
776
|
+
} catch (err) {
|
|
777
|
+
this.logger.error(`Error closing db for block ${blockNumber}`, err);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
342
780
|
/**
|
|
343
781
|
* Enqueue a job to be scheduled
|
|
344
782
|
* @param provingState - The proving state object being operated on
|
|
@@ -346,7 +784,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
346
784
|
* @param job - The actual job, returns a promise notifying of the job's completion
|
|
347
785
|
*/ deferredProving(provingState, request, callback) {
|
|
348
786
|
if (!provingState.verifyState()) {
|
|
349
|
-
logger.debug(`Not enqueuing job, state no longer valid`);
|
|
787
|
+
this.logger.debug(`Not enqueuing job, state no longer valid`);
|
|
350
788
|
return;
|
|
351
789
|
}
|
|
352
790
|
const controller = new AbortController();
|
|
@@ -361,7 +799,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
361
799
|
}
|
|
362
800
|
const result = await request(controller.signal);
|
|
363
801
|
if (!provingState.verifyState()) {
|
|
364
|
-
logger.debug(`State no longer valid, discarding result`);
|
|
802
|
+
this.logger.debug(`State no longer valid, discarding result`);
|
|
365
803
|
return;
|
|
366
804
|
}
|
|
367
805
|
// we could have been cancelled whilst waiting for the result
|
|
@@ -376,7 +814,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
376
814
|
// drop this result
|
|
377
815
|
return;
|
|
378
816
|
}
|
|
379
|
-
logger.error(`Error thrown when proving job`, err);
|
|
817
|
+
this.logger.error(`Error thrown when proving job`, err);
|
|
380
818
|
provingState.reject(`${err}`);
|
|
381
819
|
} finally{
|
|
382
820
|
const index = this.pendingProvingJobs.indexOf(controller);
|
|
@@ -432,17 +870,17 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
432
870
|
// Executes the next level of merge if all inputs are available
|
|
433
871
|
enqueueBaseRollup(provingState, txIndex) {
|
|
434
872
|
if (!provingState.verifyState()) {
|
|
435
|
-
logger.debug('Not running base rollup, state invalid');
|
|
873
|
+
this.logger.debug('Not running base rollup, state invalid');
|
|
436
874
|
return;
|
|
437
875
|
}
|
|
438
876
|
if (!provingState.tryStartProvingBase(txIndex)) {
|
|
439
|
-
logger.debug(`Base rollup for tx ${txIndex} already started.`);
|
|
877
|
+
this.logger.debug(`Base rollup for tx ${txIndex} already started.`);
|
|
440
878
|
return;
|
|
441
879
|
}
|
|
442
880
|
const txProvingState = provingState.getTxProvingState(txIndex);
|
|
443
881
|
const { processedTx } = txProvingState;
|
|
444
882
|
const { rollupType, inputs } = txProvingState.getBaseRollupTypeAndInputs();
|
|
445
|
-
logger.debug(`Enqueuing deferred proving base rollup for ${processedTx.hash.toString()}`);
|
|
883
|
+
this.logger.debug(`Enqueuing deferred proving base rollup for ${processedTx.hash.toString()}`);
|
|
446
884
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, `ProvingOrchestrator.prover.${inputs instanceof PrivateTxBaseRollupPrivateInputs ? 'getPrivateTxBaseRollupProof' : 'getPublicTxBaseRollupProof'}`, {
|
|
447
885
|
[Attributes.TX_HASH]: processedTx.hash.toString(),
|
|
448
886
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType
|
|
@@ -453,7 +891,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
453
891
|
return this.prover.getPublicTxBaseRollupProof(inputs, signal, provingState.epochNumber);
|
|
454
892
|
}
|
|
455
893
|
}), (result)=>{
|
|
456
|
-
logger.debug(`Completed proof for ${rollupType} for tx ${processedTx.hash.toString()}`);
|
|
894
|
+
this.logger.debug(`Completed proof for ${rollupType} for tx ${processedTx.hash.toString()}`);
|
|
457
895
|
validatePartialState(result.inputs.endTreeSnapshots, txProvingState.treeSnapshots);
|
|
458
896
|
const leafLocation = provingState.setBaseRollupProof(txIndex, result);
|
|
459
897
|
if (provingState.totalNumTxs === 1) {
|
|
@@ -467,14 +905,14 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
467
905
|
// Once completed, will enqueue the the public tx base rollup.
|
|
468
906
|
getOrEnqueueChonkVerifier(provingState, txIndex) {
|
|
469
907
|
if (!provingState.verifyState()) {
|
|
470
|
-
logger.debug('Not running chonk verifier circuit, state invalid');
|
|
908
|
+
this.logger.debug('Not running chonk verifier circuit, state invalid');
|
|
471
909
|
return;
|
|
472
910
|
}
|
|
473
911
|
const txProvingState = provingState.getTxProvingState(txIndex);
|
|
474
912
|
const txHash = txProvingState.processedTx.hash.toString();
|
|
475
913
|
NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH;
|
|
476
914
|
const handleResult = (result)=>{
|
|
477
|
-
logger.debug(`Got chonk verifier proof for tx index: ${txIndex}`, {
|
|
915
|
+
this.logger.debug(`Got chonk verifier proof for tx index: ${txIndex}`, {
|
|
478
916
|
txHash
|
|
479
917
|
});
|
|
480
918
|
txProvingState.setPublicChonkVerifierProof(result);
|
|
@@ -482,18 +920,18 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
482
920
|
this.checkAndEnqueueBaseRollup(provingState, txIndex);
|
|
483
921
|
};
|
|
484
922
|
if (this.provingState?.cachedChonkVerifierProofs.has(txHash)) {
|
|
485
|
-
logger.debug(`Chonk verifier proof already enqueued for tx index: ${txIndex}`, {
|
|
923
|
+
this.logger.debug(`Chonk verifier proof already enqueued for tx index: ${txIndex}`, {
|
|
486
924
|
txHash
|
|
487
925
|
});
|
|
488
926
|
void this.provingState.cachedChonkVerifierProofs.get(txHash).then(handleResult);
|
|
489
927
|
return;
|
|
490
928
|
}
|
|
491
|
-
logger.debug(`Enqueuing chonk verifier circuit for tx index: ${txIndex}`);
|
|
929
|
+
this.logger.debug(`Enqueuing chonk verifier circuit for tx index: ${txIndex}`);
|
|
492
930
|
this.doEnqueueChonkVerifier(txHash, txProvingState.getPublicChonkVerifierPrivateInputs(), handleResult);
|
|
493
931
|
}
|
|
494
932
|
doEnqueueChonkVerifier(txHash, inputs, handler, provingState = this.provingState) {
|
|
495
933
|
if (!provingState.verifyState()) {
|
|
496
|
-
logger.debug('Not running chonk verifier circuit, state invalid');
|
|
934
|
+
this.logger.debug('Not running chonk verifier circuit, state invalid');
|
|
497
935
|
return;
|
|
498
936
|
}
|
|
499
937
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getPublicChonkVerifierProof', {
|
|
@@ -505,11 +943,11 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
505
943
|
// Enqueues the next level of merge if all inputs are available
|
|
506
944
|
enqueueMergeRollup(provingState, location) {
|
|
507
945
|
if (!provingState.verifyState()) {
|
|
508
|
-
logger.debug('Not running merge rollup. State no longer valid.');
|
|
946
|
+
this.logger.debug('Not running merge rollup. State no longer valid.');
|
|
509
947
|
return;
|
|
510
948
|
}
|
|
511
949
|
if (!provingState.tryStartProvingMerge(location)) {
|
|
512
|
-
logger.debug('Merge rollup already started.');
|
|
950
|
+
this.logger.debug('Merge rollup already started.');
|
|
513
951
|
return;
|
|
514
952
|
}
|
|
515
953
|
const inputs = provingState.getMergeRollupInputs(location);
|
|
@@ -523,15 +961,15 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
523
961
|
// Executes the block root rollup circuit
|
|
524
962
|
enqueueBlockRootRollup(provingState) {
|
|
525
963
|
if (!provingState.verifyState()) {
|
|
526
|
-
logger.debug('Not running block root rollup, state no longer valid');
|
|
964
|
+
this.logger.debug('Not running block root rollup, state no longer valid');
|
|
527
965
|
return;
|
|
528
966
|
}
|
|
529
967
|
if (!provingState.tryStartProvingBlockRoot()) {
|
|
530
|
-
logger.debug('Block root rollup already started.');
|
|
968
|
+
this.logger.debug('Block root rollup already started.');
|
|
531
969
|
return;
|
|
532
970
|
}
|
|
533
971
|
const { rollupType, inputs } = provingState.getBlockRootRollupTypeAndInputs();
|
|
534
|
-
logger.debug(`Enqueuing ${rollupType} for block ${provingState.blockNumber}.`);
|
|
972
|
+
this.logger.debug(`Enqueuing ${rollupType} for block ${provingState.blockNumber}.`);
|
|
535
973
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getBlockRootRollupProof', {
|
|
536
974
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType
|
|
537
975
|
}, (signal)=>{
|
|
@@ -547,27 +985,29 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
547
985
|
return this.prover.getBlockRootRollupProof(inputs, signal, provingState.epochNumber);
|
|
548
986
|
}
|
|
549
987
|
}), async (result)=>{
|
|
550
|
-
|
|
551
|
-
await this.verifyBuiltBlockAgainstSyncedState(provingState);
|
|
552
|
-
logger.debug(`Completed ${rollupType} proof for block ${provingState.blockNumber}`);
|
|
988
|
+
this.logger.debug(`Completed ${rollupType} proof for block ${provingState.blockNumber}`);
|
|
553
989
|
const leafLocation = provingState.setBlockRootRollupProof(result);
|
|
554
990
|
const checkpointProvingState = provingState.parentCheckpoint;
|
|
991
|
+
// If the proofs were slower than the block header building, then we need to try validating the block header hashes here.
|
|
992
|
+
await this.verifyBuiltBlockAgainstSyncedState(provingState);
|
|
555
993
|
if (checkpointProvingState.totalNumBlocks === 1) {
|
|
556
994
|
this.checkAndEnqueueCheckpointRootRollup(checkpointProvingState);
|
|
557
995
|
} else {
|
|
558
996
|
this.checkAndEnqueueNextBlockMergeRollup(checkpointProvingState, leafLocation);
|
|
559
997
|
}
|
|
998
|
+
// We are finished with the block at this point, ensure the fork is cleaned up
|
|
999
|
+
void this.cleanupDBFork(provingState.blockNumber);
|
|
560
1000
|
});
|
|
561
1001
|
}
|
|
562
1002
|
// Executes the base parity circuit and stores the intermediate state for the root parity circuit
|
|
563
1003
|
// Enqueues the root parity circuit if all inputs are available
|
|
564
1004
|
enqueueBaseParityCircuit(checkpointProvingState, provingState, baseParityIndex) {
|
|
565
1005
|
if (!provingState.verifyState()) {
|
|
566
|
-
logger.debug('Not running base parity. State no longer valid.');
|
|
1006
|
+
this.logger.debug('Not running base parity. State no longer valid.');
|
|
567
1007
|
return;
|
|
568
1008
|
}
|
|
569
1009
|
if (!provingState.tryStartProvingBaseParity(baseParityIndex)) {
|
|
570
|
-
logger.warn(`Base parity ${baseParityIndex} already started.`);
|
|
1010
|
+
this.logger.warn(`Base parity ${baseParityIndex} already started.`);
|
|
571
1011
|
return;
|
|
572
1012
|
}
|
|
573
1013
|
const inputs = checkpointProvingState.getBaseParityInputs(baseParityIndex);
|
|
@@ -588,11 +1028,11 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
588
1028
|
// Enqueues the root rollup proof if all inputs are available
|
|
589
1029
|
enqueueRootParityCircuit(provingState) {
|
|
590
1030
|
if (!provingState.verifyState()) {
|
|
591
|
-
logger.debug('Not running root parity. State no longer valid.');
|
|
1031
|
+
this.logger.debug('Not running root parity. State no longer valid.');
|
|
592
1032
|
return;
|
|
593
1033
|
}
|
|
594
1034
|
if (!provingState.tryStartProvingRootParity()) {
|
|
595
|
-
logger.debug('Root parity already started.');
|
|
1035
|
+
this.logger.debug('Root parity already started.');
|
|
596
1036
|
return;
|
|
597
1037
|
}
|
|
598
1038
|
const inputs = provingState.getParityRootInputs();
|
|
@@ -607,11 +1047,11 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
607
1047
|
// Enqueues the next level of merge if all inputs are available
|
|
608
1048
|
enqueueBlockMergeRollup(provingState, location) {
|
|
609
1049
|
if (!provingState.verifyState()) {
|
|
610
|
-
logger.debug('Not running block merge rollup. State no longer valid.');
|
|
1050
|
+
this.logger.debug('Not running block merge rollup. State no longer valid.');
|
|
611
1051
|
return;
|
|
612
1052
|
}
|
|
613
1053
|
if (!provingState.tryStartProvingBlockMerge(location)) {
|
|
614
|
-
logger.debug('Block merge rollup already started.');
|
|
1054
|
+
this.logger.debug('Block merge rollup already started.');
|
|
615
1055
|
return;
|
|
616
1056
|
}
|
|
617
1057
|
const inputs = provingState.getBlockMergeRollupInputs(location);
|
|
@@ -624,15 +1064,15 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
624
1064
|
}
|
|
625
1065
|
enqueueCheckpointRootRollup(provingState) {
|
|
626
1066
|
if (!provingState.verifyState()) {
|
|
627
|
-
logger.debug('Not running checkpoint root rollup. State no longer valid.');
|
|
1067
|
+
this.logger.debug('Not running checkpoint root rollup. State no longer valid.');
|
|
628
1068
|
return;
|
|
629
1069
|
}
|
|
630
1070
|
if (!provingState.tryStartProvingCheckpointRoot()) {
|
|
631
|
-
logger.debug('Checkpoint root rollup already started.');
|
|
1071
|
+
this.logger.debug('Checkpoint root rollup already started.');
|
|
632
1072
|
return;
|
|
633
1073
|
}
|
|
634
1074
|
const rollupType = provingState.getCheckpointRootRollupType();
|
|
635
|
-
logger.debug(`Enqueuing ${rollupType} for checkpoint ${provingState.index}.`);
|
|
1075
|
+
this.logger.debug(`Enqueuing ${rollupType} for checkpoint ${provingState.index}.`);
|
|
636
1076
|
const inputs = provingState.getCheckpointRootRollupInputs();
|
|
637
1077
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getCheckpointRootRollupProof', {
|
|
638
1078
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType
|
|
@@ -646,11 +1086,11 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
646
1086
|
const computedEndBlobAccumulatorState = provingState.getEndBlobAccumulator().toBlobAccumulator();
|
|
647
1087
|
const circuitEndBlobAccumulatorState = result.inputs.endBlobAccumulator;
|
|
648
1088
|
if (!circuitEndBlobAccumulatorState.equals(computedEndBlobAccumulatorState)) {
|
|
649
|
-
logger.error(`Blob accumulator state mismatch.\nCircuit: ${inspect(circuitEndBlobAccumulatorState)}\nComputed: ${inspect(computedEndBlobAccumulatorState)}`);
|
|
1089
|
+
this.logger.error(`Blob accumulator state mismatch.\nCircuit: ${inspect(circuitEndBlobAccumulatorState)}\nComputed: ${inspect(computedEndBlobAccumulatorState)}`);
|
|
650
1090
|
provingState.reject(`Blob accumulator state mismatch.`);
|
|
651
1091
|
return;
|
|
652
1092
|
}
|
|
653
|
-
logger.debug(`Completed ${rollupType} proof for checkpoint ${provingState.index}.`);
|
|
1093
|
+
this.logger.debug(`Completed ${rollupType} proof for checkpoint ${provingState.index}.`);
|
|
654
1094
|
const leafLocation = provingState.setCheckpointRootRollupProof(result);
|
|
655
1095
|
const epochProvingState = provingState.parentEpoch;
|
|
656
1096
|
if (epochProvingState.totalNumCheckpoints === 1) {
|
|
@@ -662,37 +1102,37 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
662
1102
|
}
|
|
663
1103
|
enqueueCheckpointMergeRollup(provingState, location) {
|
|
664
1104
|
if (!provingState.verifyState()) {
|
|
665
|
-
logger.debug('Not running checkpoint merge rollup. State no longer valid.');
|
|
1105
|
+
this.logger.debug('Not running checkpoint merge rollup. State no longer valid.');
|
|
666
1106
|
return;
|
|
667
1107
|
}
|
|
668
1108
|
if (!provingState.tryStartProvingCheckpointMerge(location)) {
|
|
669
|
-
logger.debug('Checkpoint merge rollup already started.');
|
|
1109
|
+
this.logger.debug('Checkpoint merge rollup already started.');
|
|
670
1110
|
return;
|
|
671
1111
|
}
|
|
672
1112
|
const inputs = provingState.getCheckpointMergeRollupInputs(location);
|
|
673
1113
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getCheckpointMergeRollupProof', {
|
|
674
1114
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-checkpoint-merge'
|
|
675
1115
|
}, (signal)=>this.prover.getCheckpointMergeRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
676
|
-
logger.debug('Completed proof for checkpoint merge rollup.');
|
|
1116
|
+
this.logger.debug('Completed proof for checkpoint merge rollup.');
|
|
677
1117
|
provingState.setCheckpointMergeRollupProof(location, result);
|
|
678
1118
|
this.checkAndEnqueueNextCheckpointMergeRollup(provingState, location);
|
|
679
1119
|
});
|
|
680
1120
|
}
|
|
681
1121
|
enqueueEpochPadding(provingState) {
|
|
682
1122
|
if (!provingState.verifyState()) {
|
|
683
|
-
logger.debug('Not running epoch padding. State no longer valid.');
|
|
1123
|
+
this.logger.debug('Not running epoch padding. State no longer valid.');
|
|
684
1124
|
return;
|
|
685
1125
|
}
|
|
686
1126
|
if (!provingState.tryStartProvingPaddingCheckpoint()) {
|
|
687
|
-
logger.debug('Padding checkpoint already started.');
|
|
1127
|
+
this.logger.debug('Padding checkpoint already started.');
|
|
688
1128
|
return;
|
|
689
1129
|
}
|
|
690
|
-
logger.debug('Padding epoch proof with a padding block root proof.');
|
|
1130
|
+
this.logger.debug('Padding epoch proof with a padding block root proof.');
|
|
691
1131
|
const inputs = provingState.getPaddingCheckpointInputs();
|
|
692
1132
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getCheckpointPaddingRollupProof', {
|
|
693
1133
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-checkpoint-padding'
|
|
694
1134
|
}, (signal)=>this.prover.getCheckpointPaddingRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
695
|
-
logger.debug('Completed proof for padding checkpoint.');
|
|
1135
|
+
this.logger.debug('Completed proof for padding checkpoint.');
|
|
696
1136
|
provingState.setCheckpointPaddingProof(result);
|
|
697
1137
|
this.checkAndEnqueueRootRollup(provingState);
|
|
698
1138
|
});
|
|
@@ -700,15 +1140,15 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
700
1140
|
// Executes the root rollup circuit
|
|
701
1141
|
enqueueRootRollup(provingState) {
|
|
702
1142
|
if (!provingState.verifyState()) {
|
|
703
|
-
logger.debug('Not running root rollup, state no longer valid');
|
|
1143
|
+
this.logger.debug('Not running root rollup, state no longer valid');
|
|
704
1144
|
return;
|
|
705
1145
|
}
|
|
706
|
-
logger.debug(`Preparing root rollup`);
|
|
1146
|
+
this.logger.debug(`Preparing root rollup`);
|
|
707
1147
|
const inputs = provingState.getRootRollupInputs();
|
|
708
1148
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getRootRollupProof', {
|
|
709
1149
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-root'
|
|
710
1150
|
}, (signal)=>this.prover.getRootRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
711
|
-
logger.verbose(`Orchestrator completed root rollup for epoch ${provingState.epochNumber}`);
|
|
1151
|
+
this.logger.verbose(`Orchestrator completed root rollup for epoch ${provingState.epochNumber}`);
|
|
712
1152
|
provingState.setRootRollupProof(result);
|
|
713
1153
|
provingState.resolve({
|
|
714
1154
|
status: 'success'
|
|
@@ -728,7 +1168,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
728
1168
|
}
|
|
729
1169
|
checkAndEnqueueBlockRootRollup(provingState) {
|
|
730
1170
|
if (!provingState.isReadyForBlockRootRollup()) {
|
|
731
|
-
logger.debug('Not ready for block root rollup');
|
|
1171
|
+
this.logger.debug('Not ready for block root rollup');
|
|
732
1172
|
return;
|
|
733
1173
|
}
|
|
734
1174
|
this.enqueueBlockRootRollup(provingState);
|
|
@@ -763,7 +1203,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
763
1203
|
}
|
|
764
1204
|
checkAndEnqueueRootRollup(provingState) {
|
|
765
1205
|
if (!provingState.isReadyForRootRollup()) {
|
|
766
|
-
logger.debug('Not ready for root rollup');
|
|
1206
|
+
this.logger.debug('Not ready for root rollup');
|
|
767
1207
|
return;
|
|
768
1208
|
}
|
|
769
1209
|
this.enqueueRootRollup(provingState);
|
|
@@ -775,41 +1215,19 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
775
1215
|
* @param txIndex - The index of the transaction being proven
|
|
776
1216
|
*/ enqueueVM(provingState, txIndex) {
|
|
777
1217
|
if (!provingState.verifyState()) {
|
|
778
|
-
logger.debug(`Not running VM circuit as state is no longer valid`);
|
|
1218
|
+
this.logger.debug(`Not running VM circuit as state is no longer valid`);
|
|
779
1219
|
return;
|
|
780
1220
|
}
|
|
781
1221
|
const txProvingState = provingState.getTxProvingState(txIndex);
|
|
782
|
-
// This function tries to do AVM proving. If there is a failure, it fakes the proof unless AVM_PROVING_STRICT is defined.
|
|
783
|
-
// Nothing downstream depends on the AVM proof yet. So having this mode lets us incrementally build the AVM circuit.
|
|
784
1222
|
const doAvmProving = wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getAvmProof', {
|
|
785
1223
|
[Attributes.TX_HASH]: txProvingState.processedTx.hash.toString()
|
|
786
1224
|
}, async (signal)=>{
|
|
787
1225
|
const inputs = txProvingState.getAvmInputs();
|
|
788
|
-
|
|
789
|
-
// TODO(#14234)[Unconditional PIs validation]: Remove the whole try-catch logic and
|
|
790
|
-
// just keep the next line but removing the second argument (false).
|
|
791
|
-
return await this.prover.getAvmProof(inputs, false, signal, provingState.epochNumber);
|
|
792
|
-
} catch (err) {
|
|
793
|
-
if (process.env.AVM_PROVING_STRICT) {
|
|
794
|
-
logger.error(`Error thrown when proving AVM circuit with AVM_PROVING_STRICT on`, err);
|
|
795
|
-
throw err;
|
|
796
|
-
} else {
|
|
797
|
-
logger.warn(`Error thrown when proving AVM circuit but AVM_PROVING_STRICT is off. Use snapshotted
|
|
798
|
-
AVM inputs and carrying on. ${inspect(err)}.`);
|
|
799
|
-
try {
|
|
800
|
-
this.metrics.incAvmFallback();
|
|
801
|
-
const snapshotAvmPrivateInputs = readAvmMinimalPublicTxInputsFromFile();
|
|
802
|
-
return await this.prover.getAvmProof(snapshotAvmPrivateInputs, true, signal, provingState.epochNumber);
|
|
803
|
-
} catch (err) {
|
|
804
|
-
logger.error(`Error thrown when proving snapshotted AVM inputs.`, err);
|
|
805
|
-
throw err;
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
}
|
|
1226
|
+
return await this.prover.getAvmProof(inputs, signal, provingState.epochNumber);
|
|
809
1227
|
});
|
|
810
|
-
this.deferredProving(provingState, doAvmProving, (
|
|
811
|
-
logger.debug(`Proven VM for tx index: ${txIndex}`);
|
|
812
|
-
txProvingState.setAvmProof(
|
|
1228
|
+
this.deferredProving(provingState, doAvmProving, (proof)=>{
|
|
1229
|
+
this.logger.debug(`Proven VM for tx index: ${txIndex}`);
|
|
1230
|
+
txProvingState.setAvmProof(proof);
|
|
813
1231
|
this.checkAndEnqueueBaseRollup(provingState, txIndex);
|
|
814
1232
|
});
|
|
815
1233
|
}
|
|
@@ -819,30 +1237,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
819
1237
|
return;
|
|
820
1238
|
}
|
|
821
1239
|
// We must have completed all proving (chonk verifier proof and (if required) vm proof are generated), we now move to the base rollup.
|
|
822
|
-
logger.debug(`Public functions completed for tx ${txIndex} enqueueing base rollup`);
|
|
1240
|
+
this.logger.debug(`Public functions completed for tx ${txIndex} enqueueing base rollup`);
|
|
823
1241
|
this.enqueueBaseRollup(provingState, txIndex);
|
|
824
1242
|
}
|
|
825
1243
|
}
|
|
826
|
-
_ts_decorate([
|
|
827
|
-
trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
828
|
-
[Attributes.BLOCK_NUMBER]: blockNumber
|
|
829
|
-
}))
|
|
830
|
-
], ProvingOrchestrator.prototype, "startNewBlock", null);
|
|
831
|
-
_ts_decorate([
|
|
832
|
-
trackSpan('ProvingOrchestrator.addTxs', (txs)=>({
|
|
833
|
-
[Attributes.BLOCK_TXS_COUNT]: txs.length
|
|
834
|
-
}))
|
|
835
|
-
], ProvingOrchestrator.prototype, "addTxs", null);
|
|
836
|
-
_ts_decorate([
|
|
837
|
-
trackSpan('ProvingOrchestrator.startChonkVerifierCircuits')
|
|
838
|
-
], ProvingOrchestrator.prototype, "startChonkVerifierCircuits", null);
|
|
839
|
-
_ts_decorate([
|
|
840
|
-
trackSpan('ProvingOrchestrator.setBlockCompleted', (blockNumber)=>({
|
|
841
|
-
[Attributes.BLOCK_NUMBER]: blockNumber
|
|
842
|
-
}))
|
|
843
|
-
], ProvingOrchestrator.prototype, "setBlockCompleted", null);
|
|
844
|
-
_ts_decorate([
|
|
845
|
-
trackSpan('ProvingOrchestrator.prepareBaseRollupInputs', (tx)=>({
|
|
846
|
-
[Attributes.TX_HASH]: tx.hash.toString()
|
|
847
|
-
}))
|
|
848
|
-
], ProvingOrchestrator.prototype, "prepareBaseRollupInputs", null);
|