@aztec/sequencer-client 0.34.0 → 0.35.1
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/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +3 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +84 -7
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +4 -3
- package/dest/index.d.ts +0 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -2
- package/dest/sequencer/sequencer.d.ts +6 -7
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +10 -11
- package/dest/tx_validator/aggregate_tx_validator.d.ts +7 -0
- package/dest/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
- package/dest/tx_validator/aggregate_tx_validator.js +23 -0
- package/dest/tx_validator/double_spend_validator.d.ts +11 -0
- package/dest/tx_validator/double_spend_validator.d.ts.map +1 -0
- package/dest/tx_validator/double_spend_validator.js +50 -0
- package/dest/tx_validator/gas_validator.d.ts +12 -0
- package/dest/tx_validator/gas_validator.d.ts.map +1 -0
- package/dest/tx_validator/gas_validator.js +62 -0
- package/dest/tx_validator/metadata_validator.d.ts +8 -0
- package/dest/tx_validator/metadata_validator.d.ts.map +1 -0
- package/dest/tx_validator/metadata_validator.js +50 -0
- package/dest/tx_validator/phases_validator.d.ts +13 -0
- package/dest/tx_validator/phases_validator.d.ts.map +1 -0
- package/dest/tx_validator/phases_validator.js +73 -0
- package/dest/tx_validator/tx_validator_factory.d.ts +13 -0
- package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -0
- package/dest/tx_validator/tx_validator_factory.js +21 -0
- package/package.json +14 -13
- package/src/client/sequencer-client.ts +2 -3
- package/src/config.ts +93 -7
- package/src/global_variable_builder/global_builder.ts +3 -2
- package/src/index.ts +0 -1
- package/src/sequencer/sequencer.ts +27 -20
- package/src/tx_validator/aggregate_tx_validator.ts +24 -0
- package/src/tx_validator/double_spend_validator.ts +65 -0
- package/src/tx_validator/gas_validator.ts +81 -0
- package/src/tx_validator/metadata_validator.ts +60 -0
- package/src/tx_validator/phases_validator.ts +101 -0
- package/src/tx_validator/tx_validator_factory.ts +37 -0
- package/dest/sequencer/abstract_phase_manager.d.ts +0 -77
- package/dest/sequencer/abstract_phase_manager.d.ts.map +0 -1
- package/dest/sequencer/abstract_phase_manager.js +0 -307
- package/dest/sequencer/app_logic_phase_manager.d.ts +0 -28
- package/dest/sequencer/app_logic_phase_manager.d.ts.map +0 -1
- package/dest/sequencer/app_logic_phase_manager.js +0 -41
- package/dest/sequencer/hints_builder.d.ts +0 -23
- package/dest/sequencer/hints_builder.d.ts.map +0 -1
- package/dest/sequencer/hints_builder.js +0 -62
- package/dest/sequencer/phase_manager_factory.d.ts +0 -18
- package/dest/sequencer/phase_manager_factory.d.ts.map +0 -1
- package/dest/sequencer/phase_manager_factory.js +0 -56
- package/dest/sequencer/public_processor.d.ts +0 -54
- package/dest/sequencer/public_processor.d.ts.map +0 -1
- package/dest/sequencer/public_processor.js +0 -142
- package/dest/sequencer/setup_phase_manager.d.ts +0 -28
- package/dest/sequencer/setup_phase_manager.d.ts.map +0 -1
- package/dest/sequencer/setup_phase_manager.js +0 -30
- package/dest/sequencer/tail_phase_manager.d.ts +0 -29
- package/dest/sequencer/tail_phase_manager.d.ts.map +0 -1
- package/dest/sequencer/tail_phase_manager.js +0 -52
- package/dest/sequencer/teardown_phase_manager.d.ts +0 -28
- package/dest/sequencer/teardown_phase_manager.d.ts.map +0 -1
- package/dest/sequencer/teardown_phase_manager.js +0 -30
- package/dest/sequencer/tx_validator.d.ts +0 -29
- package/dest/sequencer/tx_validator.d.ts.map +0 -1
- package/dest/sequencer/tx_validator.js +0 -174
- package/dest/sequencer/tx_validator_factory.d.ts +0 -12
- package/dest/sequencer/tx_validator_factory.d.ts.map +0 -1
- package/dest/sequencer/tx_validator_factory.js +0 -17
- package/dest/sequencer/utils.d.ts +0 -8
- package/dest/sequencer/utils.d.ts.map +0 -1
- package/dest/sequencer/utils.js +0 -29
- package/dest/simulator/index.d.ts +0 -31
- package/dest/simulator/index.d.ts.map +0 -1
- package/dest/simulator/index.js +0 -2
- package/dest/simulator/public_executor.d.ts +0 -79
- package/dest/simulator/public_executor.d.ts.map +0 -1
- package/dest/simulator/public_executor.js +0 -198
- package/dest/simulator/public_kernel.d.ts +0 -37
- package/dest/simulator/public_kernel.d.ts.map +0 -1
- package/dest/simulator/public_kernel.js +0 -97
- package/src/sequencer/abstract_phase_manager.ts +0 -549
- package/src/sequencer/app_logic_phase_manager.ts +0 -62
- package/src/sequencer/hints_builder.ts +0 -119
- package/src/sequencer/phase_manager_factory.ts +0 -126
- package/src/sequencer/public_processor.ts +0 -209
- package/src/sequencer/setup_phase_manager.ts +0 -50
- package/src/sequencer/tail_phase_manager.ts +0 -111
- package/src/sequencer/teardown_phase_manager.ts +0 -50
- package/src/sequencer/tx_validator.ts +0 -265
- package/src/sequencer/tx_validator_factory.ts +0 -32
- package/src/sequencer/utils.ts +0 -31
- package/src/simulator/index.ts +0 -36
- package/src/simulator/public_executor.ts +0 -267
- package/src/simulator/public_kernel.ts +0 -139
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
var _MetadataTxValidator_instances, _MetadataTxValidator_log, _MetadataTxValidator_globalVariables, _MetadataTxValidator_hasCorrectChainId, _MetadataTxValidator_isValidForBlockNumber;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
+
export class MetadataTxValidator {
|
|
6
|
+
constructor(globalVariables) {
|
|
7
|
+
_MetadataTxValidator_instances.add(this);
|
|
8
|
+
_MetadataTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_metadata'));
|
|
9
|
+
_MetadataTxValidator_globalVariables.set(this, void 0);
|
|
10
|
+
__classPrivateFieldSet(this, _MetadataTxValidator_globalVariables, globalVariables, "f");
|
|
11
|
+
}
|
|
12
|
+
validateTxs(txs) {
|
|
13
|
+
const validTxs = [];
|
|
14
|
+
const invalidTxs = [];
|
|
15
|
+
for (const tx of txs) {
|
|
16
|
+
if (!__classPrivateFieldGet(this, _MetadataTxValidator_instances, "m", _MetadataTxValidator_hasCorrectChainId).call(this, tx)) {
|
|
17
|
+
invalidTxs.push(tx);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (!__classPrivateFieldGet(this, _MetadataTxValidator_instances, "m", _MetadataTxValidator_isValidForBlockNumber).call(this, tx)) {
|
|
21
|
+
invalidTxs.push(tx);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
validTxs.push(tx);
|
|
25
|
+
}
|
|
26
|
+
return Promise.resolve([validTxs, invalidTxs]);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
_MetadataTxValidator_log = new WeakMap(), _MetadataTxValidator_globalVariables = new WeakMap(), _MetadataTxValidator_instances = new WeakSet(), _MetadataTxValidator_hasCorrectChainId = function _MetadataTxValidator_hasCorrectChainId(tx) {
|
|
30
|
+
if (!tx.data.constants.txContext.chainId.equals(__classPrivateFieldGet(this, _MetadataTxValidator_globalVariables, "f").chainId)) {
|
|
31
|
+
__classPrivateFieldGet(this, _MetadataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because of incorrect chain ${tx.data.constants.txContext.chainId.toNumber()} != ${__classPrivateFieldGet(this, _MetadataTxValidator_globalVariables, "f").chainId.toNumber()}`);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
}, _MetadataTxValidator_isValidForBlockNumber = function _MetadataTxValidator_isValidForBlockNumber(tx) {
|
|
38
|
+
const target = tx instanceof Tx
|
|
39
|
+
? tx.data.forRollup?.rollupValidationRequests || tx.data.forPublic.validationRequests.forRollup
|
|
40
|
+
: tx.data.rollupValidationRequests;
|
|
41
|
+
const maxBlockNumber = target.maxBlockNumber;
|
|
42
|
+
if (maxBlockNumber.isSome && maxBlockNumber.value < __classPrivateFieldGet(this, _MetadataTxValidator_globalVariables, "f").blockNumber) {
|
|
43
|
+
__classPrivateFieldGet(this, _MetadataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for low max block number`);
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGFfdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci9tZXRhZGF0YV92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQWMsRUFBRSxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRXhFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sT0FBTyxtQkFBbUI7SUFJOUIsWUFBWSxlQUFnQzs7UUFINUMsbUNBQU8saUJBQWlCLENBQUMsMENBQTBDLENBQUMsRUFBQztRQUNyRSx1REFBa0M7UUFHaEMsdUJBQUEsSUFBSSx3Q0FBb0IsZUFBZSxNQUFBLENBQUM7SUFDMUMsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFRO1FBQ2xCLE1BQU0sUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUN6QixNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7UUFDM0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsdUJBQUEsSUFBSSw4RUFBbUIsTUFBdkIsSUFBSSxFQUFvQixFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQixTQUFTO1lBQ1gsQ0FBQztZQUVELElBQUksQ0FBQyx1QkFBQSxJQUFJLGtGQUF1QixNQUEzQixJQUFJLEVBQXdCLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BCLFNBQVM7WUFDWCxDQUFDO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQTZCRjt5T0EzQm9CLEVBQUs7SUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHVCQUFBLElBQUksNENBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMvRSx1QkFBQSxJQUFJLGdDQUFLLENBQUMsSUFBSSxDQUNaLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUN4QixFQUFFLENBQ0gsK0JBQStCLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sdUJBQUEsSUFBSSw0Q0FBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDaEksQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDLG1HQUVzQixFQUFLO0lBQzFCLE1BQU0sTUFBTSxHQUNWLEVBQUUsWUFBWSxFQUFFO1FBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHdCQUF3QixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLGtCQUFrQixDQUFDLFNBQVM7UUFDaEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUU3QyxJQUFJLGNBQWMsQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDLEtBQUssR0FBRyx1QkFBQSxJQUFJLDRDQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RGLHVCQUFBLElBQUksZ0NBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDMUUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type AllowedFunction, Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { type PublicCallRequest } from '@aztec/circuits.js';
|
|
3
|
+
import { type ContractDataSource } from '@aztec/types/contracts';
|
|
4
|
+
export declare class PhasesTxValidator implements TxValidator<Tx> {
|
|
5
|
+
#private;
|
|
6
|
+
private contractDataSource;
|
|
7
|
+
private setupAllowList;
|
|
8
|
+
private teardownAllowList;
|
|
9
|
+
constructor(contractDataSource: ContractDataSource, setupAllowList: AllowedFunction[], teardownAllowList: AllowedFunction[]);
|
|
10
|
+
validateTxs(txs: Tx[]): Promise<[validTxs: Tx[], invalidTxs: Tx[]]>;
|
|
11
|
+
isOnAllowList(publicCall: PublicCallRequest, allowList: AllowedFunction[]): Promise<boolean>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=phases_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phases_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/phases_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,qBAAa,iBAAkB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAIrD,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,iBAAiB;gBAFjB,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,eAAe,EAAE,EACjC,iBAAiB,EAAE,eAAe,EAAE;IAGxC,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAmDnE,aAAa,CAAC,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAkCnG"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
var _PhasesTxValidator_instances, _PhasesTxValidator_log, _PhasesTxValidator_validateTx;
|
|
2
|
+
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { AbstractPhaseManager, PublicKernelPhase } from '@aztec/simulator';
|
|
6
|
+
export class PhasesTxValidator {
|
|
7
|
+
constructor(contractDataSource, setupAllowList, teardownAllowList) {
|
|
8
|
+
_PhasesTxValidator_instances.add(this);
|
|
9
|
+
this.contractDataSource = contractDataSource;
|
|
10
|
+
this.setupAllowList = setupAllowList;
|
|
11
|
+
this.teardownAllowList = teardownAllowList;
|
|
12
|
+
_PhasesTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_phases'));
|
|
13
|
+
}
|
|
14
|
+
async validateTxs(txs) {
|
|
15
|
+
const validTxs = [];
|
|
16
|
+
const invalidTxs = [];
|
|
17
|
+
for (const tx of txs) {
|
|
18
|
+
if (await __classPrivateFieldGet(this, _PhasesTxValidator_instances, "m", _PhasesTxValidator_validateTx).call(this, tx)) {
|
|
19
|
+
validTxs.push(tx);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
invalidTxs.push(tx);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return Promise.resolve([validTxs, invalidTxs]);
|
|
26
|
+
}
|
|
27
|
+
async isOnAllowList(publicCall, allowList) {
|
|
28
|
+
const { contractAddress, functionData: { selector }, } = publicCall;
|
|
29
|
+
// do these checks first since they don't require the contract class
|
|
30
|
+
for (const entry of allowList) {
|
|
31
|
+
if (!('address' in entry)) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (contractAddress.equals(entry.address) && entry.selector.equals(selector)) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const contractClass = await this.contractDataSource.getContract(contractAddress);
|
|
39
|
+
if (!contractClass) {
|
|
40
|
+
throw new Error(`Contract not found: ${publicCall.contractAddress.toString()}`);
|
|
41
|
+
}
|
|
42
|
+
for (const entry of allowList) {
|
|
43
|
+
if (!('classId' in entry)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (contractClass.contractClassId.equals(entry.classId) && entry.selector.equals(selector)) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
_PhasesTxValidator_log = new WeakMap(), _PhasesTxValidator_instances = new WeakSet(), _PhasesTxValidator_validateTx = async function _PhasesTxValidator_validateTx(tx) {
|
|
54
|
+
if (!tx.data.forPublic) {
|
|
55
|
+
__classPrivateFieldGet(this, _PhasesTxValidator_log, "f").debug(`Tx ${Tx.getHash(tx)} does not contain enqueued public functions. Skipping phases validation.`);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
const { [PublicKernelPhase.SETUP]: setupFns, [PublicKernelPhase.TEARDOWN]: teardownFns } = AbstractPhaseManager.extractEnqueuedPublicCallsByPhase(tx.data, tx.enqueuedPublicFunctionCalls);
|
|
59
|
+
for (const setupFn of setupFns) {
|
|
60
|
+
if (!(await this.isOnAllowList(setupFn, this.setupAllowList))) {
|
|
61
|
+
__classPrivateFieldGet(this, _PhasesTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it calls setup function not on allow list: ${setupFn.contractAddress}:${setupFn.functionData.selector}`);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
for (const teardownFn of teardownFns) {
|
|
66
|
+
if (!(await this.isOnAllowList(teardownFn, this.teardownAllowList))) {
|
|
67
|
+
__classPrivateFieldGet(this, _PhasesTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it calls teardown function not on allowlist: ${teardownFn.contractAddress}:${teardownFn.functionData.selector}`);
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhhc2VzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvcGhhc2VzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBd0IsRUFBRSxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRWxGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzNFLE1BQU0sT0FBTyxpQkFBaUI7SUFHNUIsWUFDVSxrQkFBc0MsRUFDdEMsY0FBaUMsRUFDakMsaUJBQW9DOztRQUZwQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBTDlDLGlDQUFPLGlCQUFpQixDQUFDLHdDQUF3QyxDQUFDLEVBQUM7SUFNaEUsQ0FBQztJQUVKLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBUztRQUN6QixNQUFNLFFBQVEsR0FBUyxFQUFFLENBQUM7UUFDMUIsTUFBTSxVQUFVLEdBQVMsRUFBRSxDQUFDO1FBRTVCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxNQUFNLHVCQUFBLElBQUksbUVBQVksTUFBaEIsSUFBSSxFQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBc0NELEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBNkIsRUFBRSxTQUE0QjtRQUM3RSxNQUFNLEVBQ0osZUFBZSxFQUNmLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUMzQixHQUFHLFVBQVUsQ0FBQztRQUVmLG9FQUFvRTtRQUNwRSxLQUFLLE1BQU0sS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMxQixTQUFTO1lBQ1gsQ0FBQztZQUVELElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDN0UsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUVELEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLFNBQVM7WUFDWCxDQUFDO1lBRUQsSUFBSSxhQUFhLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDM0YsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO3NIQXRFQyxLQUFLLHdDQUFhLEVBQU07SUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkIsdUJBQUEsSUFBSSw4QkFBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLDBFQUEwRSxDQUFDLENBQUM7UUFDaEgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxFQUFFLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQ3RGLG9CQUFvQixDQUFDLGlDQUFpQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFFbEcsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUQsdUJBQUEsSUFBSSw4QkFBSyxDQUFDLElBQUksQ0FDWixnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsdURBQzVCLE9BQU8sQ0FBQyxlQUNWLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FDcEMsQ0FBQztZQUVGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BFLHVCQUFBLElBQUksOEJBQUssQ0FBQyxJQUFJLENBQ1osZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLHlEQUM1QixVQUFVLENBQUMsZUFDYixJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQ3ZDLENBQUM7WUFFRixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIn0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type AllowedFunction, type ProcessedTx, type Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { type EthAddress, type GlobalVariables } from '@aztec/circuits.js';
|
|
3
|
+
import { type ContractDataSource } from '@aztec/types/contracts';
|
|
4
|
+
import { type MerkleTreeOperations } from '@aztec/world-state';
|
|
5
|
+
export declare class TxValidatorFactory {
|
|
6
|
+
private merkleTreeDb;
|
|
7
|
+
private contractDataSource;
|
|
8
|
+
private gasPortalAddress;
|
|
9
|
+
constructor(merkleTreeDb: MerkleTreeOperations, contractDataSource: ContractDataSource, gasPortalAddress: EthAddress);
|
|
10
|
+
validatorForNewTxs(globalVariables: GlobalVariables, setupAllowList: AllowedFunction[], teardownAllowList: AllowedFunction[]): TxValidator<Tx>;
|
|
11
|
+
validatorForProcessedTxs(): TxValidator<ProcessedTx>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=tx_validator_factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_validator_factory.d.ts","sourceRoot":"","sources":["../../src/tx_validator/tx_validator_factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzG,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ/D,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,gBAAgB;gBAFhB,YAAY,EAAE,oBAAoB,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,gBAAgB,EAAE,UAAU;IAGtC,kBAAkB,CAChB,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,eAAe,EAAE,EACjC,iBAAiB,EAAE,eAAe,EAAE,GACnC,WAAW,CAAC,EAAE,CAAC;IASlB,wBAAwB,IAAI,WAAW,CAAC,WAAW,CAAC;CAGrD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { getCanonicalGasTokenAddress } from '@aztec/protocol-contracts/gas-token';
|
|
2
|
+
import { WorldStateDB, WorldStatePublicDB } from '@aztec/simulator';
|
|
3
|
+
import { AggregateTxValidator } from './aggregate_tx_validator.js';
|
|
4
|
+
import { DoubleSpendTxValidator } from './double_spend_validator.js';
|
|
5
|
+
import { GasTxValidator } from './gas_validator.js';
|
|
6
|
+
import { MetadataTxValidator } from './metadata_validator.js';
|
|
7
|
+
import { PhasesTxValidator } from './phases_validator.js';
|
|
8
|
+
export class TxValidatorFactory {
|
|
9
|
+
constructor(merkleTreeDb, contractDataSource, gasPortalAddress) {
|
|
10
|
+
this.merkleTreeDb = merkleTreeDb;
|
|
11
|
+
this.contractDataSource = contractDataSource;
|
|
12
|
+
this.gasPortalAddress = gasPortalAddress;
|
|
13
|
+
}
|
|
14
|
+
validatorForNewTxs(globalVariables, setupAllowList, teardownAllowList) {
|
|
15
|
+
return new AggregateTxValidator(new MetadataTxValidator(globalVariables), new DoubleSpendTxValidator(new WorldStateDB(this.merkleTreeDb)), new PhasesTxValidator(this.contractDataSource, setupAllowList, teardownAllowList), new GasTxValidator(new WorldStatePublicDB(this.merkleTreeDb), getCanonicalGasTokenAddress(this.gasPortalAddress)));
|
|
16
|
+
}
|
|
17
|
+
validatorForProcessedTxs() {
|
|
18
|
+
return new DoubleSpendTxValidator(new WorldStateDB(this.merkleTreeDb));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yX2ZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfdmFsaWRhdG9yL3R4X3ZhbGlkYXRvcl9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUlwRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUNVLFlBQWtDLEVBQ2xDLGtCQUFzQyxFQUN0QyxnQkFBNEI7UUFGNUIsaUJBQVksR0FBWixZQUFZLENBQXNCO1FBQ2xDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFZO0lBQ25DLENBQUM7SUFFSixrQkFBa0IsQ0FDaEIsZUFBZ0MsRUFDaEMsY0FBaUMsRUFDakMsaUJBQW9DO1FBRXBDLE9BQU8sSUFBSSxvQkFBb0IsQ0FDN0IsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsRUFDeEMsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFDL0QsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixDQUFDLEVBQ2pGLElBQUksY0FBYyxDQUFDLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLDJCQUEyQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQ2xILENBQUM7SUFDSixDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0YifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -24,18 +24,19 @@
|
|
|
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/circuit-types": "0.
|
|
28
|
-
"@aztec/circuits.js": "0.
|
|
29
|
-
"@aztec/ethereum": "0.
|
|
30
|
-
"@aztec/foundation": "0.
|
|
31
|
-
"@aztec/l1-artifacts": "0.
|
|
32
|
-
"@aztec/merkle-tree": "0.
|
|
33
|
-
"@aztec/noir-
|
|
34
|
-
"@aztec/
|
|
35
|
-
"@aztec/
|
|
36
|
-
"@aztec/
|
|
37
|
-
"@aztec/
|
|
38
|
-
"@aztec/
|
|
27
|
+
"@aztec/circuit-types": "0.35.1",
|
|
28
|
+
"@aztec/circuits.js": "0.35.1",
|
|
29
|
+
"@aztec/ethereum": "0.35.1",
|
|
30
|
+
"@aztec/foundation": "0.35.1",
|
|
31
|
+
"@aztec/l1-artifacts": "0.35.1",
|
|
32
|
+
"@aztec/merkle-tree": "0.35.1",
|
|
33
|
+
"@aztec/noir-contracts.js": "0.35.1",
|
|
34
|
+
"@aztec/noir-protocol-circuits-types": "0.35.1",
|
|
35
|
+
"@aztec/p2p": "0.35.1",
|
|
36
|
+
"@aztec/protocol-contracts": "0.35.1",
|
|
37
|
+
"@aztec/simulator": "0.35.1",
|
|
38
|
+
"@aztec/types": "0.35.1",
|
|
39
|
+
"@aztec/world-state": "0.35.1",
|
|
39
40
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
40
41
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
41
42
|
"lodash.chunk": "^4.2.0",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type L1ToL2MessageSource, type L2BlockSource } from '@aztec/circuit-types';
|
|
2
2
|
import { type BlockProver } from '@aztec/circuit-types/interfaces';
|
|
3
3
|
import { type P2P } from '@aztec/p2p';
|
|
4
|
-
import { type SimulationProvider } from '@aztec/simulator';
|
|
4
|
+
import { PublicProcessorFactory, type SimulationProvider } from '@aztec/simulator';
|
|
5
5
|
import { type ContractDataSource } from '@aztec/types/contracts';
|
|
6
6
|
import { type WorldStateSynchronizer } from '@aztec/world-state';
|
|
7
7
|
|
|
@@ -9,8 +9,7 @@ import { type SequencerClientConfig } from '../config.js';
|
|
|
9
9
|
import { getGlobalVariableBuilder } from '../global_variable_builder/index.js';
|
|
10
10
|
import { getL1Publisher } from '../publisher/index.js';
|
|
11
11
|
import { Sequencer, type SequencerConfig } from '../sequencer/index.js';
|
|
12
|
-
import {
|
|
13
|
-
import { TxValidatorFactory } from '../sequencer/tx_validator_factory.js';
|
|
12
|
+
import { TxValidatorFactory } from '../tx_validator/tx_validator_factory.js';
|
|
14
13
|
|
|
15
14
|
/**
|
|
16
15
|
* Encapsulates the full sequencer and publisher.
|
package/src/config.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type AllowedFunction } from '@aztec/circuit-types';
|
|
2
|
+
import { AztecAddress, Fr, FunctionSelector, getContractClassFromArtifact } from '@aztec/circuits.js';
|
|
2
3
|
import { type L1ContractAddresses, NULL_KEY } from '@aztec/ethereum';
|
|
3
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
|
+
import { EcdsaAccountContractArtifact } from '@aztec/noir-contracts.js/EcdsaAccount';
|
|
6
|
+
import { FPCContract } from '@aztec/noir-contracts.js/FPC';
|
|
7
|
+
import { GasTokenContract } from '@aztec/noir-contracts.js/GasToken';
|
|
8
|
+
import { SchnorrAccountContractArtifact } from '@aztec/noir-contracts.js/SchnorrAccount';
|
|
9
|
+
import { SchnorrHardcodedAccountContractArtifact } from '@aztec/noir-contracts.js/SchnorrHardcodedAccount';
|
|
10
|
+
import { SchnorrSingleKeyAccountContractArtifact } from '@aztec/noir-contracts.js/SchnorrSingleKeyAccount';
|
|
11
|
+
import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
|
|
4
12
|
|
|
5
13
|
import { type Hex } from 'viem';
|
|
6
14
|
|
|
@@ -40,8 +48,8 @@ export function getConfigEnvVars(): SequencerClientConfig {
|
|
|
40
48
|
SEQ_TX_POLLING_INTERVAL_MS,
|
|
41
49
|
SEQ_MAX_TX_PER_BLOCK,
|
|
42
50
|
SEQ_MIN_TX_PER_BLOCK,
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
SEQ_ALLOWED_SETUP_FN,
|
|
52
|
+
SEQ_ALLOWED_TEARDOWN_FN,
|
|
45
53
|
AVAILABILITY_ORACLE_CONTRACT_ADDRESS,
|
|
46
54
|
ROLLUP_CONTRACT_ADDRESS,
|
|
47
55
|
REGISTRY_CONTRACT_ADDRESS,
|
|
@@ -90,9 +98,87 @@ export function getConfigEnvVars(): SequencerClientConfig {
|
|
|
90
98
|
feeRecipient: FEE_RECIPIENT ? AztecAddress.fromString(FEE_RECIPIENT) : undefined,
|
|
91
99
|
acvmWorkingDirectory: ACVM_WORKING_DIRECTORY ? ACVM_WORKING_DIRECTORY : undefined,
|
|
92
100
|
acvmBinaryPath: ACVM_BINARY_PATH ? ACVM_BINARY_PATH : undefined,
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
101
|
+
allowedFunctionsInSetup: SEQ_ALLOWED_SETUP_FN
|
|
102
|
+
? parseSequencerAllowList(SEQ_ALLOWED_SETUP_FN)
|
|
103
|
+
: getDefaultAllowedSetupFunctions(),
|
|
104
|
+
allowedFunctionsInTeardown: SEQ_ALLOWED_TEARDOWN_FN
|
|
105
|
+
? parseSequencerAllowList(SEQ_ALLOWED_TEARDOWN_FN)
|
|
106
|
+
: getDefaultAllowedTeardownFunctions(),
|
|
97
107
|
};
|
|
98
108
|
}
|
|
109
|
+
|
|
110
|
+
function parseSequencerAllowList(value: string): AllowedFunction[] {
|
|
111
|
+
const entries: AllowedFunction[] = [];
|
|
112
|
+
|
|
113
|
+
if (!value) {
|
|
114
|
+
return entries;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
for (const val of value.split(',')) {
|
|
118
|
+
const [identifierString, selectorString] = val.split(':');
|
|
119
|
+
const selector = FunctionSelector.fromString(selectorString);
|
|
120
|
+
|
|
121
|
+
if (identifierString.startsWith('0x')) {
|
|
122
|
+
entries.push({
|
|
123
|
+
address: AztecAddress.fromString(identifierString),
|
|
124
|
+
selector,
|
|
125
|
+
});
|
|
126
|
+
} else {
|
|
127
|
+
entries.push({
|
|
128
|
+
classId: Fr.fromString(identifierString),
|
|
129
|
+
selector,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return entries;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function getDefaultAllowedSetupFunctions(): AllowedFunction[] {
|
|
138
|
+
return [
|
|
139
|
+
{
|
|
140
|
+
classId: getContractClassFromArtifact(SchnorrAccountContractArtifact).id,
|
|
141
|
+
selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
classId: getContractClassFromArtifact(SchnorrHardcodedAccountContractArtifact).id,
|
|
145
|
+
selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
classId: getContractClassFromArtifact(SchnorrSingleKeyAccountContractArtifact).id,
|
|
149
|
+
selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
classId: getContractClassFromArtifact(EcdsaAccountContractArtifact).id,
|
|
153
|
+
selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
// needed for private transfers via FPC
|
|
157
|
+
{
|
|
158
|
+
classId: getContractClassFromArtifact(TokenContractArtifact).id,
|
|
159
|
+
selector: FunctionSelector.fromSignature('_increase_public_balance((Field),Field)'),
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
{
|
|
163
|
+
classId: getContractClassFromArtifact(FPCContract.artifact).id,
|
|
164
|
+
selector: FunctionSelector.fromSignature('prepare_fee((Field),Field,(Field),Field)'),
|
|
165
|
+
},
|
|
166
|
+
];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function getDefaultAllowedTeardownFunctions(): AllowedFunction[] {
|
|
170
|
+
return [
|
|
171
|
+
{
|
|
172
|
+
classId: getContractClassFromArtifact(GasTokenContract.artifact).id,
|
|
173
|
+
selector: FunctionSelector.fromSignature('pay_fee(Field)'),
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
classId: getContractClassFromArtifact(FPCContract.artifact).id,
|
|
177
|
+
selector: FunctionSelector.fromSignature('pay_fee((Field),Field,(Field))'),
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
classId: getContractClassFromArtifact(FPCContract.artifact).id,
|
|
181
|
+
selector: FunctionSelector.fromSignature('pay_fee_with_shielded_rebate(Field,(Field),Field)'),
|
|
182
|
+
},
|
|
183
|
+
];
|
|
184
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AztecAddress, type EthAddress, GlobalVariables } from '@aztec/circuits.js';
|
|
1
|
+
import { type AztecAddress, type EthAddress, GasFees, GlobalVariables } from '@aztec/circuits.js';
|
|
2
2
|
import { Fr } from '@aztec/foundation/fields';
|
|
3
3
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
4
|
|
|
@@ -90,6 +90,7 @@ export class SimpleTestGlobalVariableBuilder implements GlobalVariableBuilder {
|
|
|
90
90
|
`Built global variables for block ${blockNumber}: (${chainId}, ${version}, ${blockNumber}, ${lastTimestamp}, ${coinbase}, ${feeRecipient})`,
|
|
91
91
|
);
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
const gasFees = GasFees.default();
|
|
94
|
+
return new GlobalVariables(chainId, version, blockNumber, lastTimestamp, coinbase, feeRecipient, gasFees);
|
|
94
95
|
}
|
|
95
96
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
type L1ToL2MessageSource,
|
|
3
|
+
type L2Block,
|
|
4
|
+
type L2BlockSource,
|
|
5
|
+
type ProcessedTx,
|
|
6
|
+
Tx,
|
|
7
|
+
type TxValidator,
|
|
8
|
+
} from '@aztec/circuit-types';
|
|
9
|
+
import { type AllowedFunction, type BlockProver, PROVING_STATUS } from '@aztec/circuit-types/interfaces';
|
|
3
10
|
import { type L2BlockBuiltStats } from '@aztec/circuit-types/stats';
|
|
4
11
|
import { AztecAddress, EthAddress } from '@aztec/circuits.js';
|
|
5
12
|
import { Fr } from '@aztec/foundation/fields';
|
|
@@ -7,14 +14,13 @@ import { createDebugLogger } from '@aztec/foundation/log';
|
|
|
7
14
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
8
15
|
import { Timer, elapsed } from '@aztec/foundation/timer';
|
|
9
16
|
import { type P2P } from '@aztec/p2p';
|
|
17
|
+
import { type PublicProcessorFactory } from '@aztec/simulator';
|
|
10
18
|
import { type WorldStateStatus, type WorldStateSynchronizer } from '@aztec/world-state';
|
|
11
19
|
|
|
12
20
|
import { type GlobalVariableBuilder } from '../global_variable_builder/global_builder.js';
|
|
13
21
|
import { type L1Publisher } from '../publisher/l1-publisher.js';
|
|
22
|
+
import { type TxValidatorFactory } from '../tx_validator/tx_validator_factory.js';
|
|
14
23
|
import { type SequencerConfig } from './config.js';
|
|
15
|
-
import { type PublicProcessorFactory } from './public_processor.js';
|
|
16
|
-
import { type TxValidator } from './tx_validator.js';
|
|
17
|
-
import { type TxValidatorFactory } from './tx_validator_factory.js';
|
|
18
24
|
|
|
19
25
|
/**
|
|
20
26
|
* Sequencer client
|
|
@@ -35,8 +41,8 @@ export class Sequencer {
|
|
|
35
41
|
private _feeRecipient = AztecAddress.ZERO;
|
|
36
42
|
private lastPublishedBlock = 0;
|
|
37
43
|
private state = SequencerState.STOPPED;
|
|
38
|
-
private
|
|
39
|
-
private
|
|
44
|
+
private allowedFunctionsInSetup: AllowedFunction[] = [];
|
|
45
|
+
private allowedFunctionsInTeardown: AllowedFunction[] = [];
|
|
40
46
|
|
|
41
47
|
constructor(
|
|
42
48
|
private publisher: L1Publisher,
|
|
@@ -75,11 +81,11 @@ export class Sequencer {
|
|
|
75
81
|
if (config.feeRecipient) {
|
|
76
82
|
this._feeRecipient = config.feeRecipient;
|
|
77
83
|
}
|
|
78
|
-
if (config.
|
|
79
|
-
this.
|
|
84
|
+
if (config.allowedFunctionsInSetup) {
|
|
85
|
+
this.allowedFunctionsInSetup = config.allowedFunctionsInSetup;
|
|
80
86
|
}
|
|
81
|
-
if (config.
|
|
82
|
-
this.
|
|
87
|
+
if (config.allowedFunctionsInTeardown) {
|
|
88
|
+
this.allowedFunctionsInTeardown = config.allowedFunctionsInTeardown;
|
|
83
89
|
}
|
|
84
90
|
}
|
|
85
91
|
|
|
@@ -178,14 +184,15 @@ export class Sequencer {
|
|
|
178
184
|
this._feeRecipient,
|
|
179
185
|
);
|
|
180
186
|
|
|
181
|
-
const txValidator = this.txValidatorFactory.buildTxValidator(
|
|
182
|
-
newGlobalVariables,
|
|
183
|
-
this.allowedFeePaymentContractClasses,
|
|
184
|
-
this.allowedFeePaymentContractInstances,
|
|
185
|
-
);
|
|
186
|
-
|
|
187
187
|
// TODO: It should be responsibility of the P2P layer to validate txs before passing them on here
|
|
188
|
-
const validTxs = await this.takeValidTxs(
|
|
188
|
+
const validTxs = await this.takeValidTxs(
|
|
189
|
+
pendingTxs,
|
|
190
|
+
this.txValidatorFactory.validatorForNewTxs(
|
|
191
|
+
newGlobalVariables,
|
|
192
|
+
this.allowedFunctionsInSetup,
|
|
193
|
+
this.allowedFunctionsInTeardown,
|
|
194
|
+
),
|
|
195
|
+
);
|
|
189
196
|
if (validTxs.length < this.minTxsPerBLock) {
|
|
190
197
|
return;
|
|
191
198
|
}
|
|
@@ -213,7 +220,7 @@ export class Sequencer {
|
|
|
213
220
|
const blockTicket = await this.prover.startNewBlock(blockSize, newGlobalVariables, l1ToL2Messages, emptyTx);
|
|
214
221
|
|
|
215
222
|
const [publicProcessorDuration, [processedTxs, failedTxs]] = await elapsed(() =>
|
|
216
|
-
processor.process(validTxs, blockSize, this.prover,
|
|
223
|
+
processor.process(validTxs, blockSize, this.prover, this.txValidatorFactory.validatorForProcessedTxs()),
|
|
217
224
|
);
|
|
218
225
|
if (failedTxs.length > 0) {
|
|
219
226
|
const failedTxData = failedTxs.map(fail => fail.tx);
|
|
@@ -281,7 +288,7 @@ export class Sequencer {
|
|
|
281
288
|
}
|
|
282
289
|
}
|
|
283
290
|
|
|
284
|
-
protected async takeValidTxs<T extends Tx | ProcessedTx>(txs: T[], validator: TxValidator): Promise<T[]> {
|
|
291
|
+
protected async takeValidTxs<T extends Tx | ProcessedTx>(txs: T[], validator: TxValidator<T>): Promise<T[]> {
|
|
285
292
|
const [valid, invalid] = await validator.validateTxs(txs);
|
|
286
293
|
if (invalid.length > 0) {
|
|
287
294
|
this.log.debug(`Dropping invalid txs from the p2p pool ${Tx.getHashes(invalid).join(', ')}`);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ProcessedTx, type Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
|
|
3
|
+
export class AggregateTxValidator<T extends Tx | ProcessedTx> implements TxValidator<T> {
|
|
4
|
+
#validators: TxValidator<T>[];
|
|
5
|
+
constructor(...validators: TxValidator<T>[]) {
|
|
6
|
+
if (validators.length === 0) {
|
|
7
|
+
throw new Error('At least one validator must be provided');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
this.#validators = validators;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]> {
|
|
14
|
+
const invalidTxs: T[] = [];
|
|
15
|
+
let txPool = txs;
|
|
16
|
+
for (const validator of this.#validators) {
|
|
17
|
+
const [valid, invalid] = await validator.validateTxs(txPool);
|
|
18
|
+
invalidTxs.push(...invalid);
|
|
19
|
+
txPool = valid;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return [txPool, invalidTxs];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type AnyTx, Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { Fr } from '@aztec/circuits.js';
|
|
3
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
|
+
|
|
5
|
+
export interface NullifierSource {
|
|
6
|
+
getNullifierIndex: (nullifier: Fr) => Promise<bigint | undefined>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class DoubleSpendTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
10
|
+
#log = createDebugLogger('aztec:sequencer:tx_validator:tx_double_spend');
|
|
11
|
+
#nullifierSource: NullifierSource;
|
|
12
|
+
|
|
13
|
+
constructor(nullifierSource: NullifierSource) {
|
|
14
|
+
this.#nullifierSource = nullifierSource;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]> {
|
|
18
|
+
const validTxs: T[] = [];
|
|
19
|
+
const invalidTxs: T[] = [];
|
|
20
|
+
const thisBlockNullifiers = new Set<bigint>();
|
|
21
|
+
|
|
22
|
+
for (const tx of txs) {
|
|
23
|
+
if (!(await this.#uniqueNullifiers(tx, thisBlockNullifiers))) {
|
|
24
|
+
invalidTxs.push(tx);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
validTxs.push(tx);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return [validTxs, invalidTxs];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async #uniqueNullifiers(tx: AnyTx, thisBlockNullifiers: Set<bigint>): Promise<boolean> {
|
|
35
|
+
const newNullifiers = tx.data.getNonEmptyNullifiers().map(x => x.toBigInt());
|
|
36
|
+
|
|
37
|
+
// Ditch this tx if it has repeated nullifiers
|
|
38
|
+
const uniqueNullifiers = new Set(newNullifiers);
|
|
39
|
+
if (uniqueNullifiers.size !== newNullifiers.length) {
|
|
40
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} for emitting duplicate nullifiers`);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
for (const nullifier of newNullifiers) {
|
|
45
|
+
if (thisBlockNullifiers.has(nullifier)) {
|
|
46
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} for repeating a nullifier in the same block`);
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
thisBlockNullifiers.add(nullifier);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const nullifierIndexes = await Promise.all(
|
|
54
|
+
newNullifiers.map(n => this.#nullifierSource.getNullifierIndex(new Fr(n))),
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
const hasDuplicates = nullifierIndexes.some(index => index !== undefined);
|
|
58
|
+
if (hasDuplicates) {
|
|
59
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} for repeating nullifiers present in state trees`);
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
}
|