@aztec/archiver 0.0.1-commit.fcb71a6 → 0.0.1-commit.fffb133c
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/README.md +156 -22
- package/dest/archiver.d.ts +135 -0
- package/dest/archiver.d.ts.map +1 -0
- package/dest/archiver.js +768 -0
- package/dest/{archiver/config.d.ts → config.d.ts} +9 -1
- package/dest/config.d.ts.map +1 -0
- package/dest/{archiver/config.js → config.js} +11 -2
- package/dest/errors.d.ts +41 -0
- package/dest/errors.d.ts.map +1 -0
- package/dest/{archiver/errors.js → errors.js} +8 -0
- package/dest/factory.d.ts +7 -7
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +87 -8
- package/dest/index.d.ts +10 -4
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +8 -3
- package/dest/interfaces.d.ts +9 -0
- package/dest/interfaces.d.ts.map +1 -0
- package/dest/interfaces.js +3 -0
- package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.d.ts +1 -1
- package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.js +2 -2
- package/dest/{archiver/l1 → l1}/calldata_retriever.d.ts +3 -3
- package/dest/l1/calldata_retriever.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/calldata_retriever.js +2 -2
- package/dest/l1/data_retrieval.d.ts +88 -0
- package/dest/l1/data_retrieval.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/data_retrieval.js +35 -54
- package/dest/{archiver/l1 → l1}/debug_tx.d.ts +1 -1
- package/dest/l1/debug_tx.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/spire_proposer.d.ts +1 -1
- package/dest/l1/spire_proposer.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/trace_tx.d.ts +1 -1
- package/dest/l1/trace_tx.d.ts.map +1 -0
- package/dest/l1/types.d.ts +12 -0
- package/dest/l1/types.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/validate_trace.d.ts +1 -1
- package/dest/l1/validate_trace.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/validate_trace.js +1 -1
- package/dest/modules/data_source_base.d.ts +84 -0
- package/dest/modules/data_source_base.d.ts.map +1 -0
- package/dest/modules/data_source_base.js +260 -0
- package/dest/modules/data_store_updater.d.ts +73 -0
- package/dest/modules/data_store_updater.d.ts.map +1 -0
- package/dest/modules/data_store_updater.js +302 -0
- package/dest/modules/instrumentation.d.ts +37 -0
- package/dest/modules/instrumentation.d.ts.map +1 -0
- package/dest/{archiver → modules}/instrumentation.js +15 -63
- package/dest/modules/l1_synchronizer.d.ts +75 -0
- package/dest/modules/l1_synchronizer.d.ts.map +1 -0
- package/dest/modules/l1_synchronizer.js +1113 -0
- package/dest/modules/validation.d.ts +17 -0
- package/dest/modules/validation.d.ts.map +1 -0
- package/dest/{archiver → modules}/validation.js +7 -1
- package/dest/store/block_store.d.ts +192 -0
- package/dest/store/block_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/block_store.js +162 -48
- package/dest/store/contract_class_store.d.ts +18 -0
- package/dest/store/contract_class_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/contract_class_store.js +1 -1
- package/dest/store/contract_instance_store.d.ts +24 -0
- package/dest/store/contract_instance_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/contract_instance_store.js +1 -1
- package/dest/store/kv_archiver_store.d.ts +340 -0
- package/dest/store/kv_archiver_store.d.ts.map +1 -0
- package/dest/store/kv_archiver_store.js +447 -0
- package/dest/store/log_store.d.ts +54 -0
- package/dest/store/log_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/log_store.js +89 -54
- package/dest/{archiver/kv_archiver_store → store}/message_store.d.ts +1 -1
- package/dest/store/message_store.d.ts.map +1 -0
- package/dest/{archiver/structs → structs}/data_retrieval.d.ts +1 -1
- package/dest/structs/data_retrieval.d.ts.map +1 -0
- package/dest/structs/inbox_message.d.ts +15 -0
- package/dest/structs/inbox_message.d.ts.map +1 -0
- package/dest/{archiver/structs → structs}/published.d.ts +1 -1
- package/dest/structs/published.d.ts.map +1 -0
- package/dest/test/fake_l1_state.d.ts +190 -0
- package/dest/test/fake_l1_state.d.ts.map +1 -0
- package/dest/test/fake_l1_state.js +383 -0
- package/dest/test/index.d.ts +2 -1
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +1 -0
- package/dest/test/mock_archiver.d.ts +2 -2
- package/dest/test/mock_archiver.d.ts.map +1 -1
- package/dest/test/mock_archiver.js +1 -2
- package/dest/test/mock_l1_to_l2_message_source.d.ts +2 -2
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/test/mock_l1_to_l2_message_source.js +12 -3
- package/dest/test/mock_l2_block_source.d.ts +22 -15
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +163 -57
- package/dest/test/mock_structs.d.ts +76 -2
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +133 -2
- package/package.json +15 -17
- package/src/archiver.ts +523 -0
- package/src/{archiver/config.ts → config.ts} +13 -2
- package/src/{archiver/errors.ts → errors.ts} +12 -0
- package/src/factory.ts +122 -8
- package/src/index.ts +10 -3
- package/src/interfaces.ts +9 -0
- package/src/{archiver/l1 → l1}/bin/retrieve-calldata.ts +7 -2
- package/src/{archiver/l1 → l1}/calldata_retriever.ts +3 -3
- package/src/{archiver/l1 → l1}/data_retrieval.ts +56 -73
- package/src/{archiver/l1 → l1}/validate_trace.ts +1 -1
- package/src/modules/data_source_base.ts +367 -0
- package/src/modules/data_store_updater.ts +423 -0
- package/src/{archiver → modules}/instrumentation.ts +16 -65
- package/src/modules/l1_synchronizer.ts +931 -0
- package/src/{archiver → modules}/validation.ts +11 -6
- package/src/{archiver/kv_archiver_store → store}/block_store.ts +210 -66
- package/src/{archiver/kv_archiver_store → store}/contract_class_store.ts +1 -1
- package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +1 -1
- package/src/{archiver/kv_archiver_store → store}/kv_archiver_store.ts +236 -35
- package/src/{archiver/kv_archiver_store → store}/log_store.ts +145 -86
- package/src/test/fake_l1_state.ts +599 -0
- package/src/test/index.ts +1 -0
- package/src/test/mock_archiver.ts +2 -2
- package/src/test/mock_l1_to_l2_message_source.ts +10 -4
- package/src/test/mock_l2_block_source.ts +173 -67
- package/src/test/mock_structs.ts +247 -2
- package/dest/archiver/archiver.d.ts +0 -304
- package/dest/archiver/archiver.d.ts.map +0 -1
- package/dest/archiver/archiver.js +0 -1645
- package/dest/archiver/archiver_store.d.ts +0 -308
- package/dest/archiver/archiver_store.d.ts.map +0 -1
- package/dest/archiver/archiver_store.js +0 -4
- package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
- package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
- package/dest/archiver/archiver_store_test_suite.js +0 -2770
- package/dest/archiver/config.d.ts.map +0 -1
- package/dest/archiver/errors.d.ts +0 -36
- package/dest/archiver/errors.d.ts.map +0 -1
- package/dest/archiver/index.d.ts +0 -7
- package/dest/archiver/index.d.ts.map +0 -1
- package/dest/archiver/index.js +0 -4
- package/dest/archiver/instrumentation.d.ts +0 -37
- package/dest/archiver/instrumentation.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -157
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -158
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -313
- package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -45
- package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
- package/dest/archiver/l1/bin/retrieve-calldata.d.ts.map +0 -1
- package/dest/archiver/l1/calldata_retriever.d.ts.map +0 -1
- package/dest/archiver/l1/data_retrieval.d.ts +0 -90
- package/dest/archiver/l1/data_retrieval.d.ts.map +0 -1
- package/dest/archiver/l1/debug_tx.d.ts.map +0 -1
- package/dest/archiver/l1/spire_proposer.d.ts.map +0 -1
- package/dest/archiver/l1/trace_tx.d.ts.map +0 -1
- package/dest/archiver/l1/types.d.ts +0 -12
- package/dest/archiver/l1/types.d.ts.map +0 -1
- package/dest/archiver/l1/validate_trace.d.ts.map +0 -1
- package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
- package/dest/archiver/structs/inbox_message.d.ts +0 -15
- package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
- package/dest/archiver/structs/published.d.ts.map +0 -1
- package/dest/archiver/validation.d.ts +0 -17
- package/dest/archiver/validation.d.ts.map +0 -1
- package/dest/rpc/index.d.ts +0 -9
- package/dest/rpc/index.d.ts.map +0 -1
- package/dest/rpc/index.js +0 -15
- package/src/archiver/archiver.ts +0 -2157
- package/src/archiver/archiver_store.ts +0 -372
- package/src/archiver/archiver_store_test_suite.ts +0 -2843
- package/src/archiver/index.ts +0 -6
- package/src/rpc/index.ts +0 -16
- /package/dest/{archiver/l1 → l1}/debug_tx.js +0 -0
- /package/dest/{archiver/l1 → l1}/spire_proposer.js +0 -0
- /package/dest/{archiver/l1 → l1}/trace_tx.js +0 -0
- /package/dest/{archiver/l1 → l1}/types.js +0 -0
- /package/dest/{archiver/kv_archiver_store → store}/message_store.js +0 -0
- /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
- /package/dest/{archiver/structs → structs}/inbox_message.js +0 -0
- /package/dest/{archiver/structs → structs}/published.js +0 -0
- /package/src/{archiver/l1 → l1}/README.md +0 -0
- /package/src/{archiver/l1 → l1}/debug_tx.ts +0 -0
- /package/src/{archiver/l1 → l1}/spire_proposer.ts +0 -0
- /package/src/{archiver/l1 → l1}/trace_tx.ts +0 -0
- /package/src/{archiver/l1 → l1}/types.ts +0 -0
- /package/src/{archiver/kv_archiver_store → store}/message_store.ts +0 -0
- /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
- /package/src/{archiver/structs → structs}/inbox_message.ts +0 -0
- /package/src/{archiver/structs → structs}/published.ts +0 -0
|
@@ -1,32 +1,35 @@
|
|
|
1
1
|
import { GENESIS_ARCHIVE_ROOT } from '@aztec/constants';
|
|
2
2
|
import { DefaultL1ContractsConfig } from '@aztec/ethereum/config';
|
|
3
|
-
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
4
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
5
5
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
6
6
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
7
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
8
|
-
import { L2Block, L2BlockHash
|
|
9
|
-
import { L1PublishedData } from '@aztec/stdlib/checkpoint';
|
|
8
|
+
import { CheckpointedL2Block, L2Block, L2BlockHash } from '@aztec/stdlib/block';
|
|
9
|
+
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
10
10
|
import { EmptyL1RollupConstants, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
11
|
-
import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
11
|
+
import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
12
12
|
/**
|
|
13
13
|
* A mocked implementation of L2BlockSource to be used in tests.
|
|
14
14
|
*/ export class MockL2BlockSource {
|
|
15
15
|
l2Blocks = [];
|
|
16
16
|
provenBlockNumber = 0;
|
|
17
17
|
finalizedBlockNumber = 0;
|
|
18
|
+
checkpointedBlockNumber = 0;
|
|
18
19
|
log = createLogger('archiver:mock_l2_block_source');
|
|
19
20
|
async createBlocks(numBlocks) {
|
|
20
21
|
for(let i = 0; i < numBlocks; i++){
|
|
21
22
|
const blockNum = this.l2Blocks.length + 1;
|
|
22
|
-
const block = await L2Block.random(BlockNumber(blockNum)
|
|
23
|
+
const block = await L2Block.random(BlockNumber(blockNum), {
|
|
24
|
+
slotNumber: SlotNumber(blockNum)
|
|
25
|
+
});
|
|
23
26
|
this.l2Blocks.push(block);
|
|
24
27
|
}
|
|
25
28
|
this.log.verbose(`Created ${numBlocks} blocks in the mock L2 block source`);
|
|
26
29
|
}
|
|
27
|
-
|
|
30
|
+
addProposedBlocks(blocks) {
|
|
28
31
|
this.l2Blocks.push(...blocks);
|
|
29
|
-
this.log.verbose(`Added ${blocks.length} blocks to the mock L2 block source`);
|
|
32
|
+
this.log.verbose(`Added ${blocks.length} proposed blocks to the mock L2 block source`);
|
|
30
33
|
}
|
|
31
34
|
removeBlocks(numBlocks) {
|
|
32
35
|
this.l2Blocks = this.l2Blocks.slice(0, -numBlocks);
|
|
@@ -41,6 +44,9 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
41
44
|
}
|
|
42
45
|
this.finalizedBlockNumber = finalizedBlockNumber;
|
|
43
46
|
}
|
|
47
|
+
setCheckpointedBlockNumber(checkpointedBlockNumber) {
|
|
48
|
+
this.checkpointedBlockNumber = checkpointedBlockNumber;
|
|
49
|
+
}
|
|
44
50
|
/**
|
|
45
51
|
* Method to fetch the rollup contract address at the base-layer.
|
|
46
52
|
* @returns The rollup address.
|
|
@@ -62,54 +68,96 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
62
68
|
getProvenBlockNumber() {
|
|
63
69
|
return Promise.resolve(BlockNumber(this.provenBlockNumber));
|
|
64
70
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
71
|
+
getCheckpointedL2BlockNumber() {
|
|
72
|
+
return Promise.resolve(BlockNumber(this.checkpointedBlockNumber));
|
|
73
|
+
}
|
|
74
|
+
getFinalizedL2BlockNumber() {
|
|
75
|
+
return Promise.resolve(BlockNumber(this.finalizedBlockNumber));
|
|
76
|
+
}
|
|
77
|
+
getCheckpointedBlock(number) {
|
|
78
|
+
if (number > this.checkpointedBlockNumber) {
|
|
79
|
+
return Promise.resolve(undefined);
|
|
80
|
+
}
|
|
81
|
+
const block = this.l2Blocks[number - 1];
|
|
82
|
+
if (!block) {
|
|
83
|
+
return Promise.resolve(undefined);
|
|
84
|
+
}
|
|
85
|
+
const checkpointedBlock = new CheckpointedL2Block(CheckpointNumber.fromBlockNumber(number), block, new L1PublishedData(BigInt(number), BigInt(number), `0x${number.toString(16).padStart(64, '0')}`), []);
|
|
86
|
+
return Promise.resolve(checkpointedBlock);
|
|
87
|
+
}
|
|
88
|
+
async getCheckpointedBlocks(from, limit) {
|
|
89
|
+
const result = [];
|
|
90
|
+
for(let i = 0; i < limit; i++){
|
|
91
|
+
const blockNum = from + i;
|
|
92
|
+
if (blockNum > this.checkpointedBlockNumber) {
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
const block = await this.getCheckpointedBlock(BlockNumber(blockNum));
|
|
96
|
+
if (block) {
|
|
97
|
+
result.push(block);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
68
101
|
}
|
|
69
102
|
/**
|
|
70
103
|
* Gets an l2 block.
|
|
71
104
|
* @param number - The block number to return (inclusive).
|
|
72
105
|
* @returns The requested L2 block.
|
|
73
106
|
*/ getBlock(number) {
|
|
74
|
-
|
|
107
|
+
const block = this.l2Blocks[number - 1];
|
|
108
|
+
return Promise.resolve(block);
|
|
75
109
|
}
|
|
76
110
|
/**
|
|
77
111
|
* Gets an L2 block (new format).
|
|
78
112
|
* @param number - The block number to return.
|
|
79
113
|
* @returns The requested L2 block.
|
|
80
|
-
*/
|
|
114
|
+
*/ getL2Block(number) {
|
|
81
115
|
const block = this.l2Blocks[number - 1];
|
|
82
|
-
return Promise.resolve(block
|
|
116
|
+
return Promise.resolve(block);
|
|
83
117
|
}
|
|
84
118
|
/**
|
|
85
119
|
* Gets up to `limit` amount of L2 blocks starting from `from`.
|
|
86
120
|
* @param from - Number of the first block to return (inclusive).
|
|
87
121
|
* @param limit - The maximum number of blocks to return.
|
|
88
122
|
* @returns The requested mocked L2 blocks.
|
|
89
|
-
*/ getBlocks(from, limit
|
|
90
|
-
return Promise.resolve(this.l2Blocks.slice(from - 1, from - 1 + limit)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// TODO: Implement this properly. This only works when we have one block per checkpoint.
|
|
94
|
-
|
|
123
|
+
*/ getBlocks(from, limit) {
|
|
124
|
+
return Promise.resolve(this.l2Blocks.slice(from - 1, from - 1 + limit));
|
|
125
|
+
}
|
|
126
|
+
getCheckpoints(from, limit) {
|
|
127
|
+
// TODO(mbps): Implement this properly. This only works when we have one block per checkpoint.
|
|
128
|
+
const blocks = this.l2Blocks.slice(from - 1, from - 1 + limit);
|
|
129
|
+
return Promise.all(blocks.map(async (block)=>{
|
|
130
|
+
// Create a checkpoint from the block - manually construct since L2Block doesn't have toCheckpoint()
|
|
131
|
+
const checkpoint = await Checkpoint.random(block.checkpointNumber, {
|
|
132
|
+
numBlocks: 1
|
|
133
|
+
});
|
|
134
|
+
checkpoint.blocks = [
|
|
135
|
+
block
|
|
136
|
+
];
|
|
137
|
+
return new PublishedCheckpoint(checkpoint, new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()), []);
|
|
138
|
+
}));
|
|
95
139
|
}
|
|
96
140
|
async getCheckpointByArchive(archive) {
|
|
97
|
-
// TODO: Implement this properly. This only works when we have one block per checkpoint.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
141
|
+
// TODO(mbps): Implement this properly. This only works when we have one block per checkpoint.
|
|
142
|
+
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
143
|
+
if (!block) {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
// Create a checkpoint from the block - manually construct since L2Block doesn't have toCheckpoint()
|
|
147
|
+
const checkpoint = await Checkpoint.random(block.checkpointNumber, {
|
|
148
|
+
numBlocks: 1
|
|
149
|
+
});
|
|
150
|
+
checkpoint.blocks = [
|
|
151
|
+
block
|
|
152
|
+
];
|
|
153
|
+
return checkpoint;
|
|
107
154
|
}
|
|
108
|
-
async
|
|
155
|
+
async getCheckpointedBlockByHash(blockHash) {
|
|
109
156
|
for (const block of this.l2Blocks){
|
|
110
157
|
const hash = await block.hash();
|
|
111
158
|
if (hash.equals(blockHash)) {
|
|
112
|
-
return
|
|
159
|
+
return CheckpointedL2Block.fromFields({
|
|
160
|
+
checkpointNumber: CheckpointNumber.fromBlockNumber(block.number),
|
|
113
161
|
block,
|
|
114
162
|
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
115
163
|
attestations: []
|
|
@@ -118,38 +166,69 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
118
166
|
}
|
|
119
167
|
return undefined;
|
|
120
168
|
}
|
|
121
|
-
|
|
169
|
+
getCheckpointedBlockByArchive(archive) {
|
|
122
170
|
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
123
171
|
if (!block) {
|
|
124
172
|
return Promise.resolve(undefined);
|
|
125
173
|
}
|
|
126
|
-
return Promise.resolve(
|
|
174
|
+
return Promise.resolve(CheckpointedL2Block.fromFields({
|
|
175
|
+
checkpointNumber: CheckpointNumber.fromBlockNumber(block.number),
|
|
127
176
|
block,
|
|
128
177
|
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
129
178
|
attestations: []
|
|
130
179
|
}));
|
|
131
180
|
}
|
|
181
|
+
async getL2BlockByHash(blockHash) {
|
|
182
|
+
for (const block of this.l2Blocks){
|
|
183
|
+
const hash = await block.hash();
|
|
184
|
+
if (hash.equals(blockHash)) {
|
|
185
|
+
return block;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
getL2BlockByArchive(archive) {
|
|
191
|
+
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
192
|
+
return Promise.resolve(block);
|
|
193
|
+
}
|
|
132
194
|
async getBlockHeaderByHash(blockHash) {
|
|
133
195
|
for (const block of this.l2Blocks){
|
|
134
196
|
const hash = await block.hash();
|
|
135
197
|
if (hash.equals(blockHash)) {
|
|
136
|
-
return block.
|
|
198
|
+
return block.header;
|
|
137
199
|
}
|
|
138
200
|
}
|
|
139
201
|
return undefined;
|
|
140
202
|
}
|
|
141
203
|
getBlockHeaderByArchive(archive) {
|
|
142
204
|
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
143
|
-
return Promise.resolve(block?.
|
|
205
|
+
return Promise.resolve(block?.header);
|
|
144
206
|
}
|
|
145
207
|
getBlockHeader(number) {
|
|
146
|
-
return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.
|
|
208
|
+
return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.header);
|
|
147
209
|
}
|
|
148
210
|
getCheckpointsForEpoch(epochNumber) {
|
|
149
|
-
// TODO: Implement this properly. This only works when we have one block per checkpoint.
|
|
150
|
-
|
|
211
|
+
// TODO(mbps): Implement this properly. This only works when we have one block per checkpoint.
|
|
212
|
+
const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
|
|
213
|
+
const [start, end] = getSlotRangeForEpoch(epochNumber, {
|
|
214
|
+
epochDuration
|
|
215
|
+
});
|
|
216
|
+
const blocks = this.l2Blocks.filter((b)=>{
|
|
217
|
+
const slot = b.header.globalVariables.slotNumber;
|
|
218
|
+
return slot >= start && slot <= end;
|
|
219
|
+
});
|
|
220
|
+
// Create checkpoints from blocks - manually construct since L2Block doesn't have toCheckpoint()
|
|
221
|
+
return Promise.all(blocks.map(async (block)=>{
|
|
222
|
+
const checkpoint = await Checkpoint.random(block.checkpointNumber, {
|
|
223
|
+
numBlocks: 1
|
|
224
|
+
});
|
|
225
|
+
checkpoint.blocks = [
|
|
226
|
+
block
|
|
227
|
+
];
|
|
228
|
+
return checkpoint;
|
|
229
|
+
}));
|
|
151
230
|
}
|
|
152
|
-
|
|
231
|
+
getCheckpointedBlocksForEpoch(epochNumber) {
|
|
153
232
|
const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
|
|
154
233
|
const [start, end] = getSlotRangeForEpoch(epochNumber, {
|
|
155
234
|
epochDuration
|
|
@@ -158,11 +237,20 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
158
237
|
const slot = b.header.globalVariables.slotNumber;
|
|
159
238
|
return slot >= start && slot <= end;
|
|
160
239
|
});
|
|
240
|
+
return Promise.resolve(blocks.map((block)=>CheckpointedL2Block.fromFields({
|
|
241
|
+
checkpointNumber: CheckpointNumber.fromBlockNumber(block.number),
|
|
242
|
+
block,
|
|
243
|
+
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
244
|
+
attestations: []
|
|
245
|
+
})));
|
|
246
|
+
}
|
|
247
|
+
getBlocksForSlot(slotNumber) {
|
|
248
|
+
const blocks = this.l2Blocks.filter((b)=>b.header.globalVariables.slotNumber === slotNumber);
|
|
161
249
|
return Promise.resolve(blocks);
|
|
162
250
|
}
|
|
163
|
-
async
|
|
164
|
-
const
|
|
165
|
-
return
|
|
251
|
+
async getCheckpointedBlockHeadersForEpoch(epochNumber) {
|
|
252
|
+
const checkpointedBlocks = await this.getCheckpointedBlocksForEpoch(epochNumber);
|
|
253
|
+
return checkpointedBlocks.map((b)=>b.block.header);
|
|
166
254
|
}
|
|
167
255
|
/**
|
|
168
256
|
* Gets a tx effect.
|
|
@@ -192,34 +280,52 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
192
280
|
for (const block of this.l2Blocks){
|
|
193
281
|
for (const txEffect of block.body.txEffects){
|
|
194
282
|
if (txEffect.txHash.equals(txHash)) {
|
|
195
|
-
|
|
283
|
+
// In mock, assume all txs are checkpointed with successful execution
|
|
284
|
+
return new TxReceipt(txHash, TxStatus.CHECKPOINTED, TxExecutionResult.SUCCESS, undefined, txEffect.transactionFee.toBigInt(), L2BlockHash.fromField(await block.hash()), block.number);
|
|
196
285
|
}
|
|
197
286
|
}
|
|
198
287
|
}
|
|
199
288
|
return undefined;
|
|
200
289
|
}
|
|
201
290
|
async getL2Tips() {
|
|
202
|
-
const [latest, proven, finalized] = [
|
|
291
|
+
const [latest, proven, finalized, checkpointed] = [
|
|
203
292
|
await this.getBlockNumber(),
|
|
204
293
|
await this.getProvenBlockNumber(),
|
|
205
|
-
this.finalizedBlockNumber
|
|
294
|
+
this.finalizedBlockNumber,
|
|
295
|
+
this.checkpointedBlockNumber
|
|
206
296
|
];
|
|
207
297
|
const latestBlock = this.l2Blocks[latest - 1];
|
|
208
298
|
const provenBlock = this.l2Blocks[proven - 1];
|
|
209
299
|
const finalizedBlock = this.l2Blocks[finalized - 1];
|
|
300
|
+
const checkpointedBlock = this.l2Blocks[checkpointed - 1];
|
|
301
|
+
const latestBlockId = {
|
|
302
|
+
number: BlockNumber(latest),
|
|
303
|
+
hash: (await latestBlock?.hash())?.toString()
|
|
304
|
+
};
|
|
305
|
+
const provenBlockId = {
|
|
306
|
+
number: BlockNumber(proven),
|
|
307
|
+
hash: (await provenBlock?.hash())?.toString()
|
|
308
|
+
};
|
|
309
|
+
const finalizedBlockId = {
|
|
310
|
+
number: BlockNumber(finalized),
|
|
311
|
+
hash: (await finalizedBlock?.hash())?.toString()
|
|
312
|
+
};
|
|
313
|
+
const checkpointedBlockId = {
|
|
314
|
+
number: BlockNumber(checkpointed),
|
|
315
|
+
hash: (await checkpointedBlock?.hash())?.toString()
|
|
316
|
+
};
|
|
317
|
+
const makeTipId = (blockId)=>({
|
|
318
|
+
block: blockId,
|
|
319
|
+
checkpoint: {
|
|
320
|
+
number: CheckpointNumber.fromBlockNumber(blockId.number),
|
|
321
|
+
hash: blockId.hash
|
|
322
|
+
}
|
|
323
|
+
});
|
|
210
324
|
return {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
proven: {
|
|
216
|
-
number: BlockNumber(proven),
|
|
217
|
-
hash: (await provenBlock?.hash())?.toString()
|
|
218
|
-
},
|
|
219
|
-
finalized: {
|
|
220
|
-
number: BlockNumber(finalized),
|
|
221
|
-
hash: (await finalizedBlock?.hash())?.toString()
|
|
222
|
-
}
|
|
325
|
+
proposed: latestBlockId,
|
|
326
|
+
checkpointed: makeTipId(checkpointedBlockId),
|
|
327
|
+
proven: makeTipId(provenBlockId),
|
|
328
|
+
finalized: makeTipId(finalizedBlockId)
|
|
223
329
|
};
|
|
224
330
|
}
|
|
225
331
|
getL2EpochNumber() {
|
|
@@ -1,10 +1,84 @@
|
|
|
1
1
|
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { Buffer16 } from '@aztec/foundation/buffer';
|
|
3
|
-
import {
|
|
3
|
+
import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
4
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
6
|
+
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
7
|
+
import { PrivateLog, PublicLog, SiloedTag, Tag } from '@aztec/stdlib/logs';
|
|
8
|
+
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
9
|
+
import { StateReference } from '@aztec/stdlib/tx';
|
|
10
|
+
import { type InboxMessage } from '../structs/inbox_message.js';
|
|
4
11
|
export declare function makeInboxMessage(previousRollingHash?: Buffer16, overrides?: Partial<InboxMessage>): InboxMessage;
|
|
5
12
|
export declare function makeInboxMessages(count: number, opts?: {
|
|
6
13
|
initialHash?: Buffer16;
|
|
7
14
|
initialCheckpointNumber?: CheckpointNumber;
|
|
8
15
|
overrideFn?: (msg: InboxMessage, index: number) => InboxMessage;
|
|
9
16
|
}): InboxMessage[];
|
|
10
|
-
|
|
17
|
+
/** Creates inbox messages distributed across multiple blocks with proper checkpoint numbering. */
|
|
18
|
+
export declare function makeInboxMessagesWithFullBlocks(blockCount: number, opts?: {
|
|
19
|
+
initialCheckpointNumber?: CheckpointNumber;
|
|
20
|
+
}): InboxMessage[];
|
|
21
|
+
/** Creates a deterministic block hash from a block number. */
|
|
22
|
+
export declare function makeBlockHash(blockNumber: number): `0x${string}`;
|
|
23
|
+
/**
|
|
24
|
+
* Creates a StateReference with properly calculated noteHashTree.nextAvailableLeafIndex.
|
|
25
|
+
* This ensures LogStore's dataStartIndexForBlock calculation doesn't produce negative values.
|
|
26
|
+
*/
|
|
27
|
+
export declare function makeStateForBlock(blockNumber: number, txsPerBlock: number): StateReference;
|
|
28
|
+
/** Creates L1PublishedData with deterministic values based on l1BlockNumber. */
|
|
29
|
+
export declare function makeL1PublishedData(l1BlockNumber: number): L1PublishedData;
|
|
30
|
+
/** Wraps a Checkpoint with L1 published data and random attestations. */
|
|
31
|
+
export declare function makePublishedCheckpoint(checkpoint: Checkpoint, l1BlockNumber: number, attestationCount?: number): PublishedCheckpoint;
|
|
32
|
+
export interface MakeChainedCheckpointsOptions {
|
|
33
|
+
/** Number of L2 blocks per checkpoint. Default: 1 */
|
|
34
|
+
blocksPerCheckpoint?: number;
|
|
35
|
+
/** Number of transactions per block. Default: 4 */
|
|
36
|
+
txsPerBlock?: number;
|
|
37
|
+
/** Starting checkpoint number. Default: CheckpointNumber(1) */
|
|
38
|
+
startCheckpointNumber?: CheckpointNumber;
|
|
39
|
+
/** Starting block number. Default: 1 */
|
|
40
|
+
startBlockNumber?: number;
|
|
41
|
+
/** Starting L1 block number. Default: 10 */
|
|
42
|
+
startL1BlockNumber?: number;
|
|
43
|
+
/** Previous archive to chain from. Default: undefined */
|
|
44
|
+
previousArchive?: AppendOnlyTreeSnapshot;
|
|
45
|
+
/** Optional function to provide per-checkpoint overrides */
|
|
46
|
+
makeCheckpointOptions?: (cpNumber: CheckpointNumber) => Partial<Parameters<typeof Checkpoint.random>[1]>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Creates multiple checkpoints with properly chained archives.
|
|
50
|
+
* Each checkpoint's blocks have their lastArchive set to the previous block's archive,
|
|
51
|
+
* ensuring archive chain continuity for testing.
|
|
52
|
+
*/
|
|
53
|
+
export declare function makeChainedCheckpoints(count: number, options?: MakeChainedCheckpointsOptions): Promise<PublishedCheckpoint[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Creates a PublishedCheckpoint with attestations signed by the provided signers.
|
|
56
|
+
* Useful for testing attestation validation.
|
|
57
|
+
*/
|
|
58
|
+
export declare function makeSignedPublishedCheckpoint(checkpoint: Checkpoint, signers: Secp256k1Signer[], committee: EthAddress[], l1BlockNumber?: number): PublishedCheckpoint;
|
|
59
|
+
/** Creates a deterministic SiloedTag for private log testing. */
|
|
60
|
+
export declare function makePrivateLogTag(blockNumber: number, txIndex: number, logIndex: number): SiloedTag;
|
|
61
|
+
/** Creates a PrivateLog with fields derived from the tag. */
|
|
62
|
+
export declare function makePrivateLog(tag: SiloedTag): PrivateLog;
|
|
63
|
+
/** Creates multiple private logs for a transaction. */
|
|
64
|
+
export declare function mockPrivateLogs(blockNumber: number, txIndex: number, numLogsPerTx: number): PrivateLog[];
|
|
65
|
+
/** Creates a deterministic Tag for public log testing. */
|
|
66
|
+
export declare function makePublicLogTag(blockNumber: number, txIndex: number, logIndex: number): Tag;
|
|
67
|
+
/** Creates a PublicLog with fields derived from the tag. */
|
|
68
|
+
export declare function makePublicLog(tag: Tag, contractAddress?: AztecAddress): PublicLog;
|
|
69
|
+
/** Creates multiple public logs for a transaction. */
|
|
70
|
+
export declare function makePublicLogs(blockNumber: number, txIndex: number, numLogsPerTx: number, contractAddress?: AztecAddress): PublicLog[];
|
|
71
|
+
export interface MockCheckpointWithLogsOptions {
|
|
72
|
+
previousArchive?: AppendOnlyTreeSnapshot;
|
|
73
|
+
numTxsPerBlock?: number;
|
|
74
|
+
privateLogs?: {
|
|
75
|
+
numLogsPerTx: number;
|
|
76
|
+
};
|
|
77
|
+
publicLogs?: {
|
|
78
|
+
numLogsPerTx: number;
|
|
79
|
+
contractAddress?: AztecAddress;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Creates a checkpoint with specified logs on each tx effect. */
|
|
83
|
+
export declare function makeCheckpointWithLogs(blockNumber: number, options?: MockCheckpointWithLogsOptions): Promise<PublishedCheckpoint>;
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19zdHJ1Y3RzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9tb2NrX3N0cnVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUFlLGdCQUFnQixFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxRQUFRLEVBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUc5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVqRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBeUIsY0FBYyxFQUFZLE1BQU0sa0JBQWtCLENBQUM7QUFFbkYsT0FBTyxFQUFFLEtBQUssWUFBWSxFQUFxQixNQUFNLDZCQUE2QixDQUFDO0FBRW5GLHdCQUFnQixnQkFBZ0IsQ0FDOUIsbUJBQW1CLFdBQWdCLEVBQ25DLFNBQVMsR0FBRSxPQUFPLENBQUMsWUFBWSxDQUFNLEdBQ3BDLFlBQVksQ0FnQmQ7QUFFRCx3QkFBZ0IsaUJBQWlCLENBQy9CLEtBQUssRUFBRSxNQUFNLEVBQ2IsSUFBSSxHQUFFO0lBQ0osV0FBVyxDQUFDLEVBQUUsUUFBUSxDQUFDO0lBQ3ZCLHVCQUF1QixDQUFDLEVBQUUsZ0JBQWdCLENBQUM7SUFDM0MsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEtBQUss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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock_structs.d.ts","sourceRoot":"","sources":["../../src/test/mock_structs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mock_structs.d.ts","sourceRoot":"","sources":["../../src/test/mock_structs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MAX_NOTE_HASHES_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, PRIVATE_LOG_SIZE_IN_FIELDS } from '@aztec/constants';
|
|
2
|
+
import { makeTuple } from '@aztec/foundation/array';
|
|
3
|
+
import { BlockNumber, CheckpointNumber, IndexWithinCheckpoint } from '@aztec/foundation/branded-types';
|
|
2
4
|
import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
|
|
5
|
+
import { times, timesParallel } from '@aztec/foundation/collection';
|
|
3
6
|
import { randomBigInt, randomInt } from '@aztec/foundation/crypto/random';
|
|
4
7
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
8
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
9
|
+
import { CommitteeAttestation, L2Block } from '@aztec/stdlib/block';
|
|
10
|
+
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
11
|
+
import { PrivateLog, PublicLog, SiloedTag, Tag } from '@aztec/stdlib/logs';
|
|
5
12
|
import { InboxLeaf } from '@aztec/stdlib/messaging';
|
|
6
|
-
import {
|
|
13
|
+
import { orderAttestations } from '@aztec/stdlib/p2p';
|
|
14
|
+
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
15
|
+
import { makeCheckpointAttestationFromCheckpoint } from '@aztec/stdlib/testing';
|
|
16
|
+
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
17
|
+
import { PartialStateReference, StateReference, TxEffect } from '@aztec/stdlib/tx';
|
|
18
|
+
import { updateRollingHash } from '../structs/inbox_message.js';
|
|
7
19
|
export function makeInboxMessage(previousRollingHash = Buffer16.ZERO, overrides = {}) {
|
|
8
20
|
const { checkpointNumber = CheckpointNumber(randomInt(100) + 1) } = overrides;
|
|
9
21
|
const { l1BlockNumber = randomBigInt(100n) + 1n } = overrides;
|
|
@@ -36,3 +48,122 @@ export function makeInboxMessages(count, opts = {}) {
|
|
|
36
48
|
}
|
|
37
49
|
return messages;
|
|
38
50
|
}
|
|
51
|
+
/** Creates inbox messages distributed across multiple blocks with proper checkpoint numbering. */ export function makeInboxMessagesWithFullBlocks(blockCount, opts = {}) {
|
|
52
|
+
const { initialCheckpointNumber = CheckpointNumber(13) } = opts;
|
|
53
|
+
return makeInboxMessages(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP * blockCount, {
|
|
54
|
+
overrideFn: (msg, i)=>{
|
|
55
|
+
const checkpointNumber = CheckpointNumber(initialCheckpointNumber + Math.floor(i / NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP));
|
|
56
|
+
const index = InboxLeaf.smallestIndexForCheckpoint(checkpointNumber) + BigInt(i % NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
57
|
+
return {
|
|
58
|
+
...msg,
|
|
59
|
+
checkpointNumber,
|
|
60
|
+
index
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/** Creates a deterministic block hash from a block number. */ export function makeBlockHash(blockNumber) {
|
|
66
|
+
return `0x${blockNumber.toString(16).padStart(64, '0')}`;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Creates a StateReference with properly calculated noteHashTree.nextAvailableLeafIndex.
|
|
70
|
+
* This ensures LogStore's dataStartIndexForBlock calculation doesn't produce negative values.
|
|
71
|
+
*/ export function makeStateForBlock(blockNumber, txsPerBlock) {
|
|
72
|
+
const noteHashIndex = blockNumber * txsPerBlock * MAX_NOTE_HASHES_PER_TX;
|
|
73
|
+
return new StateReference(AppendOnlyTreeSnapshot.random(), new PartialStateReference(new AppendOnlyTreeSnapshot(Fr.random(), noteHashIndex), AppendOnlyTreeSnapshot.random(), AppendOnlyTreeSnapshot.random()));
|
|
74
|
+
}
|
|
75
|
+
/** Creates L1PublishedData with deterministic values based on l1BlockNumber. */ export function makeL1PublishedData(l1BlockNumber) {
|
|
76
|
+
return new L1PublishedData(BigInt(l1BlockNumber), BigInt(l1BlockNumber * 1000), makeBlockHash(l1BlockNumber));
|
|
77
|
+
}
|
|
78
|
+
/** Wraps a Checkpoint with L1 published data and random attestations. */ export function makePublishedCheckpoint(checkpoint, l1BlockNumber, attestationCount = 3) {
|
|
79
|
+
return new PublishedCheckpoint(checkpoint, makeL1PublishedData(l1BlockNumber), times(attestationCount, CommitteeAttestation.random));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Creates multiple checkpoints with properly chained archives.
|
|
83
|
+
* Each checkpoint's blocks have their lastArchive set to the previous block's archive,
|
|
84
|
+
* ensuring archive chain continuity for testing.
|
|
85
|
+
*/ export async function makeChainedCheckpoints(count, options = {}) {
|
|
86
|
+
const { blocksPerCheckpoint = 1, txsPerBlock = 4, startCheckpointNumber = CheckpointNumber(1), startBlockNumber = 1, startL1BlockNumber = 10, makeCheckpointOptions } = options;
|
|
87
|
+
let previousArchive = options.previousArchive;
|
|
88
|
+
const checkpoints = [];
|
|
89
|
+
for(let i = 0; i < count; i++){
|
|
90
|
+
const cpNumber = CheckpointNumber(startCheckpointNumber + i);
|
|
91
|
+
const blockStart = startBlockNumber + i * blocksPerCheckpoint;
|
|
92
|
+
const customOptions = makeCheckpointOptions?.(cpNumber) ?? {};
|
|
93
|
+
const checkpoint = await Checkpoint.random(cpNumber, {
|
|
94
|
+
numBlocks: blocksPerCheckpoint,
|
|
95
|
+
startBlockNumber: blockStart,
|
|
96
|
+
previousArchive,
|
|
97
|
+
txsPerBlock,
|
|
98
|
+
state: makeStateForBlock(blockStart, txsPerBlock),
|
|
99
|
+
txOptions: {
|
|
100
|
+
numPublicCallsPerTx: 2,
|
|
101
|
+
numPublicLogsPerCall: 2
|
|
102
|
+
},
|
|
103
|
+
...customOptions
|
|
104
|
+
});
|
|
105
|
+
previousArchive = checkpoint.blocks.at(-1).archive;
|
|
106
|
+
checkpoints.push(makePublishedCheckpoint(checkpoint, startL1BlockNumber + i * 10));
|
|
107
|
+
}
|
|
108
|
+
return checkpoints;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Creates a PublishedCheckpoint with attestations signed by the provided signers.
|
|
112
|
+
* Useful for testing attestation validation.
|
|
113
|
+
*/ export function makeSignedPublishedCheckpoint(checkpoint, signers, committee, l1BlockNumber = 1) {
|
|
114
|
+
const attestations = signers.map((signer)=>makeCheckpointAttestationFromCheckpoint(checkpoint, signer));
|
|
115
|
+
const committeeAttestations = orderAttestations(attestations, committee);
|
|
116
|
+
return new PublishedCheckpoint(checkpoint, makeL1PublishedData(l1BlockNumber), committeeAttestations);
|
|
117
|
+
}
|
|
118
|
+
/** Creates a deterministic SiloedTag for private log testing. */ export function makePrivateLogTag(blockNumber, txIndex, logIndex) {
|
|
119
|
+
return new SiloedTag(blockNumber === 1 && txIndex === 0 && logIndex === 0 ? Fr.ZERO : new Fr(blockNumber * 100 + txIndex * 10 + logIndex));
|
|
120
|
+
}
|
|
121
|
+
/** Creates a PrivateLog with fields derived from the tag. */ export function makePrivateLog(tag) {
|
|
122
|
+
return PrivateLog.from({
|
|
123
|
+
fields: makeTuple(PRIVATE_LOG_SIZE_IN_FIELDS, (i)=>!i ? tag.value : new Fr(tag.value.toBigInt() + BigInt(i))),
|
|
124
|
+
emittedLength: PRIVATE_LOG_SIZE_IN_FIELDS
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/** Creates multiple private logs for a transaction. */ export function mockPrivateLogs(blockNumber, txIndex, numLogsPerTx) {
|
|
128
|
+
return times(numLogsPerTx, (logIndex)=>{
|
|
129
|
+
const tag = makePrivateLogTag(blockNumber, txIndex, logIndex);
|
|
130
|
+
return makePrivateLog(tag);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/** Creates a deterministic Tag for public log testing. */ export function makePublicLogTag(blockNumber, txIndex, logIndex) {
|
|
134
|
+
return new Tag(blockNumber === 1 && txIndex === 0 && logIndex === 0 ? Fr.ZERO : new Fr((blockNumber * 100 + txIndex * 10 + logIndex) * 123));
|
|
135
|
+
}
|
|
136
|
+
/** Creates a PublicLog with fields derived from the tag. */ export function makePublicLog(tag, contractAddress = AztecAddress.fromNumber(543254)) {
|
|
137
|
+
return PublicLog.from({
|
|
138
|
+
contractAddress,
|
|
139
|
+
fields: new Array(10).fill(null).map((_, i)=>!i ? tag.value : new Fr(tag.value.toBigInt() + BigInt(i)))
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/** Creates multiple public logs for a transaction. */ export function makePublicLogs(blockNumber, txIndex, numLogsPerTx, contractAddress = AztecAddress.fromNumber(543254)) {
|
|
143
|
+
return times(numLogsPerTx, (logIndex)=>{
|
|
144
|
+
const tag = makePublicLogTag(blockNumber, txIndex, logIndex);
|
|
145
|
+
return makePublicLog(tag, contractAddress);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/** Creates a checkpoint with specified logs on each tx effect. */ export async function makeCheckpointWithLogs(blockNumber, options = {}) {
|
|
149
|
+
const { previousArchive, numTxsPerBlock = 4, privateLogs, publicLogs } = options;
|
|
150
|
+
const block = await L2Block.random(BlockNumber(blockNumber), {
|
|
151
|
+
checkpointNumber: CheckpointNumber.fromBlockNumber(BlockNumber(blockNumber)),
|
|
152
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(0),
|
|
153
|
+
state: makeStateForBlock(blockNumber, numTxsPerBlock),
|
|
154
|
+
...previousArchive ? {
|
|
155
|
+
lastArchive: previousArchive
|
|
156
|
+
} : {}
|
|
157
|
+
});
|
|
158
|
+
block.header.globalVariables.blockNumber = BlockNumber(blockNumber);
|
|
159
|
+
block.body.txEffects = await timesParallel(numTxsPerBlock, async (txIndex)=>{
|
|
160
|
+
const txEffect = await TxEffect.random();
|
|
161
|
+
txEffect.privateLogs = privateLogs ? mockPrivateLogs(blockNumber, txIndex, privateLogs.numLogsPerTx) : [];
|
|
162
|
+
txEffect.publicLogs = publicLogs ? makePublicLogs(blockNumber, txIndex, publicLogs.numLogsPerTx, publicLogs.contractAddress) : [];
|
|
163
|
+
return txEffect;
|
|
164
|
+
});
|
|
165
|
+
const checkpoint = new Checkpoint(AppendOnlyTreeSnapshot.random(), CheckpointHeader.random(), [
|
|
166
|
+
block
|
|
167
|
+
], CheckpointNumber.fromBlockNumber(BlockNumber(blockNumber)));
|
|
168
|
+
return makePublishedCheckpoint(checkpoint, blockNumber);
|
|
169
|
+
}
|
package/package.json
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/archiver",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.fffb133c",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
7
|
-
"./data-retrieval": "./dest/archiver/data_retrieval.js",
|
|
8
|
-
"./epoch": "./dest/archiver/epoch_helpers.js",
|
|
9
7
|
"./test": "./dest/test/index.js",
|
|
10
|
-
"./config": "./dest/
|
|
8
|
+
"./config": "./dest/config.js"
|
|
11
9
|
},
|
|
12
10
|
"typedocOptions": {
|
|
13
11
|
"entryPoints": [
|
|
@@ -66,18 +64,18 @@
|
|
|
66
64
|
]
|
|
67
65
|
},
|
|
68
66
|
"dependencies": {
|
|
69
|
-
"@aztec/blob-client": "0.0.1-commit.
|
|
70
|
-
"@aztec/blob-lib": "0.0.1-commit.
|
|
71
|
-
"@aztec/constants": "0.0.1-commit.
|
|
72
|
-
"@aztec/epoch-cache": "0.0.1-commit.
|
|
73
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
74
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
75
|
-
"@aztec/kv-store": "0.0.1-commit.
|
|
76
|
-
"@aztec/l1-artifacts": "0.0.1-commit.
|
|
77
|
-
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.
|
|
78
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
79
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
80
|
-
"@aztec/telemetry-client": "0.0.1-commit.
|
|
67
|
+
"@aztec/blob-client": "0.0.1-commit.fffb133c",
|
|
68
|
+
"@aztec/blob-lib": "0.0.1-commit.fffb133c",
|
|
69
|
+
"@aztec/constants": "0.0.1-commit.fffb133c",
|
|
70
|
+
"@aztec/epoch-cache": "0.0.1-commit.fffb133c",
|
|
71
|
+
"@aztec/ethereum": "0.0.1-commit.fffb133c",
|
|
72
|
+
"@aztec/foundation": "0.0.1-commit.fffb133c",
|
|
73
|
+
"@aztec/kv-store": "0.0.1-commit.fffb133c",
|
|
74
|
+
"@aztec/l1-artifacts": "0.0.1-commit.fffb133c",
|
|
75
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.fffb133c",
|
|
76
|
+
"@aztec/protocol-contracts": "0.0.1-commit.fffb133c",
|
|
77
|
+
"@aztec/stdlib": "0.0.1-commit.fffb133c",
|
|
78
|
+
"@aztec/telemetry-client": "0.0.1-commit.fffb133c",
|
|
81
79
|
"lodash.groupby": "^4.6.0",
|
|
82
80
|
"lodash.omit": "^4.5.0",
|
|
83
81
|
"tslib": "^2.5.0",
|
|
@@ -90,7 +88,7 @@
|
|
|
90
88
|
"@types/lodash.groupby": "^4.6.9",
|
|
91
89
|
"@types/lodash.omit": "^4.5.7",
|
|
92
90
|
"@types/node": "^22.15.17",
|
|
93
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
91
|
+
"@typescript/native-preview": "7.0.0-dev.20260113.1",
|
|
94
92
|
"concurrently": "^8.0.1",
|
|
95
93
|
"jest": "^30.0.0",
|
|
96
94
|
"jest-mock-extended": "^4.0.0",
|