@aztec/sequencer-client 0.30.1 → 0.32.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.
Files changed (111) hide show
  1. package/dest/client/sequencer-client.d.ts +5 -1
  2. package/dest/client/sequencer-client.d.ts.map +1 -1
  3. package/dest/client/sequencer-client.js +7 -35
  4. package/dest/config.d.ts.map +1 -1
  5. package/dest/config.js +7 -3
  6. package/dest/index.d.ts +0 -7
  7. package/dest/index.d.ts.map +1 -1
  8. package/dest/index.js +1 -8
  9. package/dest/publisher/viem-tx-sender.d.ts.map +1 -1
  10. package/dest/publisher/viem-tx-sender.js +2 -3
  11. package/dest/sequencer/abstract_phase_manager.d.ts +3 -5
  12. package/dest/sequencer/abstract_phase_manager.d.ts.map +1 -1
  13. package/dest/sequencer/abstract_phase_manager.js +13 -17
  14. package/dest/sequencer/app_logic_phase_manager.d.ts +1 -3
  15. package/dest/sequencer/app_logic_phase_manager.d.ts.map +1 -1
  16. package/dest/sequencer/app_logic_phase_manager.js +3 -4
  17. package/dest/sequencer/phase_manager_factory.d.ts +2 -3
  18. package/dest/sequencer/phase_manager_factory.d.ts.map +1 -1
  19. package/dest/sequencer/phase_manager_factory.js +9 -9
  20. package/dest/sequencer/public_processor.d.ts +4 -9
  21. package/dest/sequencer/public_processor.d.ts.map +1 -1
  22. package/dest/sequencer/public_processor.js +9 -12
  23. package/dest/sequencer/sequencer.d.ts +8 -6
  24. package/dest/sequencer/sequencer.d.ts.map +1 -1
  25. package/dest/sequencer/sequencer.js +24 -23
  26. package/dest/sequencer/setup_phase_manager.d.ts +1 -3
  27. package/dest/sequencer/setup_phase_manager.d.ts.map +1 -1
  28. package/dest/sequencer/setup_phase_manager.js +3 -4
  29. package/dest/sequencer/tail_phase_manager.d.ts +1 -3
  30. package/dest/sequencer/tail_phase_manager.d.ts.map +1 -1
  31. package/dest/sequencer/tail_phase_manager.js +3 -4
  32. package/dest/sequencer/teardown_phase_manager.d.ts +1 -3
  33. package/dest/sequencer/teardown_phase_manager.d.ts.map +1 -1
  34. package/dest/sequencer/teardown_phase_manager.js +3 -4
  35. package/dest/sequencer/tx_validator.d.ts +9 -3
  36. package/dest/sequencer/tx_validator.d.ts.map +1 -1
  37. package/dest/sequencer/tx_validator.js +68 -20
  38. package/dest/sequencer/tx_validator_factory.d.ts +12 -0
  39. package/dest/sequencer/tx_validator_factory.d.ts.map +1 -0
  40. package/dest/sequencer/tx_validator_factory.js +17 -0
  41. package/dest/simulator/index.d.ts +1 -37
  42. package/dest/simulator/index.d.ts.map +1 -1
  43. package/dest/simulator/index.js +2 -2
  44. package/dest/simulator/public_executor.d.ts +3 -4
  45. package/dest/simulator/public_executor.d.ts.map +1 -1
  46. package/dest/simulator/public_executor.js +27 -18
  47. package/dest/simulator/public_kernel.d.ts +1 -1
  48. package/dest/simulator/public_kernel.d.ts.map +1 -1
  49. package/dest/simulator/public_kernel.js +2 -2
  50. package/package.json +13 -13
  51. package/src/client/sequencer-client.ts +10 -49
  52. package/src/config.ts +7 -1
  53. package/src/index.ts +0 -9
  54. package/src/publisher/viem-tx-sender.ts +1 -2
  55. package/src/sequencer/abstract_phase_manager.ts +17 -19
  56. package/src/sequencer/app_logic_phase_manager.ts +1 -3
  57. package/src/sequencer/phase_manager_factory.ts +0 -9
  58. package/src/sequencer/public_processor.ts +14 -19
  59. package/src/sequencer/sequencer.ts +25 -25
  60. package/src/sequencer/setup_phase_manager.ts +1 -3
  61. package/src/sequencer/tail_phase_manager.ts +1 -3
  62. package/src/sequencer/teardown_phase_manager.ts +1 -3
  63. package/src/sequencer/tx_validator.ts +94 -26
  64. package/src/sequencer/tx_validator_factory.ts +32 -0
  65. package/src/simulator/index.ts +0 -45
  66. package/src/simulator/public_executor.ts +33 -22
  67. package/src/simulator/public_kernel.ts +2 -2
  68. package/dest/block_builder/index.d.ts +0 -19
  69. package/dest/block_builder/index.d.ts.map +0 -1
  70. package/dest/block_builder/index.js +0 -2
  71. package/dest/block_builder/solo_block_builder.d.ts +0 -78
  72. package/dest/block_builder/solo_block_builder.d.ts.map +0 -1
  73. package/dest/block_builder/solo_block_builder.js +0 -489
  74. package/dest/block_builder/types.d.ts +0 -10
  75. package/dest/block_builder/types.d.ts.map +0 -1
  76. package/dest/block_builder/types.js +0 -2
  77. package/dest/mocks/verification_keys.d.ts +0 -28
  78. package/dest/mocks/verification_keys.d.ts.map +0 -1
  79. package/dest/mocks/verification_keys.js +0 -14
  80. package/dest/prover/empty.d.ts +0 -53
  81. package/dest/prover/empty.d.ts.map +0 -1
  82. package/dest/prover/empty.js +0 -75
  83. package/dest/prover/index.d.ts +0 -52
  84. package/dest/prover/index.d.ts.map +0 -1
  85. package/dest/prover/index.js +0 -2
  86. package/dest/sequencer/processed_tx.d.ts +0 -81
  87. package/dest/sequencer/processed_tx.d.ts.map +0 -1
  88. package/dest/sequencer/processed_tx.js +0 -98
  89. package/dest/simulator/acvm_native.d.ts +0 -20
  90. package/dest/simulator/acvm_native.d.ts.map +0 -1
  91. package/dest/simulator/acvm_native.js +0 -96
  92. package/dest/simulator/acvm_wasm.d.ts +0 -7
  93. package/dest/simulator/acvm_wasm.d.ts.map +0 -1
  94. package/dest/simulator/acvm_wasm.js +0 -23
  95. package/dest/simulator/rollup.d.ts +0 -43
  96. package/dest/simulator/rollup.d.ts.map +0 -1
  97. package/dest/simulator/rollup.js +0 -78
  98. package/dest/simulator/simulation_provider.d.ts +0 -9
  99. package/dest/simulator/simulation_provider.d.ts.map +0 -1
  100. package/dest/simulator/simulation_provider.js +0 -2
  101. package/src/block_builder/index.ts +0 -20
  102. package/src/block_builder/solo_block_builder.ts +0 -812
  103. package/src/block_builder/types.ts +0 -8
  104. package/src/mocks/verification_keys.ts +0 -36
  105. package/src/prover/empty.ts +0 -97
  106. package/src/prover/index.ts +0 -70
  107. package/src/sequencer/processed_tx.ts +0 -210
  108. package/src/simulator/acvm_native.ts +0 -112
  109. package/src/simulator/acvm_wasm.ts +0 -31
  110. package/src/simulator/rollup.ts +0 -127
  111. package/src/simulator/simulation_provider.ts +0 -10
@@ -1,11 +1,11 @@
1
- import { Tx } from '@aztec/circuit-types';
2
- import { AztecAddress, EthAddress, Fr, GlobalVariables } from '@aztec/circuits.js';
1
+ import { ProcessedTx, Tx } from '@aztec/circuit-types';
2
+ import { AztecAddress, EthAddress, Fr, GlobalVariables, PublicCallRequest } from '@aztec/circuits.js';
3
3
  import { pedersenHash } from '@aztec/foundation/crypto';
4
4
  import { Logger, createDebugLogger } from '@aztec/foundation/log';
5
5
  import { getCanonicalGasTokenAddress } from '@aztec/protocol-contracts/gas-token';
6
+ import { ContractDataSource } from '@aztec/types/contracts';
6
7
 
7
8
  import { AbstractPhaseManager, PublicKernelPhase } from './abstract_phase_manager.js';
8
- import { ProcessedTx } from './processed_tx.js';
9
9
 
10
10
  /** A source of what nullifiers have been committed to the state trees */
11
11
  export interface NullifierSource {
@@ -28,25 +28,33 @@ type TxValidationStatus = typeof VALID_TX | typeof INVALID_TX;
28
28
  // the storage slot associated with "storage.balances"
29
29
  const GAS_TOKEN_BALANCES_SLOT = new Fr(1);
30
30
 
31
+ type FeeValidationConfig = {
32
+ gasPortalAddress: EthAddress;
33
+ allowedFeePaymentContractClasses: Fr[];
34
+ allowedFeePaymentContractInstances: AztecAddress[];
35
+ };
36
+
31
37
  export class TxValidator {
32
38
  #log: Logger;
33
39
  #globalVariables: GlobalVariables;
34
40
  #nullifierSource: NullifierSource;
35
41
  #publicStateSource: PublicStateSource;
36
- #gasPortalAddress: EthAddress;
42
+ #contractDataSource: ContractDataSource;
43
+ #feeValidationConfig: FeeValidationConfig;
37
44
 
38
45
  constructor(
39
46
  nullifierSource: NullifierSource,
40
47
  publicStateSource: PublicStateSource,
41
- gasPortalAddress: EthAddress,
48
+ contractDataSource: ContractDataSource,
42
49
  globalVariables: GlobalVariables,
50
+ feeValidationConfig: FeeValidationConfig,
43
51
  log = createDebugLogger('aztec:sequencer:tx_validator'),
44
52
  ) {
45
53
  this.#nullifierSource = nullifierSource;
46
- this.#globalVariables = globalVariables;
47
54
  this.#publicStateSource = publicStateSource;
48
- this.#gasPortalAddress = gasPortalAddress;
49
-
55
+ this.#contractDataSource = contractDataSource;
56
+ this.#globalVariables = globalVariables;
57
+ this.#feeValidationConfig = feeValidationConfig;
50
58
  this.#log = log;
51
59
  }
52
60
 
@@ -72,7 +80,18 @@ export class TxValidator {
72
80
  }
73
81
 
74
82
  // skip already processed transactions
75
- if (tx instanceof Tx && (await this.#validateFee(tx)) === INVALID_TX) {
83
+ if (tx instanceof Tx) {
84
+ if ((await this.#validateFee(tx)) === INVALID_TX) {
85
+ invalidTxs.push(tx);
86
+ continue;
87
+ }
88
+ if ((await this.#validateGasBalance(tx)) === INVALID_TX) {
89
+ invalidTxs.push(tx);
90
+ continue;
91
+ }
92
+ }
93
+
94
+ if (this.#validateMaxBlockNumber(tx) === INVALID_TX) {
76
95
  invalidTxs.push(tx);
77
96
  continue;
78
97
  }
@@ -146,30 +165,17 @@ export class TxValidator {
146
165
  return VALID_TX;
147
166
  }
148
167
 
149
- async #validateFee(tx: Tx): Promise<TxValidationStatus> {
168
+ async #validateGasBalance(tx: Tx): Promise<TxValidationStatus> {
150
169
  if (!tx.data.needsTeardown) {
151
- // TODO check if fees are mandatory and reject this tx
152
- this.#log.debug(`Tx ${Tx.getHash(tx)} doesn't pay for gas`);
153
170
  return VALID_TX;
154
171
  }
155
172
 
156
- const {
157
- // TODO what if there's more than one function call?
158
- // if we're to enshrine that teardown = 1 function call, then we should turn this into a single function call
159
- [PublicKernelPhase.TEARDOWN]: [teardownFn],
160
- } = AbstractPhaseManager.extractEnqueuedPublicCallsByPhase(tx.data, tx.enqueuedPublicFunctionCalls);
161
-
162
- if (!teardownFn) {
163
- this.#log.warn(
164
- `Rejecting tx ${Tx.getHash(tx)} because it should pay for gas but has no enqueued teardown function call`,
165
- );
166
- return INVALID_TX;
167
- }
173
+ const teardownFn = TxValidator.#extractFeeExecutionCall(tx)!;
168
174
 
169
175
  // TODO(#1204) if a generator index is used for the derived storage slot of a map, update it here as well
170
- const slot = pedersenHash([GAS_TOKEN_BALANCES_SLOT.toBuffer(), teardownFn.callContext.msgSender.toBuffer()]);
176
+ const slot = pedersenHash([GAS_TOKEN_BALANCES_SLOT, teardownFn.callContext.msgSender]);
171
177
  const gasBalance = await this.#publicStateSource.storageRead(
172
- getCanonicalGasTokenAddress(this.#gasPortalAddress),
178
+ getCanonicalGasTokenAddress(this.#feeValidationConfig.gasPortalAddress),
173
179
  slot,
174
180
  );
175
181
 
@@ -186,4 +192,66 @@ export class TxValidator {
186
192
 
187
193
  return VALID_TX;
188
194
  }
195
+
196
+ #validateMaxBlockNumber(tx: Tx | ProcessedTx): TxValidationStatus {
197
+ const maxBlockNumber = tx.data.rollupValidationRequests.maxBlockNumber;
198
+
199
+ if (maxBlockNumber.isSome && maxBlockNumber.value < this.#globalVariables.blockNumber) {
200
+ this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} for low max block number`);
201
+ return INVALID_TX;
202
+ } else {
203
+ return VALID_TX;
204
+ }
205
+ }
206
+
207
+ async #validateFee(tx: Tx): Promise<TxValidationStatus> {
208
+ if (!tx.data.needsTeardown) {
209
+ // TODO check if fees are mandatory and reject this tx
210
+ this.#log.debug(`Tx ${Tx.getHash(tx)} doesn't pay for gas`);
211
+ return VALID_TX;
212
+ }
213
+
214
+ const teardownFn = TxValidator.#extractFeeExecutionCall(tx);
215
+ if (!teardownFn) {
216
+ this.#log.warn(
217
+ `Rejecting tx ${Tx.getHash(tx)} because it should pay for gas but has no enqueued teardown function call`,
218
+ );
219
+ return INVALID_TX;
220
+ }
221
+
222
+ const fpcAddress = teardownFn.contractAddress;
223
+ const contractClass = await this.#contractDataSource.getContract(fpcAddress);
224
+
225
+ if (!contractClass) {
226
+ return INVALID_TX;
227
+ }
228
+
229
+ if (fpcAddress.equals(getCanonicalGasTokenAddress(this.#feeValidationConfig.gasPortalAddress))) {
230
+ return VALID_TX;
231
+ }
232
+
233
+ for (const allowedContract of this.#feeValidationConfig.allowedFeePaymentContractInstances) {
234
+ if (fpcAddress.equals(allowedContract)) {
235
+ return VALID_TX;
236
+ }
237
+ }
238
+
239
+ for (const allowedContractClass of this.#feeValidationConfig.allowedFeePaymentContractClasses) {
240
+ if (contractClass.contractClassId.equals(allowedContractClass)) {
241
+ return VALID_TX;
242
+ }
243
+ }
244
+
245
+ return INVALID_TX;
246
+ }
247
+
248
+ static #extractFeeExecutionCall(tx: Tx): PublicCallRequest | undefined {
249
+ const {
250
+ // TODO what if there's more than one function call?
251
+ // if we're to enshrine that teardown = 1 function call, then we should turn this into a single function call
252
+ [PublicKernelPhase.TEARDOWN]: [teardownFn],
253
+ } = AbstractPhaseManager.extractEnqueuedPublicCallsByPhase(tx.data, tx.enqueuedPublicFunctionCalls);
254
+
255
+ return teardownFn;
256
+ }
189
257
  }
@@ -0,0 +1,32 @@
1
+ import { AztecAddress, EthAddress, Fr, GlobalVariables } from '@aztec/circuits.js';
2
+ import { ContractDataSource } from '@aztec/types/contracts';
3
+ import { MerkleTreeOperations } from '@aztec/world-state';
4
+
5
+ import { WorldStateDB, WorldStatePublicDB } from '../simulator/public_executor.js';
6
+ import { TxValidator } from './tx_validator.js';
7
+
8
+ export class TxValidatorFactory {
9
+ constructor(
10
+ private merkleTreeDb: MerkleTreeOperations,
11
+ private contractDataSource: ContractDataSource,
12
+ private gasPortalAddress: EthAddress,
13
+ ) {}
14
+
15
+ buildTxValidator(
16
+ globalVariables: GlobalVariables,
17
+ allowedFeePaymentContractClasses: Fr[],
18
+ allowedFeePaymentContractInstances: AztecAddress[],
19
+ ): TxValidator {
20
+ return new TxValidator(
21
+ new WorldStateDB(this.merkleTreeDb),
22
+ new WorldStatePublicDB(this.merkleTreeDb),
23
+ this.contractDataSource,
24
+ globalVariables,
25
+ {
26
+ allowedFeePaymentContractClasses,
27
+ allowedFeePaymentContractInstances,
28
+ gasPortalAddress: this.gasPortalAddress,
29
+ },
30
+ );
31
+ }
32
+ }
@@ -1,53 +1,9 @@
1
1
  import {
2
- BaseOrMergeRollupPublicInputs,
3
- BaseParityInputs,
4
- BaseRollupInputs,
5
- MergeRollupInputs,
6
- ParityPublicInputs,
7
2
  PublicKernelCircuitPrivateInputs,
8
3
  PublicKernelCircuitPublicInputs,
9
4
  PublicKernelTailCircuitPrivateInputs,
10
- RootParityInputs,
11
- RootRollupInputs,
12
- RootRollupPublicInputs,
13
5
  } from '@aztec/circuits.js';
14
6
 
15
- /**
16
- * Circuit simulator for the rollup circuits.
17
- */
18
- export interface RollupSimulator {
19
- /**
20
- * Simulates the base parity circuit from its inputs.
21
- * @param inputs - Inputs to the circuit.
22
- * @returns The public inputs of the parity circuit.
23
- */
24
- baseParityCircuit(inputs: BaseParityInputs): Promise<ParityPublicInputs>;
25
- /**
26
- * Simulates the root parity circuit from its inputs.
27
- * @param inputs - Inputs to the circuit.
28
- * @returns The public inputs of the parity circuit.
29
- */
30
- rootParityCircuit(inputs: RootParityInputs): Promise<ParityPublicInputs>;
31
- /**
32
- * Simulates the base rollup circuit from its inputs.
33
- * @param input - Inputs to the circuit.
34
- * @returns The public inputs as outputs of the simulation.
35
- */
36
- baseRollupCircuit(input: BaseRollupInputs): Promise<BaseOrMergeRollupPublicInputs>;
37
- /**
38
- * Simulates the merge rollup circuit from its inputs.
39
- * @param input - Inputs to the circuit.
40
- * @returns The public inputs as outputs of the simulation.
41
- */
42
- mergeRollupCircuit(input: MergeRollupInputs): Promise<BaseOrMergeRollupPublicInputs>;
43
- /**
44
- * Simulates the root rollup circuit from its inputs.
45
- * @param input - Inputs to the circuit.
46
- * @returns The public inputs as outputs of the simulation.
47
- */
48
- rootRollupCircuit(input: RootRollupInputs): Promise<RootRollupPublicInputs>;
49
- }
50
-
51
7
  /**
52
8
  * Circuit simulator for the public kernel circuits.
53
9
  */
@@ -77,4 +33,3 @@ export interface PublicKernelCircuitSimulator {
77
33
  */
78
34
  publicKernelCircuitTail(inputs: PublicKernelTailCircuitPrivateInputs): Promise<PublicKernelCircuitPublicInputs>;
79
35
  }
80
- export * from './acvm_wasm.js';
@@ -1,10 +1,4 @@
1
- import {
2
- L1ToL2MessageSource,
3
- MerkleTreeId,
4
- NullifierMembershipWitness,
5
- Tx,
6
- UnencryptedL2Log,
7
- } from '@aztec/circuit-types';
1
+ import { MerkleTreeId, NullifierMembershipWitness, Tx } from '@aztec/circuit-types';
8
2
  import {
9
3
  AztecAddress,
10
4
  ContractClassRegisteredEvent,
@@ -17,9 +11,9 @@ import {
17
11
  NullifierLeafPreimage,
18
12
  PublicDataTreeLeafPreimage,
19
13
  } from '@aztec/circuits.js';
20
- import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
14
+ import { computeL1ToL2MessageNullifier, computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
21
15
  import { createDebugLogger } from '@aztec/foundation/log';
22
- import { ClassRegistererAddress } from '@aztec/protocol-contracts/class-registerer';
16
+ import { getCanonicalClassRegistererAddress } from '@aztec/protocol-contracts/class-registerer';
23
17
  import { CommitmentsDB, MessageLoadOracleInputs, PublicContractsDB, PublicStateDB } from '@aztec/simulator';
24
18
  import { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/types/contracts';
25
19
  import { MerkleTreeOperations } from '@aztec/world-state';
@@ -42,8 +36,8 @@ export class ContractsDataSourcePublicDB implements PublicContractsDB {
42
36
  */
43
37
  public addNewContracts(tx: Tx): Promise<void> {
44
38
  // Extract contract class and instance data from logs and add to cache for this block
45
- const logs = tx.unencryptedLogs.unrollLogs().map(UnencryptedL2Log.fromBuffer);
46
- ContractClassRegisteredEvent.fromLogs(logs, ClassRegistererAddress).forEach(e => {
39
+ const logs = tx.unencryptedLogs.unrollLogs();
40
+ ContractClassRegisteredEvent.fromLogs(logs, getCanonicalClassRegistererAddress()).forEach(e => {
47
41
  this.log(`Adding class ${e.contractClassId.toString()} to public execution contract cache`);
48
42
  this.classCache.set(e.contractClassId.toString(), e.toContractClassPublic());
49
43
  });
@@ -65,8 +59,8 @@ export class ContractsDataSourcePublicDB implements PublicContractsDB {
65
59
  // TODO(@spalladino): Can this inadvertently delete a valid contract added by another tx?
66
60
  // Let's say we have two txs adding the same contract on the same block. If the 2nd one reverts,
67
61
  // wouldn't that accidentally remove the contract added on the first one?
68
- const logs = tx.unencryptedLogs.unrollLogs().map(UnencryptedL2Log.fromBuffer);
69
- ContractClassRegisteredEvent.fromLogs(logs, ClassRegistererAddress).forEach(e =>
62
+ const logs = tx.unencryptedLogs.unrollLogs();
63
+ ContractClassRegisteredEvent.fromLogs(logs, getCanonicalClassRegistererAddress()).forEach(e =>
70
64
  this.classCache.delete(e.contractClassId.toString()),
71
65
  );
72
66
  ContractInstanceDeployedEvent.fromLogs(logs).forEach(e => this.instanceCache.delete(e.address.toString()));
@@ -198,7 +192,7 @@ export class WorldStatePublicDB implements PublicStateDB {
198
192
  * Implements WorldState db using a world state database.
199
193
  */
200
194
  export class WorldStateDB implements CommitmentsDB {
201
- constructor(private db: MerkleTreeOperations, private l1ToL2MessageSource: L1ToL2MessageSource) {}
195
+ constructor(private db: MerkleTreeOperations) {}
202
196
 
203
197
  public async getNullifierMembershipWitnessAtLatestBlock(
204
198
  nullifier: Fr,
@@ -224,21 +218,38 @@ export class WorldStateDB implements CommitmentsDB {
224
218
  }
225
219
 
226
220
  public async getL1ToL2MembershipWitness(
227
- entryKey: Fr,
221
+ contractAddress: AztecAddress,
222
+ messageHash: Fr,
223
+ secret: Fr,
228
224
  ): Promise<MessageLoadOracleInputs<typeof L1_TO_L2_MSG_TREE_HEIGHT>> {
229
- const index = (await this.db.findLeafIndex(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, entryKey.toBuffer()))!;
230
- if (index === undefined) {
231
- throw new Error(`Message ${entryKey.toString()} not found`);
232
- }
225
+ let nullifierIndex: bigint | undefined;
226
+ let messageIndex: bigint | undefined;
227
+ let startIndex = 0n;
228
+
229
+ // We iterate over messages until we find one whose nullifier is not in the nullifier tree --> we need to check
230
+ // for nullifiers because messages can have duplicates.
231
+ do {
232
+ messageIndex = (await this.db.findLeafIndexAfter(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, messageHash, startIndex))!;
233
+ if (messageIndex === undefined) {
234
+ throw new Error(`No non-nullified L1 to L2 message found for message hash ${messageHash.toString()}`);
235
+ }
236
+
237
+ const messageNullifier = computeL1ToL2MessageNullifier(contractAddress, messageHash, secret, messageIndex);
238
+ nullifierIndex = await this.getNullifierIndex(messageNullifier);
239
+
240
+ startIndex = messageIndex + 1n;
241
+ } while (nullifierIndex !== undefined);
242
+
233
243
  const siblingPath = await this.db.getSiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>(
234
244
  MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
235
- index,
245
+ messageIndex,
236
246
  );
237
- return new MessageLoadOracleInputs<typeof L1_TO_L2_MSG_TREE_HEIGHT>(index, siblingPath);
247
+
248
+ return new MessageLoadOracleInputs<typeof L1_TO_L2_MSG_TREE_HEIGHT>(messageIndex, siblingPath);
238
249
  }
239
250
 
240
251
  public async getCommitmentIndex(commitment: Fr): Promise<bigint | undefined> {
241
- return await this.db.findLeafIndex(MerkleTreeId.NOTE_HASH_TREE, commitment.toBuffer());
252
+ return await this.db.findLeafIndex(MerkleTreeId.NOTE_HASH_TREE, commitment);
242
253
  }
243
254
 
244
255
  public async getNullifierIndex(nullifier: Fr): Promise<bigint | undefined> {
@@ -20,9 +20,9 @@ import {
20
20
  convertPublicTeardownRollupInputsToWitnessMap,
21
21
  convertPublicTeardownRollupOutputFromWitnessMap,
22
22
  } from '@aztec/noir-protocol-circuits-types';
23
+ import { SimulationProvider, WASMSimulator } from '@aztec/simulator';
23
24
 
24
- import { PublicKernelCircuitSimulator, WASMSimulator } from './index.js';
25
- import { SimulationProvider } from './simulation_provider.js';
25
+ import { PublicKernelCircuitSimulator } from './index.js';
26
26
 
27
27
  /**
28
28
  * Implements the PublicKernelCircuitSimulator.
@@ -1,19 +0,0 @@
1
- import { L2Block } from '@aztec/circuit-types';
2
- import { GlobalVariables, Proof } from '@aztec/circuits.js';
3
- import { Fr } from '@aztec/foundation/fields';
4
- import { ProcessedTx } from '../sequencer/processed_tx.js';
5
- /**
6
- * Assembles an L2Block from a set of processed transactions.
7
- */
8
- export interface BlockBuilder {
9
- /**
10
- * Creates a new L2Block with the given number, containing the set of processed txs.
11
- * Note that the number of txs need to be a power of two.
12
- * @param globalVariables - Global variables to include in the block.
13
- * @param txs - Processed txs to include.
14
- * @param l1ToL2Messages - L1 to L2 messages to be part of the block.
15
- * @returns The new L2 block along with its proof from the root circuit.
16
- */
17
- buildL2Block(globalVariables: GlobalVariables, txs: ProcessedTx[], l1ToL2Messages: Fr[]): Promise<[L2Block, Proof]>;
18
- }
19
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/block_builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;OAOG;IACH,YAAY,CAAC,eAAe,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;CACrH"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmxvY2tfYnVpbGRlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -1,78 +0,0 @@
1
- import { L2Block, MerkleTreeId } from '@aztec/circuit-types';
2
- import { AppendOnlyTreeSnapshot, BaseOrMergeRollupPublicInputs, BaseParityInputs, BaseRollupInputs, ConstantRollupData, GlobalVariables, MembershipWitness, MergeRollupInputs, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeafPreimage, PartialStateReference, PreviousRollupData, Proof, PublicDataTreeLeaf, PublicDataTreeLeafPreimage, RollupKernelData, RollupTypes, RootParityInput, RootParityInputs, RootRollupInputs, RootRollupPublicInputs, StateReference, VerificationKey } from '@aztec/circuits.js';
3
- import { Fr } from '@aztec/foundation/fields';
4
- import { Tuple } from '@aztec/foundation/serialize';
5
- import { MerkleTreeOperations } from '@aztec/world-state';
6
- import { VerificationKeys } from '../mocks/verification_keys.js';
7
- import { RollupProver } from '../prover/index.js';
8
- import { ProcessedTx } from '../sequencer/processed_tx.js';
9
- import { RollupSimulator } from '../simulator/index.js';
10
- import { BlockBuilder } from './index.js';
11
- import { TreeNames } from './types.js';
12
- /**
13
- * Builds an L2 block out of a set of ProcessedTx's,
14
- * using the base, merge, and root rollup circuits.
15
- */
16
- export declare class SoloBlockBuilder implements BlockBuilder {
17
- protected db: MerkleTreeOperations;
18
- protected vks: VerificationKeys;
19
- protected simulator: RollupSimulator;
20
- protected prover: RollupProver;
21
- protected debug: import("@aztec/foundation/log").DebugLogger;
22
- constructor(db: MerkleTreeOperations, vks: VerificationKeys, simulator: RollupSimulator, prover: RollupProver, debug?: import("@aztec/foundation/log").DebugLogger);
23
- /**
24
- * Builds an L2 block with the given number containing the given txs, updating state trees.
25
- * @param globalVariables - Global variables to be used in the block.
26
- * @param txs - Processed transactions to include in the block.
27
- * @param l1ToL2Messages - L1 to L2 messages to be part of the block.
28
- * @param timestamp - Timestamp of the block.
29
- * @returns The new L2 block and a correctness proof as returned by the root rollup circuit.
30
- */
31
- buildL2Block(globalVariables: GlobalVariables, txs: ProcessedTx[], l1ToL2Messages: Fr[]): Promise<[L2Block, Proof]>;
32
- protected validateTxs(txs: ProcessedTx[]): void;
33
- protected getTreeSnapshot(id: MerkleTreeId): Promise<AppendOnlyTreeSnapshot>;
34
- protected runCircuits(globalVariables: GlobalVariables, txs: ProcessedTx[], l1ToL2Messages: Tuple<Fr, typeof NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP>): Promise<[RootRollupPublicInputs, Proof]>;
35
- protected baseParityCircuit(inputs: BaseParityInputs): Promise<RootParityInput>;
36
- protected rootParityCircuit(inputs: RootParityInputs): Promise<RootParityInput>;
37
- protected baseRollupCircuit(tx: ProcessedTx, inputs: BaseRollupInputs, treeSnapshots: Map<MerkleTreeId, AppendOnlyTreeSnapshot>): Promise<[BaseOrMergeRollupPublicInputs, Proof]>;
38
- protected createMergeRollupInputs(left: [BaseOrMergeRollupPublicInputs, Proof], right: [BaseOrMergeRollupPublicInputs, Proof]): MergeRollupInputs;
39
- protected mergeRollupCircuit(mergeInputs: MergeRollupInputs): Promise<[BaseOrMergeRollupPublicInputs, Proof]>;
40
- protected getVerificationKey(type: RollupTypes): VerificationKey;
41
- protected rootRollupCircuit(left: [BaseOrMergeRollupPublicInputs, Proof], right: [BaseOrMergeRollupPublicInputs, Proof], l1ToL2Roots: RootParityInput, l1ToL2Messages: Tuple<Fr, typeof NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP>): Promise<[RootRollupPublicInputs, Proof]>;
42
- protected validatePartialState(partialState: PartialStateReference, treeSnapshots: Map<MerkleTreeId, AppendOnlyTreeSnapshot>): void;
43
- protected validateState(state: StateReference): Promise<void>;
44
- protected validateRootOutput(rootOutput: RootRollupPublicInputs): Promise<void>;
45
- protected validateSimulatedTree(localTree: AppendOnlyTreeSnapshot, simulatedTree: AppendOnlyTreeSnapshot, name: TreeNames, label?: string): void;
46
- protected getRootRollupInput(rollupOutputLeft: BaseOrMergeRollupPublicInputs, rollupProofLeft: Proof, rollupOutputRight: BaseOrMergeRollupPublicInputs, rollupProofRight: Proof, l1ToL2Roots: RootParityInput, newL1ToL2Messages: Tuple<Fr, typeof NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP>): Promise<RootRollupInputs>;
47
- protected getPreviousRollupDataFromPublicInputs(rollupOutput: BaseOrMergeRollupPublicInputs, rollupProof: Proof, vk: VerificationKey): PreviousRollupData;
48
- protected getKernelDataFor(tx: ProcessedTx): RollupKernelData;
49
- protected getMembershipWitnessFor<N extends number>(value: Fr, treeId: MerkleTreeId, height: N): Promise<MembershipWitness<N>>;
50
- protected getConstantRollupData(globalVariables: GlobalVariables): Promise<ConstantRollupData>;
51
- protected getLowNullifierInfo(nullifier: Fr): Promise<{
52
- index: number;
53
- leafPreimage: NullifierLeafPreimage;
54
- witness: MembershipWitness<20>;
55
- } | {
56
- index: {
57
- index: bigint;
58
- alreadyPresent: boolean;
59
- };
60
- leafPreimage: import("@aztec/foundation/trees").IndexedTreeLeafPreimage;
61
- witness: MembershipWitness<20>;
62
- }>;
63
- protected getSubtreeSiblingPath(treeId: MerkleTreeId, subtreeHeight: number): Promise<Fr[]>;
64
- protected processPublicDataUpdateRequests(tx: ProcessedTx): Promise<{
65
- lowPublicDataWritesPreimages: [PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage];
66
- lowPublicDataWritesMembershipWitnesses: [MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>];
67
- newPublicDataSubtreeSiblingPath: [Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr];
68
- sortedPublicDataWrites: [PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf, PublicDataTreeLeaf];
69
- sortedPublicDataWritesIndexes: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number];
70
- }>;
71
- protected getPublicDataReadsInfo(tx: ProcessedTx): Promise<{
72
- newPublicDataReadsWitnesses: [MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>, MembershipWitness<40>];
73
- newPublicDataReadsPreimages: [PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage, PublicDataTreeLeafPreimage];
74
- }>;
75
- protected buildBaseRollupInput(tx: ProcessedTx, globalVariables: GlobalVariables): Promise<BaseRollupInputs>;
76
- protected makeEmptyMembershipWitness<N extends number>(height: N): MembershipWitness<N>;
77
- }
78
- //# sourceMappingURL=solo_block_builder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"solo_block_builder.d.ts","sourceRoot":"","sources":["../../src/block_builder/solo_block_builder.ts"],"names":[],"mappings":"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"}