@aztec/prover-client 0.0.1-fake-c83136db25 → 0.0.2-commit.217f559981
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 +48 -0
- package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -0
- package/dest/light/lightweight_checkpoint_builder.js +202 -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 +119 -116
- package/dest/orchestrator/block-building-helpers.d.ts +18 -20
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +90 -115
- package/dest/orchestrator/block-proving-state.d.ts +20 -11
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +87 -19
- 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 +52 -20
- 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 +40 -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 +562 -176
- 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 +5 -5
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +15 -10
- 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 +24 -8
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +26 -3
- 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 -5
- package/dest/proving_broker/proof_store/factory.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/factory.js +7 -30
- package/dest/proving_broker/proof_store/file_store_proof_store.d.ts +18 -0
- package/dest/proving_broker/proof_store/file_store_proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/file_store_proof_store.js +60 -0
- package/dest/proving_broker/proof_store/index.d.ts +2 -2
- package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/index.js +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 +7 -4
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +35 -12
- 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 +7 -5
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +8 -0
- 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 +5 -6
- 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 +294 -0
- package/src/mocks/fixtures.ts +9 -31
- package/src/mocks/test_context.ts +158 -177
- package/src/orchestrator/block-building-helpers.ts +129 -209
- package/src/orchestrator/block-proving-state.ts +109 -22
- package/src/orchestrator/checkpoint-proving-state.ts +75 -25
- package/src/orchestrator/epoch-proving-state.ts +67 -15
- package/src/orchestrator/orchestrator.ts +172 -169
- 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 +31 -23
- 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 +30 -1
- package/src/proving_broker/fixtures.ts +8 -3
- package/src/proving_broker/proof_store/factory.ts +10 -32
- package/src/proving_broker/proof_store/file_store_proof_store.ts +78 -0
- package/src/proving_broker/proof_store/index.ts +1 -1
- package/src/proving_broker/proving_agent.ts +6 -19
- package/src/proving_broker/proving_broker.ts +36 -10
- 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/proving_broker/rpc.ts +14 -0
- 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/proof_store/gcs_proof_store.d.ts +0 -14
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +0 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.js +0 -52
- 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/proof_store/gcs_proof_store.ts +0 -76
- 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
|
+
};
|
|
369
|
+
}
|
|
370
|
+
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
371
|
+
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
6
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,13 @@ 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;
|
|
508
|
+
const firstBlockNumber = BlockNumber(lastBlockNumber + 1);
|
|
91
509
|
this.dbs.set(firstBlockNumber, db);
|
|
92
510
|
// Get archive sibling path before any block in this checkpoint lands.
|
|
93
511
|
const lastArchiveSiblingPath = await getLastSiblingPath(MerkleTreeId.ARCHIVE, db);
|
|
94
512
|
// Insert all the l1 to l2 messages into the db. And get the states before and after the insertion.
|
|
95
513
|
const { lastL1ToL2MessageTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath, newL1ToL2MessageTreeSnapshot, newL1ToL2MessageSubtreeRootSiblingPath } = await this.updateL1ToL2MessageTree(l1ToL2Messages, db);
|
|
96
|
-
this.provingState.startNewCheckpoint(checkpointIndex, constants, totalNumBlocks,
|
|
514
|
+
this.provingState.startNewCheckpoint(checkpointIndex, constants, totalNumBlocks, headerOfLastBlockInPreviousCheckpoint, lastArchiveSiblingPath, l1ToL2Messages, lastL1ToL2MessageTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath, newL1ToL2MessageTreeSnapshot, newL1ToL2MessageSubtreeRootSiblingPath);
|
|
97
515
|
}
|
|
98
516
|
/**
|
|
99
517
|
* Starts off a new block
|
|
@@ -113,18 +531,18 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
113
531
|
throw new Error(`Checkpoint not accepting further blocks.`);
|
|
114
532
|
}
|
|
115
533
|
const constants = checkpointProvingState.constants;
|
|
116
|
-
logger.info(`Starting block ${blockNumber} for slot ${constants.slotNumber
|
|
534
|
+
this.logger.info(`Starting block ${blockNumber} for slot ${constants.slotNumber}.`);
|
|
117
535
|
// Fork the db only when it's not already set. The db for the first block is set in `startNewCheckpoint`.
|
|
118
536
|
if (!this.dbs.has(blockNumber)) {
|
|
119
537
|
// Fork world state at the end of the immediately previous block
|
|
120
|
-
const db = await this.dbProvider.fork(blockNumber - 1);
|
|
538
|
+
const db = await this.dbProvider.fork(BlockNumber(blockNumber - 1));
|
|
121
539
|
this.dbs.set(blockNumber, db);
|
|
122
540
|
}
|
|
123
|
-
const db = this.
|
|
541
|
+
const db = this.getDbForBlock(blockNumber);
|
|
124
542
|
// Get archive snapshot and sibling path before any txs in this block lands.
|
|
125
543
|
const lastArchiveTreeSnapshot = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
126
544
|
const lastArchiveSiblingPath = await getRootTreeSiblingPath(MerkleTreeId.ARCHIVE, db);
|
|
127
|
-
const blockProvingState =
|
|
545
|
+
const blockProvingState = checkpointProvingState.startNewBlock(blockNumber, timestamp, totalNumTxs, lastArchiveTreeSnapshot, lastArchiveSiblingPath);
|
|
128
546
|
// Enqueue base parity circuits for the first block in the checkpoint.
|
|
129
547
|
if (blockProvingState.index === 0) {
|
|
130
548
|
for(let i = 0; i < NUM_BASE_PARITY_PER_ROOT_PARITY; i++){
|
|
@@ -134,12 +552,14 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
134
552
|
// Because `addTxs` won't be called for a block without txs, and that's where the sponge blob state is computed.
|
|
135
553
|
// We need to set its end sponge blob here, which will become the start sponge blob for the next block.
|
|
136
554
|
if (totalNumTxs === 0) {
|
|
555
|
+
const endState = await db.getStateReference();
|
|
556
|
+
blockProvingState.setEndState(endState);
|
|
137
557
|
const endSpongeBlob = blockProvingState.getStartSpongeBlob().clone();
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
]);
|
|
558
|
+
const blockEndBlobFields = blockProvingState.getBlockEndBlobFields();
|
|
559
|
+
await endSpongeBlob.absorb(blockEndBlobFields);
|
|
141
560
|
blockProvingState.setEndSpongeBlob(endSpongeBlob);
|
|
142
|
-
//
|
|
561
|
+
// Try to accumulate the out hashes and blobs as far as we can:
|
|
562
|
+
await this.provingState.accumulateCheckpointOutHashes();
|
|
143
563
|
await this.provingState.setBlobAccumulators();
|
|
144
564
|
}
|
|
145
565
|
}
|
|
@@ -153,10 +573,10 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
153
573
|
if (!txs.length) {
|
|
154
574
|
// To avoid an ugly throw below. If we require an empty block, we can just call setBlockCompleted
|
|
155
575
|
// 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.`);
|
|
576
|
+
this.logger.warn(`Provided no txs to orchestrator addTxs.`);
|
|
157
577
|
return;
|
|
158
578
|
}
|
|
159
|
-
const blockNumber = txs[0].globalVariables.blockNumber;
|
|
579
|
+
const blockNumber = BlockNumber(txs[0].globalVariables.blockNumber);
|
|
160
580
|
const provingState = this.provingState.getBlockProvingStateByBlockNumber(blockNumber);
|
|
161
581
|
if (!provingState) {
|
|
162
582
|
throw new Error(`Proving state for block ${blockNumber} not found. Call startNewBlock first.`);
|
|
@@ -167,8 +587,8 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
167
587
|
if (!provingState.isAcceptingTxs()) {
|
|
168
588
|
throw new Error(`Block ${blockNumber} has been initialized with transactions.`);
|
|
169
589
|
}
|
|
170
|
-
logger.info(`Adding ${txs.length} transactions to block ${blockNumber}`);
|
|
171
|
-
const db = this.
|
|
590
|
+
this.logger.info(`Adding ${txs.length} transactions to block ${blockNumber}`);
|
|
591
|
+
const db = this.getDbForBlock(blockNumber);
|
|
172
592
|
const lastArchive = provingState.lastArchiveTreeSnapshot;
|
|
173
593
|
const newL1ToL2MessageTreeSnapshot = provingState.newL1ToL2MessageTreeSnapshot;
|
|
174
594
|
const spongeBlobState = provingState.getStartSpongeBlob().clone();
|
|
@@ -178,7 +598,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
178
598
|
throw new Error(`Invalid proving state when adding a tx`);
|
|
179
599
|
}
|
|
180
600
|
validateTx(tx);
|
|
181
|
-
logger.
|
|
601
|
+
this.logger.debug(`Received transaction: ${tx.hash}`);
|
|
182
602
|
const startSpongeBlob = spongeBlobState.clone();
|
|
183
603
|
const [hints, treeSnapshots] = await this.prepareBaseRollupInputs(tx, lastArchive, newL1ToL2MessageTreeSnapshot, startSpongeBlob, db);
|
|
184
604
|
if (!provingState.verifyState()) {
|
|
@@ -189,10 +609,10 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
189
609
|
const txIndex = provingState.addNewTx(txProvingState);
|
|
190
610
|
if (txProvingState.requireAvmProof) {
|
|
191
611
|
this.getOrEnqueueChonkVerifier(provingState, txIndex);
|
|
192
|
-
logger.debug(`Enqueueing public VM for tx ${txIndex}`);
|
|
612
|
+
this.logger.debug(`Enqueueing public VM for tx ${txIndex}`);
|
|
193
613
|
this.enqueueVM(provingState, txIndex);
|
|
194
614
|
} else {
|
|
195
|
-
logger.debug(`Enqueueing base rollup for private-only tx ${txIndex}`);
|
|
615
|
+
this.logger.debug(`Enqueueing base rollup for private-only tx ${txIndex}`);
|
|
196
616
|
this.enqueueBaseRollup(provingState, txIndex);
|
|
197
617
|
}
|
|
198
618
|
} catch (err) {
|
|
@@ -201,11 +621,13 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
201
621
|
});
|
|
202
622
|
}
|
|
203
623
|
}
|
|
204
|
-
await
|
|
205
|
-
|
|
206
|
-
|
|
624
|
+
const endState = await db.getStateReference();
|
|
625
|
+
provingState.setEndState(endState);
|
|
626
|
+
const blockEndBlobFields = provingState.getBlockEndBlobFields();
|
|
627
|
+
await spongeBlobState.absorb(blockEndBlobFields);
|
|
207
628
|
provingState.setEndSpongeBlob(spongeBlobState);
|
|
208
|
-
// Txs have been added to the block. Now try to accumulate the blobs as far as we can:
|
|
629
|
+
// Txs have been added to the block. Now try to accumulate the out hashes and blobs as far as we can:
|
|
630
|
+
await this.provingState.accumulateCheckpointOutHashes();
|
|
209
631
|
await this.provingState.setBlobAccumulators();
|
|
210
632
|
}
|
|
211
633
|
/**
|
|
@@ -220,7 +642,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
220
642
|
const txHash = tx.getTxHash().toString();
|
|
221
643
|
const privateInputs = getPublicChonkVerifierPrivateInputsFromTx(tx, this.proverId.toField());
|
|
222
644
|
const tubeProof = promiseWithResolvers();
|
|
223
|
-
logger.debug(`Starting chonk verifier circuit for tx ${txHash}`);
|
|
645
|
+
this.logger.debug(`Starting chonk verifier circuit for tx ${txHash}`);
|
|
224
646
|
this.doEnqueueChonkVerifier(txHash, privateInputs, (proof)=>{
|
|
225
647
|
tubeProof.resolve(proof);
|
|
226
648
|
});
|
|
@@ -248,78 +670,86 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
248
670
|
if (provingState.isAcceptingTxs()) {
|
|
249
671
|
throw new Error(`Block ${blockNumber} is still accepting txs. Call setBlockCompleted after all txs have been added.`);
|
|
250
672
|
}
|
|
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);
|
|
673
|
+
// Given we've applied every change from this block, now assemble the block header:
|
|
674
|
+
this.logger.verbose(`Block ${blockNumber} completed. Assembling header.`);
|
|
675
|
+
const header = await provingState.buildBlockHeader();
|
|
266
676
|
if (expectedHeader && !header.equals(expectedHeader)) {
|
|
267
|
-
logger.error(`Block header mismatch: header=${header} expectedHeader=${expectedHeader}`);
|
|
677
|
+
this.logger.error(`Block header mismatch: header=${header} expectedHeader=${expectedHeader}`);
|
|
268
678
|
throw new Error('Block header mismatch');
|
|
269
679
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
provingState.
|
|
680
|
+
// Get db for this block and remove from map — no other code should use it after this point.
|
|
681
|
+
const db = this.getDbForBlock(provingState.blockNumber);
|
|
682
|
+
this.dbs.delete(provingState.blockNumber);
|
|
683
|
+
// Update the archive tree, capture the snapshot, and close the fork deterministically.
|
|
684
|
+
try {
|
|
685
|
+
this.logger.verbose(`Updating archive tree with block ${provingState.blockNumber} header ${(await header.hash()).toString()}`);
|
|
686
|
+
await db.updateArchive(header);
|
|
687
|
+
provingState.setBuiltArchive(await getTreeSnapshot(MerkleTreeId.ARCHIVE, db));
|
|
688
|
+
} finally{
|
|
689
|
+
await db.close();
|
|
690
|
+
}
|
|
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.');
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
const newArchive = provingState.getBuiltArchive();
|
|
707
|
+
if (!newArchive) {
|
|
708
|
+
this.logger.debug('Archive snapshot not yet captured, skipping header check.');
|
|
285
709
|
return;
|
|
286
710
|
}
|
|
287
711
|
const header = await buildHeaderFromCircuitOutputs(output);
|
|
288
712
|
if (!(await header.hash()).equals(await builtBlockHeader.hash())) {
|
|
289
|
-
logger.error(`Block header mismatch.\nCircuit: ${inspect(header)}\nComputed: ${inspect(builtBlockHeader)}`);
|
|
713
|
+
this.logger.error(`Block header mismatch.\nCircuit: ${inspect(header)}\nComputed: ${inspect(builtBlockHeader)}`);
|
|
290
714
|
provingState.reject(`Block header hash mismatch.`);
|
|
291
715
|
return;
|
|
292
716
|
}
|
|
293
|
-
// Get db for this block
|
|
294
717
|
const blockNumber = provingState.blockNumber;
|
|
295
|
-
const db = this.dbs.get(blockNumber);
|
|
296
|
-
const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
297
718
|
const syncedArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, this.dbProvider.getSnapshot(blockNumber));
|
|
298
719
|
if (!syncedArchive.equals(newArchive)) {
|
|
299
|
-
logger.error(`Archive tree mismatch for block ${blockNumber}: world state synced to ${inspect(syncedArchive)} but built ${inspect(newArchive)}`);
|
|
720
|
+
this.logger.error(`Archive tree mismatch for block ${blockNumber}: world state synced to ${inspect(syncedArchive)} but built ${inspect(newArchive)}`);
|
|
300
721
|
provingState.reject(`Archive tree mismatch.`);
|
|
301
722
|
return;
|
|
302
723
|
}
|
|
303
724
|
const circuitArchive = output.newArchive;
|
|
304
725
|
if (!newArchive.equals(circuitArchive)) {
|
|
305
|
-
logger.error(`New archive mismatch.\nCircuit: ${output.newArchive}\nComputed: ${newArchive}`);
|
|
726
|
+
this.logger.error(`New archive mismatch.\nCircuit: ${output.newArchive}\nComputed: ${newArchive}`);
|
|
306
727
|
provingState.reject(`New archive mismatch.`);
|
|
307
728
|
return;
|
|
308
729
|
}
|
|
309
|
-
// TODO(palla/prover): This closes the fork only on the happy path. If this epoch orchestrator
|
|
310
|
-
// is aborted and never reaches this point, it will leak the fork. We need to add a global cleanup,
|
|
311
|
-
// but have to make sure it only runs once all operations are completed, otherwise some function here
|
|
312
|
-
// will attempt to access the fork after it was closed.
|
|
313
|
-
logger.debug(`Cleaning up world state fork for ${blockNumber}`);
|
|
314
|
-
void this.dbs.get(blockNumber)?.close().then(()=>this.dbs.delete(blockNumber)).catch((err)=>logger.error(`Error closing db for block ${blockNumber}`, err));
|
|
315
730
|
}
|
|
316
731
|
/**
|
|
317
|
-
* Cancel any further proving
|
|
732
|
+
* Cancel any further proving.
|
|
733
|
+
* If cancelJobsOnStop is true, aborts all pending jobs with the broker (which marks them as 'Aborted').
|
|
734
|
+
* If cancelJobsOnStop is false (default), jobs remain in the broker queue and can be reused on restart/reorg.
|
|
318
735
|
*/ cancel() {
|
|
319
|
-
|
|
320
|
-
controller.
|
|
736
|
+
if (this.cancelJobsOnStop) {
|
|
737
|
+
for (const controller of this.pendingProvingJobs){
|
|
738
|
+
controller.abort();
|
|
739
|
+
}
|
|
321
740
|
}
|
|
322
741
|
this.provingState?.cancel();
|
|
742
|
+
for (const [blockNumber, db] of this.dbs.entries()){
|
|
743
|
+
void db.close().catch((err)=>this.logger.error(`Error closing db for block ${blockNumber}`, err));
|
|
744
|
+
}
|
|
745
|
+
this.dbs.clear();
|
|
746
|
+
}
|
|
747
|
+
getDbForBlock(blockNumber) {
|
|
748
|
+
const db = this.dbs.get(blockNumber);
|
|
749
|
+
if (!db) {
|
|
750
|
+
throw new Error(`World state fork for block ${blockNumber} not found.`);
|
|
751
|
+
}
|
|
752
|
+
return db;
|
|
323
753
|
}
|
|
324
754
|
/**
|
|
325
755
|
* Returns the proof for the current epoch.
|
|
@@ -346,7 +776,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
346
776
|
* @param job - The actual job, returns a promise notifying of the job's completion
|
|
347
777
|
*/ deferredProving(provingState, request, callback) {
|
|
348
778
|
if (!provingState.verifyState()) {
|
|
349
|
-
logger.debug(`Not enqueuing job, state no longer valid`);
|
|
779
|
+
this.logger.debug(`Not enqueuing job, state no longer valid`);
|
|
350
780
|
return;
|
|
351
781
|
}
|
|
352
782
|
const controller = new AbortController();
|
|
@@ -361,7 +791,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
361
791
|
}
|
|
362
792
|
const result = await request(controller.signal);
|
|
363
793
|
if (!provingState.verifyState()) {
|
|
364
|
-
logger.debug(`State no longer valid, discarding result`);
|
|
794
|
+
this.logger.debug(`State no longer valid, discarding result`);
|
|
365
795
|
return;
|
|
366
796
|
}
|
|
367
797
|
// we could have been cancelled whilst waiting for the result
|
|
@@ -376,7 +806,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
376
806
|
// drop this result
|
|
377
807
|
return;
|
|
378
808
|
}
|
|
379
|
-
logger.error(`Error thrown when proving job`, err);
|
|
809
|
+
this.logger.error(`Error thrown when proving job`, err);
|
|
380
810
|
provingState.reject(`${err}`);
|
|
381
811
|
} finally{
|
|
382
812
|
const index = this.pendingProvingJobs.indexOf(controller);
|
|
@@ -432,17 +862,17 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
432
862
|
// Executes the next level of merge if all inputs are available
|
|
433
863
|
enqueueBaseRollup(provingState, txIndex) {
|
|
434
864
|
if (!provingState.verifyState()) {
|
|
435
|
-
logger.debug('Not running base rollup, state invalid');
|
|
865
|
+
this.logger.debug('Not running base rollup, state invalid');
|
|
436
866
|
return;
|
|
437
867
|
}
|
|
438
868
|
if (!provingState.tryStartProvingBase(txIndex)) {
|
|
439
|
-
logger.debug(`Base rollup for tx ${txIndex} already started.`);
|
|
869
|
+
this.logger.debug(`Base rollup for tx ${txIndex} already started.`);
|
|
440
870
|
return;
|
|
441
871
|
}
|
|
442
872
|
const txProvingState = provingState.getTxProvingState(txIndex);
|
|
443
873
|
const { processedTx } = txProvingState;
|
|
444
874
|
const { rollupType, inputs } = txProvingState.getBaseRollupTypeAndInputs();
|
|
445
|
-
logger.debug(`Enqueuing deferred proving base rollup for ${processedTx.hash.toString()}`);
|
|
875
|
+
this.logger.debug(`Enqueuing deferred proving base rollup for ${processedTx.hash.toString()}`);
|
|
446
876
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, `ProvingOrchestrator.prover.${inputs instanceof PrivateTxBaseRollupPrivateInputs ? 'getPrivateTxBaseRollupProof' : 'getPublicTxBaseRollupProof'}`, {
|
|
447
877
|
[Attributes.TX_HASH]: processedTx.hash.toString(),
|
|
448
878
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType
|
|
@@ -453,7 +883,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
453
883
|
return this.prover.getPublicTxBaseRollupProof(inputs, signal, provingState.epochNumber);
|
|
454
884
|
}
|
|
455
885
|
}), (result)=>{
|
|
456
|
-
logger.debug(`Completed proof for ${rollupType} for tx ${processedTx.hash.toString()}`);
|
|
886
|
+
this.logger.debug(`Completed proof for ${rollupType} for tx ${processedTx.hash.toString()}`);
|
|
457
887
|
validatePartialState(result.inputs.endTreeSnapshots, txProvingState.treeSnapshots);
|
|
458
888
|
const leafLocation = provingState.setBaseRollupProof(txIndex, result);
|
|
459
889
|
if (provingState.totalNumTxs === 1) {
|
|
@@ -467,14 +897,14 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
467
897
|
// Once completed, will enqueue the the public tx base rollup.
|
|
468
898
|
getOrEnqueueChonkVerifier(provingState, txIndex) {
|
|
469
899
|
if (!provingState.verifyState()) {
|
|
470
|
-
logger.debug('Not running chonk verifier circuit, state invalid');
|
|
900
|
+
this.logger.debug('Not running chonk verifier circuit, state invalid');
|
|
471
901
|
return;
|
|
472
902
|
}
|
|
473
903
|
const txProvingState = provingState.getTxProvingState(txIndex);
|
|
474
904
|
const txHash = txProvingState.processedTx.hash.toString();
|
|
475
905
|
NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH;
|
|
476
906
|
const handleResult = (result)=>{
|
|
477
|
-
logger.debug(`Got chonk verifier proof for tx index: ${txIndex}`, {
|
|
907
|
+
this.logger.debug(`Got chonk verifier proof for tx index: ${txIndex}`, {
|
|
478
908
|
txHash
|
|
479
909
|
});
|
|
480
910
|
txProvingState.setPublicChonkVerifierProof(result);
|
|
@@ -482,18 +912,18 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
482
912
|
this.checkAndEnqueueBaseRollup(provingState, txIndex);
|
|
483
913
|
};
|
|
484
914
|
if (this.provingState?.cachedChonkVerifierProofs.has(txHash)) {
|
|
485
|
-
logger.debug(`Chonk verifier proof already enqueued for tx index: ${txIndex}`, {
|
|
915
|
+
this.logger.debug(`Chonk verifier proof already enqueued for tx index: ${txIndex}`, {
|
|
486
916
|
txHash
|
|
487
917
|
});
|
|
488
918
|
void this.provingState.cachedChonkVerifierProofs.get(txHash).then(handleResult);
|
|
489
919
|
return;
|
|
490
920
|
}
|
|
491
|
-
logger.debug(`Enqueuing chonk verifier circuit for tx index: ${txIndex}`);
|
|
921
|
+
this.logger.debug(`Enqueuing chonk verifier circuit for tx index: ${txIndex}`);
|
|
492
922
|
this.doEnqueueChonkVerifier(txHash, txProvingState.getPublicChonkVerifierPrivateInputs(), handleResult);
|
|
493
923
|
}
|
|
494
924
|
doEnqueueChonkVerifier(txHash, inputs, handler, provingState = this.provingState) {
|
|
495
925
|
if (!provingState.verifyState()) {
|
|
496
|
-
logger.debug('Not running chonk verifier circuit, state invalid');
|
|
926
|
+
this.logger.debug('Not running chonk verifier circuit, state invalid');
|
|
497
927
|
return;
|
|
498
928
|
}
|
|
499
929
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getPublicChonkVerifierProof', {
|
|
@@ -505,11 +935,11 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
505
935
|
// Enqueues the next level of merge if all inputs are available
|
|
506
936
|
enqueueMergeRollup(provingState, location) {
|
|
507
937
|
if (!provingState.verifyState()) {
|
|
508
|
-
logger.debug('Not running merge rollup. State no longer valid.');
|
|
938
|
+
this.logger.debug('Not running merge rollup. State no longer valid.');
|
|
509
939
|
return;
|
|
510
940
|
}
|
|
511
941
|
if (!provingState.tryStartProvingMerge(location)) {
|
|
512
|
-
logger.debug('Merge rollup already started.');
|
|
942
|
+
this.logger.debug('Merge rollup already started.');
|
|
513
943
|
return;
|
|
514
944
|
}
|
|
515
945
|
const inputs = provingState.getMergeRollupInputs(location);
|
|
@@ -523,15 +953,15 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
523
953
|
// Executes the block root rollup circuit
|
|
524
954
|
enqueueBlockRootRollup(provingState) {
|
|
525
955
|
if (!provingState.verifyState()) {
|
|
526
|
-
logger.debug('Not running block root rollup, state no longer valid');
|
|
956
|
+
this.logger.debug('Not running block root rollup, state no longer valid');
|
|
527
957
|
return;
|
|
528
958
|
}
|
|
529
959
|
if (!provingState.tryStartProvingBlockRoot()) {
|
|
530
|
-
logger.debug('Block root rollup already started.');
|
|
960
|
+
this.logger.debug('Block root rollup already started.');
|
|
531
961
|
return;
|
|
532
962
|
}
|
|
533
963
|
const { rollupType, inputs } = provingState.getBlockRootRollupTypeAndInputs();
|
|
534
|
-
logger.debug(`Enqueuing ${rollupType} for block ${provingState.blockNumber}.`);
|
|
964
|
+
this.logger.debug(`Enqueuing ${rollupType} for block ${provingState.blockNumber}.`);
|
|
535
965
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getBlockRootRollupProof', {
|
|
536
966
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType
|
|
537
967
|
}, (signal)=>{
|
|
@@ -547,15 +977,16 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
547
977
|
return this.prover.getBlockRootRollupProof(inputs, signal, provingState.epochNumber);
|
|
548
978
|
}
|
|
549
979
|
}), async (result)=>{
|
|
550
|
-
|
|
551
|
-
await this.verifyBuiltBlockAgainstSyncedState(provingState);
|
|
552
|
-
logger.debug(`Completed ${rollupType} proof for block ${provingState.blockNumber}`);
|
|
980
|
+
this.logger.debug(`Completed ${rollupType} proof for block ${provingState.blockNumber}`);
|
|
553
981
|
const leafLocation = provingState.setBlockRootRollupProof(result);
|
|
554
982
|
const checkpointProvingState = provingState.parentCheckpoint;
|
|
983
|
+
// Verification is called from both here and setBlockCompleted. Whichever runs last
|
|
984
|
+
// will be the first to see all three pieces (header, proof output, archive) and run the checks.
|
|
985
|
+
await this.verifyBuiltBlockAgainstSyncedState(provingState);
|
|
555
986
|
if (checkpointProvingState.totalNumBlocks === 1) {
|
|
556
|
-
this.checkAndEnqueueCheckpointRootRollup(checkpointProvingState);
|
|
987
|
+
await this.checkAndEnqueueCheckpointRootRollup(checkpointProvingState);
|
|
557
988
|
} else {
|
|
558
|
-
this.checkAndEnqueueNextBlockMergeRollup(checkpointProvingState, leafLocation);
|
|
989
|
+
await this.checkAndEnqueueNextBlockMergeRollup(checkpointProvingState, leafLocation);
|
|
559
990
|
}
|
|
560
991
|
});
|
|
561
992
|
}
|
|
@@ -563,11 +994,11 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
563
994
|
// Enqueues the root parity circuit if all inputs are available
|
|
564
995
|
enqueueBaseParityCircuit(checkpointProvingState, provingState, baseParityIndex) {
|
|
565
996
|
if (!provingState.verifyState()) {
|
|
566
|
-
logger.debug('Not running base parity. State no longer valid.');
|
|
997
|
+
this.logger.debug('Not running base parity. State no longer valid.');
|
|
567
998
|
return;
|
|
568
999
|
}
|
|
569
1000
|
if (!provingState.tryStartProvingBaseParity(baseParityIndex)) {
|
|
570
|
-
logger.warn(`Base parity ${baseParityIndex} already started.`);
|
|
1001
|
+
this.logger.warn(`Base parity ${baseParityIndex} already started.`);
|
|
571
1002
|
return;
|
|
572
1003
|
}
|
|
573
1004
|
const inputs = checkpointProvingState.getBaseParityInputs(baseParityIndex);
|
|
@@ -588,11 +1019,11 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
588
1019
|
// Enqueues the root rollup proof if all inputs are available
|
|
589
1020
|
enqueueRootParityCircuit(provingState) {
|
|
590
1021
|
if (!provingState.verifyState()) {
|
|
591
|
-
logger.debug('Not running root parity. State no longer valid.');
|
|
1022
|
+
this.logger.debug('Not running root parity. State no longer valid.');
|
|
592
1023
|
return;
|
|
593
1024
|
}
|
|
594
1025
|
if (!provingState.tryStartProvingRootParity()) {
|
|
595
|
-
logger.debug('Root parity already started.');
|
|
1026
|
+
this.logger.debug('Root parity already started.');
|
|
596
1027
|
return;
|
|
597
1028
|
}
|
|
598
1029
|
const inputs = provingState.getParityRootInputs();
|
|
@@ -607,33 +1038,33 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
607
1038
|
// Enqueues the next level of merge if all inputs are available
|
|
608
1039
|
enqueueBlockMergeRollup(provingState, location) {
|
|
609
1040
|
if (!provingState.verifyState()) {
|
|
610
|
-
logger.debug('Not running block merge rollup. State no longer valid.');
|
|
1041
|
+
this.logger.debug('Not running block merge rollup. State no longer valid.');
|
|
611
1042
|
return;
|
|
612
1043
|
}
|
|
613
1044
|
if (!provingState.tryStartProvingBlockMerge(location)) {
|
|
614
|
-
logger.debug('Block merge rollup already started.');
|
|
1045
|
+
this.logger.debug('Block merge rollup already started.');
|
|
615
1046
|
return;
|
|
616
1047
|
}
|
|
617
1048
|
const inputs = provingState.getBlockMergeRollupInputs(location);
|
|
618
1049
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getBlockMergeRollupProof', {
|
|
619
1050
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-block-merge'
|
|
620
|
-
}, (signal)=>this.prover.getBlockMergeRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
1051
|
+
}, (signal)=>this.prover.getBlockMergeRollupProof(inputs, signal, provingState.epochNumber)), async (result)=>{
|
|
621
1052
|
provingState.setBlockMergeRollupProof(location, result);
|
|
622
|
-
this.checkAndEnqueueNextBlockMergeRollup(provingState, location);
|
|
1053
|
+
await this.checkAndEnqueueNextBlockMergeRollup(provingState, location);
|
|
623
1054
|
});
|
|
624
1055
|
}
|
|
625
|
-
enqueueCheckpointRootRollup(provingState) {
|
|
1056
|
+
async enqueueCheckpointRootRollup(provingState) {
|
|
626
1057
|
if (!provingState.verifyState()) {
|
|
627
|
-
logger.debug('Not running checkpoint root rollup. State no longer valid.');
|
|
1058
|
+
this.logger.debug('Not running checkpoint root rollup. State no longer valid.');
|
|
628
1059
|
return;
|
|
629
1060
|
}
|
|
630
1061
|
if (!provingState.tryStartProvingCheckpointRoot()) {
|
|
631
|
-
logger.debug('Checkpoint root rollup already started.');
|
|
1062
|
+
this.logger.debug('Checkpoint root rollup already started.');
|
|
632
1063
|
return;
|
|
633
1064
|
}
|
|
634
1065
|
const rollupType = provingState.getCheckpointRootRollupType();
|
|
635
|
-
logger.debug(`Enqueuing ${rollupType} for checkpoint ${provingState.index}.`);
|
|
636
|
-
const inputs = provingState.getCheckpointRootRollupInputs();
|
|
1066
|
+
this.logger.debug(`Enqueuing ${rollupType} for checkpoint ${provingState.index}.`);
|
|
1067
|
+
const inputs = await provingState.getCheckpointRootRollupInputs();
|
|
637
1068
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getCheckpointRootRollupProof', {
|
|
638
1069
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType
|
|
639
1070
|
}, (signal)=>{
|
|
@@ -646,11 +1077,11 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
646
1077
|
const computedEndBlobAccumulatorState = provingState.getEndBlobAccumulator().toBlobAccumulator();
|
|
647
1078
|
const circuitEndBlobAccumulatorState = result.inputs.endBlobAccumulator;
|
|
648
1079
|
if (!circuitEndBlobAccumulatorState.equals(computedEndBlobAccumulatorState)) {
|
|
649
|
-
logger.error(`Blob accumulator state mismatch.\nCircuit: ${inspect(circuitEndBlobAccumulatorState)}\nComputed: ${inspect(computedEndBlobAccumulatorState)}`);
|
|
1080
|
+
this.logger.error(`Blob accumulator state mismatch.\nCircuit: ${inspect(circuitEndBlobAccumulatorState)}\nComputed: ${inspect(computedEndBlobAccumulatorState)}`);
|
|
650
1081
|
provingState.reject(`Blob accumulator state mismatch.`);
|
|
651
1082
|
return;
|
|
652
1083
|
}
|
|
653
|
-
logger.debug(`Completed ${rollupType} proof for checkpoint ${provingState.index}.`);
|
|
1084
|
+
this.logger.debug(`Completed ${rollupType} proof for checkpoint ${provingState.index}.`);
|
|
654
1085
|
const leafLocation = provingState.setCheckpointRootRollupProof(result);
|
|
655
1086
|
const epochProvingState = provingState.parentEpoch;
|
|
656
1087
|
if (epochProvingState.totalNumCheckpoints === 1) {
|
|
@@ -662,37 +1093,37 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
662
1093
|
}
|
|
663
1094
|
enqueueCheckpointMergeRollup(provingState, location) {
|
|
664
1095
|
if (!provingState.verifyState()) {
|
|
665
|
-
logger.debug('Not running checkpoint merge rollup. State no longer valid.');
|
|
1096
|
+
this.logger.debug('Not running checkpoint merge rollup. State no longer valid.');
|
|
666
1097
|
return;
|
|
667
1098
|
}
|
|
668
1099
|
if (!provingState.tryStartProvingCheckpointMerge(location)) {
|
|
669
|
-
logger.debug('Checkpoint merge rollup already started.');
|
|
1100
|
+
this.logger.debug('Checkpoint merge rollup already started.');
|
|
670
1101
|
return;
|
|
671
1102
|
}
|
|
672
1103
|
const inputs = provingState.getCheckpointMergeRollupInputs(location);
|
|
673
1104
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getCheckpointMergeRollupProof', {
|
|
674
1105
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-checkpoint-merge'
|
|
675
1106
|
}, (signal)=>this.prover.getCheckpointMergeRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
676
|
-
logger.debug('Completed proof for checkpoint merge rollup.');
|
|
1107
|
+
this.logger.debug('Completed proof for checkpoint merge rollup.');
|
|
677
1108
|
provingState.setCheckpointMergeRollupProof(location, result);
|
|
678
1109
|
this.checkAndEnqueueNextCheckpointMergeRollup(provingState, location);
|
|
679
1110
|
});
|
|
680
1111
|
}
|
|
681
1112
|
enqueueEpochPadding(provingState) {
|
|
682
1113
|
if (!provingState.verifyState()) {
|
|
683
|
-
logger.debug('Not running epoch padding. State no longer valid.');
|
|
1114
|
+
this.logger.debug('Not running epoch padding. State no longer valid.');
|
|
684
1115
|
return;
|
|
685
1116
|
}
|
|
686
1117
|
if (!provingState.tryStartProvingPaddingCheckpoint()) {
|
|
687
|
-
logger.debug('Padding checkpoint already started.');
|
|
1118
|
+
this.logger.debug('Padding checkpoint already started.');
|
|
688
1119
|
return;
|
|
689
1120
|
}
|
|
690
|
-
logger.debug('Padding epoch proof with a padding block root proof.');
|
|
1121
|
+
this.logger.debug('Padding epoch proof with a padding block root proof.');
|
|
691
1122
|
const inputs = provingState.getPaddingCheckpointInputs();
|
|
692
1123
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getCheckpointPaddingRollupProof', {
|
|
693
1124
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-checkpoint-padding'
|
|
694
1125
|
}, (signal)=>this.prover.getCheckpointPaddingRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
695
|
-
logger.debug('Completed proof for padding checkpoint.');
|
|
1126
|
+
this.logger.debug('Completed proof for padding checkpoint.');
|
|
696
1127
|
provingState.setCheckpointPaddingProof(result);
|
|
697
1128
|
this.checkAndEnqueueRootRollup(provingState);
|
|
698
1129
|
});
|
|
@@ -700,15 +1131,15 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
700
1131
|
// Executes the root rollup circuit
|
|
701
1132
|
enqueueRootRollup(provingState) {
|
|
702
1133
|
if (!provingState.verifyState()) {
|
|
703
|
-
logger.debug('Not running root rollup, state no longer valid');
|
|
1134
|
+
this.logger.debug('Not running root rollup, state no longer valid');
|
|
704
1135
|
return;
|
|
705
1136
|
}
|
|
706
|
-
logger.debug(`Preparing root rollup`);
|
|
1137
|
+
this.logger.debug(`Preparing root rollup`);
|
|
707
1138
|
const inputs = provingState.getRootRollupInputs();
|
|
708
1139
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getRootRollupProof', {
|
|
709
1140
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-root'
|
|
710
1141
|
}, (signal)=>this.prover.getRootRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
711
|
-
logger.verbose(`Orchestrator completed root rollup for epoch ${provingState.epochNumber}`);
|
|
1142
|
+
this.logger.verbose(`Orchestrator completed root rollup for epoch ${provingState.epochNumber}`);
|
|
712
1143
|
provingState.setRootRollupProof(result);
|
|
713
1144
|
provingState.resolve({
|
|
714
1145
|
status: 'success'
|
|
@@ -728,27 +1159,27 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
728
1159
|
}
|
|
729
1160
|
checkAndEnqueueBlockRootRollup(provingState) {
|
|
730
1161
|
if (!provingState.isReadyForBlockRootRollup()) {
|
|
731
|
-
logger.debug('Not ready for block root rollup');
|
|
1162
|
+
this.logger.debug('Not ready for block root rollup');
|
|
732
1163
|
return;
|
|
733
1164
|
}
|
|
734
1165
|
this.enqueueBlockRootRollup(provingState);
|
|
735
1166
|
}
|
|
736
|
-
checkAndEnqueueNextBlockMergeRollup(provingState, currentLocation) {
|
|
1167
|
+
async checkAndEnqueueNextBlockMergeRollup(provingState, currentLocation) {
|
|
737
1168
|
if (!provingState.isReadyForBlockMerge(currentLocation)) {
|
|
738
1169
|
return;
|
|
739
1170
|
}
|
|
740
1171
|
const parentLocation = provingState.getParentLocation(currentLocation);
|
|
741
1172
|
if (parentLocation.level === 0) {
|
|
742
|
-
this.checkAndEnqueueCheckpointRootRollup(provingState);
|
|
1173
|
+
await this.checkAndEnqueueCheckpointRootRollup(provingState);
|
|
743
1174
|
} else {
|
|
744
1175
|
this.enqueueBlockMergeRollup(provingState, parentLocation);
|
|
745
1176
|
}
|
|
746
1177
|
}
|
|
747
|
-
checkAndEnqueueCheckpointRootRollup(provingState) {
|
|
1178
|
+
async checkAndEnqueueCheckpointRootRollup(provingState) {
|
|
748
1179
|
if (!provingState.isReadyForCheckpointRoot()) {
|
|
749
1180
|
return;
|
|
750
1181
|
}
|
|
751
|
-
this.enqueueCheckpointRootRollup(provingState);
|
|
1182
|
+
await this.enqueueCheckpointRootRollup(provingState);
|
|
752
1183
|
}
|
|
753
1184
|
checkAndEnqueueNextCheckpointMergeRollup(provingState, currentLocation) {
|
|
754
1185
|
if (!provingState.isReadyForCheckpointMerge(currentLocation)) {
|
|
@@ -763,7 +1194,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
763
1194
|
}
|
|
764
1195
|
checkAndEnqueueRootRollup(provingState) {
|
|
765
1196
|
if (!provingState.isReadyForRootRollup()) {
|
|
766
|
-
logger.debug('Not ready for root rollup');
|
|
1197
|
+
this.logger.debug('Not ready for root rollup');
|
|
767
1198
|
return;
|
|
768
1199
|
}
|
|
769
1200
|
this.enqueueRootRollup(provingState);
|
|
@@ -775,41 +1206,19 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
775
1206
|
* @param txIndex - The index of the transaction being proven
|
|
776
1207
|
*/ enqueueVM(provingState, txIndex) {
|
|
777
1208
|
if (!provingState.verifyState()) {
|
|
778
|
-
logger.debug(`Not running VM circuit as state is no longer valid`);
|
|
1209
|
+
this.logger.debug(`Not running VM circuit as state is no longer valid`);
|
|
779
1210
|
return;
|
|
780
1211
|
}
|
|
781
1212
|
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
1213
|
const doAvmProving = wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getAvmProof', {
|
|
785
1214
|
[Attributes.TX_HASH]: txProvingState.processedTx.hash.toString()
|
|
786
1215
|
}, async (signal)=>{
|
|
787
1216
|
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
|
-
}
|
|
1217
|
+
return await this.prover.getAvmProof(inputs, signal, provingState.epochNumber);
|
|
809
1218
|
});
|
|
810
|
-
this.deferredProving(provingState, doAvmProving, (
|
|
811
|
-
logger.debug(`Proven VM for tx index: ${txIndex}`);
|
|
812
|
-
txProvingState.setAvmProof(
|
|
1219
|
+
this.deferredProving(provingState, doAvmProving, (proof)=>{
|
|
1220
|
+
this.logger.debug(`Proven VM for tx index: ${txIndex}`);
|
|
1221
|
+
txProvingState.setAvmProof(proof);
|
|
813
1222
|
this.checkAndEnqueueBaseRollup(provingState, txIndex);
|
|
814
1223
|
});
|
|
815
1224
|
}
|
|
@@ -819,30 +1228,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
819
1228
|
return;
|
|
820
1229
|
}
|
|
821
1230
|
// 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`);
|
|
1231
|
+
this.logger.debug(`Public functions completed for tx ${txIndex} enqueueing base rollup`);
|
|
823
1232
|
this.enqueueBaseRollup(provingState, txIndex);
|
|
824
1233
|
}
|
|
825
1234
|
}
|
|
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);
|