@aztec/sequencer-client 0.61.0 → 0.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/block_builder/light.d.ts.map +1 -1
- package/dest/block_builder/light.js +3 -5
- package/dest/client/sequencer-client.d.ts +1 -1
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +9 -4
- package/dest/config.d.ts +2 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +14 -10
- package/dest/global_variable_builder/global_builder.d.ts +3 -2
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +4 -3
- package/dest/publisher/l1-publisher.d.ts +6 -4
- package/dest/publisher/l1-publisher.d.ts.map +1 -1
- package/dest/publisher/l1-publisher.js +28 -20
- package/dest/sequencer/metrics.d.ts +3 -2
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +16 -2
- package/dest/sequencer/sequencer.d.ts +23 -38
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +105 -95
- package/dest/sequencer/utils.d.ts +52 -0
- package/dest/sequencer/utils.d.ts.map +1 -0
- package/dest/sequencer/utils.js +70 -0
- package/dest/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/tx_validator/gas_validator.js +5 -5
- package/dest/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/tx_validator/phases_validator.js +4 -4
- package/dest/tx_validator/test_utils.js +9 -7
- package/package.json +19 -19
- package/src/block_builder/light.ts +1 -4
- package/src/client/sequencer-client.ts +10 -2
- package/src/config.ts +24 -10
- package/src/global_variable_builder/global_builder.ts +7 -10
- package/src/publisher/l1-publisher.ts +35 -23
- package/src/sequencer/metrics.ts +18 -2
- package/src/sequencer/sequencer.ts +135 -101
- package/src/sequencer/utils.ts +78 -0
- package/src/tx_validator/gas_validator.ts +4 -4
- package/src/tx_validator/phases_validator.ts +3 -3
- package/src/tx_validator/test_utils.ts +9 -7
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
var _GasTxValidator_instances, _GasTxValidator_log, _GasTxValidator_publicDataSource, _GasTxValidator_feeJuiceAddress, _GasTxValidator_validateTxFee;
|
|
2
2
|
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
import {
|
|
3
|
+
import { TxExecutionPhase } from '@aztec/circuit-types';
|
|
4
4
|
import { FunctionSelector } from '@aztec/circuits.js';
|
|
5
5
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
|
-
import {
|
|
6
|
+
import { computeFeePayerBalanceStorageSlot, getExecutionRequestsByPhase } from '@aztec/simulator';
|
|
7
7
|
export class GasTxValidator {
|
|
8
8
|
constructor(publicDataSource, feeJuiceAddress, enforceFees) {
|
|
9
9
|
_GasTxValidator_instances.add(this);
|
|
@@ -47,13 +47,13 @@ _GasTxValidator_log = new WeakMap(), _GasTxValidator_publicDataSource = new Weak
|
|
|
47
47
|
// Read current balance of the feePayer
|
|
48
48
|
const initialBalance = await __classPrivateFieldGet(this, _GasTxValidator_publicDataSource, "f").storageRead(__classPrivateFieldGet(this, _GasTxValidator_feeJuiceAddress, "f"), computeFeePayerBalanceStorageSlot(feePayer));
|
|
49
49
|
// If there is a claim in this tx that increases the fee payer balance in Fee Juice, add it to balance
|
|
50
|
-
const setupFns =
|
|
50
|
+
const setupFns = getExecutionRequestsByPhase(tx, TxExecutionPhase.SETUP);
|
|
51
51
|
const claimFunctionCall = setupFns.find(fn => fn.callContext.contractAddress.equals(__classPrivateFieldGet(this, _GasTxValidator_feeJuiceAddress, "f")) &&
|
|
52
52
|
fn.callContext.msgSender.equals(__classPrivateFieldGet(this, _GasTxValidator_feeJuiceAddress, "f")) &&
|
|
53
53
|
fn.args.length > 2 &&
|
|
54
54
|
// Public functions get routed through the dispatch function, whose first argument is the target function selector.
|
|
55
55
|
fn.args[0].equals(FunctionSelector.fromSignature('_increase_public_balance((Field),Field)').toField()) &&
|
|
56
|
-
fn.args[1].equals(feePayer) &&
|
|
56
|
+
fn.args[1].equals(feePayer.toField()) &&
|
|
57
57
|
!fn.callContext.isStaticCall);
|
|
58
58
|
const balance = claimFunctionCall ? initialBalance.add(claimFunctionCall.args[2]) : initialBalance;
|
|
59
59
|
if (balance.lt(feeLimit)) {
|
|
@@ -62,4 +62,4 @@ _GasTxValidator_log = new WeakMap(), _GasTxValidator_publicDataSource = new Weak
|
|
|
62
62
|
}
|
|
63
63
|
return true;
|
|
64
64
|
};
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvZ2FzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBVyxnQkFBZ0IsRUFBb0IsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRixPQUFPLEVBQThCLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFPbEcsTUFBTSxPQUFPLGNBQWM7SUFLekIsWUFBWSxnQkFBbUMsRUFBRSxlQUE2QixFQUFTLFdBQW9COztRQUFwQixnQkFBVyxHQUFYLFdBQVcsQ0FBUztRQUozRyw4QkFBTyxpQkFBaUIsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFDO1FBQ2hFLG1EQUFxQztRQUNyQyxrREFBK0I7UUFHN0IsdUJBQUEsSUFBSSxvQ0FBcUIsZ0JBQWdCLE1BQUEsQ0FBQztRQUMxQyx1QkFBQSxJQUFJLG1DQUFvQixlQUFlLE1BQUEsQ0FBQztJQUMxQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFTO1FBQ3pCLE1BQU0sUUFBUSxHQUFTLEVBQUUsQ0FBQztRQUMxQixNQUFNLFVBQVUsR0FBUyxFQUFFLENBQUM7UUFFNUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLE1BQU0sdUJBQUEsSUFBSSxnRUFBZSxNQUFuQixJQUFJLEVBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phases_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/phases_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,
|
|
1
|
+
{"version":3,"file":"phases_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/phases_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,EAAE,EAEF,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAI7D,qBAAa,iBAAkB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAIZ,OAAO,CAAC,cAAc;IAFjE,OAAO,CAAC,kBAAkB,CAA8B;gBAE5C,SAAS,EAAE,kBAAkB,EAAU,cAAc,EAAE,cAAc,EAAE;IAI7E,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAsBnE,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBpC,aAAa,CAAC,UAAU,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CA6CvG"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
var _PhasesTxValidator_log;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import {
|
|
3
|
+
import { Tx, TxExecutionPhase, } from '@aztec/circuit-types';
|
|
4
4
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
-
import { ContractsDataSourcePublicDB,
|
|
5
|
+
import { ContractsDataSourcePublicDB, getExecutionRequestsByPhase } from '@aztec/simulator';
|
|
6
6
|
export class PhasesTxValidator {
|
|
7
7
|
constructor(contracts, setupAllowList) {
|
|
8
8
|
this.setupAllowList = setupAllowList;
|
|
@@ -32,7 +32,7 @@ export class PhasesTxValidator {
|
|
|
32
32
|
__classPrivateFieldGet(this, _PhasesTxValidator_log, "f").debug(`Tx ${Tx.getHash(tx)} does not contain enqueued public functions. Skipping phases validation.`);
|
|
33
33
|
return true;
|
|
34
34
|
}
|
|
35
|
-
const setupFns =
|
|
35
|
+
const setupFns = getExecutionRequestsByPhase(tx, TxExecutionPhase.SETUP);
|
|
36
36
|
for (const setupFn of setupFns) {
|
|
37
37
|
if (!(await this.isOnAllowList(setupFn, this.setupAllowList))) {
|
|
38
38
|
__classPrivateFieldGet(this, _PhasesTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it calls setup function not on allow list: ${setupFn.callContext.contractAddress}:${setupFn.callContext.functionSelector}`);
|
|
@@ -78,4 +78,4 @@ export class PhasesTxValidator {
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
_PhasesTxValidator_log = new WeakMap();
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhhc2VzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvcGhhc2VzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFHTCxFQUFFLEVBQ0YsZ0JBQWdCLEdBRWpCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUYsTUFBTSxPQUFPLGlCQUFpQjtJQUk1QixZQUFZLFNBQTZCLEVBQVUsY0FBZ0M7UUFBaEMsbUJBQWMsR0FBZCxjQUFjLENBQWtCO1FBSG5GLGlDQUFPLGlCQUFpQixDQUFDLHdDQUF3QyxDQUFDLEVBQUM7UUFJakUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksMkJBQTJCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBUztRQUN6QixNQUFNLFFBQVEsR0FBUyxFQUFFLENBQUM7UUFDMUIsTUFBTSxVQUFVLEdBQVMsRUFBRSxDQUFDO1FBRTVCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsd0ZBQXdGO1lBQ3hGLG1HQUFtRztZQUNuRywrREFBK0Q7WUFDL0QsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRWxELElBQUksTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQztZQUVELE1BQU0s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
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { computeVarArgsHash } from '@aztec/circuits.js/hash';
|
|
2
2
|
export function patchNonRevertibleFn(tx, index, overrides) {
|
|
3
|
-
return patchFn('
|
|
3
|
+
return patchFn('nonRevertibleAccumulatedData', tx, index, overrides);
|
|
4
4
|
}
|
|
5
5
|
export function patchRevertibleFn(tx, index, overrides) {
|
|
6
|
-
return patchFn('
|
|
6
|
+
return patchFn('revertibleAccumulatedData', tx, index, overrides);
|
|
7
7
|
}
|
|
8
8
|
function patchFn(where, tx, index, overrides) {
|
|
9
9
|
const fn = tx.enqueuedPublicFunctionCalls.at(-1 * index - 1);
|
|
@@ -12,14 +12,16 @@ function patchFn(where, tx, index, overrides) {
|
|
|
12
12
|
fn.args = overrides.args ?? fn.args;
|
|
13
13
|
fn.callContext.msgSender = overrides.msgSender ?? fn.callContext.msgSender;
|
|
14
14
|
tx.enqueuedPublicFunctionCalls[index] = fn;
|
|
15
|
-
const request = tx.data.forPublic[where].
|
|
16
|
-
request.
|
|
17
|
-
request.
|
|
15
|
+
const request = tx.data.forPublic[where].publicCallRequests[index];
|
|
16
|
+
request.contractAddress = fn.callContext.contractAddress;
|
|
17
|
+
request.msgSender = fn.callContext.msgSender;
|
|
18
|
+
request.functionSelector = fn.callContext.functionSelector;
|
|
19
|
+
request.isStaticCall = fn.callContext.isStaticCall;
|
|
18
20
|
request.argsHash = computeVarArgsHash(fn.args);
|
|
19
|
-
tx.data.forPublic[where].
|
|
21
|
+
tx.data.forPublic[where].publicCallRequests[index] = request;
|
|
20
22
|
return {
|
|
21
23
|
address: fn.callContext.contractAddress,
|
|
22
24
|
selector: fn.callContext.functionSelector,
|
|
23
25
|
};
|
|
24
26
|
}
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvdGVzdF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsT0FBTyxPQUFPLENBQUMsOEJBQThCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixFQUFNLEVBQ04sS0FBYSxFQUNiLFNBQXdHO0lBRXhHLE9BQU8sT0FBTyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUNkLEtBQW1FLEVBQ25FLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFFLENBQUM7SUFDOUQsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQztJQUNyRixFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDckQsRUFBRSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDcEMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMzRSxFQUFFLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTNDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUM7SUFDekQsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUM3QyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMzRCxPQUFPLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO0lBQ25ELE9BQU8sQ0FBQyxRQUFRLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUU5RCxPQUFPO1FBQ0wsT0FBTyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsZUFBZTtRQUN2QyxRQUFRLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0I7S0FDMUMsQ0FBQztBQUNKLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.63.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -24,24 +24,24 @@
|
|
|
24
24
|
"test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@aztec/aztec.js": "0.
|
|
28
|
-
"@aztec/bb-prover": "0.
|
|
29
|
-
"@aztec/circuit-types": "0.
|
|
30
|
-
"@aztec/circuits.js": "0.
|
|
31
|
-
"@aztec/ethereum": "0.
|
|
32
|
-
"@aztec/foundation": "0.
|
|
33
|
-
"@aztec/l1-artifacts": "0.
|
|
34
|
-
"@aztec/merkle-tree": "0.
|
|
35
|
-
"@aztec/noir-contracts.js": "0.
|
|
36
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
37
|
-
"@aztec/p2p": "0.
|
|
38
|
-
"@aztec/protocol-contracts": "0.
|
|
39
|
-
"@aztec/prover-client": "0.
|
|
40
|
-
"@aztec/simulator": "0.
|
|
41
|
-
"@aztec/telemetry-client": "0.
|
|
42
|
-
"@aztec/types": "0.
|
|
43
|
-
"@aztec/validator-client": "0.
|
|
44
|
-
"@aztec/world-state": "0.
|
|
27
|
+
"@aztec/aztec.js": "0.63.0",
|
|
28
|
+
"@aztec/bb-prover": "0.63.0",
|
|
29
|
+
"@aztec/circuit-types": "0.63.0",
|
|
30
|
+
"@aztec/circuits.js": "0.63.0",
|
|
31
|
+
"@aztec/ethereum": "0.63.0",
|
|
32
|
+
"@aztec/foundation": "0.63.0",
|
|
33
|
+
"@aztec/l1-artifacts": "0.63.0",
|
|
34
|
+
"@aztec/merkle-tree": "0.63.0",
|
|
35
|
+
"@aztec/noir-contracts.js": "0.63.0",
|
|
36
|
+
"@aztec/noir-protocol-circuits-types": "0.63.0",
|
|
37
|
+
"@aztec/p2p": "0.63.0",
|
|
38
|
+
"@aztec/protocol-contracts": "0.63.0",
|
|
39
|
+
"@aztec/prover-client": "0.63.0",
|
|
40
|
+
"@aztec/simulator": "0.63.0",
|
|
41
|
+
"@aztec/telemetry-client": "0.63.0",
|
|
42
|
+
"@aztec/types": "0.63.0",
|
|
43
|
+
"@aztec/validator-client": "0.63.0",
|
|
44
|
+
"@aztec/world-state": "0.63.0",
|
|
45
45
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
46
46
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
47
47
|
"lodash.chunk": "^4.2.0",
|
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
type ProcessedTx,
|
|
9
9
|
type TxEffect,
|
|
10
10
|
makeEmptyProcessedTx,
|
|
11
|
-
toTxEffect,
|
|
12
11
|
} from '@aztec/circuit-types';
|
|
13
12
|
import { Fr, type GlobalVariables, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js';
|
|
14
13
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
@@ -68,9 +67,7 @@ export class LightweightBlockBuilder implements BlockBuilder {
|
|
|
68
67
|
|
|
69
68
|
private async buildBlock(): Promise<L2Block> {
|
|
70
69
|
this.logger.verbose(`Finalising block`);
|
|
71
|
-
const nonEmptyTxEffects: TxEffect[] = this.txs
|
|
72
|
-
.map(tx => toTxEffect(tx, this.globalVariables!.gasFees))
|
|
73
|
-
.filter(txEffect => !txEffect.isEmpty());
|
|
70
|
+
const nonEmptyTxEffects: TxEffect[] = this.txs.map(tx => tx.txEffect).filter(txEffect => !txEffect.isEmpty());
|
|
74
71
|
const body = new Body(nonEmptyTxEffects);
|
|
75
72
|
const header = await buildHeaderFromTxEffects(body, this.globalVariables!, this.l1ToL2Messages!, this.db);
|
|
76
73
|
|
|
@@ -40,13 +40,19 @@ export class SequencerClient {
|
|
|
40
40
|
contractDataSource: ContractDataSource,
|
|
41
41
|
l2BlockSource: L2BlockSource,
|
|
42
42
|
l1ToL2MessageSource: L1ToL2MessageSource,
|
|
43
|
-
|
|
43
|
+
_simulationProvider: SimulationProvider,
|
|
44
44
|
telemetryClient: TelemetryClient,
|
|
45
45
|
) {
|
|
46
46
|
const publisher = new L1Publisher(config, telemetryClient);
|
|
47
47
|
const globalsBuilder = new GlobalVariableBuilder(config);
|
|
48
48
|
|
|
49
|
-
const publicProcessorFactory = new PublicProcessorFactory(contractDataSource,
|
|
49
|
+
const publicProcessorFactory = new PublicProcessorFactory(contractDataSource, telemetryClient);
|
|
50
|
+
|
|
51
|
+
const rollup = publisher.getRollupContract();
|
|
52
|
+
const [l1GenesisTime, slotDuration] = await Promise.all([
|
|
53
|
+
rollup.read.GENESIS_TIME(),
|
|
54
|
+
rollup.read.SLOT_DURATION(),
|
|
55
|
+
] as const);
|
|
50
56
|
|
|
51
57
|
const sequencer = new Sequencer(
|
|
52
58
|
publisher,
|
|
@@ -59,6 +65,8 @@ export class SequencerClient {
|
|
|
59
65
|
l1ToL2MessageSource,
|
|
60
66
|
publicProcessorFactory,
|
|
61
67
|
new TxValidatorFactory(worldStateSynchronizer.getCommitted(), contractDataSource, !!config.enforceFees),
|
|
68
|
+
Number(l1GenesisTime),
|
|
69
|
+
Number(slotDuration),
|
|
62
70
|
telemetryClient,
|
|
63
71
|
config,
|
|
64
72
|
);
|
package/src/config.ts
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { type AllowedElement } from '@aztec/circuit-types';
|
|
2
2
|
import { AztecAddress, Fr, FunctionSelector, getContractClassFromArtifact } from '@aztec/circuits.js';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
type L1ContractsConfig,
|
|
5
|
+
type L1ReaderConfig,
|
|
6
|
+
l1ContractsConfigMappings,
|
|
7
|
+
l1ReaderConfigMappings,
|
|
8
|
+
} from '@aztec/ethereum';
|
|
4
9
|
import {
|
|
5
10
|
type ConfigMappingsType,
|
|
6
11
|
booleanConfigHelper,
|
|
7
12
|
getConfigFromMappings,
|
|
8
13
|
numberConfigHelper,
|
|
9
14
|
} from '@aztec/foundation/config';
|
|
15
|
+
import { pickConfigMappings } from '@aztec/foundation/config';
|
|
10
16
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
11
17
|
import { FPCContract } from '@aztec/noir-contracts.js/FPC';
|
|
12
18
|
import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
|
|
@@ -31,7 +37,12 @@ type ChainConfig = {
|
|
|
31
37
|
/**
|
|
32
38
|
* Configuration settings for the SequencerClient.
|
|
33
39
|
*/
|
|
34
|
-
export type SequencerClientConfig = PublisherConfig &
|
|
40
|
+
export type SequencerClientConfig = PublisherConfig &
|
|
41
|
+
TxSenderConfig &
|
|
42
|
+
SequencerConfig &
|
|
43
|
+
L1ReaderConfig &
|
|
44
|
+
ChainConfig &
|
|
45
|
+
Pick<L1ContractsConfig, 'ethereumSlotDuration'>;
|
|
35
46
|
|
|
36
47
|
export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
37
48
|
transactionPollingIntervalMS: {
|
|
@@ -91,7 +102,7 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
91
102
|
parseEnv: (val: string) => parseSequencerAllowList(val),
|
|
92
103
|
defaultValue: getDefaultAllowedTeardownFunctions(),
|
|
93
104
|
description: 'The list of functions calls allowed to run teardown',
|
|
94
|
-
printDefault: () => 'FPC.pay_refund
|
|
105
|
+
printDefault: () => 'FPC.pay_refund',
|
|
95
106
|
},
|
|
96
107
|
maxBlockSizeInBytes: {
|
|
97
108
|
env: 'SEQ_MAX_BLOCK_SIZE_IN_BYTES',
|
|
@@ -103,9 +114,15 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
103
114
|
description: 'Whether to require every tx to have a fee payer',
|
|
104
115
|
...booleanConfigHelper(),
|
|
105
116
|
},
|
|
106
|
-
|
|
107
|
-
env: '
|
|
108
|
-
description: '
|
|
117
|
+
enforceTimeTable: {
|
|
118
|
+
env: 'SEQ_ENFORCE_TIME_TABLE',
|
|
119
|
+
description: 'Whether to enforce the time table when building blocks',
|
|
120
|
+
...booleanConfigHelper(),
|
|
121
|
+
defaultValue: false,
|
|
122
|
+
},
|
|
123
|
+
governanceProposerPayload: {
|
|
124
|
+
env: 'GOVERNANCE_PROPOSER_PAYLOAD_ADDRESS',
|
|
125
|
+
description: 'The address of the payload for the governanceProposer',
|
|
109
126
|
parseEnv: (val: string) => EthAddress.fromString(val),
|
|
110
127
|
defaultValue: EthAddress.ZERO,
|
|
111
128
|
},
|
|
@@ -126,6 +143,7 @@ export const sequencerClientConfigMappings: ConfigMappingsType<SequencerClientCo
|
|
|
126
143
|
...getTxSenderConfigMappings('SEQ'),
|
|
127
144
|
...getPublisherConfigMappings('SEQ'),
|
|
128
145
|
...chainConfigMappings,
|
|
146
|
+
...pickConfigMappings(l1ContractsConfigMappings, ['ethereumSlotDuration']),
|
|
129
147
|
};
|
|
130
148
|
|
|
131
149
|
/**
|
|
@@ -217,9 +235,5 @@ function getDefaultAllowedTeardownFunctions(): AllowedElement[] {
|
|
|
217
235
|
classId: getContractClassFromArtifact(FPCContract.artifact).id,
|
|
218
236
|
selector: FunctionSelector.fromSignature('pay_refund((Field),Field,(Field))'),
|
|
219
237
|
},
|
|
220
|
-
{
|
|
221
|
-
classId: getContractClassFromArtifact(FPCContract.artifact).id,
|
|
222
|
-
selector: FunctionSelector.fromSignature('pay_refund_with_shielded_rebate(Field,(Field),Field)'),
|
|
223
|
-
},
|
|
224
238
|
];
|
|
225
239
|
}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { type GlobalVariableBuilder as GlobalVariableBuilderInterface } from '@aztec/circuit-types';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
ETHEREUM_SLOT_DURATION,
|
|
5
|
-
type EthAddress,
|
|
6
|
-
GasFees,
|
|
7
|
-
GlobalVariables,
|
|
8
|
-
} from '@aztec/circuits.js';
|
|
9
|
-
import { type L1ReaderConfig, createEthereumChain } from '@aztec/ethereum';
|
|
2
|
+
import { type AztecAddress, type EthAddress, GasFees, GlobalVariables } from '@aztec/circuits.js';
|
|
3
|
+
import { type L1ContractsConfig, type L1ReaderConfig, createEthereumChain } from '@aztec/ethereum';
|
|
10
4
|
import { Fr } from '@aztec/foundation/fields';
|
|
11
5
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
12
6
|
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
@@ -30,12 +24,15 @@ export class GlobalVariableBuilder implements GlobalVariableBuilderInterface {
|
|
|
30
24
|
|
|
31
25
|
private rollupContract: GetContractReturnType<typeof RollupAbi, PublicClient<HttpTransport, chains.Chain>>;
|
|
32
26
|
private publicClient: PublicClient<HttpTransport, chains.Chain>;
|
|
27
|
+
private ethereumSlotDuration: number;
|
|
33
28
|
|
|
34
|
-
constructor(config: L1ReaderConfig) {
|
|
29
|
+
constructor(config: L1ReaderConfig & Pick<L1ContractsConfig, 'ethereumSlotDuration'>) {
|
|
35
30
|
const { l1RpcUrl, l1ChainId: chainId, l1Contracts } = config;
|
|
36
31
|
|
|
37
32
|
const chain = createEthereumChain(l1RpcUrl, chainId);
|
|
38
33
|
|
|
34
|
+
this.ethereumSlotDuration = config.ethereumSlotDuration;
|
|
35
|
+
|
|
39
36
|
this.publicClient = createPublicClient({
|
|
40
37
|
chain: chain.chainInfo,
|
|
41
38
|
transport: http(chain.rpcUrl),
|
|
@@ -67,7 +64,7 @@ export class GlobalVariableBuilder implements GlobalVariableBuilderInterface {
|
|
|
67
64
|
const chainId = new Fr(this.publicClient.chain.id);
|
|
68
65
|
|
|
69
66
|
if (slotNumber === undefined) {
|
|
70
|
-
const ts = BigInt((await this.publicClient.getBlock()).timestamp + BigInt(
|
|
67
|
+
const ts = BigInt((await this.publicClient.getBlock()).timestamp + BigInt(this.ethereumSlotDuration));
|
|
71
68
|
slotNumber = await this.rollupContract.read.getSlotAt([ts]);
|
|
72
69
|
}
|
|
73
70
|
|
|
@@ -3,21 +3,21 @@ import {
|
|
|
3
3
|
type EpochProofClaim,
|
|
4
4
|
type EpochProofQuote,
|
|
5
5
|
type L2Block,
|
|
6
|
+
SignatureDomainSeperator,
|
|
6
7
|
type TxHash,
|
|
7
8
|
getHashedSignaturePayload,
|
|
8
9
|
} from '@aztec/circuit-types';
|
|
9
10
|
import { type L1PublishBlockStats, type L1PublishProofStats } from '@aztec/circuit-types/stats';
|
|
10
11
|
import {
|
|
11
12
|
AGGREGATION_OBJECT_LENGTH,
|
|
12
|
-
|
|
13
|
-
ETHEREUM_SLOT_DURATION,
|
|
13
|
+
AZTEC_MAX_EPOCH_DURATION,
|
|
14
14
|
EthAddress,
|
|
15
15
|
type FeeRecipient,
|
|
16
16
|
type Header,
|
|
17
17
|
type Proof,
|
|
18
18
|
type RootRollupPublicInputs,
|
|
19
19
|
} from '@aztec/circuits.js';
|
|
20
|
-
import { createEthereumChain } from '@aztec/ethereum';
|
|
20
|
+
import { type L1ContractsConfig, createEthereumChain } from '@aztec/ethereum';
|
|
21
21
|
import { makeTuple } from '@aztec/foundation/array';
|
|
22
22
|
import { areArraysEqual, compactArray, times } from '@aztec/foundation/collection';
|
|
23
23
|
import { type Signature } from '@aztec/foundation/eth-signature';
|
|
@@ -26,7 +26,7 @@ import { createDebugLogger } from '@aztec/foundation/log';
|
|
|
26
26
|
import { type Tuple, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
27
27
|
import { InterruptibleSleep } from '@aztec/foundation/sleep';
|
|
28
28
|
import { Timer } from '@aztec/foundation/timer';
|
|
29
|
-
import {
|
|
29
|
+
import { GovernanceProposerAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
30
30
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
31
31
|
|
|
32
32
|
import pick from 'lodash.pick';
|
|
@@ -122,7 +122,7 @@ export type L1SubmitEpochProofArgs = {
|
|
|
122
122
|
endTimestamp: Fr;
|
|
123
123
|
outHash: Fr;
|
|
124
124
|
proverId: Fr;
|
|
125
|
-
fees: Tuple<FeeRecipient, typeof
|
|
125
|
+
fees: Tuple<FeeRecipient, typeof AZTEC_MAX_EPOCH_DURATION>;
|
|
126
126
|
proof: Proof;
|
|
127
127
|
};
|
|
128
128
|
|
|
@@ -149,20 +149,25 @@ export class L1Publisher {
|
|
|
149
149
|
typeof RollupAbi,
|
|
150
150
|
WalletClient<HttpTransport, chains.Chain, PrivateKeyAccount>
|
|
151
151
|
>;
|
|
152
|
-
private
|
|
153
|
-
typeof
|
|
152
|
+
private governanceProposerContract?: GetContractReturnType<
|
|
153
|
+
typeof GovernanceProposerAbi,
|
|
154
154
|
WalletClient<HttpTransport, chains.Chain, PrivateKeyAccount>
|
|
155
155
|
> = undefined;
|
|
156
156
|
|
|
157
157
|
private publicClient: PublicClient<HttpTransport, chains.Chain>;
|
|
158
158
|
private walletClient: WalletClient<HttpTransport, chains.Chain, PrivateKeyAccount>;
|
|
159
159
|
private account: PrivateKeyAccount;
|
|
160
|
+
private ethereumSlotDuration: bigint;
|
|
160
161
|
|
|
161
162
|
public static PROPOSE_GAS_GUESS: bigint = 12_000_000n;
|
|
162
163
|
public static PROPOSE_AND_CLAIM_GAS_GUESS: bigint = this.PROPOSE_GAS_GUESS + 100_000n;
|
|
163
164
|
|
|
164
|
-
constructor(
|
|
165
|
+
constructor(
|
|
166
|
+
config: TxSenderConfig & PublisherConfig & Pick<L1ContractsConfig, 'ethereumSlotDuration'>,
|
|
167
|
+
client: TelemetryClient,
|
|
168
|
+
) {
|
|
165
169
|
this.sleepTimeMs = config?.l1PublishRetryIntervalMS ?? 60_000;
|
|
170
|
+
this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
|
|
166
171
|
this.metrics = new L1PublisherMetrics(client, 'L1Publisher');
|
|
167
172
|
|
|
168
173
|
const { l1RpcUrl: rpcUrl, l1ChainId: chainId, publisherPrivateKey, l1Contracts } = config;
|
|
@@ -188,10 +193,10 @@ export class L1Publisher {
|
|
|
188
193
|
client: this.walletClient,
|
|
189
194
|
});
|
|
190
195
|
|
|
191
|
-
if (l1Contracts.
|
|
192
|
-
this.
|
|
193
|
-
address: getAddress(l1Contracts.
|
|
194
|
-
abi:
|
|
196
|
+
if (l1Contracts.governanceProposerAddress) {
|
|
197
|
+
this.governanceProposerContract = getContract({
|
|
198
|
+
address: getAddress(l1Contracts.governanceProposerAddress.toString()),
|
|
199
|
+
abi: GovernanceProposerAbi,
|
|
195
200
|
client: this.walletClient,
|
|
196
201
|
});
|
|
197
202
|
}
|
|
@@ -239,8 +244,11 @@ export class L1Publisher {
|
|
|
239
244
|
// FIXME: This should not throw if unable to propose but return a falsey value, so
|
|
240
245
|
// we can differentiate between errors when hitting the L1 rollup contract (eg RPC error)
|
|
241
246
|
// which may require a retry, vs actually not being the turn for proposing.
|
|
242
|
-
const
|
|
243
|
-
const [slot, blockNumber] = await this.rollupContract.read.canProposeAtTime([
|
|
247
|
+
const timeOfNextL1Slot = BigInt((await this.publicClient.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
248
|
+
const [slot, blockNumber] = await this.rollupContract.read.canProposeAtTime([
|
|
249
|
+
timeOfNextL1Slot,
|
|
250
|
+
`0x${archive.toString('hex')}`,
|
|
251
|
+
]);
|
|
244
252
|
return [slot, blockNumber];
|
|
245
253
|
}
|
|
246
254
|
|
|
@@ -302,9 +310,10 @@ export class L1Publisher {
|
|
|
302
310
|
}
|
|
303
311
|
|
|
304
312
|
public async validateProofQuote(quote: EpochProofQuote): Promise<EpochProofQuote | undefined> {
|
|
305
|
-
const
|
|
313
|
+
const timeOfNextL1Slot = BigInt((await this.publicClient.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
314
|
+
const args = [timeOfNextL1Slot, quote.toViemArgs()] as const;
|
|
306
315
|
try {
|
|
307
|
-
await this.rollupContract.read.
|
|
316
|
+
await this.rollupContract.read.validateEpochProofRightClaimAtTime(args, { account: this.account });
|
|
308
317
|
} catch (err) {
|
|
309
318
|
const errorName = tryGetCustomErrorName(err);
|
|
310
319
|
this.log.warn(`Proof quote validation failed: ${errorName}`);
|
|
@@ -329,7 +338,7 @@ export class L1Publisher {
|
|
|
329
338
|
signatures: [],
|
|
330
339
|
},
|
|
331
340
|
): Promise<void> {
|
|
332
|
-
const ts = BigInt((await this.publicClient.getBlock()).timestamp +
|
|
341
|
+
const ts = BigInt((await this.publicClient.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
333
342
|
|
|
334
343
|
const formattedSignatures = attestationData.signatures.map(attest => attest.toViemSignature());
|
|
335
344
|
const flags = { ignoreDA: true, ignoreSignatures: formattedSignatures.length == 0 };
|
|
@@ -381,7 +390,7 @@ export class L1Publisher {
|
|
|
381
390
|
return false;
|
|
382
391
|
}
|
|
383
392
|
|
|
384
|
-
if (!this.
|
|
393
|
+
if (!this.governanceProposerContract) {
|
|
385
394
|
return false;
|
|
386
395
|
}
|
|
387
396
|
|
|
@@ -394,14 +403,17 @@ export class L1Publisher {
|
|
|
394
403
|
|
|
395
404
|
const [proposer, roundNumber] = await Promise.all([
|
|
396
405
|
this.rollupContract.read.getProposerAt([timestamp]),
|
|
397
|
-
this.
|
|
406
|
+
this.governanceProposerContract.read.computeRound([slotNumber]),
|
|
398
407
|
]);
|
|
399
408
|
|
|
400
409
|
if (proposer != this.account.address) {
|
|
401
410
|
return false;
|
|
402
411
|
}
|
|
403
412
|
|
|
404
|
-
const [slotForLastVote] = await this.
|
|
413
|
+
const [slotForLastVote] = await this.governanceProposerContract.read.rounds([
|
|
414
|
+
this.rollupContract.address,
|
|
415
|
+
roundNumber,
|
|
416
|
+
]);
|
|
405
417
|
|
|
406
418
|
if (slotForLastVote >= slotNumber) {
|
|
407
419
|
return false;
|
|
@@ -414,7 +426,7 @@ export class L1Publisher {
|
|
|
414
426
|
|
|
415
427
|
let txHash;
|
|
416
428
|
try {
|
|
417
|
-
txHash = await this.
|
|
429
|
+
txHash = await this.governanceProposerContract.write.vote([this.payload.toString()], {
|
|
418
430
|
account: this.account,
|
|
419
431
|
});
|
|
420
432
|
} catch (err) {
|
|
@@ -457,7 +469,7 @@ export class L1Publisher {
|
|
|
457
469
|
|
|
458
470
|
const consensusPayload = new ConsensusPayload(block.header, block.archive.root, txHashes ?? []);
|
|
459
471
|
|
|
460
|
-
const digest = getHashedSignaturePayload(consensusPayload);
|
|
472
|
+
const digest = getHashedSignaturePayload(consensusPayload, SignatureDomainSeperator.blockAttestation);
|
|
461
473
|
const proposeTxArgs = {
|
|
462
474
|
header: block.header.toBuffer(),
|
|
463
475
|
archive: block.archive.root.toBuffer(),
|
|
@@ -748,7 +760,7 @@ export class L1Publisher {
|
|
|
748
760
|
args.publicInputs.outHash.toString(),
|
|
749
761
|
args.publicInputs.proverId.toString(),
|
|
750
762
|
],
|
|
751
|
-
makeTuple(
|
|
763
|
+
makeTuple(AZTEC_MAX_EPOCH_DURATION * 2, i =>
|
|
752
764
|
i % 2 === 0
|
|
753
765
|
? args.publicInputs.fees[i / 2].recipient.toField().toString()
|
|
754
766
|
: args.publicInputs.fees[(i - 1) / 2].value.toString(),
|
package/src/sequencer/metrics.ts
CHANGED
|
@@ -10,13 +10,14 @@ import {
|
|
|
10
10
|
millisecondBuckets,
|
|
11
11
|
} from '@aztec/telemetry-client';
|
|
12
12
|
|
|
13
|
-
type SequencerStateCallback
|
|
13
|
+
import { type SequencerState, type SequencerStateCallback, sequencerStateToNumber } from './utils.js';
|
|
14
14
|
|
|
15
15
|
export class SequencerMetrics {
|
|
16
16
|
public readonly tracer: Tracer;
|
|
17
17
|
|
|
18
18
|
private blockCounter: UpDownCounter;
|
|
19
19
|
private blockBuildDuration: Histogram;
|
|
20
|
+
private stateTransitionBufferDuration: Histogram;
|
|
20
21
|
private currentBlockNumber: Gauge;
|
|
21
22
|
private currentBlockSize: Gauge;
|
|
22
23
|
|
|
@@ -33,13 +34,22 @@ export class SequencerMetrics {
|
|
|
33
34
|
explicitBucketBoundaries: millisecondBuckets(2),
|
|
34
35
|
},
|
|
35
36
|
});
|
|
37
|
+
this.stateTransitionBufferDuration = meter.createHistogram(Metrics.SEQUENCER_STATE_TRANSITION_BUFFER_DURATION, {
|
|
38
|
+
unit: 'ms',
|
|
39
|
+
description:
|
|
40
|
+
'The time difference between when the sequencer needed to transition to a new state and when it actually did.',
|
|
41
|
+
valueType: ValueType.INT,
|
|
42
|
+
advice: {
|
|
43
|
+
explicitBucketBoundaries: millisecondBuckets(2),
|
|
44
|
+
},
|
|
45
|
+
});
|
|
36
46
|
|
|
37
47
|
const currentState = meter.createObservableGauge(Metrics.SEQUENCER_CURRENT_STATE, {
|
|
38
48
|
description: 'Current state of the sequencer',
|
|
39
49
|
});
|
|
40
50
|
|
|
41
51
|
currentState.addCallback(observer => {
|
|
42
|
-
observer.observe(getState());
|
|
52
|
+
observer.observe(sequencerStateToNumber(getState()));
|
|
43
53
|
});
|
|
44
54
|
|
|
45
55
|
this.currentBlockNumber = meter.createGauge(Metrics.SEQUENCER_CURRENT_BLOCK_NUMBER, {
|
|
@@ -79,6 +89,12 @@ export class SequencerMetrics {
|
|
|
79
89
|
this.setCurrentBlock(blockNumber, txCount);
|
|
80
90
|
}
|
|
81
91
|
|
|
92
|
+
recordStateTransitionBufferMs(durationMs: number, state: SequencerState) {
|
|
93
|
+
this.stateTransitionBufferDuration.record(durationMs, {
|
|
94
|
+
[Attributes.SEQUENCER_STATE]: state,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
82
98
|
private setCurrentBlock(blockNumber: number, txCount: number) {
|
|
83
99
|
this.currentBlockNumber.record(blockNumber);
|
|
84
100
|
this.currentBlockSize.record(txCount);
|