@aztec/sequencer-client 0.55.0 → 0.56.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/index.d.ts +4 -23
- package/dest/block_builder/index.d.ts.map +1 -1
- package/dest/block_builder/index.js +3 -40
- package/dest/block_builder/light.d.ts +30 -0
- package/dest/block_builder/light.d.ts.map +1 -0
- package/dest/block_builder/light.js +65 -0
- package/dest/block_builder/orchestrator.d.ts +26 -0
- package/dest/block_builder/orchestrator.d.ts.map +1 -0
- package/dest/block_builder/orchestrator.js +40 -0
- package/dest/client/sequencer-client.d.ts +3 -3
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +3 -3
- package/dest/global_variable_builder/global_builder.d.ts +2 -1
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +1 -1
- package/dest/index.d.ts +0 -4
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -5
- package/dest/publisher/l1-publisher.d.ts +2 -1
- package/dest/publisher/l1-publisher.d.ts.map +1 -1
- package/dest/publisher/l1-publisher.js +6 -6
- package/dest/sequencer/sequencer.d.ts +5 -3
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +10 -7
- package/dest/tx_validator/gas_validator.d.ts +1 -0
- package/dest/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/tx_validator/gas_validator.js +7 -4
- package/dest/tx_validator/phases_validator.d.ts +1 -0
- package/dest/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/tx_validator/phases_validator.js +20 -20
- package/dest/tx_validator/test_utils.js +4 -4
- package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -1
- package/dest/tx_validator/tx_validator_factory.js +6 -8
- package/package.json +19 -19
- package/src/block_builder/index.ts +5 -49
- package/src/block_builder/light.ts +111 -0
- package/src/block_builder/orchestrator.ts +51 -0
- package/src/client/sequencer-client.ts +5 -5
- package/src/global_variable_builder/global_builder.ts +2 -1
- package/src/index.ts +0 -4
- package/src/publisher/l1-publisher.ts +7 -7
- package/src/sequencer/sequencer.ts +9 -8
- package/src/tx_validator/gas_validator.ts +7 -3
- package/src/tx_validator/phases_validator.ts +5 -6
- package/src/tx_validator/test_utils.ts +3 -3
- package/src/tx_validator/tx_validator_factory.ts +7 -9
- package/dest/tx_validator/aggregate_tx_validator.d.ts +0 -7
- package/dest/tx_validator/aggregate_tx_validator.d.ts.map +0 -1
- package/dest/tx_validator/aggregate_tx_validator.js +0 -23
- package/dest/tx_validator/data_validator.d.ts +0 -6
- package/dest/tx_validator/data_validator.d.ts.map +0 -1
- package/dest/tx_validator/data_validator.js +0 -47
- package/dest/tx_validator/double_spend_validator.d.ts +0 -11
- package/dest/tx_validator/double_spend_validator.d.ts.map +0 -1
- package/dest/tx_validator/double_spend_validator.js +0 -50
- package/dest/tx_validator/metadata_validator.d.ts +0 -8
- package/dest/tx_validator/metadata_validator.d.ts.map +0 -1
- package/dest/tx_validator/metadata_validator.js +0 -50
- package/src/tx_validator/aggregate_tx_validator.ts +0 -24
- package/src/tx_validator/data_validator.ts +0 -61
- package/src/tx_validator/double_spend_validator.ts +0 -63
- package/src/tx_validator/metadata_validator.ts +0 -60
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { TestCircuitProver } from '@aztec/bb-prover';
|
|
2
|
+
import {
|
|
3
|
+
type BlockSimulator,
|
|
4
|
+
type MerkleTreeOperations,
|
|
5
|
+
type ProcessedTx,
|
|
6
|
+
type ProvingTicket,
|
|
7
|
+
type SimulationBlockResult,
|
|
8
|
+
} from '@aztec/circuit-types';
|
|
9
|
+
import { type Fr, type GlobalVariables } from '@aztec/circuits.js';
|
|
10
|
+
import { ProvingOrchestrator } from '@aztec/prover-client/orchestrator';
|
|
11
|
+
import { type SimulationProvider } from '@aztec/simulator';
|
|
12
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
13
|
+
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Implements a block simulator using a test circuit prover under the hood, which just simulates circuits and outputs empty proofs.
|
|
17
|
+
* This class is temporary and should die once we switch from tx effects to tx objects submissions, since sequencers won't have
|
|
18
|
+
* the need to create L2 block headers to submit to L1. When we do that, we should also remove the references to the
|
|
19
|
+
* prover-client and bb-prover packages from this package.
|
|
20
|
+
*/
|
|
21
|
+
export class OrchestratorBlockBuilder implements BlockSimulator {
|
|
22
|
+
private orchestrator: ProvingOrchestrator;
|
|
23
|
+
constructor(db: MerkleTreeOperations, simulationProvider: SimulationProvider, telemetry: TelemetryClient) {
|
|
24
|
+
const testProver = new TestCircuitProver(telemetry, simulationProvider);
|
|
25
|
+
this.orchestrator = new ProvingOrchestrator(db, testProver, telemetry);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
startNewBlock(numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise<ProvingTicket> {
|
|
29
|
+
return this.orchestrator.startNewBlock(numTxs, globalVariables, l1ToL2Messages);
|
|
30
|
+
}
|
|
31
|
+
cancel(): void {
|
|
32
|
+
this.orchestrator.cancel();
|
|
33
|
+
}
|
|
34
|
+
finaliseBlock(): Promise<SimulationBlockResult> {
|
|
35
|
+
return this.orchestrator.finaliseBlock();
|
|
36
|
+
}
|
|
37
|
+
setBlockCompleted(): Promise<void> {
|
|
38
|
+
return this.orchestrator.setBlockCompleted();
|
|
39
|
+
}
|
|
40
|
+
addNewTx(tx: ProcessedTx): Promise<void> {
|
|
41
|
+
return this.orchestrator.addNewTx(tx);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export class OrchestratorBlockBuilderFactory {
|
|
46
|
+
constructor(private simulationProvider: SimulationProvider, private telemetry?: TelemetryClient) {}
|
|
47
|
+
|
|
48
|
+
create(db: MerkleTreeOperations): BlockSimulator {
|
|
49
|
+
return new OrchestratorBlockBuilder(db, this.simulationProvider, this.telemetry ?? new NoopTelemetryClient());
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { type L1ToL2MessageSource, type L2BlockSource } from '@aztec/circuit-types';
|
|
1
|
+
import { type L1ToL2MessageSource, type L2BlockSource, type WorldStateSynchronizer } from '@aztec/circuit-types';
|
|
2
|
+
import { type EthAddress } from '@aztec/foundation/eth-address';
|
|
2
3
|
import { type P2P } from '@aztec/p2p';
|
|
3
4
|
import { PublicProcessorFactory, type SimulationProvider } from '@aztec/simulator';
|
|
4
5
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
5
6
|
import { type ContractDataSource } from '@aztec/types/contracts';
|
|
6
7
|
import { type ValidatorClient } from '@aztec/validator-client';
|
|
7
|
-
import { type WorldStateSynchronizer } from '@aztec/world-state';
|
|
8
8
|
|
|
9
|
-
import {
|
|
9
|
+
import { LightweightBlockBuilderFactory } from '../block_builder/index.js';
|
|
10
10
|
import { type SequencerClientConfig } from '../config.js';
|
|
11
11
|
import { GlobalVariableBuilder } from '../global_variable_builder/index.js';
|
|
12
12
|
import { L1Publisher } from '../publisher/index.js';
|
|
@@ -60,7 +60,7 @@ export class SequencerClient {
|
|
|
60
60
|
globalsBuilder,
|
|
61
61
|
p2pClient,
|
|
62
62
|
worldStateSynchronizer,
|
|
63
|
-
new
|
|
63
|
+
new LightweightBlockBuilderFactory(telemetryClient),
|
|
64
64
|
l2BlockSource,
|
|
65
65
|
l1ToL2MessageSource,
|
|
66
66
|
publicProcessorFactory,
|
|
@@ -100,7 +100,7 @@ export class SequencerClient {
|
|
|
100
100
|
this.sequencer.restart();
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
get coinbase() {
|
|
103
|
+
get coinbase(): EthAddress {
|
|
104
104
|
return this.sequencer.coinbase;
|
|
105
105
|
}
|
|
106
106
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type GlobalVariableBuilder as GlobalVariableBuilderInterface } from '@aztec/circuit-types';
|
|
1
2
|
import {
|
|
2
3
|
type AztecAddress,
|
|
3
4
|
ETHEREUM_SLOT_DURATION,
|
|
@@ -24,7 +25,7 @@ import type * as chains from 'viem/chains';
|
|
|
24
25
|
/**
|
|
25
26
|
* Simple global variables builder.
|
|
26
27
|
*/
|
|
27
|
-
export class GlobalVariableBuilder {
|
|
28
|
+
export class GlobalVariableBuilder implements GlobalVariableBuilderInterface {
|
|
28
29
|
private log = createDebugLogger('aztec:sequencer:global_variable_builder');
|
|
29
30
|
|
|
30
31
|
private rollupContract: GetContractReturnType<typeof RollupAbi, PublicClient<HttpTransport, chains.Chain>>;
|
package/src/index.ts
CHANGED
|
@@ -2,10 +2,6 @@ export * from './client/index.js';
|
|
|
2
2
|
export * from './config.js';
|
|
3
3
|
export * from './publisher/index.js';
|
|
4
4
|
export * from './sequencer/index.js';
|
|
5
|
-
export * from './tx_validator/aggregate_tx_validator.js';
|
|
6
|
-
export * from './tx_validator/data_validator.js';
|
|
7
|
-
export * from './tx_validator/double_spend_validator.js';
|
|
8
|
-
export * from './tx_validator/metadata_validator.js';
|
|
9
5
|
|
|
10
6
|
// Used by the node to simulate public parts of transactions. Should these be moved to a shared library?
|
|
11
7
|
export * from './global_variable_builder/index.js';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { type L2Block, type
|
|
2
|
-
import { getHashedSignaturePayload } from '@aztec/circuit-types';
|
|
1
|
+
import { ConsensusPayload, type L2Block, type TxHash, getHashedSignaturePayload } from '@aztec/circuit-types';
|
|
3
2
|
import { type L1PublishBlockStats, type L1PublishProofStats } from '@aztec/circuit-types/stats';
|
|
4
3
|
import { ETHEREUM_SLOT_DURATION, EthAddress, type Header, type Proof } from '@aztec/circuits.js';
|
|
5
4
|
import { createEthereumChain } from '@aztec/ethereum';
|
|
5
|
+
import { type Signature } from '@aztec/foundation/eth-signature';
|
|
6
6
|
import { type Fr } from '@aztec/foundation/fields';
|
|
7
7
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
8
8
|
import { serializeToBuffer } from '@aztec/foundation/serialize';
|
|
@@ -236,7 +236,9 @@ export class L1Publisher {
|
|
|
236
236
|
blockHash: block.hash().toString(),
|
|
237
237
|
};
|
|
238
238
|
|
|
239
|
-
const
|
|
239
|
+
const consensusPayload = new ConsensusPayload(block.header, block.archive.root, txHashes ?? []);
|
|
240
|
+
|
|
241
|
+
const digest = getHashedSignaturePayload(consensusPayload);
|
|
240
242
|
const proposeTxArgs = {
|
|
241
243
|
header: block.header.toBuffer(),
|
|
242
244
|
archive: block.archive.root.toBuffer(),
|
|
@@ -255,7 +257,7 @@ export class L1Publisher {
|
|
|
255
257
|
// By simulation issue, I mean the fact that the block.timestamp is equal to the last block, not the next, which
|
|
256
258
|
// make time consistency checks break.
|
|
257
259
|
await this.validateBlockForSubmission(block.header, {
|
|
258
|
-
digest,
|
|
260
|
+
digest: digest.toBuffer(),
|
|
259
261
|
signatures: attestations ?? [],
|
|
260
262
|
});
|
|
261
263
|
|
|
@@ -405,14 +407,12 @@ export class L1Publisher {
|
|
|
405
407
|
}),
|
|
406
408
|
});
|
|
407
409
|
|
|
408
|
-
const min = (a: bigint, b: bigint) => (a > b ? b : a);
|
|
409
|
-
|
|
410
410
|
// @note We perform this guesstimate instead of the usual `gasEstimate` since
|
|
411
411
|
// viem will use the current state to simulate against, which means that
|
|
412
412
|
// we will fail estimation in the case where we are simulating for the
|
|
413
413
|
// first ethereum block within our slot (as current time is not in the
|
|
414
414
|
// slot yet).
|
|
415
|
-
const gasGuesstimate =
|
|
415
|
+
const gasGuesstimate = computeTxsEffectsHashGas + L1Publisher.PROPOSE_GAS_GUESS;
|
|
416
416
|
|
|
417
417
|
const attestations = encodedData.attestations
|
|
418
418
|
? encodedData.attestations.map(attest => attest.toViemSignature())
|
|
@@ -4,22 +4,24 @@ import {
|
|
|
4
4
|
type L2Block,
|
|
5
5
|
type L2BlockSource,
|
|
6
6
|
type ProcessedTx,
|
|
7
|
-
Signature,
|
|
8
7
|
Tx,
|
|
9
8
|
type TxHash,
|
|
10
9
|
type TxValidator,
|
|
10
|
+
type WorldStateStatus,
|
|
11
|
+
type WorldStateSynchronizer,
|
|
11
12
|
} from '@aztec/circuit-types';
|
|
12
13
|
import { type AllowedElement, BlockProofError, PROVING_STATUS } from '@aztec/circuit-types/interfaces';
|
|
13
14
|
import { type L2BlockBuiltStats } from '@aztec/circuit-types/stats';
|
|
14
15
|
import {
|
|
15
16
|
AppendOnlyTreeSnapshot,
|
|
16
|
-
AztecAddress,
|
|
17
17
|
ContentCommitment,
|
|
18
|
-
EthAddress,
|
|
19
18
|
GENESIS_ARCHIVE_ROOT,
|
|
20
19
|
Header,
|
|
21
20
|
StateReference,
|
|
22
21
|
} from '@aztec/circuits.js';
|
|
22
|
+
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
23
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
24
|
+
import { Signature } from '@aztec/foundation/eth-signature';
|
|
23
25
|
import { Fr } from '@aztec/foundation/fields';
|
|
24
26
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
25
27
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
@@ -28,7 +30,6 @@ import { type P2P } from '@aztec/p2p';
|
|
|
28
30
|
import { type PublicProcessorFactory } from '@aztec/simulator';
|
|
29
31
|
import { Attributes, type TelemetryClient, type Tracer, trackSpan } from '@aztec/telemetry-client';
|
|
30
32
|
import { type ValidatorClient } from '@aztec/validator-client';
|
|
31
|
-
import { type WorldStateStatus, type WorldStateSynchronizer } from '@aztec/world-state';
|
|
32
33
|
|
|
33
34
|
import { type BlockBuilderFactory } from '../block_builder/index.js';
|
|
34
35
|
import { type GlobalVariableBuilder } from '../global_variable_builder/global_builder.js';
|
|
@@ -442,7 +443,7 @@ export class Sequencer {
|
|
|
442
443
|
processedTxsCount: processedTxs.length,
|
|
443
444
|
})
|
|
444
445
|
) {
|
|
445
|
-
blockBuilder.
|
|
446
|
+
blockBuilder.cancel();
|
|
446
447
|
throw new Error('Should not propose the block');
|
|
447
448
|
}
|
|
448
449
|
|
|
@@ -536,7 +537,7 @@ export class Sequencer {
|
|
|
536
537
|
this.log.verbose(`Collected attestations from validators, number of attestations: ${attestations.length}`);
|
|
537
538
|
|
|
538
539
|
// note: the smart contract requires that the signatures are provided in the order of the committee
|
|
539
|
-
return
|
|
540
|
+
return orderAttestations(attestations, committee);
|
|
540
541
|
}
|
|
541
542
|
|
|
542
543
|
/**
|
|
@@ -665,12 +666,12 @@ export enum SequencerState {
|
|
|
665
666
|
*
|
|
666
667
|
* @todo: perform this logic within the memory attestation store instead?
|
|
667
668
|
*/
|
|
668
|
-
|
|
669
|
+
function orderAttestations(attestations: BlockAttestation[], orderAddresses: EthAddress[]): Signature[] {
|
|
669
670
|
// Create a map of sender addresses to BlockAttestations
|
|
670
671
|
const attestationMap = new Map<string, BlockAttestation>();
|
|
671
672
|
|
|
672
673
|
for (const attestation of attestations) {
|
|
673
|
-
const sender =
|
|
674
|
+
const sender = attestation.getSender();
|
|
674
675
|
if (sender) {
|
|
675
676
|
attestationMap.set(sender.toString(), attestation);
|
|
676
677
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PublicKernelPhase, type Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
2
|
import { type AztecAddress, type Fr } from '@aztec/circuits.js';
|
|
3
3
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { FeeJuiceArtifact } from '@aztec/protocol-contracts/fee-juice';
|
|
5
|
-
import {
|
|
5
|
+
import { EnqueuedCallsProcessor, computeFeePayerBalanceStorageSlot } from '@aztec/simulator';
|
|
6
6
|
|
|
7
7
|
/** Provides a view into public contract state */
|
|
8
8
|
export interface PublicStateSource {
|
|
@@ -34,6 +34,10 @@ export class GasTxValidator implements TxValidator<Tx> {
|
|
|
34
34
|
return [validTxs, invalidTxs];
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
validateTx(tx: Tx): Promise<boolean> {
|
|
38
|
+
return this.#validateTxFee(tx);
|
|
39
|
+
}
|
|
40
|
+
|
|
37
41
|
async #validateTxFee(tx: Tx): Promise<boolean> {
|
|
38
42
|
const feePayer = tx.data.feePayer;
|
|
39
43
|
// TODO(@spalladino) Eventually remove the is_zero condition as we should always charge fees to every tx
|
|
@@ -55,7 +59,7 @@ export class GasTxValidator implements TxValidator<Tx> {
|
|
|
55
59
|
);
|
|
56
60
|
|
|
57
61
|
// If there is a claim in this tx that increases the fee payer balance in Fee Juice, add it to balance
|
|
58
|
-
const
|
|
62
|
+
const setupFns = EnqueuedCallsProcessor.getExecutionRequestsByPhase(tx, PublicKernelPhase.SETUP);
|
|
59
63
|
const claimFunctionCall = setupFns.find(
|
|
60
64
|
fn =>
|
|
61
65
|
fn.contractAddress.equals(this.#feeJuiceAddress) &&
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type AllowedElement,
|
|
3
3
|
type PublicExecutionRequest,
|
|
4
|
-
|
|
4
|
+
PublicKernelPhase,
|
|
5
5
|
Tx,
|
|
6
6
|
type TxValidator,
|
|
7
7
|
} from '@aztec/circuit-types';
|
|
8
8
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
9
|
-
import {
|
|
9
|
+
import { ContractsDataSourcePublicDB, EnqueuedCallsProcessor } from '@aztec/simulator';
|
|
10
10
|
import { type ContractDataSource } from '@aztec/types/contracts';
|
|
11
11
|
|
|
12
12
|
export class PhasesTxValidator implements TxValidator<Tx> {
|
|
@@ -27,7 +27,7 @@ export class PhasesTxValidator implements TxValidator<Tx> {
|
|
|
27
27
|
// which is what we're trying to do as part of the current txs.
|
|
28
28
|
await this.contractDataSource.addNewContracts(tx);
|
|
29
29
|
|
|
30
|
-
if (await this
|
|
30
|
+
if (await this.validateTx(tx)) {
|
|
31
31
|
validTxs.push(tx);
|
|
32
32
|
} else {
|
|
33
33
|
invalidTxs.push(tx);
|
|
@@ -39,14 +39,13 @@ export class PhasesTxValidator implements TxValidator<Tx> {
|
|
|
39
39
|
return Promise.resolve([validTxs, invalidTxs]);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
async
|
|
42
|
+
async validateTx(tx: Tx): Promise<boolean> {
|
|
43
43
|
if (!tx.data.forPublic) {
|
|
44
44
|
this.#log.debug(`Tx ${Tx.getHash(tx)} does not contain enqueued public functions. Skipping phases validation.`);
|
|
45
45
|
return true;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
const
|
|
49
|
-
|
|
48
|
+
const setupFns = EnqueuedCallsProcessor.getExecutionRequestsByPhase(tx, PublicKernelPhase.SETUP);
|
|
50
49
|
for (const setupFn of setupFns) {
|
|
51
50
|
if (!(await this.isOnAllowList(setupFn, this.setupAllowList))) {
|
|
52
51
|
this.#log.warn(
|
|
@@ -32,9 +32,9 @@ function patchFn(
|
|
|
32
32
|
tx.enqueuedPublicFunctionCalls[index] = fn;
|
|
33
33
|
|
|
34
34
|
const request = tx.data.forPublic![where].publicCallStack[index];
|
|
35
|
-
request.
|
|
36
|
-
request.
|
|
37
|
-
request.
|
|
35
|
+
request.contractAddress = fn.contractAddress;
|
|
36
|
+
request.callContext = fn.callContext;
|
|
37
|
+
request.argsHash = computeVarArgsHash(fn.args);
|
|
38
38
|
tx.data.forPublic![where].publicCallStack[index] = request;
|
|
39
39
|
|
|
40
40
|
return {
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import { type AllowedElement, type ProcessedTx, type Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
2
|
import { type GlobalVariables } from '@aztec/circuits.js';
|
|
3
|
+
import { AggregateTxValidator, DataTxValidator, DoubleSpendTxValidator, MetadataTxValidator } from '@aztec/p2p';
|
|
3
4
|
import { FeeJuiceAddress } from '@aztec/protocol-contracts/fee-juice';
|
|
4
|
-
import { WorldStateDB
|
|
5
|
+
import { WorldStateDB } from '@aztec/simulator';
|
|
5
6
|
import { type ContractDataSource } from '@aztec/types/contracts';
|
|
6
7
|
import { type MerkleTreeOperations } from '@aztec/world-state';
|
|
7
8
|
|
|
8
|
-
import { AggregateTxValidator } from './aggregate_tx_validator.js';
|
|
9
|
-
import { DataTxValidator } from './data_validator.js';
|
|
10
|
-
import { DoubleSpendTxValidator } from './double_spend_validator.js';
|
|
11
9
|
import { GasTxValidator } from './gas_validator.js';
|
|
12
|
-
import { MetadataTxValidator } from './metadata_validator.js';
|
|
13
10
|
import { PhasesTxValidator } from './phases_validator.js';
|
|
14
11
|
|
|
15
12
|
export class TxValidatorFactory {
|
|
@@ -20,16 +17,17 @@ export class TxValidatorFactory {
|
|
|
20
17
|
) {}
|
|
21
18
|
|
|
22
19
|
validatorForNewTxs(globalVariables: GlobalVariables, setupAllowList: AllowedElement[]): TxValidator<Tx> {
|
|
20
|
+
const worldStateDB = new WorldStateDB(this.merkleTreeDb, this.contractDataSource);
|
|
23
21
|
return new AggregateTxValidator(
|
|
24
22
|
new DataTxValidator(),
|
|
25
|
-
new MetadataTxValidator(globalVariables),
|
|
26
|
-
new DoubleSpendTxValidator(
|
|
23
|
+
new MetadataTxValidator(globalVariables.chainId, globalVariables.blockNumber),
|
|
24
|
+
new DoubleSpendTxValidator(worldStateDB),
|
|
27
25
|
new PhasesTxValidator(this.contractDataSource, setupAllowList),
|
|
28
|
-
new GasTxValidator(
|
|
26
|
+
new GasTxValidator(worldStateDB, FeeJuiceAddress, this.enforceFees),
|
|
29
27
|
);
|
|
30
28
|
}
|
|
31
29
|
|
|
32
30
|
validatorForProcessedTxs(): TxValidator<ProcessedTx> {
|
|
33
|
-
return new DoubleSpendTxValidator(new WorldStateDB(this.merkleTreeDb));
|
|
31
|
+
return new DoubleSpendTxValidator(new WorldStateDB(this.merkleTreeDb, this.contractDataSource));
|
|
34
32
|
}
|
|
35
33
|
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { type ProcessedTx, type Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
-
export declare class AggregateTxValidator<T extends Tx | ProcessedTx> implements TxValidator<T> {
|
|
3
|
-
#private;
|
|
4
|
-
constructor(...validators: TxValidator<T>[]);
|
|
5
|
-
validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]>;
|
|
6
|
-
}
|
|
7
|
-
//# sourceMappingURL=aggregate_tx_validator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate_tx_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/aggregate_tx_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnF,qBAAa,oBAAoB,CAAC,CAAC,SAAS,EAAE,GAAG,WAAW,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAEzE,GAAG,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE;IAQrC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;CAWvE"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
var _AggregateTxValidator_validators;
|
|
2
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
export class AggregateTxValidator {
|
|
4
|
-
constructor(...validators) {
|
|
5
|
-
_AggregateTxValidator_validators.set(this, void 0);
|
|
6
|
-
if (validators.length === 0) {
|
|
7
|
-
throw new Error('At least one validator must be provided');
|
|
8
|
-
}
|
|
9
|
-
__classPrivateFieldSet(this, _AggregateTxValidator_validators, validators, "f");
|
|
10
|
-
}
|
|
11
|
-
async validateTxs(txs) {
|
|
12
|
-
const invalidTxs = [];
|
|
13
|
-
let txPool = txs;
|
|
14
|
-
for (const validator of __classPrivateFieldGet(this, _AggregateTxValidator_validators, "f")) {
|
|
15
|
-
const [valid, invalid] = await validator.validateTxs(txPool);
|
|
16
|
-
invalidTxs.push(...invalid);
|
|
17
|
-
txPool = valid;
|
|
18
|
-
}
|
|
19
|
-
return [txPool, invalidTxs];
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
_AggregateTxValidator_validators = new WeakMap();
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlX3R4X3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvYWdncmVnYXRlX3R4X3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLE1BQU0sT0FBTyxvQkFBb0I7SUFFL0IsWUFBWSxHQUFHLFVBQTRCO1FBRDNDLG1EQUE4QjtRQUU1QixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCx1QkFBQSxJQUFJLG9DQUFlLFVBQVUsTUFBQSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQVE7UUFDeEIsTUFBTSxVQUFVLEdBQVEsRUFBRSxDQUFDO1FBQzNCLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNqQixLQUFLLE1BQU0sU0FBUyxJQUFJLHVCQUFBLElBQUksd0NBQVksRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztZQUM1QixNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRiJ9
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/data_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAG5D,qBAAa,eAAgB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAGrD,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;CAsDpE"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
var _DataTxValidator_instances, _DataTxValidator_log, _DataTxValidator_hasCorrectExecutionRequests;
|
|
2
|
-
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { Tx } from '@aztec/circuit-types';
|
|
4
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
-
export class DataTxValidator {
|
|
6
|
-
constructor() {
|
|
7
|
-
_DataTxValidator_instances.add(this);
|
|
8
|
-
_DataTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_data'));
|
|
9
|
-
// TODO: Check logs.
|
|
10
|
-
}
|
|
11
|
-
validateTxs(txs) {
|
|
12
|
-
const validTxs = [];
|
|
13
|
-
const invalidTxs = [];
|
|
14
|
-
for (const tx of txs) {
|
|
15
|
-
if (!__classPrivateFieldGet(this, _DataTxValidator_instances, "m", _DataTxValidator_hasCorrectExecutionRequests).call(this, tx)) {
|
|
16
|
-
invalidTxs.push(tx);
|
|
17
|
-
continue;
|
|
18
|
-
}
|
|
19
|
-
validTxs.push(tx);
|
|
20
|
-
}
|
|
21
|
-
return Promise.resolve([validTxs, invalidTxs]);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
_DataTxValidator_log = new WeakMap(), _DataTxValidator_instances = new WeakSet(), _DataTxValidator_hasCorrectExecutionRequests = function _DataTxValidator_hasCorrectExecutionRequests(tx) {
|
|
25
|
-
const callRequests = [
|
|
26
|
-
...tx.data.getRevertiblePublicCallRequests(),
|
|
27
|
-
...tx.data.getNonRevertiblePublicCallRequests(),
|
|
28
|
-
];
|
|
29
|
-
if (callRequests.length !== tx.enqueuedPublicFunctionCalls.length) {
|
|
30
|
-
__classPrivateFieldGet(this, _DataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because of mismatch number of execution requests for public calls. Expected ${callRequests.length}. Got ${tx.enqueuedPublicFunctionCalls.length}.`);
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
const invalidExecutionRequestIndex = tx.enqueuedPublicFunctionCalls.findIndex((execRequest, i) => !execRequest.isForCallRequest(callRequests[i]));
|
|
34
|
-
if (invalidExecutionRequestIndex !== -1) {
|
|
35
|
-
__classPrivateFieldGet(this, _DataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because of incorrect execution requests for public call at index ${invalidExecutionRequestIndex}.`);
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
const teardownCallRequest = tx.data.getTeardownPublicCallRequest();
|
|
39
|
-
const isInvalidTeardownExecutionRequest = (!teardownCallRequest && !tx.publicTeardownFunctionCall.isEmpty()) ||
|
|
40
|
-
(teardownCallRequest && !tx.publicTeardownFunctionCall.isForCallRequest(teardownCallRequest));
|
|
41
|
-
if (isInvalidTeardownExecutionRequest) {
|
|
42
|
-
__classPrivateFieldGet(this, _DataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because of incorrect teardown execution requests.`);
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
return true;
|
|
46
|
-
};
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV92YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfdmFsaWRhdG9yL2RhdGFfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLEVBQUUsRUFBb0IsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxNQUFNLE9BQU8sZUFBZTtJQUE1Qjs7UUFDRSwrQkFBTyxpQkFBaUIsQ0FBQyxzQ0FBc0MsQ0FBQyxFQUFDO1FBdURqRSxvQkFBb0I7SUFDdEIsQ0FBQztJQXREQyxXQUFXLENBQUMsR0FBUztRQUNuQixNQUFNLFFBQVEsR0FBUyxFQUFFLENBQUM7UUFDMUIsTUFBTSxVQUFVLEdBQVMsRUFBRSxDQUFDO1FBQzVCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLHVCQUFBLElBQUksZ0ZBQTZCLE1BQWpDLElBQUksRUFBOEIsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEIsU0FBUztZQUNYLENBQUM7WUFFRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBeUNGO3VMQXZDOEIsRUFBTTtJQUNqQyxNQUFNLFlBQVksR0FBRztRQUNuQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUU7UUFDNUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxFQUFFO0tBQ2hELENBQUM7SUFDRixJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xFLHVCQUFBLElBQUksNEJBQUssQ0FBQyxJQUFJLENBQ1osZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGdGQUM1QixZQUFZLENBQUMsTUFDZixTQUFTLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLEdBQUcsQ0FDbEQsQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FDM0UsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDbkUsQ0FBQztJQUNGLElBQUksNEJBQTRCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4Qyx1QkFBQSxJQUFJLDRCQUFLLENBQUMsSUFBSSxDQUNaLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUN4QixFQUFFLENBQ0gscUVBQXFFLDRCQUE0QixHQUFHLENBQ3RHLENBQUM7UUFDRixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztJQUNuRSxNQUFNLGlDQUFpQyxHQUNyQyxDQUFDLENBQUMsbUJBQW1CLElBQUksQ0FBQyxFQUFFLENBQUMsMEJBQTBCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEUsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDaEcsSUFBSSxpQ0FBaUMsRUFBRSxDQUFDO1FBQ3RDLHVCQUFBLElBQUksNEJBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDbkcsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIn0=
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { type AnyTx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
-
import { Fr } from '@aztec/circuits.js';
|
|
3
|
-
export interface NullifierSource {
|
|
4
|
-
getNullifierIndex: (nullifier: Fr) => Promise<bigint | undefined>;
|
|
5
|
-
}
|
|
6
|
-
export declare class DoubleSpendTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
7
|
-
#private;
|
|
8
|
-
constructor(nullifierSource: NullifierSource);
|
|
9
|
-
validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]>;
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=double_spend_validator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"double_spend_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/double_spend_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAGxC,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACnE;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAIhE,eAAe,EAAE,eAAe;IAItC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;CA8CvE"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
var _DoubleSpendTxValidator_instances, _DoubleSpendTxValidator_log, _DoubleSpendTxValidator_nullifierSource, _DoubleSpendTxValidator_uniqueNullifiers;
|
|
2
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
import { Tx } from '@aztec/circuit-types';
|
|
4
|
-
import { Fr } from '@aztec/circuits.js';
|
|
5
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
|
-
export class DoubleSpendTxValidator {
|
|
7
|
-
constructor(nullifierSource) {
|
|
8
|
-
_DoubleSpendTxValidator_instances.add(this);
|
|
9
|
-
_DoubleSpendTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_double_spend'));
|
|
10
|
-
_DoubleSpendTxValidator_nullifierSource.set(this, void 0);
|
|
11
|
-
__classPrivateFieldSet(this, _DoubleSpendTxValidator_nullifierSource, nullifierSource, "f");
|
|
12
|
-
}
|
|
13
|
-
async validateTxs(txs) {
|
|
14
|
-
const validTxs = [];
|
|
15
|
-
const invalidTxs = [];
|
|
16
|
-
const thisBlockNullifiers = new Set();
|
|
17
|
-
for (const tx of txs) {
|
|
18
|
-
if (!(await __classPrivateFieldGet(this, _DoubleSpendTxValidator_instances, "m", _DoubleSpendTxValidator_uniqueNullifiers).call(this, tx, thisBlockNullifiers))) {
|
|
19
|
-
invalidTxs.push(tx);
|
|
20
|
-
continue;
|
|
21
|
-
}
|
|
22
|
-
validTxs.push(tx);
|
|
23
|
-
}
|
|
24
|
-
return [validTxs, invalidTxs];
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
_DoubleSpendTxValidator_log = new WeakMap(), _DoubleSpendTxValidator_nullifierSource = new WeakMap(), _DoubleSpendTxValidator_instances = new WeakSet(), _DoubleSpendTxValidator_uniqueNullifiers = async function _DoubleSpendTxValidator_uniqueNullifiers(tx, thisBlockNullifiers) {
|
|
28
|
-
const nullifiers = tx.data.getNonEmptyNullifiers().map(x => x.toBigInt());
|
|
29
|
-
// Ditch this tx if it has repeated nullifiers
|
|
30
|
-
const uniqueNullifiers = new Set(nullifiers);
|
|
31
|
-
if (uniqueNullifiers.size !== nullifiers.length) {
|
|
32
|
-
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for emitting duplicate nullifiers`);
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
for (const nullifier of nullifiers) {
|
|
36
|
-
if (thisBlockNullifiers.has(nullifier)) {
|
|
37
|
-
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating a nullifier in the same block`);
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
thisBlockNullifiers.add(nullifier);
|
|
41
|
-
}
|
|
42
|
-
const nullifierIndexes = await Promise.all(nullifiers.map(n => __classPrivateFieldGet(this, _DoubleSpendTxValidator_nullifierSource, "f").getNullifierIndex(new Fr(n))));
|
|
43
|
-
const hasDuplicates = nullifierIndexes.some(index => index !== undefined);
|
|
44
|
-
if (hasDuplicates) {
|
|
45
|
-
__classPrivateFieldGet(this, _DoubleSpendTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating nullifiers present in state trees`);
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
return true;
|
|
49
|
-
};
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG91YmxlX3NwZW5kX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvZG91YmxlX3NwZW5kX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBYyxFQUFFLEVBQW9CLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBTTFELE1BQU0sT0FBTyxzQkFBc0I7SUFJakMsWUFBWSxlQUFnQzs7UUFINUMsc0NBQU8saUJBQWlCLENBQUMsOENBQThDLENBQUMsRUFBQztRQUN6RSwwREFBa0M7UUFHaEMsdUJBQUEsSUFBSSwyQ0FBb0IsZUFBZSxNQUFBLENBQUM7SUFDMUMsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBUTtRQUN4QixNQUFNLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFDekIsTUFBTSxVQUFVLEdBQVEsRUFBRSxDQUFDO1FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUU5QyxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxDQUFDLE1BQU0sdUJBQUEsSUFBSSxtRkFBa0IsTUFBdEIsSUFBSSxFQUFtQixFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdELFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BCLFNBQVM7WUFDWCxDQUFDO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBK0JGO29NQTdCQyxLQUFLLG1EQUFtQixFQUFTLEVBQUUsbUJBQWdDO0lBQ2pFLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUUxRSw4Q0FBOEM7SUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxJQUFJLGdCQUFnQixDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEQsdUJBQUEsSUFBSSxtQ0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUNuRixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLElBQUksbUJBQW1CLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDdkMsdUJBQUEsSUFBSSxtQ0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUM3RixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyx1QkFBQSxJQUFJLCtDQUFpQixDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXBILE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQztJQUMxRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLHVCQUFBLElBQUksbUNBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDakcsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIn0=
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type AnyTx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
-
import { type GlobalVariables } from '@aztec/circuits.js';
|
|
3
|
-
export declare class MetadataTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
4
|
-
#private;
|
|
5
|
-
constructor(globalVariables: GlobalVariables);
|
|
6
|
-
validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]>;
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=metadata_validator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metadata_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/metadata_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,qBAAa,mBAAmB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAI7D,eAAe,EAAE,eAAe;IAI5C,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;CA+CjE"}
|
|
@@ -1,50 +0,0 @@
|
|
|
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==
|
|
@@ -1,24 +0,0 @@
|
|
|
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
|
-
}
|