@aztec/prover-client 0.0.1-commit.6c91f13 → 0.0.1-commit.96bb3f7
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/light.d.ts +2 -2
- package/dest/block-factory/light.d.ts.map +1 -1
- package/dest/block-factory/light.js +3 -5
- package/dest/light/lightweight_checkpoint_builder.d.ts +8 -1
- package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -1
- package/dest/light/lightweight_checkpoint_builder.js +40 -4
- package/dest/mocks/test_context.d.ts +2 -1
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +8 -2
- package/dest/orchestrator/block-building-helpers.js +1 -1
- package/dest/orchestrator/orchestrator.js +413 -31
- package/dest/orchestrator/orchestrator_metrics.d.ts +1 -1
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator_metrics.js +2 -6
- package/dest/orchestrator/tx-proving-state.d.ts +5 -4
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.js +6 -6
- 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/prover-client.js +1 -1
- package/dest/proving_broker/broker_prover_facade.d.ts +4 -3
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.d.ts +3 -8
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.js +1 -16
- package/dest/proving_broker/proving_broker.d.ts +1 -1
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +1 -10
- 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 +389 -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_broker_instrumentation.js +11 -35
- package/dest/test/mock_prover.d.ts +2 -2
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +3 -3
- package/package.json +15 -15
- package/src/block-factory/light.ts +4 -5
- package/src/light/lightweight_checkpoint_builder.ts +56 -5
- package/src/mocks/test_context.ts +6 -1
- package/src/orchestrator/block-building-helpers.ts +1 -1
- package/src/orchestrator/orchestrator.ts +2 -2
- package/src/orchestrator/orchestrator_metrics.ts +2 -6
- package/src/orchestrator/tx-proving-state.ts +8 -11
- package/src/prover-client/prover-client.ts +1 -9
- package/src/proving_broker/broker_prover_facade.ts +2 -3
- package/src/proving_broker/proving_agent.ts +1 -17
- package/src/proving_broker/proving_broker.ts +1 -8
- package/src/proving_broker/proving_broker_database/persisted.ts +15 -1
- package/src/proving_broker/proving_broker_instrumentation.ts +10 -35
- package/src/test/mock_prover.ts +1 -8
- package/dest/proving_broker/proving_agent_instrumentation.d.ts +0 -8
- package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +0 -1
- package/dest/proving_broker/proving_agent_instrumentation.js +0 -16
- package/src/proving_broker/proving_agent_instrumentation.ts +0 -21
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
2
|
import { L2Block } from '@aztec/stdlib/block';
|
|
3
3
|
import type { IBlockFactory, MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
4
|
-
import {
|
|
4
|
+
import type { GlobalVariables, ProcessedTx } from '@aztec/stdlib/tx';
|
|
5
5
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
6
6
|
/**
|
|
7
7
|
* Builds a block and its header from a set of processed tx without running any circuits.
|
|
@@ -35,4 +35,4 @@ export declare class LightweightBlockFactory implements IBlockFactory {
|
|
|
35
35
|
* @param db - A db fork to use for block building which WILL BE MODIFIED.
|
|
36
36
|
*/
|
|
37
37
|
export declare function buildBlockWithCleanDB(txs: ProcessedTx[], globalVariables: GlobalVariables, l1ToL2Messages: Fr[], db: MerkleTreeWriteOperations, telemetry?: TelemetryClient): Promise<L2Block>;
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ibG9jay1mYWN0b3J5L2xpZ2h0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVwRCxPQUFPLEVBQUUsT0FBTyxFQUFpQixNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2hHLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFRbkY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILHFCQUFhLHVCQUF3QixZQUFXLGFBQWE7SUFRekQsT0FBTyxDQUFDLEVBQUU7SUFDVixPQUFPLENBQUMsU0FBUztJQVJuQixPQUFPLENBQUMsZUFBZSxDQUFDLENBQWtCO0lBQzFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBTztJQUM5QixPQUFPLENBQUMsR0FBRyxDQUE0QjtJQUV2QyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBNkM7SUFFcEUsWUFDVSxFQUFFLEVBQUUseUJBQXlCLEVBQzdCLFNBQVMsR0FBRSxlQUFzQyxFQUN2RDtJQUVFLGFBQWEsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBT3pGO0lBRUQsTUFBTSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBU3hDO0lBRUQsaUJBQWlCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUVwQztZQUVhLFVBQVU7Q0E2Q3pCO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQXNCLHFCQUFxQixDQUN6QyxHQUFHLEVBQUUsV0FBVyxFQUFFLEVBQ2xCLGVBQWUsRUFBRSxlQUFlLEVBQ2hDLGNBQWMsRUFBRSxFQUFFLEVBQUUsRUFDcEIsRUFBRSxFQUFFLHlCQUF5QixFQUM3QixTQUFTLEdBQUUsZUFBc0Msb0JBV2xEIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"light.d.ts","sourceRoot":"","sources":["../../src/block-factory/light.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAiB,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAGhG,OAAO,
|
|
1
|
+
{"version":3,"file":"light.d.ts","sourceRoot":"","sources":["../../src/block-factory/light.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAiB,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAGhG,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAQnF;;;;;;;;;;;;;GAaG;AACH,qBAAa,uBAAwB,YAAW,aAAa;IAQzD,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS;IARnB,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAO;IAC9B,OAAO,CAAC,GAAG,CAA4B;IAEvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;IAEpE,YACU,EAAE,EAAE,yBAAyB,EAC7B,SAAS,GAAE,eAAsC,EACvD;IAEE,aAAa,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzF;IAED,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASxC;IAED,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAEpC;YAEa,UAAU;CA6CzB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,WAAW,EAAE,EAClB,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,EAAE,EAAE,EACpB,EAAE,EAAE,yBAAyB,EAC7B,SAAS,GAAE,eAAsC,oBAWlD"}
|
|
@@ -4,9 +4,8 @@ import { padArrayEnd } from '@aztec/foundation/collection';
|
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { L2Block, L2BlockHeader } from '@aztec/stdlib/block';
|
|
7
|
-
import {
|
|
7
|
+
import { computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
8
8
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
9
|
-
import { ContentCommitment } from '@aztec/stdlib/tx';
|
|
10
9
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
11
10
|
import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffects } from '../orchestrator/block-building-helpers.js';
|
|
12
11
|
/**
|
|
@@ -67,7 +66,6 @@ import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffects } from '.
|
|
|
67
66
|
header.state.validate();
|
|
68
67
|
await this.db.updateArchive(header);
|
|
69
68
|
const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, this.db);
|
|
70
|
-
const outHash = computeBlockOutHash(txs.map((tx)=>tx.txEffect.l2ToL1Msgs));
|
|
71
69
|
const inHash = computeInHashFromL1ToL2Messages(this.l1ToL2Messages);
|
|
72
70
|
const numBlobFields = blockBlobFields.length + 1;
|
|
73
71
|
const blobFields = blockBlobFields.concat([
|
|
@@ -77,11 +75,11 @@ import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffects } from '.
|
|
|
77
75
|
]);
|
|
78
76
|
const blobsHash = computeBlobsHashFromBlobs(getBlobsPerL1Block(blobFields));
|
|
79
77
|
const blockHeaderHash = await header.hash();
|
|
80
|
-
const contentCommitment = new ContentCommitment(blobsHash, inHash, outHash);
|
|
81
78
|
const l2BlockHeader = L2BlockHeader.from({
|
|
82
79
|
...header,
|
|
83
80
|
blockHeadersHash: blockHeaderHash,
|
|
84
|
-
|
|
81
|
+
blobsHash,
|
|
82
|
+
inHash
|
|
85
83
|
});
|
|
86
84
|
const block = new L2Block(newArchive, l2BlockHeader, body);
|
|
87
85
|
this.logger.debug(`Built block ${block.number}`, {
|
|
@@ -22,6 +22,13 @@ export declare class LightweightCheckpointBuilder {
|
|
|
22
22
|
private blobFields;
|
|
23
23
|
constructor(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], db: MerkleTreeWriteOperations);
|
|
24
24
|
static startNewCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], db: MerkleTreeWriteOperations): Promise<LightweightCheckpointBuilder>;
|
|
25
|
+
/**
|
|
26
|
+
* Resumes building a checkpoint from existing blocks. This is used for validator re-execution
|
|
27
|
+
* where blocks have already been built and their effects are already in the database.
|
|
28
|
+
* Unlike startNewCheckpoint, this does NOT append l1ToL2Messages to the tree since they
|
|
29
|
+
* were already added when the blocks were originally built.
|
|
30
|
+
*/
|
|
31
|
+
static resumeCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], db: MerkleTreeWriteOperations, existingBlocks: L2BlockNew[]): Promise<LightweightCheckpointBuilder>;
|
|
25
32
|
/**
|
|
26
33
|
* Adds a new block to the checkpoint. The tx effects must have already been inserted into the db if
|
|
27
34
|
* this is called after tx processing, if that's not the case, then set `insertTxsEffects` to true.
|
|
@@ -33,4 +40,4 @@ export declare class LightweightCheckpointBuilder {
|
|
|
33
40
|
completeCheckpoint(): Promise<Checkpoint>;
|
|
34
41
|
clone(): LightweightCheckpointBuilder;
|
|
35
42
|
}
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHR3ZWlnaHRfY2hlY2twb2ludF9idWlsZGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGlnaHQvbGlnaHR3ZWlnaHRfY2hlY2twb2ludF9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFeEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUlqRixPQUFPLEVBQ0wsS0FBSyx5QkFBeUIsRUFDOUIsS0FBSyxlQUFlLEVBQ3BCLEtBQUssV0FBVyxFQUNoQixjQUFjLEVBQ2YsTUFBTSxrQkFBa0IsQ0FBQztBQVExQjs7Ozs7R0FLRztBQUNILHFCQUFhLDRCQUE0QjthQVNyQixnQkFBZ0IsRUFBRSxnQkFBZ0I7YUFDbEMsU0FBUyxFQUFFLHlCQUF5QjthQUNwQyxjQUFjLEVBQUUsRUFBRSxFQUFFO2FBQ3BCLEVBQUUsRUFBRSx5QkFBeUI7SUFYL0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQWtEO0lBRXpFLE9BQU8sQ0FBQyxZQUFZLENBQWdDO0lBQ3BELE9BQU8sQ0FBQyxVQUFVLENBQWE7SUFDL0IsT0FBTyxDQUFDLE1BQU0sQ0FBb0I7SUFDbEMsT0FBTyxDQUFDLFVBQVUsQ0FBWTtJQUU5QixZQUNrQixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsU0FBUyxFQUFFLHlCQUF5QixFQUNwQyxjQUFjLEVBQUUsRUFBRSxFQUFFLEVBQ3BCLEVBQUUsRUFBRSx5QkFBeUIsRUFJOUM7SUFFRCxPQUFhLGtCQUFrQixDQUM3QixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsU0FBUyxFQUFFLHlCQUF5QixFQUNwQyxjQUFjLEVBQUUsRUFBRSxFQUFFLEVBQ3BCLEVBQUUsRUFBRSx5QkFBeUIsR0FDNUIsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBUXZDO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFhLGdCQUFnQixDQUMzQixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsU0FBUyxFQUFFLHlCQUF5QixFQUNwQyxjQUFjLEVBQUUsRUFBRSxFQUFFLEVBQ3BCLEVBQUUsRUFBRSx5QkFBeUIsRUFDN0IsY0FBYyxFQUFFLFVBQVUsRUFBRSxHQUMzQixPQUFPLENBQUMsNEJBQTRCLENBQUMsQ0F1Q3ZDO0lBRUQ7OztPQUdHO0lBQ1UsUUFBUSxDQUNuQixlQUFlLEVBQUUsZUFBZSxFQUNoQyxHQUFHLEVBQUUsV0FBVyxFQUFFLEVBQ2xCLElBQUksR0FBRTtRQUFFLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxDQUFDO1FBQUMsZ0JBQWdCLENBQUMsRUFBRSxjQUFjLENBQUE7S0FBTyxHQUMzRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBaUVyQjtJQUVLLGtCQUFrQixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0F5QzlDO0lBRUQsS0FBSyxpQ0FZSjtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lightweight_checkpoint_builder.d.ts","sourceRoot":"","sources":["../../src/light/lightweight_checkpoint_builder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAIjF,OAAO,EACL,KAAK,yBAAyB,
|
|
1
|
+
{"version":3,"file":"lightweight_checkpoint_builder.d.ts","sourceRoot":"","sources":["../../src/light/lightweight_checkpoint_builder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAIjF,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,cAAc,EACf,MAAM,kBAAkB,CAAC;AAQ1B;;;;;GAKG;AACH,qBAAa,4BAA4B;aASrB,gBAAgB,EAAE,gBAAgB;aAClC,SAAS,EAAE,yBAAyB;aACpC,cAAc,EAAE,EAAE,EAAE;aACpB,EAAE,EAAE,yBAAyB;IAX/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkD;IAEzE,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,UAAU,CAAY;IAE9B,YACkB,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,yBAAyB,EACpC,cAAc,EAAE,EAAE,EAAE,EACpB,EAAE,EAAE,yBAAyB,EAI9C;IAED,OAAa,kBAAkB,CAC7B,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,yBAAyB,EACpC,cAAc,EAAE,EAAE,EAAE,EACpB,EAAE,EAAE,yBAAyB,GAC5B,OAAO,CAAC,4BAA4B,CAAC,CAQvC;IAED;;;;;OAKG;IACH,OAAa,gBAAgB,CAC3B,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,yBAAyB,EACpC,cAAc,EAAE,EAAE,EAAE,EACpB,EAAE,EAAE,yBAAyB,EAC7B,cAAc,EAAE,UAAU,EAAE,GAC3B,OAAO,CAAC,4BAA4B,CAAC,CAuCvC;IAED;;;OAGG;IACU,QAAQ,CACnB,eAAe,EAAE,eAAe,EAChC,GAAG,EAAE,WAAW,EAAE,EAClB,IAAI,GAAE;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,cAAc,CAAA;KAAO,GAC3E,OAAO,CAAC,UAAU,CAAC,CAiErB;IAEK,kBAAkB,IAAI,OAAO,CAAC,UAAU,CAAC,CAyC9C;IAED,KAAK,iCAYJ;CACF"}
|
|
@@ -5,10 +5,9 @@ import { Fr } from '@aztec/foundation/curves/bn254';
|
|
|
5
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { L2BlockNew } from '@aztec/stdlib/block';
|
|
7
7
|
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
8
|
-
import {
|
|
8
|
+
import { computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
9
9
|
import { CheckpointHeader, computeBlockHeadersHash } from '@aztec/stdlib/rollup';
|
|
10
10
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
11
|
-
import { ContentCommitment } from '@aztec/stdlib/tx';
|
|
12
11
|
import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffects } from '../orchestrator/block-building-helpers.js';
|
|
13
12
|
/**
|
|
14
13
|
* Builds a checkpoint and its header and the blocks in it from a set of processed tx without running any circuits.
|
|
@@ -46,6 +45,43 @@ import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffects } from '.
|
|
|
46
45
|
return new LightweightCheckpointBuilder(checkpointNumber, constants, l1ToL2Messages, db);
|
|
47
46
|
}
|
|
48
47
|
/**
|
|
48
|
+
* Resumes building a checkpoint from existing blocks. This is used for validator re-execution
|
|
49
|
+
* where blocks have already been built and their effects are already in the database.
|
|
50
|
+
* Unlike startNewCheckpoint, this does NOT append l1ToL2Messages to the tree since they
|
|
51
|
+
* were already added when the blocks were originally built.
|
|
52
|
+
*/ static async resumeCheckpoint(checkpointNumber, constants, l1ToL2Messages, db, existingBlocks) {
|
|
53
|
+
const builder = new LightweightCheckpointBuilder(checkpointNumber, constants, l1ToL2Messages, db);
|
|
54
|
+
builder.logger.debug('Resuming checkpoint from existing blocks', {
|
|
55
|
+
checkpointNumber,
|
|
56
|
+
numExistingBlocks: existingBlocks.length,
|
|
57
|
+
blockNumbers: existingBlocks.map((b)=>b.header.getBlockNumber())
|
|
58
|
+
});
|
|
59
|
+
// Validate block order and consistency
|
|
60
|
+
for(let i = 1; i < existingBlocks.length; i++){
|
|
61
|
+
const prev = existingBlocks[i - 1];
|
|
62
|
+
const curr = existingBlocks[i];
|
|
63
|
+
if (curr.number !== prev.number + 1) {
|
|
64
|
+
throw new Error(`Non-sequential block numbers in resumeCheckpoint: ${prev.number} -> ${curr.number}`);
|
|
65
|
+
}
|
|
66
|
+
if (!prev.archive.root.equals(curr.header.lastArchive.root)) {
|
|
67
|
+
throw new Error(`Archive root mismatch between blocks ${prev.number} and ${curr.number}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
for(let i = 0; i < existingBlocks.length; i++){
|
|
71
|
+
const block = existingBlocks[i];
|
|
72
|
+
const isFirstBlock = i === 0;
|
|
73
|
+
if (isFirstBlock) {
|
|
74
|
+
builder.lastArchives.push(block.header.lastArchive);
|
|
75
|
+
}
|
|
76
|
+
builder.lastArchives.push(block.archive);
|
|
77
|
+
const blockBlobFields = block.toBlobFields();
|
|
78
|
+
await builder.spongeBlob.absorb(blockBlobFields);
|
|
79
|
+
builder.blobFields.push(...blockBlobFields);
|
|
80
|
+
builder.blocks.push(block);
|
|
81
|
+
}
|
|
82
|
+
return builder;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
49
85
|
* Adds a new block to the checkpoint. The tx effects must have already been inserted into the db if
|
|
50
86
|
* this is called after tx processing, if that's not the case, then set `insertTxsEffects` to true.
|
|
51
87
|
*/ async addBlock(globalVariables, txs, opts = {}) {
|
|
@@ -109,7 +145,6 @@ import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffects } from '.
|
|
|
109
145
|
const blobs = getBlobsPerL1Block(this.blobFields);
|
|
110
146
|
const blobsHash = computeBlobsHashFromBlobs(blobs);
|
|
111
147
|
const inHash = computeInHashFromL1ToL2Messages(this.l1ToL2Messages);
|
|
112
|
-
const outHash = computeCheckpointOutHash(blocks.map((block)=>block.body.txEffects.map((tx)=>tx.l2ToL1Msgs)));
|
|
113
148
|
const { slotNumber, coinbase, feeRecipient, gasFees } = this.constants;
|
|
114
149
|
// TODO(palla/mbps): Should we source this from the constants instead?
|
|
115
150
|
// timestamp of a checkpoint is the timestamp of the last block in the checkpoint.
|
|
@@ -117,7 +152,8 @@ import { buildHeaderAndBodyFromTxs, getTreeSnapshot, insertSideEffects } from '.
|
|
|
117
152
|
const totalManaUsed = blocks.reduce((acc, block)=>acc.add(block.header.totalManaUsed), Fr.ZERO);
|
|
118
153
|
const header = CheckpointHeader.from({
|
|
119
154
|
lastArchiveRoot: this.lastArchives[0].root,
|
|
120
|
-
|
|
155
|
+
blobsHash,
|
|
156
|
+
inHash,
|
|
121
157
|
blockHeadersHash,
|
|
122
158
|
slotNumber,
|
|
123
159
|
timestamp,
|
|
@@ -24,6 +24,7 @@ export declare class TestContext {
|
|
|
24
24
|
private headers;
|
|
25
25
|
private checkpoints;
|
|
26
26
|
private nextCheckpointIndex;
|
|
27
|
+
private nextCheckpointNumber;
|
|
27
28
|
private nextBlockNumber;
|
|
28
29
|
private epochNumber;
|
|
29
30
|
private feePayerBalance;
|
|
@@ -61,4 +62,4 @@ declare class TestProvingOrchestrator extends ProvingOrchestrator {
|
|
|
61
62
|
protected verifyBuiltBlockAgainstSyncedState(provingState: BlockProvingState): Promise<void>;
|
|
62
63
|
}
|
|
63
64
|
export {};
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9jb250ZXh0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9ja3MvdGVzdF9jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBS3ZELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUt4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHM0QsT0FBTyxLQUFLLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RyxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV4RCxPQUFPLEVBQ0wsS0FBSyxXQUFXLEVBQ2hCLEtBQUssZUFBZSxFQUNwQixLQUFLLFdBQVcsRUFHakIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBV2xFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDdEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3BELHFCQUFhLFdBQVc7SUFVYixVQUFVLEVBQUUsdUJBQXVCO0lBQ25DLE1BQU0sRUFBRSxtQkFBbUI7SUFDM0IsTUFBTSxFQUFFLFVBQVU7SUFDbEIsa0JBQWtCLEVBQUUseUJBQXlCO0lBQzdDLFlBQVksRUFBRSx1QkFBdUI7SUFDNUMsT0FBTyxDQUFDLFFBQVE7SUFFaEIsT0FBTyxDQUFDLG9CQUFvQjtJQUM1QixPQUFPLENBQUMsTUFBTTtJQWpCaEIsT0FBTyxDQUFDLE9BQU8sQ0FBdUM7SUFDdEQsT0FBTyxDQUFDLFdBQVcsQ0FBb0I7SUFDdkMsT0FBTyxDQUFDLG1CQUFtQixDQUFLO0lBQ2hDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBdUI7SUFDbkQsT0FBTyxDQUFDLGVBQWUsQ0FBSztJQUM1QixPQUFPLENBQUMsV0FBVyxDQUFLO0lBQ3hCLE9BQU8sQ0FBQyxlQUFlLENBQUs7SUFFNUIsWUFDUyxVQUFVLEVBQUUsdUJBQXVCLEVBQ25DLE1BQU0sRUFBRSxtQkFBbUIsRUFDM0IsTUFBTSxFQUFFLFVBQVUsRUFDbEIsa0JBQWtCLEVBQUUseUJBQXlCLEVBQzdDLFlBQVksRUFBRSx1QkFBdUIsRUFDcEMsUUFBUSxFQUFFLFlBQVksRUFDOUIsc0JBQXNCLEVBQUUsRUFBRSxFQUNsQixvQkFBb0IsRUFBRSxNQUFNLEVBQUUsRUFDOUIsTUFBTSxFQUFFLE1BQU0sRUFHdkI7SUFFRCxJQUFXLFdBQVcsNEJBRXJCO0lBRUQsT0FBYSxHQUFHLENBQ2QsTUFBTSxFQUFFLE1BQU0sRUFDZCxFQUNFLFdBQWUsRUFDZixZQUE4RyxFQUMvRyxHQUFFO1FBQ0QsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ3JCLFlBQVksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLGNBQWMsS0FBSyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztLQUN0RSx3QkF1RFA7SUFFTSxPQUFPLHVDQUViO0lBRUssT0FBTyxrQkFVWjtJQUVNLGFBQWEsU0FJbkI7SUFHTSxhQUFhLFdBRW5CO0lBRVksc0JBQXNCLG1GQUdsQztJQUVZLGNBQWMsQ0FDekIsU0FBUyxFQUFFLE1BQU0sRUFDakIsRUFDRSxjQUFrQixFQUNsQixpQkFBcUIsRUFDckIsbUJBQWdDLEVBQ2hDLEdBQUcsWUFBWSxFQUNoQixHQUFFO1FBQ0QsY0FBYyxDQUFDLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBQ25DLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQzNCLG1CQUFtQixDQUFDLEVBQUUsQ0FDcEIsb0JBQW9CLEVBQUUsZUFBZSxFQUNyQyxPQUFPLEVBQUUsTUFBTSxLQUNaLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3JELEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFNOzs7Ozs7Ozs7T0F1R25EO1lBRWEsZUFBZTtJQW9CN0IsT0FBTyxDQUFDLGNBQWM7WUFTUixXQUFXO0NBOEIxQjtBQUVELGNBQU0sdUJBQXdCLFNBQVEsbUJBQW1CO0lBQ2hELDJDQUEyQyxVQUFTO0lBSTNELFVBQW1CLGtDQUFrQyxDQUFDLFlBQVksRUFBRSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBS3BHO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_context.d.ts","sourceRoot":"","sources":["../../src/mocks/test_context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAKxD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EAGjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAWlE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,qBAAa,WAAW;
|
|
1
|
+
{"version":3,"file":"test_context.d.ts","sourceRoot":"","sources":["../../src/mocks/test_context.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,6 +32,7 @@ export class TestContext {
|
|
|
32
32
|
headers;
|
|
33
33
|
checkpoints;
|
|
34
34
|
nextCheckpointIndex;
|
|
35
|
+
nextCheckpointNumber;
|
|
35
36
|
nextBlockNumber;
|
|
36
37
|
epochNumber;
|
|
37
38
|
feePayerBalance;
|
|
@@ -47,6 +48,7 @@ export class TestContext {
|
|
|
47
48
|
this.headers = new Map();
|
|
48
49
|
this.checkpoints = [];
|
|
49
50
|
this.nextCheckpointIndex = 0;
|
|
51
|
+
this.nextCheckpointNumber = CheckpointNumber(1);
|
|
50
52
|
this.nextBlockNumber = 1;
|
|
51
53
|
this.epochNumber = 1;
|
|
52
54
|
this.feePayerBalance = initialFeePayerBalance;
|
|
@@ -126,7 +128,8 @@ export class TestContext {
|
|
|
126
128
|
throw new Error('Cannot make a checkpoint with 0 blocks. Crate an empty block (numTxsPerBlock = 0) if there are no txs.');
|
|
127
129
|
}
|
|
128
130
|
const checkpointIndex = this.nextCheckpointIndex++;
|
|
129
|
-
const checkpointNumber =
|
|
131
|
+
const checkpointNumber = this.nextCheckpointNumber;
|
|
132
|
+
this.nextCheckpointNumber++;
|
|
130
133
|
const slotNumber = checkpointNumber * 15; // times an arbitrary number to make it different to the checkpoint number
|
|
131
134
|
const constants = makeCheckpointConstants(slotNumber, constantOpts);
|
|
132
135
|
const fork = await this.worldState.fork();
|
|
@@ -136,11 +139,14 @@ export class TestContext {
|
|
|
136
139
|
const newL1ToL2Snapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, fork);
|
|
137
140
|
const startBlockNumber = this.nextBlockNumber;
|
|
138
141
|
const previousBlockHeader = this.getBlockHeader(BlockNumber(startBlockNumber - 1));
|
|
142
|
+
// All blocks in the same slot/checkpoint share the same timestamp.
|
|
143
|
+
const timestamp = BigInt(slotNumber * 26);
|
|
139
144
|
// Build global variables.
|
|
140
145
|
const blockGlobalVariables = times(numBlocks, (i)=>makeGlobals(startBlockNumber + i, slotNumber, {
|
|
141
146
|
coinbase: constants.coinbase,
|
|
142
147
|
feeRecipient: constants.feeRecipient,
|
|
143
|
-
gasFees: constants.gasFees
|
|
148
|
+
gasFees: constants.gasFees,
|
|
149
|
+
timestamp
|
|
144
150
|
}));
|
|
145
151
|
this.nextBlockNumber += numBlocks;
|
|
146
152
|
// Build txs.
|
|
@@ -139,7 +139,7 @@ export const buildHeaderFromCircuitOutputs = runInSpan('BlockBuilderHelpers', 'b
|
|
|
139
139
|
chainId: constants.chainId,
|
|
140
140
|
version: constants.version,
|
|
141
141
|
blockNumber: BlockNumber(blockRootRollupOutput.previousArchive.nextAvailableLeafIndex),
|
|
142
|
-
timestamp: blockRootRollupOutput.
|
|
142
|
+
timestamp: blockRootRollupOutput.timestamp,
|
|
143
143
|
slotNumber: constants.slotNumber,
|
|
144
144
|
coinbase: constants.coinbase,
|
|
145
145
|
feeRecipient: constants.feeRecipient,
|