@aztec/prover-client 0.0.0-test.1 → 0.0.1-fake-c83136db25
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 +2 -0
- package/dest/block-factory/index.d.ts.map +1 -0
- package/dest/block-factory/light.d.ts +38 -0
- package/dest/block-factory/light.d.ts.map +1 -0
- package/dest/block-factory/light.js +94 -0
- package/dest/config.d.ts +6 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +11 -1
- package/dest/mocks/fixtures.d.ts +7 -4
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +32 -4
- package/dest/mocks/test_context.d.ts +43 -15
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +110 -48
- package/dest/orchestrator/block-building-helpers.d.ts +37 -28
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +156 -150
- package/dest/orchestrator/block-proving-state.d.ts +62 -46
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +223 -179
- 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 +211 -0
- package/dest/orchestrator/epoch-proving-state.d.ts +37 -24
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/epoch-proving-state.js +143 -73
- package/dest/orchestrator/orchestrator.d.ts +34 -31
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +392 -234
- package/dest/orchestrator/orchestrator_metrics.d.ts +2 -0
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator_metrics.js +9 -0
- 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 +30 -38
- package/dest/prover-client/prover-client.d.ts +3 -3
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +5 -4
- package/dest/prover-client/server-epoch-prover.d.ts +13 -10
- package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
- package/dest/prover-client/server-epoch-prover.js +11 -11
- package/dest/proving_broker/broker_prover_facade.d.ts +22 -15
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
- package/dest/proving_broker/broker_prover_facade.js +64 -39
- package/dest/proving_broker/config.d.ts +9 -4
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +15 -4
- package/dest/proving_broker/factory.d.ts +1 -1
- package/dest/proving_broker/factory.d.ts.map +1 -1
- package/dest/proving_broker/factory.js +5 -1
- package/dest/proving_broker/fixtures.js +1 -1
- package/dest/proving_broker/proof_store/factory.js +1 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.js +1 -0
- package/dest/proving_broker/proof_store/index.d.ts +1 -0
- 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/proving_agent.d.ts +3 -3
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.js +83 -47
- package/dest/proving_broker/proving_broker.d.ts +11 -2
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +34 -22
- package/dest/proving_broker/proving_broker_database/memory.js +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.js +9 -8
- package/dest/proving_broker/proving_job_controller.d.ts +7 -8
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.js +89 -61
- package/dest/proving_broker/rpc.d.ts +3 -5
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +1 -4
- package/dest/test/mock_proof_store.d.ts +9 -0
- package/dest/test/mock_proof_store.d.ts.map +1 -0
- package/dest/test/mock_proof_store.js +10 -0
- package/dest/test/mock_prover.d.ts +23 -16
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +38 -20
- package/package.json +29 -29
- package/src/block-factory/index.ts +1 -0
- package/src/block-factory/light.ts +140 -0
- package/src/config.ts +24 -8
- package/src/mocks/fixtures.ts +43 -15
- package/src/mocks/test_context.ts +201 -75
- package/src/orchestrator/block-building-helpers.ts +247 -243
- package/src/orchestrator/block-proving-state.ts +247 -231
- package/src/orchestrator/checkpoint-proving-state.ts +299 -0
- package/src/orchestrator/epoch-proving-state.ts +187 -111
- package/src/orchestrator/orchestrator.ts +590 -289
- package/src/orchestrator/orchestrator_metrics.ts +20 -1
- package/src/orchestrator/tx-proving-state.ts +60 -61
- package/src/prover-client/prover-client.ts +16 -14
- package/src/prover-client/server-epoch-prover.ts +40 -21
- package/src/proving_broker/broker_prover_facade.ts +200 -113
- package/src/proving_broker/config.ts +17 -6
- package/src/proving_broker/factory.ts +2 -1
- package/src/proving_broker/fixtures.ts +1 -1
- package/src/proving_broker/proof_store/factory.ts +1 -1
- package/src/proving_broker/proof_store/gcs_proof_store.ts +5 -1
- package/src/proving_broker/proof_store/index.ts +1 -0
- package/src/proving_broker/proof_store/inline_proof_store.ts +1 -1
- package/src/proving_broker/proving_agent.ts +89 -47
- package/src/proving_broker/proving_broker.ts +51 -32
- package/src/proving_broker/proving_broker_database/memory.ts +1 -1
- package/src/proving_broker/proving_broker_database/persisted.ts +9 -8
- package/src/proving_broker/proving_job_controller.ts +92 -81
- package/src/proving_broker/rpc.ts +1 -6
- package/src/test/mock_proof_store.ts +14 -0
- package/src/test/mock_prover.ts +164 -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/dest/block_builder/index.d.ts +0 -6
- package/dest/block_builder/index.d.ts.map +0 -1
- package/dest/block_builder/light.d.ts +0 -33
- package/dest/block_builder/light.d.ts.map +0 -1
- package/dest/block_builder/light.js +0 -82
- package/src/bin/get-proof-inputs.ts +0 -59
- package/src/block_builder/index.ts +0 -6
- package/src/block_builder/light.ts +0 -101
- /package/dest/{block_builder → block-factory}/index.js +0 -0
|
@@ -1,252 +1,303 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { RootParityInput, RootParityInputs } from '@aztec/stdlib/parity';
|
|
9
|
-
import { BlockRootRollupBlobData, BlockRootRollupData, BlockRootRollupInputs, ConstantRollupData, EmptyBlockRootRollupInputs, MergeRollupInputs, PreviousRollupData, SingleTxBlockRootRollupInputs } from '@aztec/stdlib/rollup';
|
|
10
|
-
import { StateReference } from '@aztec/stdlib/tx';
|
|
11
|
-
import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-helpers.js';
|
|
1
|
+
import { NUM_BASE_PARITY_PER_ROOT_PARITY } from '@aztec/constants';
|
|
2
|
+
import { assertLength } from '@aztec/foundation/serialize';
|
|
3
|
+
import { UnbalancedTreeStore } from '@aztec/foundation/trees';
|
|
4
|
+
import { ParityRootPrivateInputs } from '@aztec/stdlib/parity';
|
|
5
|
+
import { BlockRootEmptyTxFirstRollupPrivateInputs, BlockRootFirstRollupPrivateInputs, BlockRootRollupPrivateInputs, BlockRootSingleTxFirstRollupPrivateInputs, BlockRootSingleTxRollupPrivateInputs, TxMergeRollupPrivateInputs } from '@aztec/stdlib/rollup';
|
|
6
|
+
import { GlobalVariables } from '@aztec/stdlib/tx';
|
|
7
|
+
import { buildHeaderFromCircuitOutputs, toProofData } from './block-building-helpers.js';
|
|
12
8
|
/**
|
|
13
9
|
* The current state of the proving schedule for a given block. Managed by ProvingState.
|
|
14
10
|
* Contains the raw inputs and intermediate state to generate every constituent proof in the tree.
|
|
15
11
|
*/ export class BlockProvingState {
|
|
16
12
|
index;
|
|
17
|
-
|
|
18
|
-
newL1ToL2Messages;
|
|
19
|
-
l1ToL2MessageSubtreeSiblingPath;
|
|
20
|
-
l1ToL2MessageTreeSnapshotAfterInsertion;
|
|
21
|
-
lastArchiveSnapshot;
|
|
22
|
-
newArchiveSiblingPath;
|
|
23
|
-
previousBlockHeader;
|
|
24
|
-
parentEpoch;
|
|
25
|
-
baseOrMergeProvingOutputs;
|
|
26
|
-
baseParityProvingOutputs;
|
|
27
|
-
rootParityProvingOutput;
|
|
28
|
-
blockRootProvingOutput;
|
|
29
|
-
blockRootRollupStarted;
|
|
30
|
-
block;
|
|
31
|
-
spongeBlobState;
|
|
13
|
+
blockNumber;
|
|
32
14
|
totalNumTxs;
|
|
15
|
+
constants;
|
|
16
|
+
timestamp;
|
|
17
|
+
lastArchiveTreeSnapshot;
|
|
18
|
+
lastArchiveSiblingPath;
|
|
19
|
+
lastL1ToL2MessageTreeSnapshot;
|
|
20
|
+
lastL1ToL2MessageSubtreeRootSiblingPath;
|
|
21
|
+
newL1ToL2MessageTreeSnapshot;
|
|
22
|
+
headerOfLastBlockInPreviousCheckpoint;
|
|
23
|
+
startSpongeBlob;
|
|
24
|
+
parentCheckpoint;
|
|
25
|
+
baseOrMergeProofs;
|
|
26
|
+
baseParityProofs;
|
|
27
|
+
rootParityProof;
|
|
28
|
+
blockRootProof;
|
|
29
|
+
builtBlockHeader;
|
|
30
|
+
endSpongeBlob;
|
|
33
31
|
txs;
|
|
32
|
+
isFirstBlock;
|
|
34
33
|
error;
|
|
35
|
-
constructor(index,
|
|
34
|
+
constructor(index, blockNumber, totalNumTxs, constants, timestamp, lastArchiveTreeSnapshot, lastArchiveSiblingPath, lastL1ToL2MessageTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath, newL1ToL2MessageTreeSnapshot, headerOfLastBlockInPreviousCheckpoint, startSpongeBlob, parentCheckpoint){
|
|
36
35
|
this.index = index;
|
|
37
|
-
this.
|
|
38
|
-
this.
|
|
39
|
-
this.
|
|
40
|
-
this.
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
43
|
-
this.
|
|
44
|
-
this.
|
|
45
|
-
this.
|
|
46
|
-
this.
|
|
47
|
-
this.
|
|
48
|
-
this.
|
|
36
|
+
this.blockNumber = blockNumber;
|
|
37
|
+
this.totalNumTxs = totalNumTxs;
|
|
38
|
+
this.constants = constants;
|
|
39
|
+
this.timestamp = timestamp;
|
|
40
|
+
this.lastArchiveTreeSnapshot = lastArchiveTreeSnapshot;
|
|
41
|
+
this.lastArchiveSiblingPath = lastArchiveSiblingPath;
|
|
42
|
+
this.lastL1ToL2MessageTreeSnapshot = lastL1ToL2MessageTreeSnapshot;
|
|
43
|
+
this.lastL1ToL2MessageSubtreeRootSiblingPath = lastL1ToL2MessageSubtreeRootSiblingPath;
|
|
44
|
+
this.newL1ToL2MessageTreeSnapshot = newL1ToL2MessageTreeSnapshot;
|
|
45
|
+
this.headerOfLastBlockInPreviousCheckpoint = headerOfLastBlockInPreviousCheckpoint;
|
|
46
|
+
this.startSpongeBlob = startSpongeBlob;
|
|
47
|
+
this.parentCheckpoint = parentCheckpoint;
|
|
48
|
+
this.baseOrMergeProofs = new UnbalancedTreeStore(0);
|
|
49
|
+
this.baseParityProofs = Array.from({
|
|
49
50
|
length: NUM_BASE_PARITY_PER_ROOT_PARITY
|
|
50
51
|
}).map((_)=>undefined);
|
|
51
|
-
this.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
startNewBlock(numTxs, numBlobFields) {
|
|
57
|
-
if (this.spongeBlobState) {
|
|
58
|
-
throw new Error(`Block ${this.blockNumber} already initalised.`);
|
|
52
|
+
this.txs = [];
|
|
53
|
+
this.isFirstBlock = index === 0;
|
|
54
|
+
if (!totalNumTxs && !this.isFirstBlock) {
|
|
55
|
+
throw new Error(`Cannot create a block with 0 txs, unless it's the first block.`);
|
|
59
56
|
}
|
|
60
|
-
this.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
this.
|
|
64
|
-
this.totalNumTxs = numTxs;
|
|
57
|
+
this.baseOrMergeProofs = new UnbalancedTreeStore(totalNumTxs);
|
|
58
|
+
}
|
|
59
|
+
get epochNumber() {
|
|
60
|
+
return this.parentCheckpoint.epochNumber;
|
|
65
61
|
}
|
|
66
62
|
// Adds a transaction to the proving state, returns it's index
|
|
67
63
|
addNewTx(tx) {
|
|
68
|
-
if (!this.
|
|
69
|
-
throw new Error(`
|
|
64
|
+
if (!this.isAcceptingTxs()) {
|
|
65
|
+
throw new Error(`Cannot add more txs to block ${this.blockNumber}.`);
|
|
70
66
|
}
|
|
71
67
|
const txIndex = this.txs.length;
|
|
72
68
|
this.txs[txIndex] = tx;
|
|
73
69
|
return txIndex;
|
|
74
70
|
}
|
|
71
|
+
isAcceptingTxs() {
|
|
72
|
+
return this.txs.length < this.totalNumTxs;
|
|
73
|
+
}
|
|
74
|
+
getProcessedTxs() {
|
|
75
|
+
return this.txs.map((t)=>t.processedTx);
|
|
76
|
+
}
|
|
77
|
+
tryStartProvingBase(txIndex) {
|
|
78
|
+
if (this.baseOrMergeProofs.getLeaf(txIndex)?.isProving) {
|
|
79
|
+
return false;
|
|
80
|
+
} else {
|
|
81
|
+
this.baseOrMergeProofs.setLeaf(txIndex, {
|
|
82
|
+
isProving: true
|
|
83
|
+
});
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
75
87
|
setBaseRollupProof(txIndex, provingOutput) {
|
|
76
|
-
return this.
|
|
88
|
+
return this.baseOrMergeProofs.setLeaf(txIndex, {
|
|
89
|
+
provingOutput
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
tryStartProvingMerge(location) {
|
|
93
|
+
if (this.baseOrMergeProofs.getNode(location)?.isProving) {
|
|
94
|
+
return false;
|
|
95
|
+
} else {
|
|
96
|
+
this.baseOrMergeProofs.setNode(location, {
|
|
97
|
+
isProving: true
|
|
98
|
+
});
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
77
101
|
}
|
|
78
102
|
setMergeRollupProof(location, provingOutput) {
|
|
79
|
-
this.
|
|
103
|
+
this.baseOrMergeProofs.setNode(location, {
|
|
104
|
+
provingOutput
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
tryStartProvingBaseParity(index) {
|
|
108
|
+
if (this.baseParityProofs[index]?.isProving) {
|
|
109
|
+
return false;
|
|
110
|
+
} else {
|
|
111
|
+
this.baseParityProofs[index] = {
|
|
112
|
+
isProving: true
|
|
113
|
+
};
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
80
116
|
}
|
|
81
117
|
// Stores a set of root parity inputs at the given index
|
|
82
118
|
setBaseParityProof(index, provingOutput) {
|
|
83
119
|
if (index >= NUM_BASE_PARITY_PER_ROOT_PARITY) {
|
|
84
120
|
throw new Error(`Unable to set a base parity proofs at index ${index}. Expected at most ${NUM_BASE_PARITY_PER_ROOT_PARITY} proofs.`);
|
|
85
121
|
}
|
|
86
|
-
this.
|
|
122
|
+
this.baseParityProofs[index] = {
|
|
123
|
+
provingOutput
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
tryStartProvingRootParity() {
|
|
127
|
+
if (this.rootParityProof?.isProving) {
|
|
128
|
+
return false;
|
|
129
|
+
} else {
|
|
130
|
+
this.rootParityProof = {
|
|
131
|
+
isProving: true
|
|
132
|
+
};
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
87
135
|
}
|
|
88
136
|
setRootParityProof(provingOutput) {
|
|
89
|
-
this.
|
|
137
|
+
this.rootParityProof = {
|
|
138
|
+
provingOutput
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
tryStartProvingBlockRoot() {
|
|
142
|
+
if (this.blockRootProof?.isProving) {
|
|
143
|
+
return false;
|
|
144
|
+
} else {
|
|
145
|
+
this.blockRootProof = {
|
|
146
|
+
isProving: true
|
|
147
|
+
};
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
90
150
|
}
|
|
91
151
|
setBlockRootRollupProof(provingOutput) {
|
|
92
|
-
this.
|
|
152
|
+
this.blockRootProof = {
|
|
153
|
+
provingOutput
|
|
154
|
+
};
|
|
155
|
+
return this.parentCheckpoint.setBlockRootRollupProof(this.index, provingOutput);
|
|
93
156
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return this.txs;
|
|
157
|
+
getBlockRootRollupOutput() {
|
|
158
|
+
return this.blockRootProof?.provingOutput?.inputs;
|
|
97
159
|
}
|
|
98
|
-
|
|
99
|
-
|
|
160
|
+
setBuiltBlockHeader(blockHeader) {
|
|
161
|
+
this.builtBlockHeader = blockHeader;
|
|
162
|
+
}
|
|
163
|
+
getBuiltBlockHeader() {
|
|
164
|
+
return this.builtBlockHeader;
|
|
165
|
+
}
|
|
166
|
+
getGlobalVariables() {
|
|
167
|
+
if (this.txs.length) {
|
|
168
|
+
return this.txs[0].processedTx.globalVariables;
|
|
169
|
+
}
|
|
170
|
+
const constants = this.constants;
|
|
171
|
+
return GlobalVariables.from({
|
|
172
|
+
chainId: constants.chainId,
|
|
173
|
+
version: constants.version,
|
|
174
|
+
blockNumber: this.blockNumber,
|
|
175
|
+
slotNumber: constants.slotNumber,
|
|
176
|
+
timestamp: this.timestamp,
|
|
177
|
+
coinbase: constants.coinbase,
|
|
178
|
+
feeRecipient: constants.feeRecipient,
|
|
179
|
+
gasFees: constants.gasFees
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
getStartSpongeBlob() {
|
|
183
|
+
return this.startSpongeBlob;
|
|
184
|
+
}
|
|
185
|
+
setEndSpongeBlob(endSpongeBlob) {
|
|
186
|
+
this.endSpongeBlob = endSpongeBlob;
|
|
187
|
+
}
|
|
188
|
+
getEndSpongeBlob() {
|
|
189
|
+
return this.endSpongeBlob;
|
|
190
|
+
}
|
|
191
|
+
getTxEffects() {
|
|
192
|
+
return this.txs.map((t)=>t.processedTx.txEffect);
|
|
100
193
|
}
|
|
101
194
|
getParentLocation(location) {
|
|
102
|
-
return this.
|
|
195
|
+
return this.baseOrMergeProofs.getParentLocation(location);
|
|
103
196
|
}
|
|
104
197
|
getMergeRollupInputs(mergeLocation) {
|
|
105
|
-
const [left, right] = this.
|
|
198
|
+
const [left, right] = this.baseOrMergeProofs.getChildren(mergeLocation).map((c)=>c?.provingOutput);
|
|
106
199
|
if (!left || !right) {
|
|
107
|
-
throw new Error('At
|
|
200
|
+
throw new Error('At least one child is not ready for the merge rollup.');
|
|
108
201
|
}
|
|
109
|
-
return new
|
|
110
|
-
|
|
111
|
-
|
|
202
|
+
return new TxMergeRollupPrivateInputs([
|
|
203
|
+
toProofData(left),
|
|
204
|
+
toProofData(right)
|
|
112
205
|
]);
|
|
113
206
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const proofs = this.#getChildProofsForBlockRoot();
|
|
119
|
-
const nonEmptyProofs = proofs.filter((p)=>!!p);
|
|
120
|
-
if (proofs.length !== nonEmptyProofs.length) {
|
|
121
|
-
throw new Error('At lease one child is not ready for the block root.');
|
|
207
|
+
getBlockRootRollupTypeAndInputs() {
|
|
208
|
+
const provingOutputs = this.#getChildProvingOutputsForBlockRoot();
|
|
209
|
+
if (!provingOutputs.every((p)=>!!p)) {
|
|
210
|
+
throw new Error('At least one child is not ready for the block root rollup.');
|
|
122
211
|
}
|
|
123
|
-
const
|
|
124
|
-
if (this.
|
|
125
|
-
|
|
126
|
-
lastArchive: this.lastArchiveSnapshot,
|
|
127
|
-
globalVariables: this.globalVariables,
|
|
128
|
-
vkTreeRoot: getVKTreeRoot(),
|
|
129
|
-
protocolContractTreeRoot
|
|
130
|
-
});
|
|
131
|
-
return {
|
|
132
|
-
rollupType: 'empty-block-root-rollup',
|
|
133
|
-
inputs: EmptyBlockRootRollupInputs.from({
|
|
134
|
-
data,
|
|
135
|
-
constants,
|
|
136
|
-
isPadding: false
|
|
137
|
-
})
|
|
138
|
-
};
|
|
212
|
+
const previousRollups = provingOutputs.map((p)=>toProofData(p));
|
|
213
|
+
if (this.isFirstBlock) {
|
|
214
|
+
return this.#getFirstBlockRootRollupTypeAndInputs(previousRollups);
|
|
139
215
|
}
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
if (previousRollupData.length === 1) {
|
|
216
|
+
const [leftRollup, rightRollup] = previousRollups;
|
|
217
|
+
if (!rightRollup) {
|
|
143
218
|
return {
|
|
144
|
-
rollupType: '
|
|
145
|
-
inputs: new
|
|
219
|
+
rollupType: 'rollup-block-root-single-tx',
|
|
220
|
+
inputs: new BlockRootSingleTxRollupPrivateInputs(leftRollup, this.lastArchiveSiblingPath)
|
|
146
221
|
};
|
|
147
222
|
} else {
|
|
148
223
|
return {
|
|
149
|
-
rollupType: 'block-root
|
|
150
|
-
inputs: new
|
|
224
|
+
rollupType: 'rollup-block-root',
|
|
225
|
+
inputs: new BlockRootRollupPrivateInputs([
|
|
226
|
+
leftRollup,
|
|
227
|
+
rightRollup
|
|
228
|
+
], this.lastArchiveSiblingPath)
|
|
151
229
|
};
|
|
152
230
|
}
|
|
153
231
|
}
|
|
154
|
-
|
|
155
|
-
if (!this.
|
|
232
|
+
#getFirstBlockRootRollupTypeAndInputs([leftRollup, rightRollup]) {
|
|
233
|
+
if (!this.rootParityProof?.provingOutput) {
|
|
156
234
|
throw new Error('Root parity is not ready.');
|
|
157
235
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
});
|
|
236
|
+
const l1ToL2Roots = toProofData(this.rootParityProof.provingOutput);
|
|
237
|
+
if (!leftRollup) {
|
|
238
|
+
return {
|
|
239
|
+
rollupType: 'rollup-block-root-first-empty-tx',
|
|
240
|
+
inputs: new BlockRootEmptyTxFirstRollupPrivateInputs(l1ToL2Roots, this.lastArchiveTreeSnapshot, this.headerOfLastBlockInPreviousCheckpoint.state, this.constants, this.startSpongeBlob, this.timestamp, this.lastL1ToL2MessageSubtreeRootSiblingPath, this.lastArchiveSiblingPath)
|
|
241
|
+
};
|
|
242
|
+
} else if (!rightRollup) {
|
|
243
|
+
return {
|
|
244
|
+
rollupType: 'rollup-block-root-first-single-tx',
|
|
245
|
+
inputs: new BlockRootSingleTxFirstRollupPrivateInputs(l1ToL2Roots, leftRollup, this.lastL1ToL2MessageTreeSnapshot, this.lastL1ToL2MessageSubtreeRootSiblingPath, this.lastArchiveSiblingPath)
|
|
246
|
+
};
|
|
247
|
+
} else {
|
|
248
|
+
return {
|
|
249
|
+
rollupType: 'rollup-block-root-first',
|
|
250
|
+
inputs: new BlockRootFirstRollupPrivateInputs(l1ToL2Roots, [
|
|
251
|
+
leftRollup,
|
|
252
|
+
rightRollup
|
|
253
|
+
], this.lastL1ToL2MessageTreeSnapshot, this.lastL1ToL2MessageSubtreeRootSiblingPath, this.lastArchiveSiblingPath)
|
|
254
|
+
};
|
|
255
|
+
}
|
|
179
256
|
}
|
|
180
|
-
|
|
181
|
-
|
|
257
|
+
getParityRootInputs() {
|
|
258
|
+
const baseParityProvingOutputs = this.baseParityProofs.filter((p)=>!!p?.provingOutput).map((p)=>p.provingOutput);
|
|
259
|
+
if (baseParityProvingOutputs.length !== this.baseParityProofs.length) {
|
|
182
260
|
throw new Error('At lease one base parity is not ready.');
|
|
183
261
|
}
|
|
184
|
-
const children =
|
|
185
|
-
return new
|
|
262
|
+
const children = baseParityProvingOutputs.map((p)=>toProofData(p));
|
|
263
|
+
return new ParityRootPrivateInputs(assertLength(children, NUM_BASE_PARITY_PER_ROOT_PARITY));
|
|
186
264
|
}
|
|
187
265
|
// Returns a specific transaction proving state
|
|
188
266
|
getTxProvingState(txIndex) {
|
|
189
267
|
return this.txs[txIndex];
|
|
190
268
|
}
|
|
191
|
-
async buildHeaderFromProvingOutputs(
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
if (this.totalNumTxs !== 0) {
|
|
195
|
-
const previousRollupData = this.#getChildProofsForBlockRoot();
|
|
196
|
-
const lastRollup = previousRollupData[previousRollupData.length - 1];
|
|
197
|
-
if (!lastRollup) {
|
|
198
|
-
throw new Error('End state of the block is not available. Last rollup is not ready yet.');
|
|
199
|
-
}
|
|
200
|
-
endPartialState = lastRollup.inputs.end;
|
|
269
|
+
async buildHeaderFromProvingOutputs() {
|
|
270
|
+
if (!this.blockRootProof?.provingOutput) {
|
|
271
|
+
throw new Error('Block root rollup is not ready.');
|
|
201
272
|
}
|
|
202
|
-
|
|
203
|
-
return buildHeaderFromCircuitOutputs(previousRollupData.map((d)=>d.baseOrMergeRollupPublicInputs), this.rootParityProvingOutput.inputs, this.blockRootProvingOutput.inputs, endState, logger);
|
|
273
|
+
return await buildHeaderFromCircuitOutputs(this.blockRootProof.provingOutput.inputs);
|
|
204
274
|
}
|
|
205
275
|
isReadyForMergeRollup(location) {
|
|
206
|
-
return this.
|
|
276
|
+
return !!this.baseOrMergeProofs.getSibling(location)?.provingOutput;
|
|
207
277
|
}
|
|
208
278
|
// Returns true if we have sufficient inputs to execute the block root rollup
|
|
209
279
|
isReadyForBlockRootRollup() {
|
|
210
|
-
const childProofs = this.#
|
|
211
|
-
return this.
|
|
280
|
+
const childProofs = this.#getChildProvingOutputsForBlockRoot();
|
|
281
|
+
return (!this.isFirstBlock || !!this.rootParityProof?.provingOutput) && childProofs.every((p)=>!!p);
|
|
212
282
|
}
|
|
213
283
|
// Returns true if we have sufficient root parity inputs to execute the root parity circuit
|
|
214
284
|
isReadyForRootParity() {
|
|
215
|
-
return this.
|
|
285
|
+
return this.baseParityProofs.every((p)=>!!p?.provingOutput);
|
|
216
286
|
}
|
|
217
287
|
isComplete() {
|
|
218
|
-
return !!this.
|
|
288
|
+
return !!this.blockRootProof;
|
|
219
289
|
}
|
|
220
|
-
// Returns whether the proving state is still valid
|
|
221
290
|
verifyState() {
|
|
222
|
-
return this.
|
|
291
|
+
return this.parentCheckpoint.verifyState();
|
|
292
|
+
}
|
|
293
|
+
getError() {
|
|
294
|
+
return this.error;
|
|
223
295
|
}
|
|
224
296
|
reject(reason) {
|
|
225
297
|
this.error = reason;
|
|
226
|
-
this.
|
|
227
|
-
}
|
|
228
|
-
#getBlockRootRollupData(proverId) {
|
|
229
|
-
return BlockRootRollupData.from({
|
|
230
|
-
l1ToL2Roots: this.#getRootParityData(this.rootParityProvingOutput),
|
|
231
|
-
l1ToL2MessageSubtreeSiblingPath: this.l1ToL2MessageSubtreeSiblingPath,
|
|
232
|
-
newArchiveSiblingPath: this.newArchiveSiblingPath,
|
|
233
|
-
previousBlockHeader: this.previousBlockHeader,
|
|
234
|
-
proverId
|
|
235
|
-
});
|
|
298
|
+
this.parentCheckpoint.reject(reason);
|
|
236
299
|
}
|
|
237
|
-
|
|
238
|
-
const txEffects = this.txs.map((txProvingState)=>txProvingState.processedTx.txEffect);
|
|
239
|
-
const { blobFields, blobCommitments, blobsHash } = await buildBlobHints(txEffects);
|
|
240
|
-
return BlockRootRollupBlobData.from({
|
|
241
|
-
blobFields: padArrayEnd(blobFields, Fr.ZERO, FIELDS_PER_BLOB * BLOBS_PER_BLOCK),
|
|
242
|
-
blobCommitments: padArrayEnd(blobCommitments, [
|
|
243
|
-
Fr.ZERO,
|
|
244
|
-
Fr.ZERO
|
|
245
|
-
], BLOBS_PER_BLOCK),
|
|
246
|
-
blobsHash
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
#getChildProofsForBlockRoot() {
|
|
300
|
+
#getChildProvingOutputsForBlockRoot() {
|
|
250
301
|
if (this.totalNumTxs === 0) {
|
|
251
302
|
return [];
|
|
252
303
|
}
|
|
@@ -256,14 +307,7 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
|
|
|
256
307
|
};
|
|
257
308
|
// If there's only 1 tx, its base rollup proof will be stored at the root.
|
|
258
309
|
return this.totalNumTxs === 1 ? [
|
|
259
|
-
this.
|
|
260
|
-
] : this.
|
|
261
|
-
}
|
|
262
|
-
#getPreviousRollupData({ inputs, proof, verificationKey }) {
|
|
263
|
-
const leafIndex = getVKIndex(verificationKey.keyAsFields);
|
|
264
|
-
return new PreviousRollupData(inputs, proof, verificationKey.keyAsFields, new MembershipWitness(VK_TREE_HEIGHT, BigInt(leafIndex), getVKSiblingPath(leafIndex)));
|
|
265
|
-
}
|
|
266
|
-
#getRootParityData({ inputs, proof, verificationKey }) {
|
|
267
|
-
return new RootParityInput(proof, verificationKey.keyAsFields, getVKSiblingPath(getVKIndex(verificationKey)), inputs);
|
|
310
|
+
this.baseOrMergeProofs.getNode(rootLocation)?.provingOutput
|
|
311
|
+
] : this.baseOrMergeProofs.getChildren(rootLocation).map((c)=>c?.provingOutput);
|
|
268
312
|
}
|
|
269
313
|
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { BatchedBlobAccumulator, type FinalBlobBatchingChallenges } from '@aztec/blob-lib';
|
|
2
|
+
import { type ARCHIVE_HEIGHT, type L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH, type NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH } from '@aztec/constants';
|
|
3
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
4
|
+
import type { Tuple } from '@aztec/foundation/serialize';
|
|
5
|
+
import { type TreeNodeLocation } from '@aztec/foundation/trees';
|
|
6
|
+
import type { PublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
|
|
7
|
+
import { ParityBasePrivateInputs } from '@aztec/stdlib/parity';
|
|
8
|
+
import { BlockMergeRollupPrivateInputs, BlockRollupPublicInputs, CheckpointConstantData, CheckpointRollupPublicInputs, CheckpointRootRollupPrivateInputs, CheckpointRootSingleBlockRollupPrivateInputs } from '@aztec/stdlib/rollup';
|
|
9
|
+
import type { CircuitName } from '@aztec/stdlib/stats';
|
|
10
|
+
import type { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
11
|
+
import type { BlockHeader } from '@aztec/stdlib/tx';
|
|
12
|
+
import type { UInt64 } from '@aztec/stdlib/types';
|
|
13
|
+
import { BlockProvingState } from './block-proving-state.js';
|
|
14
|
+
import type { EpochProvingState } from './epoch-proving-state.js';
|
|
15
|
+
export declare class CheckpointProvingState {
|
|
16
|
+
#private;
|
|
17
|
+
readonly index: number;
|
|
18
|
+
readonly constants: CheckpointConstantData;
|
|
19
|
+
readonly totalNumBlocks: number;
|
|
20
|
+
private readonly totalNumBlobFields;
|
|
21
|
+
private readonly finalBlobBatchingChallenges;
|
|
22
|
+
private readonly headerOfLastBlockInPreviousCheckpoint;
|
|
23
|
+
private readonly lastArchiveSiblingPath;
|
|
24
|
+
private readonly l1ToL2Messages;
|
|
25
|
+
private readonly lastL1ToL2MessageTreeSnapshot;
|
|
26
|
+
private readonly lastL1ToL2MessageSubtreeRootSiblingPath;
|
|
27
|
+
private readonly newL1ToL2MessageTreeSnapshot;
|
|
28
|
+
private readonly newL1ToL2MessageSubtreeRootSiblingPath;
|
|
29
|
+
parentEpoch: EpochProvingState;
|
|
30
|
+
private onBlobAccumulatorSet;
|
|
31
|
+
private blockProofs;
|
|
32
|
+
private checkpointRootProof;
|
|
33
|
+
private blocks;
|
|
34
|
+
private startBlobAccumulator;
|
|
35
|
+
private endBlobAccumulator;
|
|
36
|
+
private blobFields;
|
|
37
|
+
private error;
|
|
38
|
+
readonly firstBlockNumber: number;
|
|
39
|
+
constructor(index: number, constants: CheckpointConstantData, totalNumBlocks: number, totalNumBlobFields: number, finalBlobBatchingChallenges: FinalBlobBatchingChallenges, headerOfLastBlockInPreviousCheckpoint: BlockHeader, lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>, l1ToL2Messages: Fr[], lastL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH>, newL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, newL1ToL2MessageSubtreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH>, parentEpoch: EpochProvingState, onBlobAccumulatorSet: (checkpoint: CheckpointProvingState) => void);
|
|
40
|
+
get epochNumber(): number;
|
|
41
|
+
startNewBlock(blockNumber: number, timestamp: UInt64, totalNumTxs: number, lastArchiveTreeSnapshot: AppendOnlyTreeSnapshot, lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>): Promise<BlockProvingState>;
|
|
42
|
+
isAcceptingBlocks(): boolean;
|
|
43
|
+
setBlockRootRollupProof(blockIndex: number, provingOutput: PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): TreeNodeLocation;
|
|
44
|
+
tryStartProvingBlockMerge(location: TreeNodeLocation): boolean;
|
|
45
|
+
setBlockMergeRollupProof(location: TreeNodeLocation, provingOutput: PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): void;
|
|
46
|
+
tryStartProvingCheckpointRoot(): boolean;
|
|
47
|
+
setCheckpointRootRollupProof(provingOutput: PublicInputsAndRecursiveProof<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): TreeNodeLocation;
|
|
48
|
+
getBaseParityInputs(baseParityIndex: number): ParityBasePrivateInputs;
|
|
49
|
+
accumulateBlobs(startBlobAccumulator: BatchedBlobAccumulator): Promise<BatchedBlobAccumulator | undefined>;
|
|
50
|
+
getEndBlobAccumulator(): BatchedBlobAccumulator | undefined;
|
|
51
|
+
getParentLocation(location: TreeNodeLocation): TreeNodeLocation;
|
|
52
|
+
getBlockMergeRollupInputs(mergeLocation: TreeNodeLocation): BlockMergeRollupPrivateInputs;
|
|
53
|
+
getCheckpointRootRollupType(): CircuitName;
|
|
54
|
+
getCheckpointRootRollupInputs(): CheckpointRootSingleBlockRollupPrivateInputs | CheckpointRootRollupPrivateInputs;
|
|
55
|
+
getBlockProvingStateByBlockNumber(blockNumber: number): BlockProvingState | undefined;
|
|
56
|
+
isReadyForBlockMerge(location: TreeNodeLocation): boolean;
|
|
57
|
+
isReadyForCheckpointRoot(): boolean;
|
|
58
|
+
verifyState(): boolean;
|
|
59
|
+
getError(): string | undefined;
|
|
60
|
+
cancel(): void;
|
|
61
|
+
reject(reason: string): void;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=checkpoint-proving-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-proving-state.d.ts","sourceRoot":"","sources":["../../src/orchestrator/checkpoint-proving-state.ts"],"names":[],"mappings":"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"}
|