@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.
- package/dest/client/sequencer-client.d.ts +5 -1
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +7 -35
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +7 -3
- package/dest/index.d.ts +0 -7
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -8
- package/dest/publisher/viem-tx-sender.d.ts.map +1 -1
- package/dest/publisher/viem-tx-sender.js +2 -3
- package/dest/sequencer/abstract_phase_manager.d.ts +3 -5
- package/dest/sequencer/abstract_phase_manager.d.ts.map +1 -1
- package/dest/sequencer/abstract_phase_manager.js +13 -17
- package/dest/sequencer/app_logic_phase_manager.d.ts +1 -3
- package/dest/sequencer/app_logic_phase_manager.d.ts.map +1 -1
- package/dest/sequencer/app_logic_phase_manager.js +3 -4
- package/dest/sequencer/phase_manager_factory.d.ts +2 -3
- package/dest/sequencer/phase_manager_factory.d.ts.map +1 -1
- package/dest/sequencer/phase_manager_factory.js +9 -9
- package/dest/sequencer/public_processor.d.ts +4 -9
- package/dest/sequencer/public_processor.d.ts.map +1 -1
- package/dest/sequencer/public_processor.js +9 -12
- package/dest/sequencer/sequencer.d.ts +8 -6
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +24 -23
- package/dest/sequencer/setup_phase_manager.d.ts +1 -3
- package/dest/sequencer/setup_phase_manager.d.ts.map +1 -1
- package/dest/sequencer/setup_phase_manager.js +3 -4
- package/dest/sequencer/tail_phase_manager.d.ts +1 -3
- package/dest/sequencer/tail_phase_manager.d.ts.map +1 -1
- package/dest/sequencer/tail_phase_manager.js +3 -4
- package/dest/sequencer/teardown_phase_manager.d.ts +1 -3
- package/dest/sequencer/teardown_phase_manager.d.ts.map +1 -1
- package/dest/sequencer/teardown_phase_manager.js +3 -4
- package/dest/sequencer/tx_validator.d.ts +9 -3
- package/dest/sequencer/tx_validator.d.ts.map +1 -1
- package/dest/sequencer/tx_validator.js +68 -20
- package/dest/sequencer/tx_validator_factory.d.ts +12 -0
- package/dest/sequencer/tx_validator_factory.d.ts.map +1 -0
- package/dest/sequencer/tx_validator_factory.js +17 -0
- package/dest/simulator/index.d.ts +1 -37
- package/dest/simulator/index.d.ts.map +1 -1
- package/dest/simulator/index.js +2 -2
- package/dest/simulator/public_executor.d.ts +3 -4
- package/dest/simulator/public_executor.d.ts.map +1 -1
- package/dest/simulator/public_executor.js +27 -18
- package/dest/simulator/public_kernel.d.ts +1 -1
- package/dest/simulator/public_kernel.d.ts.map +1 -1
- package/dest/simulator/public_kernel.js +2 -2
- package/package.json +13 -13
- package/src/client/sequencer-client.ts +10 -49
- package/src/config.ts +7 -1
- package/src/index.ts +0 -9
- package/src/publisher/viem-tx-sender.ts +1 -2
- package/src/sequencer/abstract_phase_manager.ts +17 -19
- package/src/sequencer/app_logic_phase_manager.ts +1 -3
- package/src/sequencer/phase_manager_factory.ts +0 -9
- package/src/sequencer/public_processor.ts +14 -19
- package/src/sequencer/sequencer.ts +25 -25
- package/src/sequencer/setup_phase_manager.ts +1 -3
- package/src/sequencer/tail_phase_manager.ts +1 -3
- package/src/sequencer/teardown_phase_manager.ts +1 -3
- package/src/sequencer/tx_validator.ts +94 -26
- package/src/sequencer/tx_validator_factory.ts +32 -0
- package/src/simulator/index.ts +0 -45
- package/src/simulator/public_executor.ts +33 -22
- package/src/simulator/public_kernel.ts +2 -2
- package/dest/block_builder/index.d.ts +0 -19
- package/dest/block_builder/index.d.ts.map +0 -1
- package/dest/block_builder/index.js +0 -2
- package/dest/block_builder/solo_block_builder.d.ts +0 -78
- package/dest/block_builder/solo_block_builder.d.ts.map +0 -1
- package/dest/block_builder/solo_block_builder.js +0 -489
- package/dest/block_builder/types.d.ts +0 -10
- package/dest/block_builder/types.d.ts.map +0 -1
- package/dest/block_builder/types.js +0 -2
- package/dest/mocks/verification_keys.d.ts +0 -28
- package/dest/mocks/verification_keys.d.ts.map +0 -1
- package/dest/mocks/verification_keys.js +0 -14
- package/dest/prover/empty.d.ts +0 -53
- package/dest/prover/empty.d.ts.map +0 -1
- package/dest/prover/empty.js +0 -75
- package/dest/prover/index.d.ts +0 -52
- package/dest/prover/index.d.ts.map +0 -1
- package/dest/prover/index.js +0 -2
- package/dest/sequencer/processed_tx.d.ts +0 -81
- package/dest/sequencer/processed_tx.d.ts.map +0 -1
- package/dest/sequencer/processed_tx.js +0 -98
- package/dest/simulator/acvm_native.d.ts +0 -20
- package/dest/simulator/acvm_native.d.ts.map +0 -1
- package/dest/simulator/acvm_native.js +0 -96
- package/dest/simulator/acvm_wasm.d.ts +0 -7
- package/dest/simulator/acvm_wasm.d.ts.map +0 -1
- package/dest/simulator/acvm_wasm.js +0 -23
- package/dest/simulator/rollup.d.ts +0 -43
- package/dest/simulator/rollup.d.ts.map +0 -1
- package/dest/simulator/rollup.js +0 -78
- package/dest/simulator/simulation_provider.d.ts +0 -9
- package/dest/simulator/simulation_provider.d.ts.map +0 -1
- package/dest/simulator/simulation_provider.js +0 -2
- package/src/block_builder/index.ts +0 -20
- package/src/block_builder/solo_block_builder.ts +0 -812
- package/src/block_builder/types.ts +0 -8
- package/src/mocks/verification_keys.ts +0 -36
- package/src/prover/empty.ts +0 -97
- package/src/prover/index.ts +0 -70
- package/src/sequencer/processed_tx.ts +0 -210
- package/src/simulator/acvm_native.ts +0 -112
- package/src/simulator/acvm_wasm.ts +0 -31
- package/src/simulator/rollup.ts +0 -127
- package/src/simulator/simulation_provider.ts +0 -10
|
@@ -1,489 +0,0 @@
|
|
|
1
|
-
import { Body, L2Block, MerkleTreeId } from '@aztec/circuit-types';
|
|
2
|
-
import { ARCHIVE_HEIGHT, AppendOnlyTreeSnapshot, BaseParityInputs, BaseRollupInputs, ConstantRollupData, L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, MAX_NEW_NULLIFIERS_PER_TX, MAX_PUBLIC_DATA_READS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MembershipWitness, MergeRollupInputs, NOTE_HASH_SUBTREE_HEIGHT, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_TREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NUM_BASE_PARITY_PER_ROOT_PARITY, NullifierLeafPreimage, PUBLIC_DATA_SUBTREE_HEIGHT, PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH, PUBLIC_DATA_TREE_HEIGHT, PartialStateReference, PreviousRollupData, PublicDataTreeLeaf, PublicDataTreeLeafPreimage, ROLLUP_VK_TREE_HEIGHT, RollupKernelCircuitPublicInputs, RollupKernelData, RollupTypes, RootParityInput, RootParityInputs, RootRollupInputs, StateDiffHints, VK_TREE_HEIGHT, } from '@aztec/circuits.js';
|
|
3
|
-
import { assertPermutation, makeTuple } from '@aztec/foundation/array';
|
|
4
|
-
import { toBigIntBE } from '@aztec/foundation/bigint-buffer';
|
|
5
|
-
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
6
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
7
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
8
|
-
import { assertLength, toFriendlyJSON } from '@aztec/foundation/serialize';
|
|
9
|
-
import { elapsed } from '@aztec/foundation/timer';
|
|
10
|
-
import chunk from 'lodash.chunk';
|
|
11
|
-
import { inspect } from 'util';
|
|
12
|
-
import { toTxEffect } from '../sequencer/processed_tx.js';
|
|
13
|
-
const frToBigInt = (fr) => toBigIntBE(fr.toBuffer());
|
|
14
|
-
// Denotes fields that are not used now, but will be in the future
|
|
15
|
-
const FUTURE_FR = new Fr(0n);
|
|
16
|
-
const FUTURE_NUM = 0;
|
|
17
|
-
// Denotes fields that should be deleted
|
|
18
|
-
const DELETE_FR = new Fr(0n);
|
|
19
|
-
/**
|
|
20
|
-
* Builds an L2 block out of a set of ProcessedTx's,
|
|
21
|
-
* using the base, merge, and root rollup circuits.
|
|
22
|
-
*/
|
|
23
|
-
export class SoloBlockBuilder {
|
|
24
|
-
constructor(db, vks, simulator, prover, debug = createDebugLogger('aztec:sequencer:solo-block-builder')) {
|
|
25
|
-
this.db = db;
|
|
26
|
-
this.vks = vks;
|
|
27
|
-
this.simulator = simulator;
|
|
28
|
-
this.prover = prover;
|
|
29
|
-
this.debug = debug;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Builds an L2 block with the given number containing the given txs, updating state trees.
|
|
33
|
-
* @param globalVariables - Global variables to be used in the block.
|
|
34
|
-
* @param txs - Processed transactions to include in the block.
|
|
35
|
-
* @param l1ToL2Messages - L1 to L2 messages to be part of the block.
|
|
36
|
-
* @param timestamp - Timestamp of the block.
|
|
37
|
-
* @returns The new L2 block and a correctness proof as returned by the root rollup circuit.
|
|
38
|
-
*/
|
|
39
|
-
async buildL2Block(globalVariables, txs, l1ToL2Messages) {
|
|
40
|
-
// Check txs are good for processing by checking if all the tree snapshots in header are non-empty
|
|
41
|
-
this.validateTxs(txs);
|
|
42
|
-
// We pad the messages as the circuits expect that.
|
|
43
|
-
const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
44
|
-
// We fill the tx batch with empty txs, we process only one tx at a time for now
|
|
45
|
-
const [circuitsOutput, proof] = await this.runCircuits(globalVariables, txs, l1ToL2MessagesPadded);
|
|
46
|
-
// Collect all new nullifiers, commitments, and contracts from all txs in this block
|
|
47
|
-
const txEffects = txs.map(tx => toTxEffect(tx));
|
|
48
|
-
const blockBody = new Body(l1ToL2MessagesPadded, txEffects);
|
|
49
|
-
const l2Block = L2Block.fromFields({
|
|
50
|
-
archive: circuitsOutput.archive,
|
|
51
|
-
header: circuitsOutput.header,
|
|
52
|
-
body: blockBody,
|
|
53
|
-
});
|
|
54
|
-
if (!l2Block.body.getTxsEffectsHash().equals(circuitsOutput.header.contentCommitment.txsEffectsHash)) {
|
|
55
|
-
this.debug(inspect(blockBody));
|
|
56
|
-
throw new Error(`Txs effects hash mismatch, ${l2Block.body
|
|
57
|
-
.getTxsEffectsHash()
|
|
58
|
-
.toString('hex')} == ${circuitsOutput.header.contentCommitment.txsEffectsHash.toString('hex')} `);
|
|
59
|
-
}
|
|
60
|
-
return [l2Block, proof];
|
|
61
|
-
}
|
|
62
|
-
validateTxs(txs) {
|
|
63
|
-
for (const tx of txs) {
|
|
64
|
-
const txHeader = tx.data.constants.historicalHeader;
|
|
65
|
-
if (txHeader.state.l1ToL2MessageTree.isZero()) {
|
|
66
|
-
throw new Error(`Empty L1 to L2 messages tree in tx: ${toFriendlyJSON(tx)}`);
|
|
67
|
-
}
|
|
68
|
-
if (txHeader.state.partial.noteHashTree.isZero()) {
|
|
69
|
-
throw new Error(`Empty note hash tree in tx: ${toFriendlyJSON(tx)}`);
|
|
70
|
-
}
|
|
71
|
-
if (txHeader.state.partial.nullifierTree.isZero()) {
|
|
72
|
-
throw new Error(`Empty nullifier tree in tx: ${toFriendlyJSON(tx)}`);
|
|
73
|
-
}
|
|
74
|
-
if (txHeader.state.partial.publicDataTree.isZero()) {
|
|
75
|
-
throw new Error(`Empty public data tree in tx: ${toFriendlyJSON(tx)}`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
async getTreeSnapshot(id) {
|
|
80
|
-
const treeInfo = await this.db.getTreeInfo(id);
|
|
81
|
-
return new AppendOnlyTreeSnapshot(Fr.fromBuffer(treeInfo.root), Number(treeInfo.size));
|
|
82
|
-
}
|
|
83
|
-
async runCircuits(globalVariables, txs, l1ToL2Messages) {
|
|
84
|
-
// Check that the length of the array of txs is a power of two
|
|
85
|
-
// See https://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2
|
|
86
|
-
if (txs.length < 2 || (txs.length & (txs.length - 1)) !== 0) {
|
|
87
|
-
throw new Error(`Length of txs for the block should be a power of two and at least two (got ${txs.length})`);
|
|
88
|
-
}
|
|
89
|
-
// BASE PARITY CIRCUIT (run in parallel)
|
|
90
|
-
// Note: In the future we will want to cache the results of empty base and root parity circuits so that we don't
|
|
91
|
-
// have to run them. (It will most likely be quite common that some base parity circuits will be "empty")
|
|
92
|
-
let baseParityInputs = [];
|
|
93
|
-
let elapsedBaseParityOutputsPromise;
|
|
94
|
-
{
|
|
95
|
-
baseParityInputs = Array.from({ length: NUM_BASE_PARITY_PER_ROOT_PARITY }, (_, i) => BaseParityInputs.fromSlice(l1ToL2Messages, i));
|
|
96
|
-
const baseParityOutputs = [];
|
|
97
|
-
for (const inputs of baseParityInputs) {
|
|
98
|
-
baseParityOutputs.push(this.baseParityCircuit(inputs));
|
|
99
|
-
}
|
|
100
|
-
elapsedBaseParityOutputsPromise = elapsed(() => Promise.all(baseParityOutputs));
|
|
101
|
-
}
|
|
102
|
-
// BASE ROLLUP CIRCUIT (run in parallel)
|
|
103
|
-
let elapsedBaseRollupOutputsPromise;
|
|
104
|
-
const baseRollupInputs = [];
|
|
105
|
-
{
|
|
106
|
-
// Perform all tree insertions and retrieve snapshots for all base rollups
|
|
107
|
-
const treeSnapshots = [];
|
|
108
|
-
for (const tx of txs) {
|
|
109
|
-
const input = await this.buildBaseRollupInput(tx, globalVariables);
|
|
110
|
-
baseRollupInputs.push(input);
|
|
111
|
-
const promises = [MerkleTreeId.NOTE_HASH_TREE, MerkleTreeId.NULLIFIER_TREE, MerkleTreeId.PUBLIC_DATA_TREE].map(async (id) => {
|
|
112
|
-
return { key: id, value: await this.getTreeSnapshot(id) };
|
|
113
|
-
});
|
|
114
|
-
const snapshots = new Map((await Promise.all(promises)).map(obj => [obj.key, obj.value]));
|
|
115
|
-
treeSnapshots.push(snapshots);
|
|
116
|
-
}
|
|
117
|
-
// Run the base rollup circuits for the txs in parallel
|
|
118
|
-
const baseRollupOutputs = [];
|
|
119
|
-
for (let i = 0; i < txs.length; i++) {
|
|
120
|
-
baseRollupOutputs.push(this.baseRollupCircuit(txs[i], baseRollupInputs[i], treeSnapshots[i]));
|
|
121
|
-
}
|
|
122
|
-
elapsedBaseRollupOutputsPromise = elapsed(() => Promise.all(baseRollupOutputs));
|
|
123
|
-
}
|
|
124
|
-
// ROOT PARITY CIRCUIT
|
|
125
|
-
let elapsedRootParityOutputPromise;
|
|
126
|
-
let rootParityInputs;
|
|
127
|
-
{
|
|
128
|
-
// First we await the base parity outputs
|
|
129
|
-
const [duration, baseParityOutputs] = await elapsedBaseParityOutputsPromise;
|
|
130
|
-
// We emit stats for base parity circuits
|
|
131
|
-
for (let i = 0; i < baseParityOutputs.length; i++) {
|
|
132
|
-
this.debug(`Simulated base parity circuit`, {
|
|
133
|
-
eventName: 'circuit-simulation',
|
|
134
|
-
circuitName: 'base-parity',
|
|
135
|
-
duration: duration / baseParityOutputs.length,
|
|
136
|
-
inputSize: baseParityInputs[i].toBuffer().length,
|
|
137
|
-
outputSize: baseParityOutputs[i].toBuffer().length,
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
rootParityInputs = new RootParityInputs(baseParityOutputs);
|
|
141
|
-
elapsedRootParityOutputPromise = elapsed(() => this.rootParityCircuit(rootParityInputs));
|
|
142
|
-
}
|
|
143
|
-
// MERGE ROLLUP CIRCUIT (each layer run in parallel)
|
|
144
|
-
let mergeOutputLeft;
|
|
145
|
-
let mergeOutputRight;
|
|
146
|
-
{
|
|
147
|
-
// Run merge rollups in layers until we have only two outputs
|
|
148
|
-
const [duration, mergeInputs] = await elapsedBaseRollupOutputsPromise;
|
|
149
|
-
// We emit stats for base rollup circuits
|
|
150
|
-
for (let i = 0; i < mergeInputs.length; i++) {
|
|
151
|
-
this.debug(`Simulated base rollup circuit`, {
|
|
152
|
-
eventName: 'circuit-simulation',
|
|
153
|
-
circuitName: 'base-rollup',
|
|
154
|
-
duration: duration / mergeInputs.length,
|
|
155
|
-
inputSize: baseRollupInputs[i].toBuffer().length,
|
|
156
|
-
outputSize: mergeInputs[i][0].toBuffer().length,
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
let mergeRollupInputs = mergeInputs;
|
|
160
|
-
while (mergeRollupInputs.length > 2) {
|
|
161
|
-
const mergeInputStructs = [];
|
|
162
|
-
for (const pair of chunk(mergeRollupInputs, 2)) {
|
|
163
|
-
const [r1, r2] = pair;
|
|
164
|
-
mergeInputStructs.push(this.createMergeRollupInputs(r1, r2));
|
|
165
|
-
}
|
|
166
|
-
const [duration, mergeOutputs] = await elapsed(() => Promise.all(mergeInputStructs.map(async (input) => await this.mergeRollupCircuit(input))));
|
|
167
|
-
// We emit stats for merge rollup circuits
|
|
168
|
-
for (let i = 0; i < mergeOutputs.length; i++) {
|
|
169
|
-
this.debug(`Simulated merge rollup circuit`, {
|
|
170
|
-
eventName: 'circuit-simulation',
|
|
171
|
-
circuitName: 'merge-rollup',
|
|
172
|
-
duration: duration / mergeOutputs.length,
|
|
173
|
-
inputSize: mergeInputStructs[i].toBuffer().length,
|
|
174
|
-
outputSize: mergeOutputs[i][0].toBuffer().length,
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
mergeRollupInputs = mergeOutputs;
|
|
178
|
-
}
|
|
179
|
-
// Run the root rollup with the last two merge rollups (or base, if no merge layers)
|
|
180
|
-
[mergeOutputLeft, mergeOutputRight] = mergeRollupInputs;
|
|
181
|
-
}
|
|
182
|
-
// Finally, we emit stats for root parity circuit
|
|
183
|
-
const [duration, rootParityOutput] = await elapsedRootParityOutputPromise;
|
|
184
|
-
this.debug(`Simulated root parity circuit`, {
|
|
185
|
-
eventName: 'circuit-simulation',
|
|
186
|
-
circuitName: 'root-parity',
|
|
187
|
-
duration: duration,
|
|
188
|
-
inputSize: rootParityInputs.toBuffer().length,
|
|
189
|
-
outputSize: rootParityOutput.toBuffer().length,
|
|
190
|
-
});
|
|
191
|
-
return this.rootRollupCircuit(mergeOutputLeft, mergeOutputRight, rootParityOutput, l1ToL2Messages);
|
|
192
|
-
}
|
|
193
|
-
async baseParityCircuit(inputs) {
|
|
194
|
-
this.debug(`Running base parity circuit`);
|
|
195
|
-
const parityPublicInputs = await this.simulator.baseParityCircuit(inputs);
|
|
196
|
-
const proof = await this.prover.getBaseParityProof(inputs, parityPublicInputs);
|
|
197
|
-
return new RootParityInput(proof, parityPublicInputs);
|
|
198
|
-
}
|
|
199
|
-
async rootParityCircuit(inputs) {
|
|
200
|
-
this.debug(`Running root parity circuit`);
|
|
201
|
-
const parityPublicInputs = await this.simulator.rootParityCircuit(inputs);
|
|
202
|
-
const proof = await this.prover.getRootParityProof(inputs, parityPublicInputs);
|
|
203
|
-
return new RootParityInput(proof, parityPublicInputs);
|
|
204
|
-
}
|
|
205
|
-
async baseRollupCircuit(tx, inputs, treeSnapshots) {
|
|
206
|
-
this.debug(`Running base rollup for ${tx.hash}`);
|
|
207
|
-
const rollupOutput = await this.simulator.baseRollupCircuit(inputs);
|
|
208
|
-
this.validatePartialState(rollupOutput.end, treeSnapshots);
|
|
209
|
-
const proof = await this.prover.getBaseRollupProof(inputs, rollupOutput);
|
|
210
|
-
return [rollupOutput, proof];
|
|
211
|
-
}
|
|
212
|
-
createMergeRollupInputs(left, right) {
|
|
213
|
-
const vk = this.getVerificationKey(left[0].rollupType);
|
|
214
|
-
const mergeInputs = new MergeRollupInputs([
|
|
215
|
-
this.getPreviousRollupDataFromPublicInputs(left[0], left[1], vk),
|
|
216
|
-
this.getPreviousRollupDataFromPublicInputs(right[0], right[1], vk),
|
|
217
|
-
]);
|
|
218
|
-
return mergeInputs;
|
|
219
|
-
}
|
|
220
|
-
async mergeRollupCircuit(mergeInputs) {
|
|
221
|
-
this.debug(`Running merge rollup circuit`);
|
|
222
|
-
const output = await this.simulator.mergeRollupCircuit(mergeInputs);
|
|
223
|
-
const proof = await this.prover.getMergeRollupProof(mergeInputs, output);
|
|
224
|
-
return [output, proof];
|
|
225
|
-
}
|
|
226
|
-
getVerificationKey(type) {
|
|
227
|
-
switch (type) {
|
|
228
|
-
case RollupTypes.Base:
|
|
229
|
-
return this.vks.baseRollupCircuit;
|
|
230
|
-
case RollupTypes.Merge:
|
|
231
|
-
return this.vks.mergeRollupCircuit;
|
|
232
|
-
default:
|
|
233
|
-
throw new Error(`No verification key available for ${type}`);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
async rootRollupCircuit(left, right, l1ToL2Roots, l1ToL2Messages) {
|
|
237
|
-
this.debug(`Running root rollup circuit`);
|
|
238
|
-
const rootInput = await this.getRootRollupInput(...left, ...right, l1ToL2Roots, l1ToL2Messages);
|
|
239
|
-
// Update the local trees to include the l1 to l2 messages
|
|
240
|
-
await this.db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2Messages.map(m => m.toBuffer()));
|
|
241
|
-
// Simulate and get proof for the root circuit
|
|
242
|
-
const rootOutput = await this.simulator.rootRollupCircuit(rootInput);
|
|
243
|
-
const rootProof = await this.prover.getRootRollupProof(rootInput, rootOutput);
|
|
244
|
-
// Update the archive with the latest block header
|
|
245
|
-
this.debug(`Updating and validating root trees`);
|
|
246
|
-
await this.db.updateArchive(rootOutput.header);
|
|
247
|
-
await this.validateRootOutput(rootOutput);
|
|
248
|
-
return [rootOutput, rootProof];
|
|
249
|
-
}
|
|
250
|
-
validatePartialState(partialState, treeSnapshots) {
|
|
251
|
-
this.validateSimulatedTree(treeSnapshots.get(MerkleTreeId.NOTE_HASH_TREE), partialState.noteHashTree, 'NoteHashTree');
|
|
252
|
-
this.validateSimulatedTree(treeSnapshots.get(MerkleTreeId.NULLIFIER_TREE), partialState.nullifierTree, 'NullifierTree');
|
|
253
|
-
this.validateSimulatedTree(treeSnapshots.get(MerkleTreeId.PUBLIC_DATA_TREE), partialState.publicDataTree, 'PublicDataTree');
|
|
254
|
-
}
|
|
255
|
-
async validateState(state) {
|
|
256
|
-
const promises = [MerkleTreeId.NOTE_HASH_TREE, MerkleTreeId.NULLIFIER_TREE, MerkleTreeId.PUBLIC_DATA_TREE].map(async (id) => {
|
|
257
|
-
return { key: id, value: await this.getTreeSnapshot(id) };
|
|
258
|
-
});
|
|
259
|
-
const snapshots = new Map((await Promise.all(promises)).map(obj => [obj.key, obj.value]));
|
|
260
|
-
this.validatePartialState(state.partial, snapshots);
|
|
261
|
-
this.validateSimulatedTree(await this.getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE), state.l1ToL2MessageTree, 'L1ToL2MessageTree');
|
|
262
|
-
}
|
|
263
|
-
// Validate that the roots of all local trees match the output of the root circuit simulation
|
|
264
|
-
async validateRootOutput(rootOutput) {
|
|
265
|
-
await Promise.all([
|
|
266
|
-
this.validateState(rootOutput.header.state),
|
|
267
|
-
this.validateSimulatedTree(await this.getTreeSnapshot(MerkleTreeId.ARCHIVE), rootOutput.archive, 'Archive'),
|
|
268
|
-
]);
|
|
269
|
-
}
|
|
270
|
-
// Helper for comparing two trees snapshots
|
|
271
|
-
validateSimulatedTree(localTree, simulatedTree, name, label) {
|
|
272
|
-
if (!simulatedTree.root.toBuffer().equals(localTree.root.toBuffer())) {
|
|
273
|
-
throw new Error(`${label ?? name} tree root mismatch (local ${localTree.root}, simulated ${simulatedTree.root})`);
|
|
274
|
-
}
|
|
275
|
-
if (simulatedTree.nextAvailableLeafIndex !== localTree.nextAvailableLeafIndex) {
|
|
276
|
-
throw new Error(`${label ?? name} tree next available leaf index mismatch (local ${localTree.nextAvailableLeafIndex}, simulated ${simulatedTree.nextAvailableLeafIndex})`);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
// Builds the inputs for the root rollup circuit, without making any changes to trees
|
|
280
|
-
async getRootRollupInput(rollupOutputLeft, rollupProofLeft, rollupOutputRight, rollupProofRight, l1ToL2Roots, newL1ToL2Messages) {
|
|
281
|
-
const vk = this.getVerificationKey(rollupOutputLeft.rollupType);
|
|
282
|
-
const previousRollupData = [
|
|
283
|
-
this.getPreviousRollupDataFromPublicInputs(rollupOutputLeft, rollupProofLeft, vk),
|
|
284
|
-
this.getPreviousRollupDataFromPublicInputs(rollupOutputRight, rollupProofRight, vk),
|
|
285
|
-
];
|
|
286
|
-
const getRootTreeSiblingPath = async (treeId) => {
|
|
287
|
-
const { size } = await this.db.getTreeInfo(treeId);
|
|
288
|
-
const path = await this.db.getSiblingPath(treeId, size);
|
|
289
|
-
return path.toFields();
|
|
290
|
-
};
|
|
291
|
-
const newL1ToL2MessageTreeRootSiblingPathArray = await this.getSubtreeSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, L1_TO_L2_MSG_SUBTREE_HEIGHT);
|
|
292
|
-
const newL1ToL2MessageTreeRootSiblingPath = makeTuple(L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, i => i < newL1ToL2MessageTreeRootSiblingPathArray.length ? newL1ToL2MessageTreeRootSiblingPathArray[i] : Fr.ZERO, 0);
|
|
293
|
-
// Get tree snapshots
|
|
294
|
-
const startL1ToL2MessageTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE);
|
|
295
|
-
// Get blocks tree
|
|
296
|
-
const startArchiveSnapshot = await this.getTreeSnapshot(MerkleTreeId.ARCHIVE);
|
|
297
|
-
const newArchiveSiblingPathArray = await getRootTreeSiblingPath(MerkleTreeId.ARCHIVE);
|
|
298
|
-
const newArchiveSiblingPath = makeTuple(ARCHIVE_HEIGHT, i => (i < newArchiveSiblingPathArray.length ? newArchiveSiblingPathArray[i] : Fr.ZERO), 0);
|
|
299
|
-
return RootRollupInputs.from({
|
|
300
|
-
previousRollupData,
|
|
301
|
-
l1ToL2Roots,
|
|
302
|
-
newL1ToL2Messages,
|
|
303
|
-
newL1ToL2MessageTreeRootSiblingPath,
|
|
304
|
-
startL1ToL2MessageTreeSnapshot,
|
|
305
|
-
startArchiveSnapshot,
|
|
306
|
-
newArchiveSiblingPath,
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
getPreviousRollupDataFromPublicInputs(rollupOutput, rollupProof, vk) {
|
|
310
|
-
return new PreviousRollupData(rollupOutput, rollupProof, vk,
|
|
311
|
-
// MembershipWitness for a VK tree to be implemented in the future
|
|
312
|
-
FUTURE_NUM, new MembershipWitness(ROLLUP_VK_TREE_HEIGHT, BigInt(FUTURE_NUM), makeTuple(ROLLUP_VK_TREE_HEIGHT, () => FUTURE_FR)));
|
|
313
|
-
}
|
|
314
|
-
getKernelDataFor(tx) {
|
|
315
|
-
const inputs = new RollupKernelCircuitPublicInputs(tx.data.aggregationObject, tx.data.combinedData, tx.data.constants);
|
|
316
|
-
return new RollupKernelData(inputs, tx.proof,
|
|
317
|
-
// VK for the kernel circuit
|
|
318
|
-
this.vks.privateKernelCircuit,
|
|
319
|
-
// MembershipWitness for a VK tree to be implemented in the future
|
|
320
|
-
FUTURE_NUM, assertLength(Array(VK_TREE_HEIGHT).fill(FUTURE_FR), VK_TREE_HEIGHT));
|
|
321
|
-
}
|
|
322
|
-
// Scan a tree searching for a specific value and return a membership witness proof for it
|
|
323
|
-
async getMembershipWitnessFor(value, treeId, height) {
|
|
324
|
-
// If this is an empty tx, then just return zeroes
|
|
325
|
-
if (value.isZero()) {
|
|
326
|
-
return this.makeEmptyMembershipWitness(height);
|
|
327
|
-
}
|
|
328
|
-
const index = await this.db.findLeafIndex(treeId, value.toBuffer());
|
|
329
|
-
if (index === undefined) {
|
|
330
|
-
throw new Error(`Leaf with value ${value} not found in tree ${MerkleTreeId[treeId]}`);
|
|
331
|
-
}
|
|
332
|
-
const path = await this.db.getSiblingPath(treeId, index);
|
|
333
|
-
return new MembershipWitness(height, index, assertLength(path.toFields(), height));
|
|
334
|
-
}
|
|
335
|
-
async getConstantRollupData(globalVariables) {
|
|
336
|
-
return ConstantRollupData.from({
|
|
337
|
-
baseRollupVkHash: DELETE_FR,
|
|
338
|
-
mergeRollupVkHash: DELETE_FR,
|
|
339
|
-
privateKernelVkTreeRoot: FUTURE_FR,
|
|
340
|
-
publicKernelVkTreeRoot: FUTURE_FR,
|
|
341
|
-
lastArchive: await this.getTreeSnapshot(MerkleTreeId.ARCHIVE),
|
|
342
|
-
globalVariables,
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
async getLowNullifierInfo(nullifier) {
|
|
346
|
-
// Return empty nullifier info for an empty tx
|
|
347
|
-
if (nullifier.value === 0n) {
|
|
348
|
-
return {
|
|
349
|
-
index: 0,
|
|
350
|
-
leafPreimage: NullifierLeafPreimage.empty(),
|
|
351
|
-
witness: this.makeEmptyMembershipWitness(NULLIFIER_TREE_HEIGHT),
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
const tree = MerkleTreeId.NULLIFIER_TREE;
|
|
355
|
-
const prevValueIndex = await this.db.getPreviousValueIndex(tree, frToBigInt(nullifier));
|
|
356
|
-
if (!prevValueIndex) {
|
|
357
|
-
throw new Error(`Nullifier tree should have one initial leaf`);
|
|
358
|
-
}
|
|
359
|
-
const prevValuePreimage = (await this.db.getLeafPreimage(tree, prevValueIndex.index));
|
|
360
|
-
const prevValueSiblingPath = await this.db.getSiblingPath(tree, BigInt(prevValueIndex.index));
|
|
361
|
-
return {
|
|
362
|
-
index: prevValueIndex,
|
|
363
|
-
leafPreimage: prevValuePreimage,
|
|
364
|
-
witness: new MembershipWitness(NULLIFIER_TREE_HEIGHT, BigInt(prevValueIndex.index), assertLength(prevValueSiblingPath.toFields(), NULLIFIER_TREE_HEIGHT)),
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
async getSubtreeSiblingPath(treeId, subtreeHeight) {
|
|
368
|
-
const nextAvailableLeafIndex = await this.db.getTreeInfo(treeId).then(t => t.size);
|
|
369
|
-
const fullSiblingPath = await this.db.getSiblingPath(treeId, nextAvailableLeafIndex);
|
|
370
|
-
// Drop the first subtreeHeight items since we only care about the path to the subtree root
|
|
371
|
-
return fullSiblingPath.getSubtreeSiblingPath(subtreeHeight).toFields();
|
|
372
|
-
}
|
|
373
|
-
async processPublicDataUpdateRequests(tx) {
|
|
374
|
-
const combinedPublicDataUpdateRequests = tx.data.combinedData.publicDataUpdateRequests.map(updateRequest => {
|
|
375
|
-
return new PublicDataTreeLeaf(updateRequest.leafSlot, updateRequest.newValue);
|
|
376
|
-
});
|
|
377
|
-
const { lowLeavesWitnessData, newSubtreeSiblingPath, sortedNewLeaves, sortedNewLeavesIndexes } = await this.db.batchInsert(MerkleTreeId.PUBLIC_DATA_TREE, combinedPublicDataUpdateRequests.map(x => x.toBuffer()),
|
|
378
|
-
// TODO(#3675) remove oldValue from update requests
|
|
379
|
-
PUBLIC_DATA_SUBTREE_HEIGHT);
|
|
380
|
-
if (lowLeavesWitnessData === undefined) {
|
|
381
|
-
throw new Error(`Could not craft public data batch insertion proofs`);
|
|
382
|
-
}
|
|
383
|
-
const sortedPublicDataWrites = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
|
|
384
|
-
return PublicDataTreeLeaf.fromBuffer(sortedNewLeaves[i]);
|
|
385
|
-
});
|
|
386
|
-
const sortedPublicDataWritesIndexes = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
|
|
387
|
-
return sortedNewLeavesIndexes[i];
|
|
388
|
-
});
|
|
389
|
-
const subtreeSiblingPathAsFields = newSubtreeSiblingPath.toFields();
|
|
390
|
-
const newPublicDataSubtreeSiblingPath = makeTuple(PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH, i => {
|
|
391
|
-
return subtreeSiblingPathAsFields[i];
|
|
392
|
-
});
|
|
393
|
-
const lowPublicDataWritesMembershipWitnesses = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
|
|
394
|
-
const witness = lowLeavesWitnessData[i];
|
|
395
|
-
return MembershipWitness.fromBufferArray(witness.index, assertLength(witness.siblingPath.toBufferArray(), PUBLIC_DATA_TREE_HEIGHT));
|
|
396
|
-
});
|
|
397
|
-
const lowPublicDataWritesPreimages = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
|
|
398
|
-
return lowLeavesWitnessData[i].leafPreimage;
|
|
399
|
-
});
|
|
400
|
-
// validate that the sortedPublicDataWrites and sortedPublicDataWritesIndexes are in the correct order
|
|
401
|
-
// otherwise it will just fail in the circuit
|
|
402
|
-
assertPermutation(combinedPublicDataUpdateRequests, sortedPublicDataWrites, sortedPublicDataWritesIndexes, (a, b) => a.equals(b));
|
|
403
|
-
return {
|
|
404
|
-
lowPublicDataWritesPreimages,
|
|
405
|
-
lowPublicDataWritesMembershipWitnesses,
|
|
406
|
-
newPublicDataSubtreeSiblingPath,
|
|
407
|
-
sortedPublicDataWrites,
|
|
408
|
-
sortedPublicDataWritesIndexes,
|
|
409
|
-
};
|
|
410
|
-
}
|
|
411
|
-
async getPublicDataReadsInfo(tx) {
|
|
412
|
-
const newPublicDataReadsWitnesses = makeTuple(MAX_PUBLIC_DATA_READS_PER_TX, () => MembershipWitness.empty(PUBLIC_DATA_TREE_HEIGHT, 0n));
|
|
413
|
-
const newPublicDataReadsPreimages = makeTuple(MAX_PUBLIC_DATA_READS_PER_TX, () => PublicDataTreeLeafPreimage.empty());
|
|
414
|
-
for (const i in tx.data.validationRequests.publicDataReads) {
|
|
415
|
-
const leafSlot = tx.data.validationRequests.publicDataReads[i].leafSlot.value;
|
|
416
|
-
const lowLeafResult = await this.db.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
|
|
417
|
-
if (!lowLeafResult) {
|
|
418
|
-
throw new Error(`Public data tree should have one initial leaf`);
|
|
419
|
-
}
|
|
420
|
-
const preimage = await this.db.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
|
|
421
|
-
const path = await this.db.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
|
|
422
|
-
newPublicDataReadsWitnesses[i] = new MembershipWitness(PUBLIC_DATA_TREE_HEIGHT, BigInt(lowLeafResult.index), path.toTuple());
|
|
423
|
-
newPublicDataReadsPreimages[i] = preimage;
|
|
424
|
-
}
|
|
425
|
-
return {
|
|
426
|
-
newPublicDataReadsWitnesses,
|
|
427
|
-
newPublicDataReadsPreimages,
|
|
428
|
-
};
|
|
429
|
-
}
|
|
430
|
-
// Builds the base rollup inputs, updating the contract, nullifier, and data trees in the process
|
|
431
|
-
async buildBaseRollupInput(tx, globalVariables) {
|
|
432
|
-
// Get trees info before any changes hit
|
|
433
|
-
const constants = await this.getConstantRollupData(globalVariables);
|
|
434
|
-
const start = new PartialStateReference(await this.getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE), await this.getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE), await this.getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE));
|
|
435
|
-
// Get the subtree sibling paths for the circuit
|
|
436
|
-
const noteHashSubtreeSiblingPathArray = await this.getSubtreeSiblingPath(MerkleTreeId.NOTE_HASH_TREE, NOTE_HASH_SUBTREE_HEIGHT);
|
|
437
|
-
const noteHashSubtreeSiblingPath = makeTuple(NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, i => i < noteHashSubtreeSiblingPathArray.length ? noteHashSubtreeSiblingPathArray[i] : Fr.ZERO);
|
|
438
|
-
// Update the note hash trees with the new items being inserted to get the new roots
|
|
439
|
-
// that will be used by the next iteration of the base rollup circuit, skipping the empty ones
|
|
440
|
-
const newNoteHashes = tx.data.combinedData.newNoteHashes.map(x => x.value.toBuffer());
|
|
441
|
-
await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, newNoteHashes);
|
|
442
|
-
// The read witnesses for a given TX should be generated before the writes of the same TX are applied.
|
|
443
|
-
// All reads that refer to writes in the same tx are transient and can be simplified out.
|
|
444
|
-
const txPublicDataReadsInfo = await this.getPublicDataReadsInfo(tx);
|
|
445
|
-
const txPublicDataUpdateRequestInfo = await this.processPublicDataUpdateRequests(tx);
|
|
446
|
-
// Update the nullifier tree, capturing the low nullifier info for each individual operation
|
|
447
|
-
const { lowLeavesWitnessData: nullifierWitnessLeaves, newSubtreeSiblingPath: newNullifiersSubtreeSiblingPath, sortedNewLeaves: sortedNewNullifiers, sortedNewLeavesIndexes, } = await this.db.batchInsert(MerkleTreeId.NULLIFIER_TREE, tx.data.combinedData.newNullifiers.map(sideEffectLinkedToNoteHash => sideEffectLinkedToNoteHash.value.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
|
|
448
|
-
if (nullifierWitnessLeaves === undefined) {
|
|
449
|
-
throw new Error(`Could not craft nullifier batch insertion proofs`);
|
|
450
|
-
}
|
|
451
|
-
// Extract witness objects from returned data
|
|
452
|
-
const nullifierPredecessorMembershipWitnessesWithoutPadding = nullifierWitnessLeaves.map(l => MembershipWitness.fromBufferArray(l.index, assertLength(l.siblingPath.toBufferArray(), NULLIFIER_TREE_HEIGHT)));
|
|
453
|
-
const nullifierSubtreeSiblingPathArray = newNullifiersSubtreeSiblingPath.toFields();
|
|
454
|
-
const nullifierSubtreeSiblingPath = makeTuple(NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, i => i < nullifierSubtreeSiblingPathArray.length ? nullifierSubtreeSiblingPathArray[i] : Fr.ZERO);
|
|
455
|
-
const publicDataSiblingPath = txPublicDataUpdateRequestInfo.newPublicDataSubtreeSiblingPath;
|
|
456
|
-
const stateDiffHints = StateDiffHints.from({
|
|
457
|
-
nullifierPredecessorPreimages: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => i < nullifierWitnessLeaves.length
|
|
458
|
-
? nullifierWitnessLeaves[i].leafPreimage
|
|
459
|
-
: NullifierLeafPreimage.empty()),
|
|
460
|
-
nullifierPredecessorMembershipWitnesses: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => i < nullifierPredecessorMembershipWitnessesWithoutPadding.length
|
|
461
|
-
? nullifierPredecessorMembershipWitnessesWithoutPadding[i]
|
|
462
|
-
: this.makeEmptyMembershipWitness(NULLIFIER_TREE_HEIGHT)),
|
|
463
|
-
sortedNullifiers: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => Fr.fromBuffer(sortedNewNullifiers[i])),
|
|
464
|
-
sortedNullifierIndexes: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => sortedNewLeavesIndexes[i]),
|
|
465
|
-
noteHashSubtreeSiblingPath,
|
|
466
|
-
nullifierSubtreeSiblingPath,
|
|
467
|
-
publicDataSiblingPath,
|
|
468
|
-
});
|
|
469
|
-
const blockHash = tx.data.constants.historicalHeader.hash();
|
|
470
|
-
const archiveRootMembershipWitness = await this.getMembershipWitnessFor(blockHash, MerkleTreeId.ARCHIVE, ARCHIVE_HEIGHT);
|
|
471
|
-
return BaseRollupInputs.from({
|
|
472
|
-
kernelData: this.getKernelDataFor(tx),
|
|
473
|
-
start,
|
|
474
|
-
stateDiffHints,
|
|
475
|
-
sortedPublicDataWrites: txPublicDataUpdateRequestInfo.sortedPublicDataWrites,
|
|
476
|
-
sortedPublicDataWritesIndexes: txPublicDataUpdateRequestInfo.sortedPublicDataWritesIndexes,
|
|
477
|
-
lowPublicDataWritesPreimages: txPublicDataUpdateRequestInfo.lowPublicDataWritesPreimages,
|
|
478
|
-
lowPublicDataWritesMembershipWitnesses: txPublicDataUpdateRequestInfo.lowPublicDataWritesMembershipWitnesses,
|
|
479
|
-
publicDataReadsPreimages: txPublicDataReadsInfo.newPublicDataReadsPreimages,
|
|
480
|
-
publicDataReadsMembershipWitnesses: txPublicDataReadsInfo.newPublicDataReadsWitnesses,
|
|
481
|
-
archiveRootMembershipWitness,
|
|
482
|
-
constants,
|
|
483
|
-
});
|
|
484
|
-
}
|
|
485
|
-
makeEmptyMembershipWitness(height) {
|
|
486
|
-
return new MembershipWitness(height, 0n, makeTuple(height, () => Fr.ZERO));
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sb19ibG9ja19idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jsb2NrX2J1aWxkZXIvc29sb19ibG9ja19idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLHNCQUFzQixDQUFDO0FBRTdFLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsc0JBQXNCLEVBRXRCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBRWxCLDJCQUEyQixFQUMzQix3Q0FBd0MsRUFDeEMseUJBQXlCLEVBQ3pCLDRCQUE0QixFQUM1QixzQ0FBc0MsRUFDdEMsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIscUNBQXFDLEVBQ3JDLHdCQUF3QixFQUN4QixxQ0FBcUMsRUFDckMscUJBQXFCLEVBQ3JCLG1DQUFtQyxFQUNuQywrQkFBK0IsRUFDL0IscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQix1Q0FBdUMsRUFDdkMsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFFbEIsa0JBQWtCLEVBQ2xCLDBCQUEwQixFQUMxQixxQkFBcUIsRUFDckIsK0JBQStCLEVBQy9CLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFFaEIsY0FBYyxFQUVkLGNBQWMsR0FFZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsaUJBQWlCLEVB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
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type representing the names of the trees for the base rollup.
|
|
3
|
-
*/
|
|
4
|
-
type BaseTreeNames = 'NoteHashTree' | 'ContractTree' | 'NullifierTree' | 'PublicDataTree';
|
|
5
|
-
/**
|
|
6
|
-
* Type representing the names of the trees.
|
|
7
|
-
*/
|
|
8
|
-
export type TreeNames = BaseTreeNames | 'L1ToL2MessageTree' | 'Archive';
|
|
9
|
-
export {};
|
|
10
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/block_builder/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,KAAK,aAAa,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAC1F;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,mBAAmB,GAAG,SAAS,CAAC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { VerificationKey } from '@aztec/circuits.js';
|
|
2
|
-
/**
|
|
3
|
-
* Well-known verification keys.
|
|
4
|
-
*/
|
|
5
|
-
export interface VerificationKeys {
|
|
6
|
-
/**
|
|
7
|
-
* Verification key for the default public kernel circuit.
|
|
8
|
-
*/
|
|
9
|
-
publicKernelCircuit: VerificationKey;
|
|
10
|
-
/**
|
|
11
|
-
* Verification key for the default private kernel circuit.
|
|
12
|
-
*/
|
|
13
|
-
privateKernelCircuit: VerificationKey;
|
|
14
|
-
/**
|
|
15
|
-
* Verification key for the default base rollup circuit.
|
|
16
|
-
*/
|
|
17
|
-
baseRollupCircuit: VerificationKey;
|
|
18
|
-
/**
|
|
19
|
-
* Verification key for the default merge rollup circuit.
|
|
20
|
-
*/
|
|
21
|
-
mergeRollupCircuit: VerificationKey;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Returns mock verification keys for each well known circuit.
|
|
25
|
-
* @returns A VerificationKeys object with fake values.
|
|
26
|
-
*/
|
|
27
|
-
export declare function getVerificationKeys(): VerificationKeys;
|
|
28
|
-
//# sourceMappingURL=verification_keys.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verification_keys.d.ts","sourceRoot":"","sources":["../../src/mocks/verification_keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,mBAAmB,EAAE,eAAe,CAAC;IACrC;;OAEG;IACH,oBAAoB,EAAE,eAAe,CAAC;IACtC;;OAEG;IACH,iBAAiB,EAAE,eAAe,CAAC;IACnC;;OAEG;IACH,kBAAkB,EAAE,eAAe,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAOtD"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { VerificationKey } from '@aztec/circuits.js';
|
|
2
|
-
/**
|
|
3
|
-
* Returns mock verification keys for each well known circuit.
|
|
4
|
-
* @returns A VerificationKeys object with fake values.
|
|
5
|
-
*/
|
|
6
|
-
export function getVerificationKeys() {
|
|
7
|
-
return {
|
|
8
|
-
privateKernelCircuit: VerificationKey.makeFake(),
|
|
9
|
-
baseRollupCircuit: VerificationKey.makeFake(),
|
|
10
|
-
mergeRollupCircuit: VerificationKey.makeFake(),
|
|
11
|
-
publicKernelCircuit: VerificationKey.makeFake(),
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZpY2F0aW9uX2tleXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9ja3MvdmVyaWZpY2F0aW9uX2tleXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBd0JyRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLE9BQU87UUFDTCxvQkFBb0IsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO1FBQ2hELGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUU7UUFDN0Msa0JBQWtCLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRTtRQUM5QyxtQkFBbUIsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO0tBQ2hELENBQUM7QUFDSixDQUFDIn0=
|