@aztec/archiver 0.28.1 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/archiver/archiver.d.ts +13 -53
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +60 -199
- package/dest/archiver/archiver_store.d.ts +21 -67
- package/dest/archiver/archiver_store.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.js +60 -199
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +6 -2
- package/dest/archiver/data_retrieval.d.ts +10 -32
- package/dest/archiver/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/data_retrieval.js +13 -67
- package/dest/archiver/eth_log_handlers.d.ts +7 -38
- package/dest/archiver/eth_log_handlers.d.ts.map +1 -1
- package/dest/archiver/eth_log_handlers.js +9 -77
- package/dest/archiver/kv_archiver_store/block_store.d.ts +5 -4
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/block_store.js +12 -15
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +15 -56
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +23 -87
- package/dest/archiver/kv_archiver_store/message_store.d.ts +12 -43
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/message_store.js +32 -141
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +8 -41
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +1 -1
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +22 -79
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +20 -81
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -1
- package/dest/archiver/memory_archiver_store/memory_archiver_store.js +30 -143
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +3 -15
- package/dest/rpc/archiver_client.d.ts.map +1 -1
- package/dest/rpc/archiver_client.js +2 -6
- package/dest/rpc/archiver_server.d.ts.map +1 -1
- package/dest/rpc/archiver_server.js +2 -6
- package/package.json +9 -9
- package/src/archiver/archiver.ts +80 -267
- package/src/archiver/archiver_store.ts +22 -76
- package/src/archiver/archiver_store_test_suite.ts +78 -243
- package/src/archiver/config.ts +6 -0
- package/src/archiver/data_retrieval.ts +19 -101
- package/src/archiver/eth_log_handlers.ts +14 -108
- package/src/archiver/kv_archiver_store/block_store.ts +13 -14
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +23 -93
- package/src/archiver/kv_archiver_store/message_store.ts +38 -169
- package/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +21 -90
- package/src/archiver/memory_archiver_store/memory_archiver_store.ts +33 -161
- package/src/index.ts +1 -15
- package/src/rpc/archiver_client.ts +0 -8
- package/src/rpc/archiver_server.ts +0 -8
- package/dest/archiver/kv_archiver_store/contract_store.d.ts +0 -26
- package/dest/archiver/kv_archiver_store/contract_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/contract_store.js +0 -49
- package/src/archiver/kv_archiver_store/contract_store.ts +0 -55
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GetUnencryptedLogsResponse, L1ToL2MessageSource, L2Block, L2BlockL2Logs, L2BlockSource, L2LogsSource, LogFilter, LogType, TxEffect, TxHash, TxReceipt } from '@aztec/circuit-types';
|
|
2
2
|
import { FunctionSelector } from '@aztec/circuits.js';
|
|
3
3
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
4
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
5
|
import { Fr } from '@aztec/foundation/fields';
|
|
6
6
|
import { DebugLogger } from '@aztec/foundation/log';
|
|
7
|
-
import { ContractClassPublic, ContractInstanceWithAddress } from '@aztec/types/contracts';
|
|
7
|
+
import { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress, PublicFunction } from '@aztec/types/contracts';
|
|
8
8
|
import { Chain, HttpTransport, PublicClient } from 'viem';
|
|
9
9
|
import { ArchiverDataStore } from './archiver_store.js';
|
|
10
10
|
import { ArchiverConfig } from './config.js';
|
|
@@ -22,7 +22,6 @@ export declare class Archiver implements ArchiveSource {
|
|
|
22
22
|
private readonly rollupAddress;
|
|
23
23
|
private readonly availabilityOracleAddress;
|
|
24
24
|
private readonly inboxAddress;
|
|
25
|
-
private readonly newInboxAddress;
|
|
26
25
|
private readonly registryAddress;
|
|
27
26
|
private readonly store;
|
|
28
27
|
private readonly pollingIntervalMs;
|
|
@@ -40,13 +39,12 @@ export declare class Archiver implements ArchiveSource {
|
|
|
40
39
|
* @param publicClient - A client for interacting with the Ethereum node.
|
|
41
40
|
* @param rollupAddress - Ethereum address of the rollup contract.
|
|
42
41
|
* @param inboxAddress - Ethereum address of the inbox contract.
|
|
43
|
-
* @param newInboxAddress - Ethereum address of the new inbox contract.
|
|
44
42
|
* @param registryAddress - Ethereum address of the registry contract.
|
|
45
43
|
* @param pollingIntervalMs - The interval for polling for L1 logs (in milliseconds).
|
|
46
44
|
* @param store - An archiver data store for storage & retrieval of blocks, encrypted logs & contract data.
|
|
47
45
|
* @param log - A logger.
|
|
48
46
|
*/
|
|
49
|
-
constructor(publicClient: PublicClient<HttpTransport, Chain>, rollupAddress: EthAddress, availabilityOracleAddress: EthAddress, inboxAddress: EthAddress,
|
|
47
|
+
constructor(publicClient: PublicClient<HttpTransport, Chain>, rollupAddress: EthAddress, availabilityOracleAddress: EthAddress, inboxAddress: EthAddress, registryAddress: EthAddress, store: ArchiverDataStore, pollingIntervalMs?: number, log?: DebugLogger);
|
|
50
48
|
/**
|
|
51
49
|
* Creates a new instance of the Archiver and blocks until it syncs from chain.
|
|
52
50
|
* @param config - The archiver's desired configuration.
|
|
@@ -75,14 +73,6 @@ export declare class Archiver implements ArchiveSource {
|
|
|
75
73
|
* @param allLogs - All logs emitted in a bunch of blocks.
|
|
76
74
|
*/
|
|
77
75
|
private storeDeployedContractInstances;
|
|
78
|
-
/**
|
|
79
|
-
* Stores extended contract data as classes and instances.
|
|
80
|
-
* Temporary solution until we source this data from the contract class registerer and instance deployer.
|
|
81
|
-
* @param contracts - The extended contract data to be stored.
|
|
82
|
-
* @param l2BlockNum - The L2 block number to which the contract data corresponds.
|
|
83
|
-
* TODO(palla/purge-old-contract-deploy): Delete this method
|
|
84
|
-
*/
|
|
85
|
-
storeContractDataAsClassesAndInstances(contracts: ExtendedContractData[], l2BlockNum: number): Promise<void>;
|
|
86
76
|
/**
|
|
87
77
|
* Stops the archiver.
|
|
88
78
|
* @returns A promise signalling completion of the stop process.
|
|
@@ -105,37 +95,13 @@ export declare class Archiver implements ArchiveSource {
|
|
|
105
95
|
getBlock(number: number): Promise<L2Block | undefined>;
|
|
106
96
|
getTxEffect(txHash: TxHash): Promise<TxEffect | undefined>;
|
|
107
97
|
getSettledTxReceipt(txHash: TxHash): Promise<TxReceipt | undefined>;
|
|
108
|
-
/**
|
|
109
|
-
* Get the extended contract data for this contract.
|
|
110
|
-
* @param contractAddress - The contract data address.
|
|
111
|
-
* @returns The extended contract data or undefined if not found.
|
|
112
|
-
*/
|
|
113
|
-
getExtendedContractData(contractAddress: AztecAddress): Promise<ExtendedContractData | undefined>;
|
|
114
|
-
/**
|
|
115
|
-
* Temporary method for creating a fake extended contract data out of classes and instances registered in the node.
|
|
116
|
-
* Used as a fallback if the extended contract data is not found.
|
|
117
|
-
* TODO(palla/purge-old-contract-deploy): Use proper classes
|
|
118
|
-
*/
|
|
119
|
-
private makeExtendedContractDataFor;
|
|
120
|
-
/**
|
|
121
|
-
* Lookup the contract data for this contract.
|
|
122
|
-
* Contains contract address & the ethereum portal address.
|
|
123
|
-
* @param contractAddress - The contract data address.
|
|
124
|
-
* @returns ContractData with the portal address (if we didn't throw an error).
|
|
125
|
-
*/
|
|
126
|
-
getContractData(contractAddress: AztecAddress): Promise<ContractData | undefined>;
|
|
127
|
-
/**
|
|
128
|
-
* Temporary method for creating a fake contract data out of classes and instances registered in the node.
|
|
129
|
-
* Used as a fallback if the extended contract data is not found.
|
|
130
|
-
*/
|
|
131
|
-
private makeContractDataFor;
|
|
132
98
|
/**
|
|
133
99
|
* Gets the public function data for a contract.
|
|
134
|
-
* @param
|
|
100
|
+
* @param address - The contract address containing the function to fetch.
|
|
135
101
|
* @param selector - The function selector of the function to fetch.
|
|
136
102
|
* @returns The public function data (if found).
|
|
137
103
|
*/
|
|
138
|
-
getPublicFunction(
|
|
104
|
+
getPublicFunction(address: AztecAddress, selector: FunctionSelector): Promise<PublicFunction | undefined>;
|
|
139
105
|
/**
|
|
140
106
|
* Gets up to `limit` amount of logs starting from `from`.
|
|
141
107
|
* @param from - Number of the L2 block to which corresponds the first logs to be returned.
|
|
@@ -158,23 +124,17 @@ export declare class Archiver implements ArchiveSource {
|
|
|
158
124
|
getContractClass(id: Fr): Promise<ContractClassPublic | undefined>;
|
|
159
125
|
getContract(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined>;
|
|
160
126
|
/**
|
|
161
|
-
* Gets
|
|
162
|
-
* @param limit - The number of messages to return.
|
|
163
|
-
* @returns The requested L1 to L2 messages' keys.
|
|
164
|
-
*/
|
|
165
|
-
getPendingL1ToL2EntryKeys(limit: number): Promise<Fr[]>;
|
|
166
|
-
/**
|
|
167
|
-
* Gets the confirmed/consumed L1 to L2 message associated with the given entry key
|
|
168
|
-
* @param entryKey - The entry key.
|
|
169
|
-
* @returns The L1 to L2 message (throws if not found).
|
|
170
|
-
*/
|
|
171
|
-
getConfirmedL1ToL2Message(entryKey: Fr): Promise<L1ToL2Message>;
|
|
172
|
-
/**
|
|
173
|
-
* Gets new L1 to L2 message (to be) included in a given block.
|
|
127
|
+
* Gets L1 to L2 message (to be) included in a given block.
|
|
174
128
|
* @param blockNumber - L2 block number to get messages for.
|
|
175
129
|
* @returns The L1 to L2 messages/leaves of the messages subtree (throws if not found).
|
|
176
130
|
*/
|
|
177
|
-
|
|
131
|
+
getL1ToL2Messages(blockNumber: bigint): Promise<Fr[]>;
|
|
132
|
+
/**
|
|
133
|
+
* Gets the L1 to L2 message index in the L1 to L2 message tree.
|
|
134
|
+
* @param l1ToL2Message - The L1 to L2 message.
|
|
135
|
+
* @returns The index of the L1 to L2 message in the L1 to L2 message tree (undefined if not found).
|
|
136
|
+
*/
|
|
137
|
+
getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint | undefined>;
|
|
178
138
|
getContractClassIds(): Promise<Fr[]>;
|
|
179
139
|
}
|
|
180
140
|
//# sourceMappingURL=archiver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { L2Block, UnencryptedL2Log, } from '@aztec/circuit-types';
|
|
2
2
|
import { ContractClassRegisteredEvent } from '@aztec/circuits.js';
|
|
3
3
|
import { ContractInstanceDeployedEvent } from '@aztec/circuits.js/contract';
|
|
4
4
|
import { createEthereumChain } from '@aztec/ethereum';
|
|
5
|
-
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
7
5
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
8
6
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
9
|
-
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
10
7
|
import { ClassRegistererAddress } from '@aztec/protocol-contracts/class-registerer';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { retrieveBlockBodiesFromAvailabilityOracle, retrieveBlockMetadataFromRollup, retrieveNewCancelledL1ToL2Messages, retrieveNewL1ToL2Messages, retrieveNewPendingL1ToL2Messages, } from './data_retrieval.js';
|
|
8
|
+
import { createPublicClient, http } from 'viem';
|
|
9
|
+
import { retrieveBlockBodiesFromAvailabilityOracle, retrieveBlockMetadataFromRollup, retrieveL1ToL2Messages, } from './data_retrieval.js';
|
|
14
10
|
/**
|
|
15
11
|
* Pulls L2 blocks in a non-blocking manner and provides interface for their retrieval.
|
|
16
12
|
* Responsible for handling robust L1 polling so that other components do not need to
|
|
@@ -22,18 +18,16 @@ export class Archiver {
|
|
|
22
18
|
* @param publicClient - A client for interacting with the Ethereum node.
|
|
23
19
|
* @param rollupAddress - Ethereum address of the rollup contract.
|
|
24
20
|
* @param inboxAddress - Ethereum address of the inbox contract.
|
|
25
|
-
* @param newInboxAddress - Ethereum address of the new inbox contract.
|
|
26
21
|
* @param registryAddress - Ethereum address of the registry contract.
|
|
27
22
|
* @param pollingIntervalMs - The interval for polling for L1 logs (in milliseconds).
|
|
28
23
|
* @param store - An archiver data store for storage & retrieval of blocks, encrypted logs & contract data.
|
|
29
24
|
* @param log - A logger.
|
|
30
25
|
*/
|
|
31
|
-
constructor(publicClient, rollupAddress, availabilityOracleAddress, inboxAddress,
|
|
26
|
+
constructor(publicClient, rollupAddress, availabilityOracleAddress, inboxAddress, registryAddress, store, pollingIntervalMs = 10000, log = createDebugLogger('aztec:archiver')) {
|
|
32
27
|
this.publicClient = publicClient;
|
|
33
28
|
this.rollupAddress = rollupAddress;
|
|
34
29
|
this.availabilityOracleAddress = availabilityOracleAddress;
|
|
35
30
|
this.inboxAddress = inboxAddress;
|
|
36
|
-
this.newInboxAddress = newInboxAddress;
|
|
37
31
|
this.registryAddress = registryAddress;
|
|
38
32
|
this.store = store;
|
|
39
33
|
this.pollingIntervalMs = pollingIntervalMs;
|
|
@@ -57,17 +51,7 @@ export class Archiver {
|
|
|
57
51
|
transport: http(chain.rpcUrl),
|
|
58
52
|
pollingInterval: config.viemPollingIntervalMS,
|
|
59
53
|
});
|
|
60
|
-
|
|
61
|
-
let newInboxAddress;
|
|
62
|
-
{
|
|
63
|
-
const rollup = getContract({
|
|
64
|
-
address: getAddress(config.l1Contracts.rollupAddress.toString()),
|
|
65
|
-
abi: RollupAbi,
|
|
66
|
-
client: publicClient,
|
|
67
|
-
});
|
|
68
|
-
newInboxAddress = EthAddress.fromString(await rollup.read.NEW_INBOX());
|
|
69
|
-
}
|
|
70
|
-
const archiver = new Archiver(publicClient, config.l1Contracts.rollupAddress, config.l1Contracts.availabilityOracleAddress, config.l1Contracts.inboxAddress, newInboxAddress, config.l1Contracts.registryAddress, archiverStore, config.archiverPollingIntervalMS);
|
|
54
|
+
const archiver = new Archiver(publicClient, config.l1Contracts.rollupAddress, config.l1Contracts.availabilityOracleAddress, config.l1Contracts.inboxAddress, config.l1Contracts.registryAddress, archiverStore, config.archiverPollingIntervalMS);
|
|
71
55
|
await archiver.start(blockUntilSynced);
|
|
72
56
|
return archiver;
|
|
73
57
|
}
|
|
@@ -103,12 +87,9 @@ export class Archiver {
|
|
|
103
87
|
*
|
|
104
88
|
* This code does not handle reorgs.
|
|
105
89
|
*/
|
|
106
|
-
const lastL1Blocks = await this.store.
|
|
90
|
+
const lastL1Blocks = await this.store.getSynchedL1BlockNumbers();
|
|
107
91
|
const currentL1BlockNumber = await this.publicClient.getBlockNumber();
|
|
108
|
-
if (currentL1BlockNumber <= lastL1Blocks.
|
|
109
|
-
currentL1BlockNumber <= lastL1Blocks.newMessages &&
|
|
110
|
-
currentL1BlockNumber <= lastL1Blocks.addedMessages &&
|
|
111
|
-
currentL1BlockNumber <= lastL1Blocks.cancelledMessages) {
|
|
92
|
+
if (currentL1BlockNumber <= lastL1Blocks.blocks && currentL1BlockNumber <= lastL1Blocks.messages) {
|
|
112
93
|
// chain hasn't moved forward
|
|
113
94
|
// or it's been rolled back
|
|
114
95
|
return;
|
|
@@ -131,62 +112,39 @@ export class Archiver {
|
|
|
131
112
|
* in future but for the time being it should give us the guarantees that we need
|
|
132
113
|
*/
|
|
133
114
|
// ********** Events that are processed per L1 block **********
|
|
134
|
-
// TODO(#4492): Nuke the following when purging the old inbox
|
|
135
|
-
// Process l1ToL2Messages, these are consumed as time passes, not each block
|
|
136
|
-
const retrievedPendingL1ToL2Messages = await retrieveNewPendingL1ToL2Messages(this.publicClient, this.inboxAddress, blockUntilSynced, lastL1Blocks.addedMessages + 1n, currentL1BlockNumber);
|
|
137
|
-
const retrievedCancelledL1ToL2Messages = await retrieveNewCancelledL1ToL2Messages(this.publicClient, this.inboxAddress, blockUntilSynced, lastL1Blocks.cancelledMessages + 1n, currentL1BlockNumber);
|
|
138
|
-
// group pending messages and cancelled messages by their L1 block number
|
|
139
|
-
const messagesByBlock = new Map();
|
|
140
|
-
for (const [message, blockNumber] of retrievedPendingL1ToL2Messages.retrievedData) {
|
|
141
|
-
const messages = messagesByBlock.get(blockNumber) || [[], []];
|
|
142
|
-
messages[0].push(message);
|
|
143
|
-
messagesByBlock.set(blockNumber, messages);
|
|
144
|
-
}
|
|
145
|
-
for (const [entryKey, blockNumber] of retrievedCancelledL1ToL2Messages.retrievedData) {
|
|
146
|
-
const messages = messagesByBlock.get(blockNumber) || [[], []];
|
|
147
|
-
messages[1].push(entryKey);
|
|
148
|
-
messagesByBlock.set(blockNumber, messages);
|
|
149
|
-
}
|
|
150
|
-
// process messages from each L1 block in sequence
|
|
151
|
-
const l1BlocksWithMessages = Array.from(messagesByBlock.keys()).sort((a, b) => (a < b ? -1 : a === b ? 0 : 1));
|
|
152
|
-
for (const l1Block of l1BlocksWithMessages) {
|
|
153
|
-
const [newMessages, cancelledMessages] = messagesByBlock.get(l1Block);
|
|
154
|
-
this.log(`Adding ${newMessages.length} new messages and ${cancelledMessages.length} cancelled messages in L1 block ${l1Block}`);
|
|
155
|
-
await this.store.addPendingL1ToL2Messages(newMessages, l1Block);
|
|
156
|
-
await this.store.cancelPendingL1ToL2EntryKeys(cancelledMessages, l1Block);
|
|
157
|
-
}
|
|
158
115
|
// ********** Events that are processed per L2 block **********
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
116
|
+
const retrievedL1ToL2Messages = await retrieveL1ToL2Messages(this.publicClient, this.inboxAddress, blockUntilSynced, lastL1Blocks.messages + 1n, currentL1BlockNumber);
|
|
117
|
+
if (retrievedL1ToL2Messages.retrievedData.length !== 0) {
|
|
118
|
+
this.log(`Retrieved ${retrievedL1ToL2Messages.retrievedData.length} new L1 -> L2 messages between L1 blocks ${lastL1Blocks.messages + 1n} and ${currentL1BlockNumber}.`);
|
|
119
|
+
}
|
|
120
|
+
await this.store.addL1ToL2Messages(retrievedL1ToL2Messages);
|
|
164
121
|
// Read all data from chain and then write to our stores at the end
|
|
165
|
-
const nextExpectedL2BlockNum = BigInt((await this.store.
|
|
166
|
-
const retrievedBlockBodies = await retrieveBlockBodiesFromAvailabilityOracle(this.publicClient, this.availabilityOracleAddress, blockUntilSynced, lastL1Blocks.
|
|
122
|
+
const nextExpectedL2BlockNum = BigInt((await this.store.getSynchedL2BlockNumber()) + 1);
|
|
123
|
+
const retrievedBlockBodies = await retrieveBlockBodiesFromAvailabilityOracle(this.publicClient, this.availabilityOracleAddress, blockUntilSynced, lastL1Blocks.blocks + 1n, currentL1BlockNumber);
|
|
167
124
|
const blockBodies = retrievedBlockBodies.retrievedData.map(([blockBody]) => blockBody);
|
|
168
125
|
await this.store.addBlockBodies(blockBodies);
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
126
|
+
// Now that we have block bodies we will retrieve block metadata and build L2 blocks from the bodies and
|
|
127
|
+
// the metadata
|
|
128
|
+
let retrievedBlocks;
|
|
129
|
+
{
|
|
130
|
+
const retrievedBlockMetadata = await retrieveBlockMetadataFromRollup(this.publicClient, this.rollupAddress, blockUntilSynced, lastL1Blocks.blocks + 1n, currentL1BlockNumber, nextExpectedL2BlockNum);
|
|
131
|
+
const retrievedBodyHashes = retrievedBlockMetadata.retrievedData.map(([header]) => header.contentCommitment.txsEffectsHash);
|
|
132
|
+
const blockBodiesFromStore = await this.store.getBlockBodies(retrievedBodyHashes);
|
|
133
|
+
if (retrievedBlockMetadata.retrievedData.length !== blockBodiesFromStore.length) {
|
|
134
|
+
throw new Error('Block headers length does not equal block bodies length');
|
|
135
|
+
}
|
|
136
|
+
const blocks = retrievedBlockMetadata.retrievedData.map((blockMetadata, i) => new L2Block(blockMetadata[1], blockMetadata[0], blockBodiesFromStore[i]));
|
|
137
|
+
if (blocks.length === 0) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this.log(`Retrieved ${blocks.length} new L2 blocks between L1 blocks ${lastL1Blocks.blocks + 1n} and ${currentL1BlockNumber}.`);
|
|
142
|
+
}
|
|
143
|
+
retrievedBlocks = {
|
|
144
|
+
lastProcessedL1BlockNumber: retrievedBlockMetadata.lastProcessedL1BlockNumber,
|
|
145
|
+
retrievedData: blocks,
|
|
146
|
+
};
|
|
183
147
|
}
|
|
184
|
-
// create the block number -> block hash mapping to ensure we retrieve the appropriate events
|
|
185
|
-
const blockNumberToBodyHash = {};
|
|
186
|
-
retrievedBlocks.retrievedData.forEach((block) => {
|
|
187
|
-
blockNumberToBodyHash[block.number] = block.header.contentCommitment.txsEffectsHash;
|
|
188
|
-
});
|
|
189
|
-
this.log(`Retrieved ${retrievedBlocks.retrievedData.length} block(s) from chain`);
|
|
190
148
|
await Promise.all(retrievedBlocks.retrievedData.map(block => {
|
|
191
149
|
const encryptedLogs = block.body.encryptedLogs;
|
|
192
150
|
const unencryptedLogs = block.body.unencryptedLogs;
|
|
@@ -201,13 +159,7 @@ export class Archiver {
|
|
|
201
159
|
await this.storeRegisteredContractClasses(blockLogs, block.number);
|
|
202
160
|
await this.storeDeployedContractInstances(blockLogs, block.number);
|
|
203
161
|
}));
|
|
204
|
-
|
|
205
|
-
// from each l2block fetch all entryKeys in a flattened array:
|
|
206
|
-
this.log(`Confirming l1 to l2 messages in store`);
|
|
207
|
-
for (const block of retrievedBlocks.retrievedData) {
|
|
208
|
-
await this.store.confirmL1ToL2EntryKeys(block.body.l1ToL2Messages);
|
|
209
|
-
}
|
|
210
|
-
await this.store.addBlocks(retrievedBlocks.retrievedData);
|
|
162
|
+
await this.store.addBlocks(retrievedBlocks);
|
|
211
163
|
}
|
|
212
164
|
/**
|
|
213
165
|
* Extracts and stores contract classes out of ContractClassRegistered events emitted by the class registerer contract.
|
|
@@ -225,24 +177,12 @@ export class Archiver {
|
|
|
225
177
|
* @param allLogs - All logs emitted in a bunch of blocks.
|
|
226
178
|
*/
|
|
227
179
|
async storeDeployedContractInstances(allLogs, blockNum) {
|
|
228
|
-
const contractInstances = ContractInstanceDeployedEvent.fromLogs(allLogs
|
|
180
|
+
const contractInstances = ContractInstanceDeployedEvent.fromLogs(allLogs).map(e => e.toContractInstance());
|
|
229
181
|
if (contractInstances.length > 0) {
|
|
230
182
|
contractInstances.forEach(c => this.log(`Storing contract instance at ${c.address.toString()}`));
|
|
231
183
|
await this.store.addContractInstances(contractInstances, blockNum);
|
|
232
184
|
}
|
|
233
185
|
}
|
|
234
|
-
/**
|
|
235
|
-
* Stores extended contract data as classes and instances.
|
|
236
|
-
* Temporary solution until we source this data from the contract class registerer and instance deployer.
|
|
237
|
-
* @param contracts - The extended contract data to be stored.
|
|
238
|
-
* @param l2BlockNum - The L2 block number to which the contract data corresponds.
|
|
239
|
-
* TODO(palla/purge-old-contract-deploy): Delete this method
|
|
240
|
-
*/
|
|
241
|
-
async storeContractDataAsClassesAndInstances(contracts, l2BlockNum) {
|
|
242
|
-
const classesAndInstances = contracts.map(extendedContractDataToContractClassAndInstance);
|
|
243
|
-
await this.store.addContractClasses(classesAndInstances.map(([c, _]) => c), l2BlockNum);
|
|
244
|
-
await this.store.addContractInstances(classesAndInstances.map(([_, i]) => i), l2BlockNum);
|
|
245
|
-
}
|
|
246
186
|
/**
|
|
247
187
|
* Stops the archiver.
|
|
248
188
|
* @returns A promise signalling completion of the stop process.
|
|
@@ -276,7 +216,7 @@ export class Archiver {
|
|
|
276
216
|
async getBlock(number) {
|
|
277
217
|
// If the number provided is -ve, then return the latest block.
|
|
278
218
|
if (number < 0) {
|
|
279
|
-
number = await this.store.
|
|
219
|
+
number = await this.store.getSynchedL2BlockNumber();
|
|
280
220
|
}
|
|
281
221
|
const blocks = await this.store.getBlocks(number, 1);
|
|
282
222
|
return blocks.length === 0 ? undefined : blocks[0];
|
|
@@ -288,59 +228,21 @@ export class Archiver {
|
|
|
288
228
|
return this.store.getSettledTxReceipt(txHash);
|
|
289
229
|
}
|
|
290
230
|
/**
|
|
291
|
-
*
|
|
292
|
-
* @param
|
|
293
|
-
* @
|
|
294
|
-
|
|
295
|
-
async getExtendedContractData(contractAddress) {
|
|
296
|
-
return ((await this.store.getExtendedContractData(contractAddress)) ?? this.makeExtendedContractDataFor(contractAddress));
|
|
297
|
-
}
|
|
298
|
-
/**
|
|
299
|
-
* Temporary method for creating a fake extended contract data out of classes and instances registered in the node.
|
|
300
|
-
* Used as a fallback if the extended contract data is not found.
|
|
301
|
-
* TODO(palla/purge-old-contract-deploy): Use proper classes
|
|
231
|
+
* Gets the public function data for a contract.
|
|
232
|
+
* @param address - The contract address containing the function to fetch.
|
|
233
|
+
* @param selector - The function selector of the function to fetch.
|
|
234
|
+
* @returns The public function data (if found).
|
|
302
235
|
*/
|
|
303
|
-
async
|
|
304
|
-
const instance = await this.
|
|
236
|
+
async getPublicFunction(address, selector) {
|
|
237
|
+
const instance = await this.getContract(address);
|
|
305
238
|
if (!instance) {
|
|
306
|
-
|
|
239
|
+
throw new Error(`Contract ${address.toString()} not found`);
|
|
307
240
|
}
|
|
308
|
-
const contractClass = await this.
|
|
241
|
+
const contractClass = await this.getContractClass(instance.contractClassId);
|
|
309
242
|
if (!contractClass) {
|
|
310
|
-
|
|
311
|
-
return undefined;
|
|
243
|
+
throw new Error(`Contract class ${instance.contractClassId.toString()} for ${address.toString()} not found`);
|
|
312
244
|
}
|
|
313
|
-
return
|
|
314
|
-
}
|
|
315
|
-
/**
|
|
316
|
-
* Lookup the contract data for this contract.
|
|
317
|
-
* Contains contract address & the ethereum portal address.
|
|
318
|
-
* @param contractAddress - The contract data address.
|
|
319
|
-
* @returns ContractData with the portal address (if we didn't throw an error).
|
|
320
|
-
*/
|
|
321
|
-
getContractData(contractAddress) {
|
|
322
|
-
return this.makeContractDataFor(contractAddress);
|
|
323
|
-
}
|
|
324
|
-
/**
|
|
325
|
-
* Temporary method for creating a fake contract data out of classes and instances registered in the node.
|
|
326
|
-
* Used as a fallback if the extended contract data is not found.
|
|
327
|
-
*/
|
|
328
|
-
async makeContractDataFor(address) {
|
|
329
|
-
const instance = await this.store.getContractInstance(address);
|
|
330
|
-
if (!instance) {
|
|
331
|
-
return undefined;
|
|
332
|
-
}
|
|
333
|
-
return new ContractData(address, instance.portalContractAddress);
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Gets the public function data for a contract.
|
|
337
|
-
* @param contractAddress - The contract address containing the function to fetch.
|
|
338
|
-
* @param selector - The function selector of the function to fetch.
|
|
339
|
-
* @returns The public function data (if found).
|
|
340
|
-
*/
|
|
341
|
-
async getPublicFunction(contractAddress, selector) {
|
|
342
|
-
const contractData = await this.getExtendedContractData(contractAddress);
|
|
343
|
-
return contractData?.getPublicFunction(selector);
|
|
245
|
+
return contractClass.publicFunctions.find(f => f.selector.equals(selector));
|
|
344
246
|
}
|
|
345
247
|
/**
|
|
346
248
|
* Gets up to `limit` amount of logs starting from `from`.
|
|
@@ -365,7 +267,7 @@ export class Archiver {
|
|
|
365
267
|
* @returns The number of the latest L2 block processed by the block source implementation.
|
|
366
268
|
*/
|
|
367
269
|
getBlockNumber() {
|
|
368
|
-
return this.store.
|
|
270
|
+
return this.store.getSynchedL2BlockNumber();
|
|
369
271
|
}
|
|
370
272
|
getContractClass(id) {
|
|
371
273
|
return this.store.getContractClass(id);
|
|
@@ -374,64 +276,23 @@ export class Archiver {
|
|
|
374
276
|
return this.store.getContractInstance(address);
|
|
375
277
|
}
|
|
376
278
|
/**
|
|
377
|
-
* Gets
|
|
378
|
-
* @param
|
|
379
|
-
* @returns The
|
|
279
|
+
* Gets L1 to L2 message (to be) included in a given block.
|
|
280
|
+
* @param blockNumber - L2 block number to get messages for.
|
|
281
|
+
* @returns The L1 to L2 messages/leaves of the messages subtree (throws if not found).
|
|
380
282
|
*/
|
|
381
|
-
|
|
382
|
-
return this.store.
|
|
283
|
+
getL1ToL2Messages(blockNumber) {
|
|
284
|
+
return this.store.getL1ToL2Messages(blockNumber);
|
|
383
285
|
}
|
|
384
286
|
/**
|
|
385
|
-
* Gets the
|
|
386
|
-
* @param
|
|
387
|
-
* @returns The L1 to L2 message (
|
|
287
|
+
* Gets the L1 to L2 message index in the L1 to L2 message tree.
|
|
288
|
+
* @param l1ToL2Message - The L1 to L2 message.
|
|
289
|
+
* @returns The index of the L1 to L2 message in the L1 to L2 message tree (undefined if not found).
|
|
388
290
|
*/
|
|
389
|
-
|
|
390
|
-
return this.store.
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* Gets new L1 to L2 message (to be) included in a given block.
|
|
394
|
-
* @param blockNumber - L2 block number to get messages for.
|
|
395
|
-
* @returns The L1 to L2 messages/leaves of the messages subtree (throws if not found).
|
|
396
|
-
*/
|
|
397
|
-
getNewL1ToL2Messages(blockNumber) {
|
|
398
|
-
return this.store.getNewL1ToL2Messages(blockNumber);
|
|
291
|
+
getL1ToL2MessageIndex(l1ToL2Message) {
|
|
292
|
+
return this.store.getL1ToL2MessageIndex(l1ToL2Message);
|
|
399
293
|
}
|
|
400
294
|
getContractClassIds() {
|
|
401
295
|
return this.store.getContractClassIds();
|
|
402
296
|
}
|
|
403
297
|
}
|
|
404
|
-
/**
|
|
405
|
-
* Converts ExtendedContractData into contract classes and instances.
|
|
406
|
-
* Note that the conversion is not correct, since there is some data missing from the broadcasted ExtendedContractData.
|
|
407
|
-
* The archiver will trust the ids broadcasted instead of trying to recompute them.
|
|
408
|
-
* Eventually this function and ExtendedContractData altogether will be removed.
|
|
409
|
-
*/
|
|
410
|
-
function extendedContractDataToContractClassAndInstance(data) {
|
|
411
|
-
const contractClass = {
|
|
412
|
-
version: 1,
|
|
413
|
-
artifactHash: Fr.ZERO,
|
|
414
|
-
publicFunctions: data.publicFunctions.map(f => ({
|
|
415
|
-
selector: f.selector,
|
|
416
|
-
bytecode: f.bytecode,
|
|
417
|
-
isInternal: f.isInternal,
|
|
418
|
-
})),
|
|
419
|
-
privateFunctions: [],
|
|
420
|
-
packedBytecode: data.bytecode,
|
|
421
|
-
};
|
|
422
|
-
const contractClassId = data.contractClassId;
|
|
423
|
-
const contractInstance = {
|
|
424
|
-
version: 1,
|
|
425
|
-
salt: data.saltedInitializationHash,
|
|
426
|
-
contractClassId,
|
|
427
|
-
initializationHash: data.saltedInitializationHash,
|
|
428
|
-
portalContractAddress: data.contractData.portalContractAddress,
|
|
429
|
-
publicKeysHash: data.publicKeyHash,
|
|
430
|
-
};
|
|
431
|
-
const address = data.contractData.contractAddress;
|
|
432
|
-
return [
|
|
433
|
-
{ ...contractClass, id: contractClassId, privateFunctionsRoot: Fr.ZERO },
|
|
434
|
-
{ ...contractInstance, address },
|
|
435
|
-
];
|
|
436
|
-
}
|
|
437
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvYXJjaGl2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFHWixvQkFBb0IsRUFJcEIsT0FBTyxFQVNQLGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSw0QkFBNEIsRUFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFRdEYsT0FBTyxFQUFzQyxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUk3RyxPQUFPLEVBQ0wseUNBQXlDLEVBQ3pDLCtCQUErQixFQUMvQixrQ0FBa0MsRUFDbEMseUJBQXlCLEVBQ3pCLGdDQUFnQyxHQUNqQyxNQUFNLHFCQUFxQixDQUFDO0FBTzdCOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQVduQjs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFDbUIsWUFBZ0QsRUFDaEQsYUFBeUIsRUFDekIs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
|
|
298
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvYXJjaGl2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLE9BQU8sRUFTUCxnQkFBZ0IsR0FDakIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsNEJBQTRCLEVBQW9CLE1BQU0sb0JBQW9CLENBQUM7QUFDcEYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJdEQsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBUXBGLE9BQU8sRUFBc0Msa0JBQWtCLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXBGLE9BQU8sRUFFTCx5Q0FBeUMsRUFDekMsK0JBQStCLEVBQy9CLHNCQUFzQixHQUN2QixNQUFNLHFCQUFxQixDQUFDO0FBTzdCOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQVduQjs7Ozs7Ozs7O09BU0c7SUFDSCxZQUNtQixZQUFnRCxFQUNoRCxhQUF5QixFQUN6Qix5QkFBcUMsRUFDckMsWUFBd0IsRUFDeEIsZUFBMkIsRUFDM0IsS0FBd0IsRUFDeEIsb0JBQW9CLEtBQU0sRUFDMUIsTUFBbUIsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUM7UUFQdEQsaUJBQVksR0FBWixZQUFZLENBQW9DO1FBQ2hELGtCQUFhLEdBQWIsYUFBYSxDQUFZO1FBQ3pCLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBWTtRQUNyQyxpQkFBWSxHQUFaLFlBQVksQ0FBWTtRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBWTtRQUMzQixV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
|