@aztec/sequencer-client 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2
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/client/index.js +0 -1
- package/dest/client/sequencer-client.js +52 -57
- package/dest/config.js +40 -42
- package/dest/global_variable_builder/global_builder.js +39 -26
- package/dest/global_variable_builder/index.js +0 -1
- package/dest/index.js +0 -1
- package/dest/publisher/config.js +49 -50
- package/dest/publisher/index.js +0 -1
- package/dest/publisher/sequencer-publisher-metrics.js +32 -23
- package/dest/publisher/sequencer-publisher.js +216 -191
- package/dest/sequencer/allowed.js +5 -12
- package/dest/sequencer/config.js +1 -2
- package/dest/sequencer/index.js +0 -1
- package/dest/sequencer/metrics.js +26 -18
- package/dest/sequencer/sequencer.js +648 -607
- package/dest/sequencer/timetable.js +33 -19
- package/dest/sequencer/utils.js +22 -32
- package/dest/slasher/factory.js +5 -4
- package/dest/slasher/index.js +0 -1
- package/dest/slasher/slasher_client.js +107 -110
- package/dest/test/index.js +4 -1
- package/dest/tx_validator/archive_cache.js +7 -7
- package/dest/tx_validator/gas_validator.js +76 -64
- package/dest/tx_validator/nullifier_cache.js +8 -8
- package/dest/tx_validator/phases_validator.js +27 -19
- package/dest/tx_validator/test_utils.js +1 -2
- package/dest/tx_validator/tx_validator_factory.js +5 -5
- package/package.json +23 -22
- package/src/config.ts +1 -1
- package/src/publisher/sequencer-publisher.ts +1 -1
- package/src/sequencer/sequencer.ts +29 -13
- package/dest/client/index.d.ts +0 -2
- package/dest/client/index.d.ts.map +0 -1
- package/dest/client/sequencer-client.d.ts +0 -68
- package/dest/client/sequencer-client.d.ts.map +0 -1
- package/dest/config.d.ts +0 -37
- package/dest/config.d.ts.map +0 -1
- package/dest/global_variable_builder/global_builder.d.ts +0 -29
- package/dest/global_variable_builder/global_builder.d.ts.map +0 -1
- package/dest/global_variable_builder/index.d.ts +0 -2
- package/dest/global_variable_builder/index.d.ts.map +0 -1
- package/dest/index.d.ts +0 -8
- package/dest/index.d.ts.map +0 -1
- package/dest/publisher/config.d.ts +0 -38
- package/dest/publisher/config.d.ts.map +0 -1
- package/dest/publisher/index.d.ts +0 -2
- package/dest/publisher/index.d.ts.map +0 -1
- package/dest/publisher/sequencer-publisher-metrics.d.ts +0 -24
- package/dest/publisher/sequencer-publisher-metrics.d.ts.map +0 -1
- package/dest/publisher/sequencer-publisher.d.ts +0 -163
- package/dest/publisher/sequencer-publisher.d.ts.map +0 -1
- package/dest/sequencer/allowed.d.ts +0 -3
- package/dest/sequencer/allowed.d.ts.map +0 -1
- package/dest/sequencer/config.d.ts +0 -2
- package/dest/sequencer/config.d.ts.map +0 -1
- package/dest/sequencer/index.d.ts +0 -4
- package/dest/sequencer/index.d.ts.map +0 -1
- package/dest/sequencer/metrics.d.ts +0 -24
- package/dest/sequencer/metrics.d.ts.map +0 -1
- package/dest/sequencer/sequencer.d.ts +0 -172
- package/dest/sequencer/sequencer.d.ts.map +0 -1
- package/dest/sequencer/timetable.d.ts +0 -38
- package/dest/sequencer/timetable.d.ts.map +0 -1
- package/dest/sequencer/utils.d.ts +0 -47
- package/dest/sequencer/utils.d.ts.map +0 -1
- package/dest/slasher/factory.d.ts +0 -11
- package/dest/slasher/factory.d.ts.map +0 -1
- package/dest/slasher/index.d.ts +0 -3
- package/dest/slasher/index.d.ts.map +0 -1
- package/dest/slasher/slasher_client.d.ts +0 -127
- package/dest/slasher/slasher_client.d.ts.map +0 -1
- package/dest/test/index.d.ts +0 -17
- package/dest/test/index.d.ts.map +0 -1
- package/dest/tx_validator/archive_cache.d.ts +0 -14
- package/dest/tx_validator/archive_cache.d.ts.map +0 -1
- package/dest/tx_validator/gas_validator.d.ts +0 -12
- package/dest/tx_validator/gas_validator.d.ts.map +0 -1
- package/dest/tx_validator/nullifier_cache.d.ts +0 -16
- package/dest/tx_validator/nullifier_cache.d.ts.map +0 -1
- package/dest/tx_validator/phases_validator.d.ts +0 -11
- package/dest/tx_validator/phases_validator.d.ts.map +0 -1
- package/dest/tx_validator/test_utils.d.ts +0 -21
- package/dest/tx_validator/test_utils.d.ts.map +0 -1
- package/dest/tx_validator/tx_validator_factory.d.ts +0 -16
- package/dest/tx_validator/tx_validator_factory.d.ts.map +0 -1
|
@@ -2,21 +2,21 @@ import { MerkleTreeId } from '@aztec/circuit-types';
|
|
|
2
2
|
/**
|
|
3
3
|
* Implements an archive source by checking a DB and an in-memory collection.
|
|
4
4
|
* Intended for validating transactions as they are added to a block.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
*/ export class ArchiveCache {
|
|
6
|
+
db;
|
|
7
|
+
archives;
|
|
8
|
+
constructor(db){
|
|
8
9
|
this.db = db;
|
|
9
10
|
this.archives = new Map();
|
|
10
11
|
}
|
|
11
12
|
async getArchiveIndices(archives) {
|
|
12
|
-
const toCheckDb = archives.filter(n
|
|
13
|
+
const toCheckDb = archives.filter((n)=>!this.archives.has(n.toString()));
|
|
13
14
|
const dbHits = await this.db.findLeafIndices(MerkleTreeId.ARCHIVE, toCheckDb);
|
|
14
|
-
dbHits.forEach((x, index)
|
|
15
|
+
dbHits.forEach((x, index)=>{
|
|
15
16
|
if (x !== undefined) {
|
|
16
17
|
this.archives.set(toCheckDb[index].toString(), x);
|
|
17
18
|
}
|
|
18
19
|
});
|
|
19
|
-
return archives.map(n
|
|
20
|
+
return archives.map((n)=>this.archives.get(n.toString()));
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZV9jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvYXJjaGl2ZV9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFpQyxNQUFNLHNCQUFzQixDQUFDO0FBSW5GOzs7R0FHRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBR3ZCLFlBQW9CLEVBQTRCO1FBQTVCLE9BQUUsR0FBRixFQUFFLENBQTBCO1FBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDNUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFjO1FBQzNDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDRiJ9
|
|
@@ -1,78 +1,90 @@
|
|
|
1
|
-
var _GasTxValidator_instances, _GasTxValidator_log, _GasTxValidator_publicDataSource, _GasTxValidator_feeJuiceAddress, _GasTxValidator_enforceFees, _GasTxValidator_gasFees, _GasTxValidator_shouldSkip, _GasTxValidator_validateTxFee;
|
|
2
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
1
|
import { TxExecutionPhase } from '@aztec/circuit-types';
|
|
4
2
|
import { Fr, FunctionSelector } from '@aztec/circuits.js';
|
|
5
3
|
import { U128 } from '@aztec/foundation/abi';
|
|
6
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
7
5
|
import { computeFeePayerBalanceStorageSlot, getExecutionRequestsByPhase } from '@aztec/simulator/server';
|
|
8
6
|
export class GasTxValidator {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
__classPrivateFieldSet(this, _GasTxValidator_gasFees, gasFees, "f");
|
|
7
|
+
#log = createLogger('sequencer:tx_validator:tx_gas');
|
|
8
|
+
#publicDataSource;
|
|
9
|
+
#feeJuiceAddress;
|
|
10
|
+
#enforceFees;
|
|
11
|
+
#gasFees;
|
|
12
|
+
constructor(publicDataSource, feeJuiceAddress, enforceFees, gasFees){
|
|
13
|
+
this.#publicDataSource = publicDataSource;
|
|
14
|
+
this.#feeJuiceAddress = feeJuiceAddress;
|
|
15
|
+
this.#enforceFees = enforceFees;
|
|
16
|
+
this.#gasFees = gasFees;
|
|
20
17
|
}
|
|
21
18
|
validateTx(tx) {
|
|
22
|
-
if (
|
|
23
|
-
return Promise.resolve({
|
|
19
|
+
if (this.#shouldSkip(tx)) {
|
|
20
|
+
return Promise.resolve({
|
|
21
|
+
result: 'skipped',
|
|
22
|
+
reason: [
|
|
23
|
+
'Insufficient fee per gas'
|
|
24
|
+
]
|
|
25
|
+
});
|
|
24
26
|
}
|
|
25
|
-
return
|
|
27
|
+
return this.#validateTxFee(tx);
|
|
26
28
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Check whether the tx's max fees are valid for the current block, and skip if not.
|
|
31
|
+
* We skip instead of invalidating since the tx may become elligible later.
|
|
32
|
+
* Note that circuits check max fees even if fee payer is unset, so we
|
|
33
|
+
* keep this validation even if the tx does not pay fees.
|
|
34
|
+
*/ #shouldSkip(tx) {
|
|
35
|
+
const gasSettings = tx.data.constants.txContext.gasSettings;
|
|
36
|
+
// Skip the tx if its max fees are not enough for the current block's gas fees.
|
|
37
|
+
const maxFeesPerGas = gasSettings.maxFeesPerGas;
|
|
38
|
+
const notEnoughMaxFees = maxFeesPerGas.feePerDaGas.lt(this.#gasFees.feePerDaGas) || maxFeesPerGas.feePerL2Gas.lt(this.#gasFees.feePerL2Gas);
|
|
39
|
+
if (notEnoughMaxFees) {
|
|
40
|
+
this.#log.warn(`Skipping transaction ${tx.getTxHash()} due to insufficient fee per gas`);
|
|
41
|
+
}
|
|
42
|
+
return notEnoughMaxFees;
|
|
36
43
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
async #validateTxFee(tx) {
|
|
45
|
+
const feePayer = tx.data.feePayer;
|
|
46
|
+
// TODO(@spalladino) Eventually remove the is_zero condition as we should always charge fees to every tx
|
|
47
|
+
if (feePayer.isZero()) {
|
|
48
|
+
if (this.#enforceFees) {
|
|
49
|
+
this.#log.warn(`Rejecting transaction ${tx.getTxHash()} due to missing fee payer`);
|
|
50
|
+
return {
|
|
51
|
+
result: 'invalid',
|
|
52
|
+
reason: [
|
|
53
|
+
'Missing fee payer'
|
|
54
|
+
]
|
|
55
|
+
};
|
|
56
|
+
} else {
|
|
57
|
+
return {
|
|
58
|
+
result: 'valid'
|
|
59
|
+
};
|
|
60
|
+
}
|
|
45
61
|
}
|
|
46
|
-
|
|
47
|
-
|
|
62
|
+
// Compute the maximum fee that this tx may pay, based on its gasLimits and maxFeePerGas
|
|
63
|
+
const feeLimit = tx.data.constants.txContext.gasSettings.getFeeLimit();
|
|
64
|
+
// Read current balance of the feePayer
|
|
65
|
+
const initialBalance = await this.#publicDataSource.storageRead(this.#feeJuiceAddress, await computeFeePayerBalanceStorageSlot(feePayer));
|
|
66
|
+
// If there is a claim in this tx that increases the fee payer balance in Fee Juice, add it to balance
|
|
67
|
+
const setupFns = getExecutionRequestsByPhase(tx, TxExecutionPhase.SETUP);
|
|
68
|
+
const increasePublicBalanceSelector = await FunctionSelector.fromSignature('_increase_public_balance((Field),(Field,Field))');
|
|
69
|
+
const claimFunctionCall = setupFns.find((fn)=>fn.callContext.contractAddress.equals(this.#feeJuiceAddress) && fn.callContext.msgSender.equals(this.#feeJuiceAddress) && fn.args.length > 2 && // Public functions get routed through the dispatch function, whose first argument is the target function selector.
|
|
70
|
+
fn.args[0].equals(increasePublicBalanceSelector.toField()) && fn.args[1].equals(feePayer.toField()) && !fn.callContext.isStaticCall);
|
|
71
|
+
// `amount` in the claim function call arguments occupies 2 fields as it is represented as U128.
|
|
72
|
+
const balance = claimFunctionCall ? initialBalance.add(new Fr(U128.fromFields(claimFunctionCall.args.slice(2, 4)).toInteger())) : initialBalance;
|
|
73
|
+
if (balance.lt(feeLimit)) {
|
|
74
|
+
this.#log.warn(`Rejecting transaction due to not enough fee payer balance`, {
|
|
75
|
+
feePayer,
|
|
76
|
+
balance: balance.toBigInt(),
|
|
77
|
+
feeLimit: feeLimit.toBigInt()
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
result: 'invalid',
|
|
81
|
+
reason: [
|
|
82
|
+
'Insufficient fee payer balance'
|
|
83
|
+
]
|
|
84
|
+
};
|
|
48
85
|
}
|
|
86
|
+
return {
|
|
87
|
+
result: 'valid'
|
|
88
|
+
};
|
|
49
89
|
}
|
|
50
|
-
|
|
51
|
-
const feeLimit = tx.data.constants.txContext.gasSettings.getFeeLimit();
|
|
52
|
-
// Read current balance of the feePayer
|
|
53
|
-
const initialBalance = await __classPrivateFieldGet(this, _GasTxValidator_publicDataSource, "f").storageRead(__classPrivateFieldGet(this, _GasTxValidator_feeJuiceAddress, "f"), await computeFeePayerBalanceStorageSlot(feePayer));
|
|
54
|
-
// If there is a claim in this tx that increases the fee payer balance in Fee Juice, add it to balance
|
|
55
|
-
const setupFns = getExecutionRequestsByPhase(tx, TxExecutionPhase.SETUP);
|
|
56
|
-
const increasePublicBalanceSelector = await FunctionSelector.fromSignature('_increase_public_balance((Field),(Field,Field))');
|
|
57
|
-
const claimFunctionCall = setupFns.find(fn => fn.callContext.contractAddress.equals(__classPrivateFieldGet(this, _GasTxValidator_feeJuiceAddress, "f")) &&
|
|
58
|
-
fn.callContext.msgSender.equals(__classPrivateFieldGet(this, _GasTxValidator_feeJuiceAddress, "f")) &&
|
|
59
|
-
fn.args.length > 2 &&
|
|
60
|
-
// Public functions get routed through the dispatch function, whose first argument is the target function selector.
|
|
61
|
-
fn.args[0].equals(increasePublicBalanceSelector.toField()) &&
|
|
62
|
-
fn.args[1].equals(feePayer.toField()) &&
|
|
63
|
-
!fn.callContext.isStaticCall);
|
|
64
|
-
// `amount` in the claim function call arguments occupies 2 fields as it is represented as U128.
|
|
65
|
-
const balance = claimFunctionCall
|
|
66
|
-
? initialBalance.add(new Fr(U128.fromFields(claimFunctionCall.args.slice(2, 4)).toInteger()))
|
|
67
|
-
: initialBalance;
|
|
68
|
-
if (balance.lt(feeLimit)) {
|
|
69
|
-
__classPrivateFieldGet(this, _GasTxValidator_log, "f").warn(`Rejecting transaction due to not enough fee payer balance`, {
|
|
70
|
-
feePayer,
|
|
71
|
-
balance: balance.toBigInt(),
|
|
72
|
-
feeLimit: feeLimit.toBigInt(),
|
|
73
|
-
});
|
|
74
|
-
return { result: 'invalid', reason: ['Insufficient fee payer balance'] };
|
|
75
|
-
}
|
|
76
|
-
return { result: 'valid' };
|
|
77
|
-
};
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvZ2FzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBVyxnQkFBZ0IsRUFBNkMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RyxPQUFPLEVBQXFCLEVBQUUsRUFBRSxnQkFBZ0IsRUFBZ0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBT3pHLE1BQU0sT0FBTyxjQUFjO0lBT3pCLFlBQ0UsZ0JBQW1DLEVBQ25DLGVBQTZCLEVBQzdCLFdBQW9CLEVBQ3BCLE9BQWdCOztRQVZsQiw4QkFBTyxZQUFZLENBQUMsK0JBQStCLENBQUMsRUFBQztRQUNyRCxtREFBcUM7UUFDckMsa0RBQStCO1FBQy9CLDhDQUFzQjtRQUN0QiwwQ0FBa0I7UUFRaEIsdUJBQUEsSUFBSSxvQ0FBcUIsZ0JBQWdCLE1BQUEsQ0FBQztRQUMxQyx1QkFBQSxJQUFJLG1DQUFvQixlQUFlLE1BQUEsQ0FBQztRQUN4Qyx1QkFBQSxJQUFJLCtCQUFnQixXQUFXLE1BQUEsQ0FBQztRQUNoQyx1QkFBQSxJQUFJLDJCQUFZLE9BQU8sTUFBQSxDQUFDO0lBQzFCLENBQUM7SUFFRCxVQUFVLENBQUMsRUFBTTtRQUNmLElBQUksdUJBQUEsSUFBSSw2REFBWSxNQUFoQixJQUFJLEVBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RG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
|
|
90
|
+
}
|
|
@@ -2,23 +2,23 @@ import { MerkleTreeId } from '@aztec/circuit-types';
|
|
|
2
2
|
/**
|
|
3
3
|
* Implements a nullifier source by checking a DB and an in-memory collection.
|
|
4
4
|
* Intended for validating transactions as they are added to a block.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
*/ export class NullifierCache {
|
|
6
|
+
db;
|
|
7
|
+
nullifiers;
|
|
8
|
+
constructor(db){
|
|
8
9
|
this.db = db;
|
|
9
10
|
this.nullifiers = new Set();
|
|
10
11
|
}
|
|
11
12
|
async nullifiersExist(nullifiers) {
|
|
12
|
-
const cacheResults = nullifiers.map(n
|
|
13
|
-
const toCheckDb = nullifiers.filter((_n, index)
|
|
13
|
+
const cacheResults = nullifiers.map((n)=>this.nullifiers.has(n.toString()));
|
|
14
|
+
const toCheckDb = nullifiers.filter((_n, index)=>!cacheResults[index]);
|
|
14
15
|
const dbHits = await this.db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, toCheckDb);
|
|
15
16
|
let dbIndex = 0;
|
|
16
|
-
return nullifiers.map((_n, index)
|
|
17
|
+
return nullifiers.map((_n, index)=>cacheResults[index] || dbHits[dbIndex++] !== undefined);
|
|
17
18
|
}
|
|
18
19
|
addNullifiers(nullifiers) {
|
|
19
|
-
for (const nullifier of nullifiers)
|
|
20
|
+
for (const nullifier of nullifiers){
|
|
20
21
|
this.nullifiers.add(nullifier.toString());
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbGlmaWVyX2NhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci9udWxsaWZpZXJfY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBaUMsTUFBTSxzQkFBc0IsQ0FBQztBQUduRjs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUd6QixZQUFvQixFQUE0QjtRQUE1QixPQUFFLEdBQUYsRUFBRSxDQUEwQjtRQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBb0I7UUFDL0MsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXJGLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVNLGFBQWEsQ0FBQyxVQUFvQjtRQUN2QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { Tx, TxExecutionPhase, } from '@aztec/circuit-types';
|
|
1
|
+
import { Tx, TxExecutionPhase } from '@aztec/circuit-types';
|
|
4
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
3
|
import { ContractsDataSourcePublicDB, getExecutionRequestsByPhase } from '@aztec/simulator/server';
|
|
6
4
|
export class PhasesTxValidator {
|
|
7
|
-
|
|
5
|
+
setupAllowList;
|
|
6
|
+
#log;
|
|
7
|
+
contractDataSource;
|
|
8
|
+
constructor(contracts, setupAllowList){
|
|
8
9
|
this.setupAllowList = setupAllowList;
|
|
9
|
-
|
|
10
|
+
this.#log = createLogger('sequencer:tx_validator:tx_phases');
|
|
10
11
|
this.contractDataSource = new ContractsDataSourcePublicDB(contracts);
|
|
11
12
|
}
|
|
12
13
|
async validateTx(tx) {
|
|
@@ -16,19 +17,29 @@ export class PhasesTxValidator {
|
|
|
16
17
|
// which is what we're trying to do as part of the current txs.
|
|
17
18
|
await this.contractDataSource.addNewContracts(tx);
|
|
18
19
|
if (!tx.data.forPublic) {
|
|
19
|
-
|
|
20
|
-
return {
|
|
20
|
+
this.#log.debug(`Tx ${Tx.getHash(tx)} does not contain enqueued public functions. Skipping phases validation.`);
|
|
21
|
+
return {
|
|
22
|
+
result: 'valid'
|
|
23
|
+
};
|
|
21
24
|
}
|
|
22
25
|
const setupFns = getExecutionRequestsByPhase(tx, TxExecutionPhase.SETUP);
|
|
23
|
-
for (const setupFn of setupFns)
|
|
24
|
-
if (!
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
for (const setupFn of setupFns){
|
|
27
|
+
if (!await this.isOnAllowList(setupFn, this.setupAllowList)) {
|
|
28
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because it calls setup function not on allow list: ${setupFn.callContext.contractAddress}:${setupFn.callContext.functionSelector}`, {
|
|
29
|
+
allowList: this.setupAllowList
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
result: 'invalid',
|
|
33
|
+
reason: [
|
|
34
|
+
'Setup function not on allow list'
|
|
35
|
+
]
|
|
36
|
+
};
|
|
27
37
|
}
|
|
28
38
|
}
|
|
29
|
-
return {
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
return {
|
|
40
|
+
result: 'valid'
|
|
41
|
+
};
|
|
42
|
+
} finally{
|
|
32
43
|
await this.contractDataSource.removeNewContracts(tx);
|
|
33
44
|
}
|
|
34
45
|
}
|
|
@@ -38,7 +49,7 @@ export class PhasesTxValidator {
|
|
|
38
49
|
}
|
|
39
50
|
const { contractAddress, functionSelector } = publicCall.callContext;
|
|
40
51
|
// do these checks first since they don't require the contract class
|
|
41
|
-
for (const entry of allowList)
|
|
52
|
+
for (const entry of allowList){
|
|
42
53
|
if ('address' in entry && !('selector' in entry)) {
|
|
43
54
|
if (contractAddress.equals(entry.address)) {
|
|
44
55
|
return true;
|
|
@@ -59,8 +70,7 @@ export class PhasesTxValidator {
|
|
|
59
70
|
}
|
|
60
71
|
}
|
|
61
72
|
if ('classId' in entry && 'selector' in entry) {
|
|
62
|
-
if (contractClass.contractClassId.equals(entry.classId) &&
|
|
63
|
-
(entry.selector === undefined || entry.selector.equals(functionSelector))) {
|
|
73
|
+
if (contractClass.contractClassId.equals(entry.classId) && (entry.selector === undefined || entry.selector.equals(functionSelector))) {
|
|
64
74
|
return true;
|
|
65
75
|
}
|
|
66
76
|
}
|
|
@@ -68,5 +78,3 @@ export class PhasesTxValidator {
|
|
|
68
78
|
return false;
|
|
69
79
|
}
|
|
70
80
|
}
|
|
71
|
-
_PhasesTxValidator_log = new WeakMap();
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhhc2VzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvcGhhc2VzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFHTCxFQUFFLEVBQ0YsZ0JBQWdCLEdBR2pCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5HLE1BQU0sT0FBTyxpQkFBaUI7SUFJNUIsWUFBWSxTQUE2QixFQUFVLGNBQWdDO1FBQWhDLG1CQUFjLEdBQWQsY0FBYyxDQUFrQjtRQUhuRixpQ0FBTyxZQUFZLENBQUMsa0NBQWtDLENBQUMsRUFBQztRQUl0RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFNO1FBQ3JCLElBQUksQ0FBQztZQUNILHdGQUF3RjtZQUN4RixtR0FBbUc7WUFDbkcsK0RBQStEO1lBQy9ELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVsRCxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdkIsdUJBQUEsSUFBSSw4QkFBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLDBFQUEwRSxDQUFDLENBQUM7Z0JBQ2hILE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLDJCQUEyQixDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RSxLQUFL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
|
|
@@ -21,7 +21,6 @@ async function patchFn(where, tx, index, overrides) {
|
|
|
21
21
|
tx.data.forPublic[where].publicCallRequests[index] = request;
|
|
22
22
|
return {
|
|
23
23
|
address: fn.callContext.contractAddress,
|
|
24
|
-
selector: fn.callContext.functionSelector
|
|
24
|
+
selector: fn.callContext.functionSelector
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvdGVzdF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsT0FBTyxPQUFPLENBQUMsOEJBQThCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixFQUFNLEVBQ04sS0FBYSxFQUNiLFNBQXdHO0lBRXhHLE9BQU8sT0FBTyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELEtBQUssVUFBVSxPQUFPLENBQ3BCLEtBQW1FLEVBQ25FLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFFLENBQUM7SUFDOUQsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQztJQUNyRixFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDckQsRUFBRSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDcEMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMzRSxFQUFFLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTNDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUM7SUFDekQsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUM3QyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMzRCxPQUFPLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO0lBQ25ELE9BQU8sQ0FBQyxRQUFRLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBRTlELE9BQU87UUFDTCxPQUFPLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlO1FBQ3ZDLFFBQVEsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQjtLQUMxQyxDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Fr } from '@aztec/circuits.js';
|
|
2
|
-
import { AggregateTxValidator, BlockHeaderTxValidator, DataTxValidator, DoubleSpendTxValidator, MetadataTxValidator, TxProofValidator
|
|
2
|
+
import { AggregateTxValidator, BlockHeaderTxValidator, DataTxValidator, DoubleSpendTxValidator, MetadataTxValidator, TxProofValidator } from '@aztec/p2p';
|
|
3
3
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
4
4
|
import { readPublicState } from '@aztec/simulator/server';
|
|
5
5
|
import { ArchiveCache } from './archive_cache.js';
|
|
@@ -14,7 +14,7 @@ export function createValidatorForAcceptingTxs(db, contractDataSource, verifier,
|
|
|
14
14
|
new DoubleSpendTxValidator(new NullifierCache(db)),
|
|
15
15
|
new PhasesTxValidator(contractDataSource, setupAllowList),
|
|
16
16
|
new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, enforceFees, gasFees),
|
|
17
|
-
new BlockHeaderTxValidator(new ArchiveCache(db))
|
|
17
|
+
new BlockHeaderTxValidator(new ArchiveCache(db))
|
|
18
18
|
];
|
|
19
19
|
if (verifier) {
|
|
20
20
|
validators.push(new TxProofValidator(verifier));
|
|
@@ -28,11 +28,12 @@ export function createValidatorsForBlockBuilding(db, contractDataSource, globalV
|
|
|
28
28
|
return {
|
|
29
29
|
preprocessValidator: preprocessValidator(nullifierCache, archiveCache, publicStateSource, contractDataSource, enforceFees, globalVariables, setupAllowList),
|
|
30
30
|
postprocessValidator: postprocessValidator(nullifierCache),
|
|
31
|
-
nullifierCache
|
|
31
|
+
nullifierCache
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
34
|
class DatabasePublicStateSource {
|
|
35
|
-
|
|
35
|
+
db;
|
|
36
|
+
constructor(db){
|
|
36
37
|
this.db = db;
|
|
37
38
|
}
|
|
38
39
|
storageRead(contractAddress, slot) {
|
|
@@ -46,4 +47,3 @@ function preprocessValidator(nullifierCache, archiveCache, publicStateSource, co
|
|
|
46
47
|
function postprocessValidator(nullifierCache) {
|
|
47
48
|
return new DoubleSpendTxValidator(nullifierCache);
|
|
48
49
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yX2ZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfdmFsaWRhdG9yL3R4X3ZhbGlkYXRvcl9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFBOEMsRUFBRSxFQUFzQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3hILE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLGdCQUFnQixHQUNqQixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQTBCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sVUFBVSw4QkFBOEIsQ0FDNUMsRUFBNEIsRUFDNUIsa0JBQXNDLEVBQ3RDLFFBQW1ELEVBQ25ELElBTUM7SUFFRCxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztJQUM5RSxNQUFNLFVBQVUsR0FBc0I7UUFDcEMsSUFBSSxlQUFlLEVBQUU7UUFDckIsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxJQUFJLHNCQUFzQixDQUFDLElBQUksY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDO1FBQ3pELElBQUksY0FBYyxDQUFDLElBQUkseUJBQXlCLENBQUMsRUFBRSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUM7UUFDN0csSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNqRCxDQUFDO0lBRUYsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxPQUFPLElBQUksb0JBQW9CLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdDQUFnQyxDQUM5QyxFQUE0QixFQUM1QixrQkFBc0MsRUFDdEMsZUFBZ0MsRUFDaEMsV0FBb0IsRUFDcEIsY0FBZ0M7SUFNaEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTVELE9BQU87UUFDTCxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FDdEMsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxlQUFlLEVBQ2YsY0FBYyxDQUNmO1FBQ0Qsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUMsY0FBYyxDQUFDO1FBQzFELGNBQWM7S0FDZixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0seUJBQXlCO0lBQzdCLFlBQW9CLEVBQTRCO1FBQTVCLE9BQUUsR0FBRixFQUFFLENBQTBCO0lBQUcsQ0FBQztJQUVwRCxXQUFXLENBQUMsZUFBNkIsRUFBRSxJQUFRO1FBQ2pELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQUVELFNBQVMsbUJBQW1CLENBQzFCLGNBQThCLEVBQzlCLFlBQTBCLEVBQzFCLGlCQUFvQyxFQUNwQyxrQkFBc0MsRUFDdEMsV0FBb0IsRUFDcEIsZUFBZ0MsRUFDaEMsY0FBZ0M7SUFFaEMsNElBQTRJO0lBQzVJLE9BQU8sSUFBSSxvQkFBb0IsQ0FDN0IsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFDN0UsSUFBSSxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsRUFDMUMsSUFBSSxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsRUFDekQsSUFBSSxjQUFjLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQzdHLElBQUksc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQ3pDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxjQUE4QjtJQUMxRCxPQUFPLElBQUksc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDcEQsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -23,31 +23,32 @@
|
|
|
23
23
|
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
24
24
|
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
25
25
|
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
26
|
-
"test": "
|
|
26
|
+
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}",
|
|
27
27
|
"test:integration": "concurrently -k -s first -c reset,dim -n test,anvil \"yarn test:integration:run\" \"anvil\"",
|
|
28
28
|
"test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@aztec/aztec.js": "0.
|
|
32
|
-
"@aztec/bb-prover": "0.
|
|
33
|
-
"@aztec/blob-
|
|
34
|
-
"@aztec/
|
|
35
|
-
"@aztec/
|
|
36
|
-
"@aztec/
|
|
37
|
-
"@aztec/
|
|
38
|
-
"@aztec/
|
|
39
|
-
"@aztec/
|
|
40
|
-
"@aztec/
|
|
41
|
-
"@aztec/
|
|
42
|
-
"@aztec/noir-
|
|
43
|
-
"@aztec/
|
|
44
|
-
"@aztec/
|
|
45
|
-
"@aztec/
|
|
46
|
-
"@aztec/
|
|
47
|
-
"@aztec/
|
|
48
|
-
"@aztec/
|
|
49
|
-
"@aztec/
|
|
50
|
-
"@aztec/
|
|
31
|
+
"@aztec/aztec.js": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
32
|
+
"@aztec/bb-prover": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
33
|
+
"@aztec/blob-lib": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
34
|
+
"@aztec/blob-sink": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
35
|
+
"@aztec/circuit-types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
36
|
+
"@aztec/circuits.js": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
37
|
+
"@aztec/epoch-cache": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
38
|
+
"@aztec/ethereum": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
39
|
+
"@aztec/foundation": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
40
|
+
"@aztec/l1-artifacts": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
41
|
+
"@aztec/merkle-tree": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
42
|
+
"@aztec/noir-contracts.js": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
43
|
+
"@aztec/noir-protocol-circuits-types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
44
|
+
"@aztec/p2p": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
45
|
+
"@aztec/protocol-contracts": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
46
|
+
"@aztec/prover-client": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
47
|
+
"@aztec/simulator": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
48
|
+
"@aztec/telemetry-client": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
49
|
+
"@aztec/types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
50
|
+
"@aztec/validator-client": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
51
|
+
"@aztec/world-state": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
51
52
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
52
53
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
53
54
|
"lodash.chunk": "^4.2.0",
|
package/src/config.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Blob } from '@aztec/blob-lib';
|
|
1
2
|
import { type BlobSinkClientInterface, createBlobSinkClient } from '@aztec/blob-sink/client';
|
|
2
3
|
import {
|
|
3
4
|
ConsensusPayload,
|
|
@@ -27,7 +28,6 @@ import {
|
|
|
27
28
|
formatViemError,
|
|
28
29
|
} from '@aztec/ethereum';
|
|
29
30
|
import { toHex } from '@aztec/foundation/bigint-buffer';
|
|
30
|
-
import { Blob } from '@aztec/foundation/blob';
|
|
31
31
|
import { type Signature } from '@aztec/foundation/eth-signature';
|
|
32
32
|
import { createLogger } from '@aztec/foundation/log';
|
|
33
33
|
import { Timer } from '@aztec/foundation/timer';
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
GENESIS_ARCHIVE_ROOT,
|
|
20
20
|
Gas,
|
|
21
21
|
type GlobalVariables,
|
|
22
|
+
INITIAL_L2_BLOCK_NUM,
|
|
22
23
|
StateReference,
|
|
23
24
|
} from '@aztec/circuits.js';
|
|
24
25
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
@@ -232,20 +233,18 @@ export class Sequencer {
|
|
|
232
233
|
protected async doRealWork() {
|
|
233
234
|
this.setState(SequencerState.SYNCHRONIZING, 0n);
|
|
234
235
|
// Update state when the previous block has been synced
|
|
235
|
-
const
|
|
236
|
+
const chainTip = await this.getChainTip();
|
|
236
237
|
// Do not go forward with new block if the previous one has not been mined and processed
|
|
237
|
-
if (!
|
|
238
|
+
if (!chainTip) {
|
|
238
239
|
return;
|
|
239
240
|
}
|
|
240
241
|
|
|
241
242
|
this.setState(SequencerState.PROPOSER_CHECK, 0n);
|
|
242
243
|
|
|
243
|
-
const
|
|
244
|
-
|
|
245
|
-
const newBlockNumber = (chainTip?.header.globalVariables.blockNumber.toNumber() ?? 0) + 1;
|
|
244
|
+
const newBlockNumber = chainTip.blockNumber + 1;
|
|
246
245
|
|
|
247
246
|
// If we cannot find a tip archive, assume genesis.
|
|
248
|
-
const chainTipArchive = chainTip
|
|
247
|
+
const chainTipArchive = chainTip.archive;
|
|
249
248
|
|
|
250
249
|
const slot = await this.slotForProposal(chainTipArchive.toBuffer(), BigInt(newBlockNumber));
|
|
251
250
|
if (!slot) {
|
|
@@ -253,7 +252,7 @@ export class Sequencer {
|
|
|
253
252
|
return;
|
|
254
253
|
}
|
|
255
254
|
|
|
256
|
-
this.log.
|
|
255
|
+
this.log.debug(`Can propose block ${newBlockNumber} at slot ${slot}`);
|
|
257
256
|
|
|
258
257
|
const newGlobalVariables = await this.globalsBuilder.buildGlobalVariables(
|
|
259
258
|
new Fr(newBlockNumber),
|
|
@@ -763,14 +762,16 @@ export class Sequencer {
|
|
|
763
762
|
* We don't check against the previous block submitted since it may have been reorg'd out.
|
|
764
763
|
* @returns Boolean indicating if our dependencies are synced to the latest block.
|
|
765
764
|
*/
|
|
766
|
-
protected async
|
|
765
|
+
protected async getChainTip(): Promise<{ blockNumber: number; archive: Fr } | undefined> {
|
|
767
766
|
const syncedBlocks = await Promise.all([
|
|
768
767
|
this.worldState.status().then((s: WorldStateSynchronizerStatus) => s.syncedToL2Block),
|
|
769
768
|
this.l2BlockSource.getL2Tips().then(t => t.latest),
|
|
770
|
-
this.p2pClient.getStatus().then(
|
|
769
|
+
this.p2pClient.getStatus().then(p2p => p2p.syncedToL2Block),
|
|
771
770
|
this.l1ToL2MessageSource.getBlockNumber(),
|
|
772
771
|
] as const);
|
|
772
|
+
|
|
773
773
|
const [worldState, l2BlockSource, p2p, l1ToL2MessageSource] = syncedBlocks;
|
|
774
|
+
|
|
774
775
|
const result =
|
|
775
776
|
// check that world state has caught up with archiver
|
|
776
777
|
// note that the archiver reports undefined hash for the genesis block
|
|
@@ -780,18 +781,33 @@ export class Sequencer {
|
|
|
780
781
|
// this should change to hashes once p2p client handles reorgs
|
|
781
782
|
// and once we stop pretending that the l1tol2message source is not
|
|
782
783
|
// just the archiver under a different name
|
|
783
|
-
p2p
|
|
784
|
-
l1ToL2MessageSource
|
|
784
|
+
(!l2BlockSource.hash || p2p.hash === l2BlockSource.hash) &&
|
|
785
|
+
l1ToL2MessageSource === l2BlockSource.number;
|
|
785
786
|
|
|
786
787
|
this.log.debug(`Sequencer sync check ${result ? 'succeeded' : 'failed'}`, {
|
|
787
788
|
worldStateNumber: worldState.number,
|
|
788
789
|
worldStateHash: worldState.hash,
|
|
789
790
|
l2BlockSourceNumber: l2BlockSource.number,
|
|
790
791
|
l2BlockSourceHash: l2BlockSource.hash,
|
|
791
|
-
p2pNumber: p2p,
|
|
792
|
+
p2pNumber: p2p.number,
|
|
793
|
+
p2pHash: p2p.hash,
|
|
792
794
|
l1ToL2MessageSourceNumber: l1ToL2MessageSource,
|
|
793
795
|
});
|
|
794
|
-
|
|
796
|
+
|
|
797
|
+
if (!result) {
|
|
798
|
+
return undefined;
|
|
799
|
+
}
|
|
800
|
+
if (worldState.number >= INITIAL_L2_BLOCK_NUM) {
|
|
801
|
+
const block = await this.l2BlockSource.getBlock(worldState.number);
|
|
802
|
+
if (!block) {
|
|
803
|
+
// this shouldn't really happen because a moment ago we checked that all components were in synch
|
|
804
|
+
return undefined;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
return { blockNumber: block.number, archive: block.archive.root };
|
|
808
|
+
} else {
|
|
809
|
+
return { blockNumber: INITIAL_L2_BLOCK_NUM - 1, archive: new Fr(GENESIS_ARCHIVE_ROOT) };
|
|
810
|
+
}
|
|
795
811
|
}
|
|
796
812
|
|
|
797
813
|
private getSlotStartTimestamp(slotNumber: number | bigint): number {
|
package/dest/client/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
|