@aztec/prover-client 3.0.0-canary.a9708bd → 3.0.0-devnet.2-patch.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/block-factory/index.d.ts +1 -1
- package/dest/block-factory/light.d.ts +5 -3
- package/dest/block-factory/light.d.ts.map +1 -1
- package/dest/block-factory/light.js +32 -11
- package/dest/config.d.ts +1 -1
- package/dest/config.js +1 -1
- package/dest/index.d.ts +1 -1
- package/dest/light/lightweight_checkpoint_builder.d.ts +29 -0
- package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -0
- package/dest/light/lightweight_checkpoint_builder.js +108 -0
- package/dest/mocks/fixtures.d.ts +5 -5
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +33 -15
- package/dest/mocks/test_context.d.ts +37 -33
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +124 -82
- package/dest/orchestrator/block-building-helpers.d.ts +35 -35
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +151 -187
- package/dest/orchestrator/block-proving-state.d.ts +68 -55
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +273 -185
- package/dest/orchestrator/checkpoint-proving-state.d.ts +63 -0
- package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/checkpoint-proving-state.js +210 -0
- package/dest/orchestrator/epoch-proving-state.d.ts +38 -31
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/epoch-proving-state.js +128 -84
- package/dest/orchestrator/index.d.ts +1 -1
- package/dest/orchestrator/orchestrator.d.ts +33 -32
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +369 -243
- package/dest/orchestrator/orchestrator_metrics.d.ts +1 -1
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.d.ts +12 -10
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.js +23 -29
- package/dest/prover-client/factory.d.ts +1 -1
- package/dest/prover-client/index.d.ts +1 -1
- package/dest/prover-client/prover-client.d.ts +1 -1
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/server-epoch-prover.d.ts +13 -11
- package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
- package/dest/prover-client/server-epoch-prover.js +9 -9
- package/dest/proving_broker/broker_prover_facade.d.ts +23 -18
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
- package/dest/proving_broker/broker_prover_facade.js +41 -25
- package/dest/proving_broker/config.d.ts +18 -14
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +13 -7
- package/dest/proving_broker/factory.d.ts +1 -1
- package/dest/proving_broker/factory.js +1 -1
- package/dest/proving_broker/fixtures.d.ts +3 -2
- package/dest/proving_broker/fixtures.d.ts.map +1 -1
- package/dest/proving_broker/fixtures.js +3 -2
- package/dest/proving_broker/index.d.ts +1 -1
- package/dest/proving_broker/proof_store/factory.d.ts +2 -2
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +1 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/index.d.ts +2 -1
- package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/index.js +1 -0
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts +1 -1
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/proof_store.d.ts +1 -1
- package/dest/proving_broker/proving_agent.d.ts +1 -1
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent_instrumentation.d.ts +1 -1
- package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.d.ts +2 -2
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +31 -19
- package/dest/proving_broker/proving_broker_database/memory.d.ts +3 -2
- package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.d.ts +3 -2
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.js +8 -7
- package/dest/proving_broker/proving_broker_database.d.ts +3 -2
- package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.d.ts +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.d.ts +3 -2
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.js +39 -19
- package/dest/proving_broker/rpc.d.ts +4 -4
- package/dest/test/mock_proof_store.d.ts +3 -3
- package/dest/test/mock_proof_store.d.ts.map +1 -1
- package/dest/test/mock_prover.d.ts +23 -19
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +35 -20
- package/package.json +19 -19
- package/src/block-factory/light.ts +40 -17
- package/src/config.ts +1 -1
- package/src/light/lightweight_checkpoint_builder.ts +144 -0
- package/src/mocks/fixtures.ts +41 -36
- package/src/mocks/test_context.ts +188 -114
- package/src/orchestrator/block-building-helpers.ts +233 -313
- package/src/orchestrator/block-proving-state.ts +315 -247
- package/src/orchestrator/checkpoint-proving-state.ts +303 -0
- package/src/orchestrator/epoch-proving-state.ts +176 -129
- package/src/orchestrator/orchestrator.ts +554 -319
- package/src/orchestrator/tx-proving-state.ts +48 -55
- package/src/prover-client/server-epoch-prover.ts +30 -21
- package/src/proving_broker/broker_prover_facade.ts +175 -103
- package/src/proving_broker/config.ts +15 -8
- package/src/proving_broker/factory.ts +1 -1
- package/src/proving_broker/fixtures.ts +8 -3
- package/src/proving_broker/proof_store/index.ts +1 -0
- package/src/proving_broker/proving_broker.ts +38 -19
- package/src/proving_broker/proving_broker_database/memory.ts +2 -1
- package/src/proving_broker/proving_broker_database/persisted.ts +10 -9
- package/src/proving_broker/proving_broker_database.ts +2 -1
- package/src/proving_broker/proving_job_controller.ts +41 -20
- package/src/test/mock_prover.ts +142 -60
- package/dest/bin/get-proof-inputs.d.ts +0 -2
- package/dest/bin/get-proof-inputs.d.ts.map +0 -1
- package/dest/bin/get-proof-inputs.js +0 -51
- package/src/bin/get-proof-inputs.ts +0 -59
|
@@ -1,62 +1,61 @@
|
|
|
1
|
+
import { TestCircuitProver } from '@aztec/bb-prover';
|
|
1
2
|
import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { padArrayEnd, times, timesAsync } from '@aztec/foundation/collection';
|
|
5
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
6
|
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
6
|
-
import {
|
|
7
|
+
import { ProtocolContractsList } from '@aztec/protocol-contracts';
|
|
7
8
|
import { computeFeePayerBalanceLeafSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
8
|
-
import { SimpleContractDataSource } from '@aztec/simulator/public/fixtures';
|
|
9
|
-
import { PublicProcessorFactory } from '@aztec/simulator/server';
|
|
10
9
|
import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
11
10
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
12
11
|
import { EthAddress } from '@aztec/stdlib/block';
|
|
13
|
-
import {
|
|
12
|
+
import { mockProcessedTx } from '@aztec/stdlib/testing';
|
|
14
13
|
import { MerkleTreeId, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
15
14
|
import { TreeSnapshots } from '@aztec/stdlib/tx';
|
|
16
15
|
import { NativeWorldStateService } from '@aztec/world-state/native';
|
|
17
16
|
import { promises as fs } from 'fs';
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
import { TestCircuitProver } from '../../../bb-prover/src/test/test_circuit_prover.js';
|
|
21
|
-
import { buildBlockWithCleanDB } from '../block-factory/light.js';
|
|
22
|
-
import { getTreeSnapshot } from '../orchestrator/block-building-helpers.js';
|
|
17
|
+
import { LightweightCheckpointBuilder } from '../light/lightweight_checkpoint_builder.js';
|
|
18
|
+
import { buildFinalBlobChallenges, getTreeSnapshot, insertSideEffects } from '../orchestrator/block-building-helpers.js';
|
|
23
19
|
import { ProvingOrchestrator } from '../orchestrator/index.js';
|
|
24
20
|
import { BrokerCircuitProverFacade } from '../proving_broker/broker_prover_facade.js';
|
|
25
21
|
import { TestBroker } from '../test/mock_prover.js';
|
|
26
|
-
import { getEnvironmentConfig, getSimulator,
|
|
22
|
+
import { getEnvironmentConfig, getSimulator, makeCheckpointConstants, makeGlobals } from './fixtures.js';
|
|
27
23
|
export class TestContext {
|
|
28
24
|
worldState;
|
|
29
|
-
globalVariables;
|
|
30
25
|
prover;
|
|
31
26
|
broker;
|
|
32
27
|
brokerProverFacade;
|
|
33
28
|
orchestrator;
|
|
34
|
-
blockNumber;
|
|
35
29
|
feePayer;
|
|
36
30
|
directoriesToCleanup;
|
|
37
31
|
logger;
|
|
38
32
|
headers;
|
|
33
|
+
checkpoints;
|
|
34
|
+
nextCheckpointIndex;
|
|
35
|
+
nextBlockNumber;
|
|
36
|
+
epochNumber;
|
|
39
37
|
feePayerBalance;
|
|
40
|
-
constructor(worldState,
|
|
38
|
+
constructor(worldState, prover, broker, brokerProverFacade, orchestrator, feePayer, initialFeePayerBalance, directoriesToCleanup, logger){
|
|
41
39
|
this.worldState = worldState;
|
|
42
|
-
this.globalVariables = globalVariables;
|
|
43
40
|
this.prover = prover;
|
|
44
41
|
this.broker = broker;
|
|
45
42
|
this.brokerProverFacade = brokerProverFacade;
|
|
46
43
|
this.orchestrator = orchestrator;
|
|
47
|
-
this.blockNumber = blockNumber;
|
|
48
44
|
this.feePayer = feePayer;
|
|
49
45
|
this.directoriesToCleanup = directoriesToCleanup;
|
|
50
46
|
this.logger = logger;
|
|
51
47
|
this.headers = new Map();
|
|
48
|
+
this.checkpoints = [];
|
|
49
|
+
this.nextCheckpointIndex = 0;
|
|
50
|
+
this.nextBlockNumber = 1;
|
|
51
|
+
this.epochNumber = 1;
|
|
52
52
|
this.feePayerBalance = initialFeePayerBalance;
|
|
53
53
|
}
|
|
54
54
|
get epochProver() {
|
|
55
55
|
return this.orchestrator;
|
|
56
56
|
}
|
|
57
|
-
static async new(logger, { proverCount = 4, createProver = async (bbConfig)=>new TestCircuitProver(await getSimulator(bbConfig, logger))
|
|
57
|
+
static async new(logger, { proverCount = 4, createProver = async (bbConfig)=>new TestCircuitProver(await getSimulator(bbConfig, logger)) } = {}) {
|
|
58
58
|
const directoriesToCleanup = [];
|
|
59
|
-
const globalVariables = makeGlobals(blockNumber);
|
|
60
59
|
const feePayer = AztecAddress.fromNumber(42222);
|
|
61
60
|
const initialFeePayerBalance = new Fr(10n ** 20n);
|
|
62
61
|
const feePayerSlot = await computeFeePayerBalanceLeafSlot(feePayer);
|
|
@@ -89,20 +88,11 @@ export class TestContext {
|
|
|
89
88
|
const orchestrator = new TestProvingOrchestrator(ws, facade, EthAddress.ZERO);
|
|
90
89
|
await broker.start();
|
|
91
90
|
facade.start();
|
|
92
|
-
return new this(ws,
|
|
91
|
+
return new this(ws, localProver, broker, facade, orchestrator, feePayer, initialFeePayerBalance, directoriesToCleanup, logger);
|
|
93
92
|
}
|
|
94
93
|
getFork() {
|
|
95
94
|
return this.worldState.fork();
|
|
96
95
|
}
|
|
97
|
-
getBlockHeader(blockNumber = 0) {
|
|
98
|
-
return blockNumber === 0 ? this.worldState.getCommitted().getInitialHeader() : this.headers.get(blockNumber);
|
|
99
|
-
}
|
|
100
|
-
setBlockHeader(header, blockNumber) {
|
|
101
|
-
this.headers.set(blockNumber, header);
|
|
102
|
-
}
|
|
103
|
-
getPreviousBlockHeader(currentBlockNumber = this.blockNumber) {
|
|
104
|
-
return this.getBlockHeader(currentBlockNumber - 1);
|
|
105
|
-
}
|
|
106
96
|
async cleanup() {
|
|
107
97
|
await this.brokerProverFacade.stop();
|
|
108
98
|
await this.broker.stop();
|
|
@@ -118,81 +108,133 @@ export class TestContext {
|
|
|
118
108
|
}
|
|
119
109
|
}
|
|
120
110
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
111
|
+
startNewEpoch() {
|
|
112
|
+
this.checkpoints = [];
|
|
113
|
+
this.nextCheckpointIndex = 0;
|
|
114
|
+
this.epochNumber++;
|
|
115
|
+
}
|
|
116
|
+
// Return blob fields of all checkpoints in the epoch.
|
|
117
|
+
getBlobFields() {
|
|
118
|
+
return this.checkpoints.map((checkpoint)=>checkpoint.toBlobFields());
|
|
119
|
+
}
|
|
120
|
+
async getFinalBlobChallenges() {
|
|
121
|
+
const blobFields = this.getBlobFields();
|
|
122
|
+
return await buildFinalBlobChallenges(blobFields);
|
|
123
|
+
}
|
|
124
|
+
async makeCheckpoint(numBlocks, { numTxsPerBlock = 0, numL1ToL2Messages = 0, makeProcessedTxOpts = ()=>({}), ...constantOpts } = {}) {
|
|
125
|
+
if (numBlocks === 0) {
|
|
126
|
+
throw new Error('Cannot make a checkpoint with 0 blocks. Crate an empty block (numTxsPerBlock = 0) if there are no txs.');
|
|
127
|
+
}
|
|
128
|
+
const checkpointIndex = this.nextCheckpointIndex++;
|
|
129
|
+
const checkpointNumber = CheckpointNumber(checkpointIndex + 1);
|
|
130
|
+
const slotNumber = checkpointNumber * 15; // times an arbitrary number to make it different to the checkpoint number
|
|
131
|
+
const constants = makeCheckpointConstants(slotNumber, constantOpts);
|
|
132
|
+
const fork = await this.worldState.fork();
|
|
133
|
+
// Build l1 to l2 messages.
|
|
134
|
+
const l1ToL2Messages = times(numL1ToL2Messages, (i)=>new Fr(slotNumber * 100 + i));
|
|
135
|
+
await fork.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP));
|
|
136
|
+
const newL1ToL2Snapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, fork);
|
|
137
|
+
const startBlockNumber = this.nextBlockNumber;
|
|
138
|
+
const previousBlockHeader = this.getBlockHeader(BlockNumber(startBlockNumber - 1));
|
|
139
|
+
// Build global variables.
|
|
140
|
+
const blockGlobalVariables = times(numBlocks, (i)=>makeGlobals(startBlockNumber + i, slotNumber, {
|
|
141
|
+
coinbase: constants.coinbase,
|
|
142
|
+
feeRecipient: constants.feeRecipient,
|
|
143
|
+
gasFees: constants.gasFees
|
|
144
|
+
}));
|
|
145
|
+
this.nextBlockNumber += numBlocks;
|
|
146
|
+
// Build txs.
|
|
147
|
+
let totalTxs = 0;
|
|
148
|
+
const blockEndStates = [];
|
|
149
|
+
const blockTxs = await timesAsync(numBlocks, async (blockIndex)=>{
|
|
150
|
+
const txIndexOffset = totalTxs;
|
|
151
|
+
const numTxs = typeof numTxsPerBlock === 'number' ? numTxsPerBlock : numTxsPerBlock[blockIndex];
|
|
152
|
+
totalTxs += numTxs;
|
|
153
|
+
const txs = await timesAsync(numTxs, (txIndex)=>this.makeProcessedTx({
|
|
154
|
+
seed: (txIndexOffset + txIndex + 1) * 321 + (checkpointIndex + 1) * 123456 + this.epochNumber * 0x99999,
|
|
155
|
+
globalVariables: blockGlobalVariables[blockIndex],
|
|
156
|
+
anchorBlockHeader: previousBlockHeader,
|
|
157
|
+
newL1ToL2Snapshot,
|
|
158
|
+
...makeProcessedTxOpts(blockGlobalVariables[blockIndex], txIndexOffset + txIndex)
|
|
159
|
+
}));
|
|
160
|
+
// Insert side effects into the trees.
|
|
161
|
+
const endState = await this.updateTrees(txs, fork);
|
|
162
|
+
blockEndStates.push(endState);
|
|
163
|
+
return txs;
|
|
164
|
+
});
|
|
165
|
+
const cleanFork = await this.worldState.fork();
|
|
166
|
+
const builder = await LightweightCheckpointBuilder.startNewCheckpoint(checkpointNumber, constants, l1ToL2Messages, cleanFork);
|
|
167
|
+
// Add tx effects to db and build block headers.
|
|
168
|
+
const blocks = [];
|
|
169
|
+
for(let i = 0; i < numBlocks; i++){
|
|
170
|
+
const txs = blockTxs[i];
|
|
171
|
+
const state = blockEndStates[i];
|
|
172
|
+
const block = await builder.addBlock(blockGlobalVariables[i], state, txs);
|
|
173
|
+
const header = block.header;
|
|
174
|
+
this.headers.set(block.number, header);
|
|
175
|
+
const blockMsgs = block.indexWithinCheckpoint === 0 ? l1ToL2Messages : [];
|
|
176
|
+
await this.worldState.handleL2BlockAndMessages(block, blockMsgs);
|
|
177
|
+
blocks.push({
|
|
178
|
+
header,
|
|
179
|
+
txs
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
const checkpoint = await builder.completeCheckpoint();
|
|
183
|
+
this.checkpoints.push(checkpoint);
|
|
184
|
+
return {
|
|
185
|
+
constants,
|
|
186
|
+
header: checkpoint.header,
|
|
187
|
+
blocks,
|
|
188
|
+
l1ToL2Messages,
|
|
189
|
+
previousBlockHeader
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
async makeProcessedTx(opts = {}) {
|
|
193
|
+
const tx = await mockProcessedTx({
|
|
126
194
|
vkTreeRoot: getVKTreeRoot(),
|
|
127
|
-
|
|
128
|
-
globalVariables: this.globalVariables,
|
|
195
|
+
protocolContracts: ProtocolContractsList,
|
|
129
196
|
feePayer: this.feePayer,
|
|
130
197
|
...opts
|
|
131
198
|
});
|
|
132
199
|
this.feePayerBalance = new Fr(this.feePayerBalance.toBigInt() - tx.txEffect.transactionFee.toBigInt());
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
200
|
+
const feePayerSlot = await computeFeePayerBalanceLeafSlot(this.feePayer);
|
|
201
|
+
const feePaymentPublicDataWrite = new PublicDataWrite(feePayerSlot, this.feePayerBalance);
|
|
202
|
+
tx.txEffect.publicDataWrites[0] = feePaymentPublicDataWrite;
|
|
203
|
+
if (tx.avmProvingRequest) {
|
|
204
|
+
tx.avmProvingRequest.inputs.publicInputs.accumulatedData.publicDataWrites[0] = feePaymentPublicDataWrite;
|
|
136
205
|
}
|
|
137
206
|
return tx;
|
|
138
207
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const merkleTrees = await this.worldState.fork();
|
|
145
|
-
await merkleTrees.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP));
|
|
146
|
-
const newL1ToL2Snapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, merkleTrees);
|
|
147
|
-
const txs = await timesParallel(numTxs, (i)=>this.makeProcessedTx({
|
|
148
|
-
seed: i + blockNum * 1000,
|
|
149
|
-
globalVariables,
|
|
150
|
-
newL1ToL2Snapshot,
|
|
151
|
-
...makeProcessedTxOpts(i)
|
|
152
|
-
}));
|
|
153
|
-
await this.setTreeRoots(txs);
|
|
154
|
-
const block = await buildBlockWithCleanDB(txs, globalVariables, l1ToL2Messages, db);
|
|
155
|
-
this.headers.set(blockNum, block.header);
|
|
156
|
-
await this.worldState.handleL2BlockAndMessages(block, l1ToL2Messages);
|
|
157
|
-
return {
|
|
158
|
-
block,
|
|
159
|
-
txs,
|
|
160
|
-
l1ToL2Messages
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
async processPublicFunctions(txs, { maxTransactions = txs.length, numL1ToL2Messages = 0, contractDataSource } = {}) {
|
|
164
|
-
const l1ToL2Messages = times(numL1ToL2Messages, (i)=>new Fr(this.blockNumber * 100 + i));
|
|
165
|
-
const merkleTrees = await this.worldState.fork();
|
|
166
|
-
await merkleTrees.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP));
|
|
167
|
-
const processorFactory = new PublicProcessorFactory(contractDataSource ?? new SimpleContractDataSource(), new TestDateProvider());
|
|
168
|
-
const publicProcessor = processorFactory.create(merkleTrees, this.globalVariables, /*skipFeeEnforcement=*/ false);
|
|
169
|
-
return await publicProcessor.process(txs, {
|
|
170
|
-
maxTransactions
|
|
171
|
-
});
|
|
208
|
+
getBlockHeader(blockNumber) {
|
|
209
|
+
if (Number(blockNumber) > 0 && Number(blockNumber) >= this.nextBlockNumber) {
|
|
210
|
+
throw new Error(`Block header not built for block number ${blockNumber}.`);
|
|
211
|
+
}
|
|
212
|
+
return Number(blockNumber) === 0 ? this.worldState.getCommitted().getInitialHeader() : this.headers.get(Number(blockNumber));
|
|
172
213
|
}
|
|
173
|
-
async
|
|
174
|
-
|
|
214
|
+
async updateTrees(txs, fork) {
|
|
215
|
+
let startStateReference = await fork.getStateReference();
|
|
216
|
+
let endStateReference = startStateReference;
|
|
175
217
|
for (const tx of txs){
|
|
176
|
-
|
|
177
|
-
await
|
|
178
|
-
tx
|
|
179
|
-
]);
|
|
180
|
-
const endStateReference = await db.getStateReference();
|
|
218
|
+
await insertSideEffects(tx, fork);
|
|
219
|
+
endStateReference = await fork.getStateReference();
|
|
181
220
|
if (tx.avmProvingRequest) {
|
|
221
|
+
// Update the trees in the avm public inputs so that the proof won't fail.
|
|
182
222
|
const l1ToL2MessageTree = tx.avmProvingRequest.inputs.publicInputs.startTreeSnapshots.l1ToL2MessageTree;
|
|
183
223
|
tx.avmProvingRequest.inputs.publicInputs.startTreeSnapshots = new TreeSnapshots(l1ToL2MessageTree, startStateReference.partial.noteHashTree, startStateReference.partial.nullifierTree, startStateReference.partial.publicDataTree);
|
|
184
224
|
tx.avmProvingRequest.inputs.publicInputs.endTreeSnapshots = new TreeSnapshots(l1ToL2MessageTree, endStateReference.partial.noteHashTree, endStateReference.partial.nullifierTree, endStateReference.partial.publicDataTree);
|
|
185
225
|
}
|
|
226
|
+
startStateReference = endStateReference;
|
|
186
227
|
}
|
|
228
|
+
return endStateReference;
|
|
187
229
|
}
|
|
188
230
|
}
|
|
189
231
|
class TestProvingOrchestrator extends ProvingOrchestrator {
|
|
190
232
|
isVerifyBuiltBlockAgainstSyncedStateEnabled = false;
|
|
191
233
|
// Disable this check by default, since it requires seeding world state with the block being built
|
|
192
234
|
// This is only enabled in some tests with multiple blocks that populate the pending chain via makePendingBlock
|
|
193
|
-
verifyBuiltBlockAgainstSyncedState(
|
|
235
|
+
verifyBuiltBlockAgainstSyncedState(provingState) {
|
|
194
236
|
if (this.isVerifyBuiltBlockAgainstSyncedStateEnabled) {
|
|
195
|
-
return super.verifyBuiltBlockAgainstSyncedState(
|
|
237
|
+
return super.verifyBuiltBlockAgainstSyncedState(provingState);
|
|
196
238
|
}
|
|
197
239
|
return Promise.resolve();
|
|
198
240
|
}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { BatchedBlobAccumulator,
|
|
2
|
-
import {
|
|
3
|
-
import { type
|
|
1
|
+
import { BatchedBlobAccumulator, SpongeBlob } from '@aztec/blob-lib';
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
import { type Bufferable } from '@aztec/foundation/serialize';
|
|
4
4
|
import { MembershipWitness } from '@aztec/foundation/trees';
|
|
5
|
-
import { PublicDataHint } from '@aztec/stdlib/avm';
|
|
6
5
|
import { Body } from '@aztec/stdlib/block';
|
|
7
|
-
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
6
|
+
import type { MerkleTreeWriteOperations, PublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
|
|
7
|
+
import { ProofData, RecursiveProof } from '@aztec/stdlib/proofs';
|
|
8
|
+
import { BlockRollupPublicInputs, PrivateBaseRollupHints, PublicBaseRollupHints, PublicChonkVerifierPrivateInputs } from '@aztec/stdlib/rollup';
|
|
10
9
|
import { AppendOnlyTreeSnapshot, MerkleTreeId } from '@aztec/stdlib/trees';
|
|
11
|
-
import { BlockHeader,
|
|
10
|
+
import { BlockHeader, GlobalVariables, PartialStateReference, type ProcessedTx, StateReference, Tx } from '@aztec/stdlib/tx';
|
|
12
11
|
import type { MerkleTreeReadOperations } from '@aztec/world-state';
|
|
13
12
|
/**
|
|
14
13
|
* Type representing the names of the trees for the base rollup.
|
|
@@ -18,38 +17,38 @@ type BaseTreeNames = 'NoteHashTree' | 'ContractTree' | 'NullifierTree' | 'Public
|
|
|
18
17
|
* Type representing the names of the trees.
|
|
19
18
|
*/
|
|
20
19
|
export type TreeNames = BaseTreeNames | 'L1ToL2MessageTree' | 'Archive';
|
|
21
|
-
export declare const insertSideEffectsAndBuildBaseRollupHints: (tx: ProcessedTx,
|
|
22
|
-
export declare
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
blobCommitments: BLS12Point[];
|
|
26
|
-
blobs: Blob[];
|
|
27
|
-
blobsHash: Fr;
|
|
20
|
+
export declare const insertSideEffectsAndBuildBaseRollupHints: (tx: ProcessedTx, lastArchive: AppendOnlyTreeSnapshot, newL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, startSpongeBlob: SpongeBlob, proverId: Fr, db: MerkleTreeWriteOperations) => Promise<PrivateBaseRollupHints | PublicBaseRollupHints>;
|
|
21
|
+
export declare const insertSideEffects: (tx: ProcessedTx, db: MerkleTreeWriteOperations) => Promise<{
|
|
22
|
+
nullifierInsertionResult: import("@aztec/stdlib/trees").BatchInsertionResult<number, number>;
|
|
23
|
+
publicDataInsertionResult: import("@aztec/stdlib/trees").SequentialInsertionResult<number>;
|
|
28
24
|
}>;
|
|
29
|
-
export declare
|
|
30
|
-
export declare
|
|
31
|
-
export declare const
|
|
25
|
+
export declare function getChonkProofFromTx(tx: Tx | ProcessedTx): RecursiveProof<1963>;
|
|
26
|
+
export declare function getPublicChonkVerifierPrivateInputsFromTx(tx: Tx | ProcessedTx, proverId: Fr): PublicChonkVerifierPrivateInputs;
|
|
27
|
+
export declare const buildBlobHints: (blobFields: Fr[]) => {
|
|
28
|
+
blobCommitments: import("../../../foundation/dest/curves/bls12/point.js").BLS12Point[];
|
|
29
|
+
blobs: import("@aztec/blob-lib").Blob[];
|
|
30
|
+
blobsHash: Fr;
|
|
31
|
+
};
|
|
32
|
+
export declare const buildFinalBlobChallenges: (blobFieldsPerCheckpoint: Fr[][]) => Promise<import("@aztec/blob-lib").FinalBlobBatchingChallenges>;
|
|
33
|
+
export declare const accumulateBlobs: (blobFields: Fr[], startBlobAccumulator: BatchedBlobAccumulator) => Promise<BatchedBlobAccumulator>;
|
|
34
|
+
export declare const buildHeaderFromCircuitOutputs: (blockRootRollupOutput: BlockRollupPublicInputs) => Promise<BlockHeader>;
|
|
35
|
+
export declare const buildHeaderAndBodyFromTxs: (txs: ProcessedTx[], lastArchive: AppendOnlyTreeSnapshot, endState: StateReference, globalVariables: GlobalVariables, startSpongeBlob: SpongeBlob, isFirstBlock: boolean) => Promise<{
|
|
32
36
|
header: BlockHeader;
|
|
33
37
|
body: Body;
|
|
38
|
+
blockBlobFields: Fr[];
|
|
34
39
|
}>;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
export declare const validateState: (state: StateReference, db: MerkleTreeReadOperations) => Promise<void>;
|
|
41
|
-
export declare function getLastSiblingPath<TID extends MerkleTreeId>(treeId: TID, db: MerkleTreeReadOperations): Promise<Tuple<Fr, {
|
|
42
|
-
readonly 1: 40;
|
|
43
|
-
readonly 4: 29;
|
|
44
|
-
readonly 3: 39;
|
|
45
|
-
readonly 0: 40;
|
|
40
|
+
export declare function getLastSiblingPath<TID extends MerkleTreeId>(treeId: TID, db: MerkleTreeReadOperations): Promise<import("@aztec/foundation/serialize").Tuple<Fr, {
|
|
41
|
+
readonly 1: 42;
|
|
42
|
+
readonly 4: 30;
|
|
43
|
+
readonly 3: 36;
|
|
44
|
+
readonly 0: 42;
|
|
46
45
|
readonly 2: 40;
|
|
47
46
|
}[TID]>>;
|
|
48
|
-
export declare function getRootTreeSiblingPath<TID extends MerkleTreeId>(treeId: TID, db: MerkleTreeReadOperations): Promise<Tuple<Fr, {
|
|
49
|
-
readonly 1:
|
|
50
|
-
readonly 4:
|
|
51
|
-
readonly 3:
|
|
52
|
-
readonly 0:
|
|
47
|
+
export declare function getRootTreeSiblingPath<TID extends MerkleTreeId>(treeId: TID, db: MerkleTreeReadOperations): Promise<import("@aztec/foundation/serialize").Tuple<Fr, {
|
|
48
|
+
readonly 1: 42;
|
|
49
|
+
readonly 4: 30;
|
|
50
|
+
readonly 3: 36;
|
|
51
|
+
readonly 0: 42;
|
|
53
52
|
readonly 2: 40;
|
|
54
53
|
}[TID]>>;
|
|
55
54
|
export declare function getTreeSnapshot(id: MerkleTreeId, db: MerkleTreeReadOperations): Promise<AppendOnlyTreeSnapshot>;
|
|
@@ -58,5 +57,6 @@ export declare function getSubtreeSiblingPath(treeId: MerkleTreeId, subtreeHeigh
|
|
|
58
57
|
export declare function getMembershipWitnessFor<N extends number>(value: Fr, treeId: MerkleTreeId, height: N, db: MerkleTreeReadOperations): Promise<MembershipWitness<N>>;
|
|
59
58
|
export declare function validatePartialState(partialState: PartialStateReference, treeSnapshots: Map<MerkleTreeId, AppendOnlyTreeSnapshot>): void;
|
|
60
59
|
export declare function validateTx(tx: ProcessedTx): void;
|
|
60
|
+
export declare function toProofData<T extends Bufferable, PROOF_LENGTH extends number>({ inputs, proof, verificationKey }: PublicInputsAndRecursiveProof<T, PROOF_LENGTH>, vkIndex?: number): ProofData<T, PROOF_LENGTH>;
|
|
61
61
|
export {};
|
|
62
|
-
//# sourceMappingURL=
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2stYnVpbGRpbmctaGVscGVycy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29yY2hlc3RyYXRvci9ibG9jay1idWlsZGluZy1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsVUFBVSxFQUtYLE1BQU0saUJBQWlCLENBQUM7QUFpQnpCLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQWdDLE1BQU0sNkJBQTZCLENBQUM7QUFDNUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxFQUFFLHlCQUF5QixFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFaEgsT0FBTyxFQUFTLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsZ0NBQWdDLEVBRWpDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixZQUFZLEVBSWIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsV0FBVyxFQUNYLGVBQWUsRUFDZixxQkFBcUIsRUFDckIsS0FBSyxXQUFXLEVBQ2hCLGNBQWMsRUFDZCxFQUFFLEVBQ0gsTUFBTSxrQkFBa0IsQ0FBQztBQUcxQixPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRW5FOztHQUVHO0FBQ0gsS0FBSyxhQUFhLEdBQUcsY0FBYyxHQUFHLGNBQWMsR0FBRyxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFDMUY7O0dBRUc7QUFDSCxNQUFNLE1BQU0sU0FBUyxHQUFHLGFBQWEsR0FBRyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7QUFHeEUsZUFBTyxNQUFNLHdDQUF3QyxtUEEwSHBELENBQUM7QUFFRixlQUFPLE1BQU0saUJBQWlCOzs7RUFvQzdCLENBQUM7QUFFRix3QkFBZ0IsbUJBQW1CLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxXQUFXLHdCQVF2RDtBQUVELHdCQUFnQix5Q0FBeUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLFdBQVcsRUFBRSxRQUFRLEVBQUUsRUFBRSxvQ0FPM0Y7QUFLRCxlQUFPLE1BQU0sY0FBYzs7OztDQUsxQixDQUFDO0FBRUYsZUFBTyxNQUFNLHdCQUF3QixxR0FFcEMsQ0FBQztBQUVGLGVBQU8sTUFBTSxlQUFlLHFHQU8zQixDQUFDO0FBRUYsZUFBTyxNQUFNLDZCQUE2QiwwRUEyQnpDLENBQUM7QUFFRixlQUFPLE1BQU0seUJBQXlCOzs7O0VBMERyQyxDQUFDO0FBRUYsd0JBQXNCLGtCQUFrQixDQUFDLEdBQUcsU0FBUyxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsd0JBQXdCOzs7Ozs7U0FJM0c7QUFFRCx3QkFBc0Isc0JBQXNCLENBQUMsR0FBRyxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSx3QkFBd0I7Ozs7OztTQUkvRztBQUVELHdCQUFzQixlQUFlLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsd0JBQXdCLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBR3JIO0FBRUQsd0JBQWdCLDBCQUEwQixDQUFDLENBQUMsU0FBUyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsd0JBTXJFO0FBRUQsd0JBQXNCLHFCQUFxQixDQUN6QyxNQUFNLEVBQUUsWUFBWSxFQUNwQixhQUFhLEVBQUUsTUFBTSxFQUNyQixFQUFFLEVBQUUsd0JBQXdCLEdBQzNCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQU1mO0FBR0Qsd0JBQXNCLHVCQUF1QixDQUFDLENBQUMsU0FBUyxNQUFNLEVBQzVELEtBQUssRUFBRSxFQUFFLEVBQ1QsTUFBTSxFQUFFLFlBQVksRUFDcEIsTUFBTSxFQUFFLENBQUMsRUFDVCxFQUFFLEVBQUUsd0JBQXdCLEdBQzNCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQVkvQjtBQUVELHdCQUFnQixvQkFBb0IsQ0FDbEMsWUFBWSxFQUFFLHFCQUFxQixFQUNuQyxhQUFhLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxRQVN6RDtBQXFCRCx3QkFBZ0IsVUFBVSxDQUFDLEVBQUUsRUFBRSxXQUFXLFFBY3pDO0FBRUQsd0JBQWdCLFdBQVcsQ0FBQyxDQUFDLFNBQVMsVUFBVSxFQUFFLFlBQVksU0FBUyxNQUFNLEVBQzNFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQ2xGLE9BQU8sQ0FBQyxFQUFFLE1BQU0sOEJBS2pCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-building-helpers.d.ts","sourceRoot":"","sources":["../../src/orchestrator/block-building-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"block-building-helpers.d.ts","sourceRoot":"","sources":["../../src/orchestrator/block-building-helpers.ts"],"names":[],"mappings":"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"}
|