@aztec/sequencer-client 0.28.1 → 0.30.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 +2 -4
- package/dest/block_builder/index.d.ts.map +1 -1
- package/dest/block_builder/solo_block_builder.d.ts +4 -7
- package/dest/block_builder/solo_block_builder.d.ts.map +1 -1
- package/dest/block_builder/solo_block_builder.js +18 -20
- package/dest/client/sequencer-client.d.ts +4 -3
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +2 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +6 -2
- package/dest/sequencer/abstract_phase_manager.d.ts.map +1 -1
- package/dest/sequencer/abstract_phase_manager.js +10 -11
- package/dest/sequencer/hints_builder.d.ts +1 -1
- package/dest/sequencer/hints_builder.d.ts.map +1 -1
- package/dest/sequencer/hints_builder.js +4 -4
- package/dest/sequencer/processed_tx.d.ts.map +1 -1
- package/dest/sequencer/processed_tx.js +3 -3
- package/dest/sequencer/public_processor.d.ts +2 -1
- package/dest/sequencer/public_processor.d.ts.map +1 -1
- package/dest/sequencer/public_processor.js +1 -1
- package/dest/sequencer/sequencer.d.ts +6 -26
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +26 -101
- package/dest/sequencer/tx_validator.d.ts +22 -0
- package/dest/sequencer/tx_validator.d.ts.map +1 -0
- package/dest/sequencer/tx_validator.js +125 -0
- package/dest/simulator/public_executor.d.ts +3 -5
- package/dest/simulator/public_executor.d.ts.map +1 -1
- package/dest/simulator/public_executor.js +18 -34
- package/package.json +13 -13
- package/src/block_builder/index.ts +2 -8
- package/src/block_builder/solo_block_builder.ts +18 -29
- package/src/client/sequencer-client.ts +3 -1
- package/src/config.ts +6 -0
- package/src/sequencer/abstract_phase_manager.ts +9 -12
- package/src/sequencer/hints_builder.ts +2 -8
- package/src/sequencer/processed_tx.ts +2 -0
- package/src/sequencer/public_processor.ts +2 -1
- package/src/sequencer/sequencer.ts +31 -117
- package/src/sequencer/tx_validator.ts +189 -0
- package/src/simulator/public_executor.ts +15 -42
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
var _TxValidator_instances, _TxValidator_log, _TxValidator_globalVariables, _TxValidator_nullifierSource, _TxValidator_publicStateSource, _TxValidator_gasPortalAddress, _TxValidator_validateMetadata, _TxValidator_validateNullifiers, _TxValidator_validateFee;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { Fr } from '@aztec/circuits.js';
|
|
5
|
+
import { pedersenHash } from '@aztec/foundation/crypto';
|
|
6
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
7
|
+
import { getCanonicalGasTokenAddress } from '@aztec/protocol-contracts/gas-token';
|
|
8
|
+
import { AbstractPhaseManager, PublicKernelPhase } from './abstract_phase_manager.js';
|
|
9
|
+
// prefer symbols over booleans so it's clear what the intention is
|
|
10
|
+
// vs returning true/false is tied to the function name
|
|
11
|
+
// eg. isDoubleSpend vs isValidChain assign different meanings to booleans
|
|
12
|
+
const VALID_TX = Symbol('valid_tx');
|
|
13
|
+
const INVALID_TX = Symbol('invalid_tx');
|
|
14
|
+
// the storage slot associated with "storage.balances"
|
|
15
|
+
const GAS_TOKEN_BALANCES_SLOT = new Fr(1);
|
|
16
|
+
export class TxValidator {
|
|
17
|
+
constructor(nullifierSource, publicStateSource, gasPortalAddress, globalVariables, log = createDebugLogger('aztec:sequencer:tx_validator')) {
|
|
18
|
+
_TxValidator_instances.add(this);
|
|
19
|
+
_TxValidator_log.set(this, void 0);
|
|
20
|
+
_TxValidator_globalVariables.set(this, void 0);
|
|
21
|
+
_TxValidator_nullifierSource.set(this, void 0);
|
|
22
|
+
_TxValidator_publicStateSource.set(this, void 0);
|
|
23
|
+
_TxValidator_gasPortalAddress.set(this, void 0);
|
|
24
|
+
__classPrivateFieldSet(this, _TxValidator_nullifierSource, nullifierSource, "f");
|
|
25
|
+
__classPrivateFieldSet(this, _TxValidator_globalVariables, globalVariables, "f");
|
|
26
|
+
__classPrivateFieldSet(this, _TxValidator_publicStateSource, publicStateSource, "f");
|
|
27
|
+
__classPrivateFieldSet(this, _TxValidator_gasPortalAddress, gasPortalAddress, "f");
|
|
28
|
+
__classPrivateFieldSet(this, _TxValidator_log, log, "f");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validates a list of transactions.
|
|
32
|
+
* @param txs - The transactions to validate.
|
|
33
|
+
* @returns A tuple of valid and invalid transactions.
|
|
34
|
+
*/
|
|
35
|
+
async validateTxs(txs) {
|
|
36
|
+
const validTxs = [];
|
|
37
|
+
const invalidTxs = [];
|
|
38
|
+
const thisBlockNullifiers = new Set();
|
|
39
|
+
for (const tx of txs) {
|
|
40
|
+
if (__classPrivateFieldGet(this, _TxValidator_instances, "m", _TxValidator_validateMetadata).call(this, tx) === INVALID_TX) {
|
|
41
|
+
invalidTxs.push(tx);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if ((await __classPrivateFieldGet(this, _TxValidator_instances, "m", _TxValidator_validateNullifiers).call(this, tx, thisBlockNullifiers)) === INVALID_TX) {
|
|
45
|
+
invalidTxs.push(tx);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// skip already processed transactions
|
|
49
|
+
if (tx instanceof Tx && (await __classPrivateFieldGet(this, _TxValidator_instances, "m", _TxValidator_validateFee).call(this, tx)) === INVALID_TX) {
|
|
50
|
+
invalidTxs.push(tx);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
validTxs.push(tx);
|
|
54
|
+
}
|
|
55
|
+
return [validTxs, invalidTxs];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
_TxValidator_log = new WeakMap(), _TxValidator_globalVariables = new WeakMap(), _TxValidator_nullifierSource = new WeakMap(), _TxValidator_publicStateSource = new WeakMap(), _TxValidator_gasPortalAddress = new WeakMap(), _TxValidator_instances = new WeakSet(), _TxValidator_validateMetadata = function _TxValidator_validateMetadata(tx) {
|
|
59
|
+
if (!tx.data.constants.txContext.chainId.equals(__classPrivateFieldGet(this, _TxValidator_globalVariables, "f").chainId)) {
|
|
60
|
+
__classPrivateFieldGet(this, _TxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because of incorrect chain ${tx.data.constants.txContext.chainId.toString()} != ${__classPrivateFieldGet(this, _TxValidator_globalVariables, "f").chainId.toString()}`);
|
|
61
|
+
return INVALID_TX;
|
|
62
|
+
}
|
|
63
|
+
return VALID_TX;
|
|
64
|
+
}, _TxValidator_validateNullifiers =
|
|
65
|
+
/**
|
|
66
|
+
* It looks for duplicate nullifiers:
|
|
67
|
+
* - in the same transaction
|
|
68
|
+
* - in the same block
|
|
69
|
+
* - in the nullifier tree
|
|
70
|
+
*
|
|
71
|
+
* Nullifiers prevent double spends in a private context.
|
|
72
|
+
*
|
|
73
|
+
* @param tx - The transaction.
|
|
74
|
+
* @returns Whether this is a problematic double spend that the L1 contract would reject.
|
|
75
|
+
*/
|
|
76
|
+
async function _TxValidator_validateNullifiers(tx, thisBlockNullifiers) {
|
|
77
|
+
const newNullifiers = [...tx.data.endNonRevertibleData.newNullifiers, ...tx.data.end.newNullifiers]
|
|
78
|
+
.filter(x => !x.isEmpty())
|
|
79
|
+
.map(x => x.value.toBigInt());
|
|
80
|
+
// Ditch this tx if it has repeated nullifiers
|
|
81
|
+
const uniqueNullifiers = new Set(newNullifiers);
|
|
82
|
+
if (uniqueNullifiers.size !== newNullifiers.length) {
|
|
83
|
+
__classPrivateFieldGet(this, _TxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for emitting duplicate nullifiers`);
|
|
84
|
+
return INVALID_TX;
|
|
85
|
+
}
|
|
86
|
+
for (const nullifier of newNullifiers) {
|
|
87
|
+
if (thisBlockNullifiers.has(nullifier)) {
|
|
88
|
+
__classPrivateFieldGet(this, _TxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating a nullifier in the same block`);
|
|
89
|
+
return INVALID_TX;
|
|
90
|
+
}
|
|
91
|
+
thisBlockNullifiers.add(nullifier);
|
|
92
|
+
}
|
|
93
|
+
const nullifierIndexes = await Promise.all(newNullifiers.map(n => __classPrivateFieldGet(this, _TxValidator_nullifierSource, "f").getNullifierIndex(new Fr(n))));
|
|
94
|
+
const hasDuplicates = nullifierIndexes.some(index => index !== undefined);
|
|
95
|
+
if (hasDuplicates) {
|
|
96
|
+
__classPrivateFieldGet(this, _TxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for repeating nullifiers present in state trees`);
|
|
97
|
+
return INVALID_TX;
|
|
98
|
+
}
|
|
99
|
+
return VALID_TX;
|
|
100
|
+
}, _TxValidator_validateFee = async function _TxValidator_validateFee(tx) {
|
|
101
|
+
if (!tx.data.needsTeardown) {
|
|
102
|
+
// TODO check if fees are mandatory and reject this tx
|
|
103
|
+
__classPrivateFieldGet(this, _TxValidator_log, "f").debug(`Tx ${Tx.getHash(tx)} doesn't pay for gas`);
|
|
104
|
+
return VALID_TX;
|
|
105
|
+
}
|
|
106
|
+
const {
|
|
107
|
+
// TODO what if there's more than one function call?
|
|
108
|
+
// if we're to enshrine that teardown = 1 function call, then we should turn this into a single function call
|
|
109
|
+
[PublicKernelPhase.TEARDOWN]: [teardownFn], } = AbstractPhaseManager.extractEnqueuedPublicCallsByPhase(tx.data, tx.enqueuedPublicFunctionCalls);
|
|
110
|
+
if (!teardownFn) {
|
|
111
|
+
__classPrivateFieldGet(this, _TxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it should pay for gas but has no enqueued teardown function call`);
|
|
112
|
+
return INVALID_TX;
|
|
113
|
+
}
|
|
114
|
+
// TODO(#1204) if a generator index is used for the derived storage slot of a map, update it here as well
|
|
115
|
+
const slot = pedersenHash([GAS_TOKEN_BALANCES_SLOT.toBuffer(), teardownFn.callContext.msgSender.toBuffer()]);
|
|
116
|
+
const gasBalance = await __classPrivateFieldGet(this, _TxValidator_publicStateSource, "f").storageRead(getCanonicalGasTokenAddress(__classPrivateFieldGet(this, _TxValidator_gasPortalAddress, "f")), slot);
|
|
117
|
+
// TODO(#5004) calculate fee needed based on tx limits and gas prices
|
|
118
|
+
const gasAmountNeeded = new Fr(1);
|
|
119
|
+
if (gasBalance.lt(gasAmountNeeded)) {
|
|
120
|
+
__classPrivateFieldGet(this, _TxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it should pay for gas but has insufficient balance ${gasBalance.toShortString()} < ${gasAmountNeeded.toShortString()}`);
|
|
121
|
+
return INVALID_TX;
|
|
122
|
+
}
|
|
123
|
+
return VALID_TX;
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci90eF92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUMsT0FBTyxFQUE0QixFQUFFLEVBQW1CLE1BQU0sb0JBQW9CLENBQUM7QUFDbkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBVSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRWxGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBYXRGLG1FQUFtRTtBQUNuRSx1REFBdUQ7QUFDdkQsMEVBQTBFO0FBQzFFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNwQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFJeEMsc0RBQXNEO0FBQ3RELE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFMUMsTUFBTSxPQUFPLFdBQVc7SUFPdEIsWUFDRSxlQUFnQyxFQUNoQyxpQkFBb0MsRUFDcEMsZ0JBQTRCLEVBQzVCLGVBQWdDLEVBQ2hDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyw4QkFBOEIsQ0FBQzs7UUFYekQsbUNBQWE7UUFDYiwrQ0FBa0M7UUFDbEMsK0NBQWtDO1FBQ2xDLGlEQUFzQztRQUN0QyxnREFBOEI7UUFTNUIsdUJBQUEsSUFBSSxnQ0FBb0IsZUFBZSxNQUFBLENBQUM7UUFDeEMsdUJBQUEsSUFBSSxnQ0FBb0IsZUFBZSxNQUFBLENBQUM7UUFDeEMsdUJBQUEsSUFBSSxrQ0FBc0IsaUJBQWlCLE1BQUEsQ0FB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
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import {
|
|
2
|
+
import { L1ToL2MessageSource, NullifierMembershipWitness, Tx } from '@aztec/circuit-types';
|
|
3
3
|
import { AztecAddress, EthAddress, Fr, FunctionSelector, L1_TO_L2_MSG_TREE_HEIGHT } from '@aztec/circuits.js';
|
|
4
4
|
import { CommitmentsDB, MessageLoadOracleInputs, PublicContractsDB, PublicStateDB } from '@aztec/simulator';
|
|
5
|
-
import { ContractInstanceWithAddress } from '@aztec/types/contracts';
|
|
5
|
+
import { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/types/contracts';
|
|
6
6
|
import { MerkleTreeOperations } from '@aztec/world-state';
|
|
7
7
|
/**
|
|
8
8
|
* Implements the PublicContractsDB using a ContractDataSource.
|
|
9
9
|
* Progressively records contracts in transaction as they are processed in a block.
|
|
10
10
|
*/
|
|
11
11
|
export declare class ContractsDataSourcePublicDB implements PublicContractsDB {
|
|
12
|
-
#private;
|
|
13
12
|
private db;
|
|
14
|
-
private cache;
|
|
15
13
|
private instanceCache;
|
|
16
14
|
private classCache;
|
|
17
15
|
private log;
|
|
@@ -27,8 +25,8 @@ export declare class ContractsDataSourcePublicDB implements PublicContractsDB {
|
|
|
27
25
|
*/
|
|
28
26
|
removeNewContracts(tx: Tx): Promise<void>;
|
|
29
27
|
getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined>;
|
|
28
|
+
getContractClass(contractClassId: Fr): Promise<ContractClassPublic | undefined>;
|
|
30
29
|
getBytecode(address: AztecAddress, selector: FunctionSelector): Promise<Buffer | undefined>;
|
|
31
|
-
getIsInternal(address: AztecAddress, selector: FunctionSelector): Promise<boolean | undefined>;
|
|
32
30
|
getPortalContractAddress(address: AztecAddress): Promise<EthAddress | undefined>;
|
|
33
31
|
}
|
|
34
32
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public_executor.d.ts","sourceRoot":"","sources":["../../src/simulator/public_executor.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"public_executor.d.ts","sourceRoot":"","sources":["../../src/simulator/public_executor.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,mBAAmB,EAEnB,0BAA0B,EAC1B,EAAE,EAEH,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,YAAY,EAGZ,UAAU,EACV,EAAE,EACF,gBAAgB,EAChB,wBAAwB,EAIzB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5G,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC9G,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;GAGG;AACH,qBAAa,2BAA4B,YAAW,iBAAiB;IAMvD,OAAO,CAAC,EAAE;IALtB,OAAO,CAAC,aAAa,CAAkD;IACvE,OAAO,CAAC,UAAU,CAA0C;IAE5D,OAAO,CAAC,GAAG,CAA8D;gBAErD,EAAE,EAAE,kBAAkB;IAE1C;;;OAGG;IACI,eAAe,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB7C;;;OAGG;IACI,kBAAkB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnC,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC;IAI5F,gBAAgB,CAAC,eAAe,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAItF,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAY3F,wBAAwB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;CAIvF;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IAK1C,OAAO,CAAC,EAAE;IAJtB,OAAO,CAAC,mBAAmB,CAA8B;IACzD,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,OAAO,CAAC,qBAAqB,CAA8B;gBAEvC,EAAE,EAAE,oBAAoB;IAE5C;;;;;OAKG;IACU,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IA4BvE;;;;;OAKG;IACI,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlF;;;OAGG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvB;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMvC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;CAItC;AAED;;GAEG;AACH,qBAAa,YAAa,YAAW,aAAa;IACpC,OAAO,CAAC,EAAE;IAAwB,OAAO,CAAC,mBAAmB;gBAArD,EAAE,EAAE,oBAAoB,EAAU,mBAAmB,EAAE,mBAAmB;IAEjF,0CAA0C,CACrD,SAAS,EAAE,EAAE,GACZ,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC;IAqBrC,0BAA0B,CACrC,QAAQ,EAAE,EAAE,GACX,OAAO,CAAC,uBAAuB,CAAC,OAAO,wBAAwB,CAAC,CAAC;IAYvD,kBAAkB,CAAC,UAAU,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAI/D,iBAAiB,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAG3E"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { ExtendedContractData, MerkleTreeId, NullifierMembershipWitness, UnencryptedL2Log, } from '@aztec/circuit-types';
|
|
1
|
+
import { MerkleTreeId, NullifierMembershipWitness, UnencryptedL2Log, } from '@aztec/circuit-types';
|
|
4
2
|
import { ContractClassRegisteredEvent, ContractInstanceDeployedEvent, Fr, } from '@aztec/circuits.js';
|
|
5
3
|
import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
|
|
6
4
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
7
5
|
import { ClassRegistererAddress } from '@aztec/protocol-contracts/class-registerer';
|
|
8
|
-
import { InstanceDeployerAddress } from '@aztec/protocol-contracts/instance-deployer';
|
|
9
6
|
import { MessageLoadOracleInputs } from '@aztec/simulator';
|
|
10
7
|
/**
|
|
11
8
|
* Implements the PublicContractsDB using a ContractDataSource.
|
|
@@ -13,9 +10,7 @@ import { MessageLoadOracleInputs } from '@aztec/simulator';
|
|
|
13
10
|
*/
|
|
14
11
|
export class ContractsDataSourcePublicDB {
|
|
15
12
|
constructor(db) {
|
|
16
|
-
_ContractsDataSourcePublicDB_instances.add(this);
|
|
17
13
|
this.db = db;
|
|
18
|
-
this.cache = new Map();
|
|
19
14
|
this.instanceCache = new Map();
|
|
20
15
|
this.classCache = new Map();
|
|
21
16
|
this.log = createDebugLogger('aztec:sequencer:contracts-data-source');
|
|
@@ -31,7 +26,7 @@ export class ContractsDataSourcePublicDB {
|
|
|
31
26
|
this.log(`Adding class ${e.contractClassId.toString()} to public execution contract cache`);
|
|
32
27
|
this.classCache.set(e.contractClassId.toString(), e.toContractClassPublic());
|
|
33
28
|
});
|
|
34
|
-
ContractInstanceDeployedEvent.fromLogs(logs
|
|
29
|
+
ContractInstanceDeployedEvent.fromLogs(logs).forEach(e => {
|
|
35
30
|
this.log(`Adding instance ${e.address.toString()} with class ${e.contractClassId.toString()} to public execution contract cache`);
|
|
36
31
|
this.instanceCache.set(e.address.toString(), e.toContractInstance());
|
|
37
32
|
});
|
|
@@ -47,42 +42,31 @@ export class ContractsDataSourcePublicDB {
|
|
|
47
42
|
// wouldn't that accidentally remove the contract added on the first one?
|
|
48
43
|
const logs = tx.unencryptedLogs.unrollLogs().map(UnencryptedL2Log.fromBuffer);
|
|
49
44
|
ContractClassRegisteredEvent.fromLogs(logs, ClassRegistererAddress).forEach(e => this.classCache.delete(e.contractClassId.toString()));
|
|
50
|
-
ContractInstanceDeployedEvent.fromLogs(logs
|
|
45
|
+
ContractInstanceDeployedEvent.fromLogs(logs).forEach(e => this.instanceCache.delete(e.address.toString()));
|
|
51
46
|
return Promise.resolve();
|
|
52
47
|
}
|
|
53
48
|
async getContractInstance(address) {
|
|
54
49
|
return this.instanceCache.get(address.toString()) ?? (await this.db.getContract(address));
|
|
55
50
|
}
|
|
56
|
-
async
|
|
57
|
-
|
|
58
|
-
return contract?.getPublicFunction(selector)?.bytecode;
|
|
51
|
+
async getContractClass(contractClassId) {
|
|
52
|
+
return this.classCache.get(contractClassId.toString()) ?? (await this.db.getContractClass(contractClassId));
|
|
59
53
|
}
|
|
60
|
-
async
|
|
61
|
-
const
|
|
62
|
-
|
|
54
|
+
async getBytecode(address, selector) {
|
|
55
|
+
const instance = await this.getContractInstance(address);
|
|
56
|
+
if (!instance) {
|
|
57
|
+
throw new Error(`Contract ${address.toString()} not found`);
|
|
58
|
+
}
|
|
59
|
+
const contractClass = await this.getContractClass(instance.contractClassId);
|
|
60
|
+
if (!contractClass) {
|
|
61
|
+
throw new Error(`Contract class ${instance.contractClassId.toString()} for ${address.toString()} not found`);
|
|
62
|
+
}
|
|
63
|
+
return contractClass.publicFunctions.find(f => f.selector.equals(selector))?.bytecode;
|
|
63
64
|
}
|
|
64
65
|
async getPortalContractAddress(address) {
|
|
65
|
-
const contract = await
|
|
66
|
-
return contract?.
|
|
66
|
+
const contract = await this.getContractInstance(address);
|
|
67
|
+
return contract?.portalContractAddress;
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
|
-
_ContractsDataSourcePublicDB_instances = new WeakSet(), _ContractsDataSourcePublicDB_getContract = async function _ContractsDataSourcePublicDB_getContract(address) {
|
|
70
|
-
return (this.cache.get(address.toString()) ??
|
|
71
|
-
(await __classPrivateFieldGet(this, _ContractsDataSourcePublicDB_instances, "m", _ContractsDataSourcePublicDB_makeExtendedContractDataFor).call(this, address)) ??
|
|
72
|
-
(await this.db.getExtendedContractData(address)));
|
|
73
|
-
}, _ContractsDataSourcePublicDB_makeExtendedContractDataFor = async function _ContractsDataSourcePublicDB_makeExtendedContractDataFor(address) {
|
|
74
|
-
const instance = this.instanceCache.get(address.toString());
|
|
75
|
-
if (!instance) {
|
|
76
|
-
return undefined;
|
|
77
|
-
}
|
|
78
|
-
const contractClass = this.classCache.get(instance.contractClassId.toString()) ??
|
|
79
|
-
(await this.db.getContractClass(instance.contractClassId));
|
|
80
|
-
if (!contractClass) {
|
|
81
|
-
this.log.warn(`Contract class ${instance.contractClassId.toString()} for address ${address.toString()} not found`);
|
|
82
|
-
return undefined;
|
|
83
|
-
}
|
|
84
|
-
return ExtendedContractData.fromClassAndInstance(contractClass, instance);
|
|
85
|
-
};
|
|
86
70
|
/**
|
|
87
71
|
* Implements the PublicStateDB using a world-state database.
|
|
88
72
|
*/
|
|
@@ -202,4 +186,4 @@ export class WorldStateDB {
|
|
|
202
186
|
return await this.db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer());
|
|
203
187
|
}
|
|
204
188
|
}
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpbXVsYXRvci9wdWJsaWNfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFlBQVksRUFDWiwwQkFBMEIsRUFFMUIsZ0JBQWdCLEdBQ2pCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUVMLDRCQUE0QixFQUM1Qiw2QkFBNkIsRUFFN0IsRUFBRSxHQU1ILE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFpQix1QkFBdUIsRUFBb0MsTUFBTSxrQkFBa0IsQ0FBQztBQUk1Rzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sMkJBQTJCO0lBTXRDLFlBQW9CLEVBQXNCO1FBQXRCLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBTGxDLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXVDLENBQUM7UUFDL0QsZUFBVSxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO1FBRXBELFFBQUcsR0FBRyxpQkFBaUIsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBRTVCLENBQUM7SUFFOUM7OztPQUdHO0lBQ0ksZUFBZSxDQUFDLEVBQU07UUFDM0IscUZBQXFGO1FBQ3JGLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlFLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDOUUsSUFBSSxDQUFDLEdB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -21,18 +21,18 @@
|
|
|
21
21
|
"test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@aztec/circuit-types": "0.
|
|
25
|
-
"@aztec/circuits.js": "0.
|
|
26
|
-
"@aztec/ethereum": "0.
|
|
27
|
-
"@aztec/foundation": "0.
|
|
28
|
-
"@aztec/l1-artifacts": "0.
|
|
29
|
-
"@aztec/merkle-tree": "0.
|
|
30
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
31
|
-
"@aztec/p2p": "0.
|
|
32
|
-
"@aztec/protocol-contracts": "0.
|
|
33
|
-
"@aztec/simulator": "0.
|
|
34
|
-
"@aztec/types": "0.
|
|
35
|
-
"@aztec/world-state": "0.
|
|
24
|
+
"@aztec/circuit-types": "0.30.0",
|
|
25
|
+
"@aztec/circuits.js": "0.30.0",
|
|
26
|
+
"@aztec/ethereum": "0.30.0",
|
|
27
|
+
"@aztec/foundation": "0.30.0",
|
|
28
|
+
"@aztec/l1-artifacts": "0.30.0",
|
|
29
|
+
"@aztec/merkle-tree": "0.30.0",
|
|
30
|
+
"@aztec/noir-protocol-circuits-types": "0.30.0",
|
|
31
|
+
"@aztec/p2p": "0.30.0",
|
|
32
|
+
"@aztec/protocol-contracts": "0.30.0",
|
|
33
|
+
"@aztec/simulator": "0.30.0",
|
|
34
|
+
"@aztec/types": "0.30.0",
|
|
35
|
+
"@aztec/world-state": "0.30.0",
|
|
36
36
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
37
37
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
38
38
|
"lodash.chunk": "^4.2.0",
|
|
@@ -13,14 +13,8 @@ export interface BlockBuilder {
|
|
|
13
13
|
* Note that the number of txs need to be a power of two.
|
|
14
14
|
* @param globalVariables - Global variables to include in the block.
|
|
15
15
|
* @param txs - Processed txs to include.
|
|
16
|
-
* @param
|
|
17
|
-
* @param newL1ToL2Messages - L1 to L2 messages to be part of the block.
|
|
16
|
+
* @param l1ToL2Messages - L1 to L2 messages to be part of the block.
|
|
18
17
|
* @returns The new L2 block along with its proof from the root circuit.
|
|
19
18
|
*/
|
|
20
|
-
buildL2Block(
|
|
21
|
-
globalVariables: GlobalVariables,
|
|
22
|
-
txs: ProcessedTx[],
|
|
23
|
-
newModelL1ToL2Messages: Fr[], // TODO(#4492): Rename this when purging the old inbox
|
|
24
|
-
newL1ToL2Messages: Fr[], // TODO(#4492): Nuke this when purging the old inbox
|
|
25
|
-
): Promise<[L2Block, Proof]>;
|
|
19
|
+
buildL2Block(globalVariables: GlobalVariables, txs: ProcessedTx[], l1ToL2Messages: Fr[]): Promise<[L2Block, Proof]>;
|
|
26
20
|
}
|
|
@@ -89,32 +89,28 @@ export class SoloBlockBuilder implements BlockBuilder {
|
|
|
89
89
|
* Builds an L2 block with the given number containing the given txs, updating state trees.
|
|
90
90
|
* @param globalVariables - Global variables to be used in the block.
|
|
91
91
|
* @param txs - Processed transactions to include in the block.
|
|
92
|
-
* @param
|
|
93
|
-
* @param newL1ToL2Messages - L1 to L2 messages to be part of the block.
|
|
92
|
+
* @param l1ToL2Messages - L1 to L2 messages to be part of the block.
|
|
94
93
|
* @param timestamp - Timestamp of the block.
|
|
95
94
|
* @returns The new L2 block and a correctness proof as returned by the root rollup circuit.
|
|
96
95
|
*/
|
|
97
96
|
public async buildL2Block(
|
|
98
97
|
globalVariables: GlobalVariables,
|
|
99
98
|
txs: ProcessedTx[],
|
|
100
|
-
|
|
101
|
-
newL1ToL2Messages: Fr[],
|
|
99
|
+
l1ToL2Messages: Fr[],
|
|
102
100
|
): Promise<[L2Block, Proof]> {
|
|
103
101
|
// Check txs are good for processing by checking if all the tree snapshots in header are non-empty
|
|
104
102
|
this.validateTxs(txs);
|
|
105
103
|
|
|
104
|
+
// We pad the messages as the circuits expect that.
|
|
105
|
+
const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
106
|
+
|
|
106
107
|
// We fill the tx batch with empty txs, we process only one tx at a time for now
|
|
107
|
-
const [circuitsOutput, proof] = await this.runCircuits(
|
|
108
|
-
globalVariables,
|
|
109
|
-
txs,
|
|
110
|
-
newModelL1ToL2Messages,
|
|
111
|
-
newL1ToL2Messages,
|
|
112
|
-
);
|
|
108
|
+
const [circuitsOutput, proof] = await this.runCircuits(globalVariables, txs, l1ToL2MessagesPadded);
|
|
113
109
|
|
|
114
110
|
// Collect all new nullifiers, commitments, and contracts from all txs in this block
|
|
115
111
|
const txEffects: TxEffect[] = txs.map(tx => toTxEffect(tx));
|
|
116
112
|
|
|
117
|
-
const blockBody = new Body(
|
|
113
|
+
const blockBody = new Body(l1ToL2MessagesPadded, txEffects);
|
|
118
114
|
|
|
119
115
|
const l2Block = L2Block.fromFields({
|
|
120
116
|
archive: circuitsOutput.archive,
|
|
@@ -160,8 +156,7 @@ export class SoloBlockBuilder implements BlockBuilder {
|
|
|
160
156
|
protected async runCircuits(
|
|
161
157
|
globalVariables: GlobalVariables,
|
|
162
158
|
txs: ProcessedTx[],
|
|
163
|
-
|
|
164
|
-
newL1ToL2Messages: Fr[], // TODO(#4492): Nuke this when purging the old inbox
|
|
159
|
+
l1ToL2Messages: Tuple<Fr, typeof NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP>,
|
|
165
160
|
): Promise<[RootRollupPublicInputs, Proof]> {
|
|
166
161
|
// Check that the length of the array of txs is a power of two
|
|
167
162
|
// See https://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2
|
|
@@ -170,16 +165,13 @@ export class SoloBlockBuilder implements BlockBuilder {
|
|
|
170
165
|
}
|
|
171
166
|
|
|
172
167
|
// BASE PARITY CIRCUIT (run in parallel)
|
|
168
|
+
// Note: In the future we will want to cache the results of empty base and root parity circuits so that we don't
|
|
169
|
+
// have to run them. (It will most likely be quite common that some base parity circuits will be "empty")
|
|
173
170
|
let baseParityInputs: BaseParityInputs[] = [];
|
|
174
171
|
let elapsedBaseParityOutputsPromise: Promise<[number, RootParityInput[]]>;
|
|
175
172
|
{
|
|
176
|
-
const newModelL1ToL2MessagesTuple = padArrayEnd(
|
|
177
|
-
newModelL1ToL2Messages,
|
|
178
|
-
Fr.ZERO,
|
|
179
|
-
NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
|
|
180
|
-
);
|
|
181
173
|
baseParityInputs = Array.from({ length: NUM_BASE_PARITY_PER_ROOT_PARITY }, (_, i) =>
|
|
182
|
-
BaseParityInputs.fromSlice(
|
|
174
|
+
BaseParityInputs.fromSlice(l1ToL2Messages, i),
|
|
183
175
|
);
|
|
184
176
|
|
|
185
177
|
const baseParityOutputs: Promise<RootParityInput>[] = [];
|
|
@@ -189,9 +181,6 @@ export class SoloBlockBuilder implements BlockBuilder {
|
|
|
189
181
|
elapsedBaseParityOutputsPromise = elapsed(() => Promise.all(baseParityOutputs));
|
|
190
182
|
}
|
|
191
183
|
|
|
192
|
-
// padArrayEnd throws if the array is already full. Otherwise it pads till we reach the required size
|
|
193
|
-
const newL1ToL2MessagesTuple = padArrayEnd(newL1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
194
|
-
|
|
195
184
|
// BASE ROLLUP CIRCUIT (run in parallel)
|
|
196
185
|
let elapsedBaseRollupOutputsPromise: Promise<[number, [BaseOrMergeRollupPublicInputs, Proof][]]>;
|
|
197
186
|
const baseRollupInputs: BaseRollupInputs[] = [];
|
|
@@ -302,7 +291,7 @@ export class SoloBlockBuilder implements BlockBuilder {
|
|
|
302
291
|
outputSize: rootParityOutput.toBuffer().length,
|
|
303
292
|
} satisfies CircuitSimulationStats);
|
|
304
293
|
|
|
305
|
-
return this.rootRollupCircuit(mergeOutputLeft, mergeOutputRight, rootParityOutput,
|
|
294
|
+
return this.rootRollupCircuit(mergeOutputLeft, mergeOutputRight, rootParityOutput, l1ToL2Messages);
|
|
306
295
|
}
|
|
307
296
|
|
|
308
297
|
protected async baseParityCircuit(inputs: BaseParityInputs): Promise<RootParityInput> {
|
|
@@ -365,15 +354,15 @@ export class SoloBlockBuilder implements BlockBuilder {
|
|
|
365
354
|
left: [BaseOrMergeRollupPublicInputs, Proof],
|
|
366
355
|
right: [BaseOrMergeRollupPublicInputs, Proof],
|
|
367
356
|
l1ToL2Roots: RootParityInput,
|
|
368
|
-
|
|
357
|
+
l1ToL2Messages: Tuple<Fr, typeof NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP>,
|
|
369
358
|
): Promise<[RootRollupPublicInputs, Proof]> {
|
|
370
359
|
this.debug(`Running root rollup circuit`);
|
|
371
|
-
const rootInput = await this.getRootRollupInput(...left, ...right, l1ToL2Roots,
|
|
360
|
+
const rootInput = await this.getRootRollupInput(...left, ...right, l1ToL2Roots, l1ToL2Messages);
|
|
372
361
|
|
|
373
|
-
// Update the local trees to include the
|
|
362
|
+
// Update the local trees to include the l1 to l2 messages
|
|
374
363
|
await this.db.appendLeaves(
|
|
375
364
|
MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
|
|
376
|
-
|
|
365
|
+
l1ToL2Messages.map(m => m.toBuffer()),
|
|
377
366
|
);
|
|
378
367
|
|
|
379
368
|
// Simulate and get proof for the root circuit
|
|
@@ -690,8 +679,8 @@ export class SoloBlockBuilder implements BlockBuilder {
|
|
|
690
679
|
const newPublicDataReadsPreimages: Tuple<PublicDataTreeLeafPreimage, typeof MAX_PUBLIC_DATA_READS_PER_TX> =
|
|
691
680
|
makeTuple(MAX_PUBLIC_DATA_READS_PER_TX, () => PublicDataTreeLeafPreimage.empty());
|
|
692
681
|
|
|
693
|
-
for (const i in tx.data.
|
|
694
|
-
const leafSlot = tx.data.
|
|
682
|
+
for (const i in tx.data.validationRequests.publicDataReads) {
|
|
683
|
+
const leafSlot = tx.data.validationRequests.publicDataReads[i].leafSlot.value;
|
|
695
684
|
const lowLeafResult = await this.db.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
|
|
696
685
|
if (!lowLeafResult) {
|
|
697
686
|
throw new Error(`Public data tree should have one initial leaf`);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { L1ToL2MessageSource, L2BlockSource } from '@aztec/circuit-types';
|
|
2
2
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { P2P } from '@aztec/p2p';
|
|
4
|
+
import { ContractDataSource } from '@aztec/types/contracts';
|
|
4
5
|
import { WorldStateSynchronizer } from '@aztec/world-state';
|
|
5
6
|
|
|
6
7
|
import * as fs from 'fs/promises';
|
|
@@ -94,6 +95,7 @@ export class SequencerClient {
|
|
|
94
95
|
l1ToL2MessageSource,
|
|
95
96
|
publicProcessorFactory,
|
|
96
97
|
config,
|
|
98
|
+
config.l1Contracts.gasPortalAddress,
|
|
97
99
|
);
|
|
98
100
|
|
|
99
101
|
await sequencer.start();
|
package/src/config.ts
CHANGED
|
@@ -45,6 +45,8 @@ export function getConfigEnvVars(): SequencerClientConfig {
|
|
|
45
45
|
REGISTRY_CONTRACT_ADDRESS,
|
|
46
46
|
INBOX_CONTRACT_ADDRESS,
|
|
47
47
|
OUTBOX_CONTRACT_ADDRESS,
|
|
48
|
+
GAS_TOKEN_CONTRACT_ADDRESS,
|
|
49
|
+
GAS_PORTAL_CONTRACT_ADDRESS,
|
|
48
50
|
COINBASE,
|
|
49
51
|
FEE_RECIPIENT,
|
|
50
52
|
ACVM_WORKING_DIRECTORY,
|
|
@@ -63,6 +65,10 @@ export function getConfigEnvVars(): SequencerClientConfig {
|
|
|
63
65
|
registryAddress: REGISTRY_CONTRACT_ADDRESS ? EthAddress.fromString(REGISTRY_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
64
66
|
inboxAddress: INBOX_CONTRACT_ADDRESS ? EthAddress.fromString(INBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
65
67
|
outboxAddress: OUTBOX_CONTRACT_ADDRESS ? EthAddress.fromString(OUTBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
68
|
+
gasTokenAddress: GAS_TOKEN_CONTRACT_ADDRESS ? EthAddress.fromString(GAS_TOKEN_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
69
|
+
gasPortalAddress: GAS_PORTAL_CONTRACT_ADDRESS
|
|
70
|
+
? EthAddress.fromString(GAS_PORTAL_CONTRACT_ADDRESS)
|
|
71
|
+
: EthAddress.ZERO,
|
|
66
72
|
};
|
|
67
73
|
|
|
68
74
|
return {
|
|
@@ -11,14 +11,13 @@ import {
|
|
|
11
11
|
MAX_NEW_L2_TO_L1_MSGS_PER_CALL,
|
|
12
12
|
MAX_NEW_NOTE_HASHES_PER_CALL,
|
|
13
13
|
MAX_NEW_NULLIFIERS_PER_CALL,
|
|
14
|
-
MAX_NON_REVERTIBLE_PUBLIC_DATA_READS_PER_TX,
|
|
15
14
|
MAX_NON_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
|
|
16
15
|
MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL,
|
|
17
16
|
MAX_NULLIFIER_READ_REQUESTS_PER_CALL,
|
|
18
17
|
MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,
|
|
19
18
|
MAX_PUBLIC_DATA_READS_PER_CALL,
|
|
19
|
+
MAX_PUBLIC_DATA_READS_PER_TX,
|
|
20
20
|
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,
|
|
21
|
-
MAX_REVERTIBLE_PUBLIC_DATA_READS_PER_TX,
|
|
22
21
|
MAX_REVERTIBLE_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
|
|
23
22
|
MembershipWitness,
|
|
24
23
|
PrivateKernelTailCircuitPublicInputs,
|
|
@@ -291,15 +290,14 @@ export abstract class AbstractPhaseManager {
|
|
|
291
290
|
const previousKernel = this.getPreviousKernelData(previousOutput, previousProof);
|
|
292
291
|
|
|
293
292
|
if (this.phase === PublicKernelPhase.TAIL) {
|
|
294
|
-
const { endNonRevertibleData, end } = previousOutput;
|
|
293
|
+
const { validationRequests, endNonRevertibleData, end } = previousOutput;
|
|
295
294
|
const nullifierReadRequestHints = await this.hintsBuilder.getNullifierReadRequestHints(
|
|
296
|
-
|
|
297
|
-
end.nullifierReadRequests,
|
|
295
|
+
validationRequests.nullifierReadRequests,
|
|
298
296
|
endNonRevertibleData.newNullifiers,
|
|
299
297
|
end.newNullifiers,
|
|
300
298
|
);
|
|
301
299
|
const nullifierNonExistentReadRequestHints = await this.hintsBuilder.getNullifierNonExistentReadRequestHints(
|
|
302
|
-
|
|
300
|
+
validationRequests.nullifierNonExistentReadRequests,
|
|
303
301
|
endNonRevertibleData.newNullifiers,
|
|
304
302
|
end.newNullifiers,
|
|
305
303
|
);
|
|
@@ -479,9 +477,8 @@ function patchPublicStorageActionOrdering(
|
|
|
479
477
|
execResult: PublicExecutionResult,
|
|
480
478
|
phase: PublicKernelPhase,
|
|
481
479
|
) {
|
|
482
|
-
const {
|
|
483
|
-
|
|
484
|
-
: publicInputs.endNonRevertibleData;
|
|
480
|
+
const { publicDataUpdateRequests } = PhaseIsRevertible[phase] ? publicInputs.end : publicInputs.endNonRevertibleData;
|
|
481
|
+
const { publicDataReads } = publicInputs.validationRequests;
|
|
485
482
|
|
|
486
483
|
// Convert ContractStorage* objects to PublicData* objects and sort them in execution order.
|
|
487
484
|
// Note, this only pulls simulated reads/writes from the current phase,
|
|
@@ -518,14 +515,14 @@ function patchPublicStorageActionOrdering(
|
|
|
518
515
|
|
|
519
516
|
const numReadsInKernel = arrayNonEmptyLength(publicDataReads, f => f.isEmpty());
|
|
520
517
|
const numReadsBeforeThisEnqueuedCall = numReadsInKernel - simPublicDataReads.length;
|
|
521
|
-
publicInputs
|
|
518
|
+
publicInputs.validationRequests.publicDataReads = padArrayEnd(
|
|
522
519
|
[
|
|
523
520
|
// do not mess with items from previous top/enqueued calls in kernel output
|
|
524
|
-
...publicInputs
|
|
521
|
+
...publicInputs.validationRequests.publicDataReads.slice(0, numReadsBeforeThisEnqueuedCall),
|
|
525
522
|
...simPublicDataReads,
|
|
526
523
|
],
|
|
527
524
|
PublicDataRead.empty(),
|
|
528
|
-
|
|
525
|
+
MAX_PUBLIC_DATA_READS_PER_TX,
|
|
529
526
|
);
|
|
530
527
|
|
|
531
528
|
const numUpdatesInKernel = arrayNonEmptyLength(publicDataUpdateRequests, f => f.isEmpty());
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
buildNullifierNonExistentReadRequestHints,
|
|
14
14
|
buildNullifierReadRequestHints,
|
|
15
15
|
concatAccumulatedData,
|
|
16
|
-
mergeAccumulatedData,
|
|
17
16
|
} from '@aztec/circuits.js';
|
|
18
17
|
import { Tuple } from '@aztec/foundation/serialize';
|
|
19
18
|
import { MerkleTreeOperations } from '@aztec/world-state';
|
|
@@ -22,18 +21,13 @@ export class HintsBuilder {
|
|
|
22
21
|
constructor(private db: MerkleTreeOperations) {}
|
|
23
22
|
|
|
24
23
|
getNullifierReadRequestHints(
|
|
25
|
-
|
|
26
|
-
nullifierReadRequestsRevertible: Tuple<ReadRequestContext, typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX>,
|
|
24
|
+
nullifierReadRequests: Tuple<ReadRequestContext, typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX>,
|
|
27
25
|
nullifiersNonRevertible: Tuple<SideEffectLinkedToNoteHash, typeof MAX_NON_REVERTIBLE_NULLIFIERS_PER_TX>,
|
|
28
26
|
nullifiersRevertible: Tuple<SideEffectLinkedToNoteHash, typeof MAX_REVERTIBLE_NULLIFIERS_PER_TX>,
|
|
29
27
|
) {
|
|
30
28
|
return buildNullifierReadRequestHints(
|
|
31
29
|
this,
|
|
32
|
-
|
|
33
|
-
MAX_NULLIFIER_READ_REQUESTS_PER_TX,
|
|
34
|
-
nullifierReadRequestsNonRevertible,
|
|
35
|
-
nullifierReadRequestsRevertible,
|
|
36
|
-
),
|
|
30
|
+
nullifierReadRequests,
|
|
37
31
|
concatAccumulatedData(MAX_NEW_NULLIFIERS_PER_TX, nullifiersNonRevertible, nullifiersRevertible),
|
|
38
32
|
);
|
|
39
33
|
}
|