@aztec/archiver 0.28.0 → 0.29.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 +42 -180
- package/dest/archiver/archiver_store.d.ts +17 -63
- 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 +26 -168
- package/dest/archiver/data_retrieval.d.ts +5 -26
- package/dest/archiver/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/data_retrieval.js +10 -64
- package/dest/archiver/eth_log_handlers.d.ts +5 -36
- package/dest/archiver/eth_log_handlers.d.ts.map +1 -1
- package/dest/archiver/eth_log_handlers.js +7 -75
- package/dest/archiver/kv_archiver_store/block_store.d.ts +2 -2
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/block_store.js +3 -3
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +11 -52
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +21 -84
- package/dest/archiver/kv_archiver_store/message_store.d.ts +10 -41
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/message_store.js +31 -136
- 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 +14 -76
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -1
- package/dest/archiver/memory_archiver_store/memory_archiver_store.js +22 -134
- 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 +47 -230
- package/src/archiver/archiver_store.ts +17 -72
- package/src/archiver/archiver_store_test_suite.ts +25 -208
- package/src/archiver/data_retrieval.ts +11 -93
- package/src/archiver/eth_log_handlers.ts +10 -104
- package/src/archiver/kv_archiver_store/block_store.ts +2 -2
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +19 -89
- package/src/archiver/kv_archiver_store/message_store.ts +36 -165
- package/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +21 -90
- package/src/archiver/memory_archiver_store/memory_archiver_store.ts +23 -150
- 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.
|
|
136
|
+
*/
|
|
137
|
+
getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint>;
|
|
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,42 +112,21 @@ 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
|
-
|
|
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.retrievedData,
|
|
161
121
|
// -1n because the function expects the last block in which the message was emitted and not the one after next
|
|
162
|
-
// TODO(#
|
|
163
|
-
|
|
122
|
+
// TODO(#5264): Check whether this could be cleaned up - `nextEthBlockNumber` value doesn't seem to be used much
|
|
123
|
+
retrievedL1ToL2Messages.nextEthBlockNumber - 1n);
|
|
164
124
|
// 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.
|
|
125
|
+
const nextExpectedL2BlockNum = BigInt((await this.store.getSynchedL2BlockNumber()) + 1);
|
|
126
|
+
const retrievedBlockBodies = await retrieveBlockBodiesFromAvailabilityOracle(this.publicClient, this.availabilityOracleAddress, blockUntilSynced, lastL1Blocks.blocks + 1n, currentL1BlockNumber);
|
|
167
127
|
const blockBodies = retrievedBlockBodies.retrievedData.map(([blockBody]) => blockBody);
|
|
168
128
|
await this.store.addBlockBodies(blockBodies);
|
|
169
|
-
const retrievedBlockMetadata = await retrieveBlockMetadataFromRollup(this.publicClient, this.rollupAddress, blockUntilSynced, lastL1Blocks.
|
|
129
|
+
const retrievedBlockMetadata = await retrieveBlockMetadataFromRollup(this.publicClient, this.rollupAddress, blockUntilSynced, lastL1Blocks.blocks + 1n, currentL1BlockNumber, nextExpectedL2BlockNum);
|
|
170
130
|
const retrievedBodyHashes = retrievedBlockMetadata.retrievedData.map(([header]) => header.contentCommitment.txsEffectsHash);
|
|
171
131
|
const blockBodiesFromStore = await this.store.getBlockBodies(retrievedBodyHashes);
|
|
172
132
|
if (retrievedBlockMetadata.retrievedData.length !== blockBodiesFromStore.length) {
|
|
@@ -179,14 +139,13 @@ export class Archiver {
|
|
|
179
139
|
return;
|
|
180
140
|
}
|
|
181
141
|
else {
|
|
182
|
-
this.log(`Retrieved ${retrievedBlocks.retrievedData.length} new L2 blocks between L1 blocks ${lastL1Blocks.
|
|
142
|
+
this.log(`Retrieved ${retrievedBlocks.retrievedData.length} new L2 blocks between L1 blocks ${lastL1Blocks.blocks + 1n} and ${currentL1BlockNumber}.`);
|
|
183
143
|
}
|
|
184
144
|
// create the block number -> block hash mapping to ensure we retrieve the appropriate events
|
|
185
145
|
const blockNumberToBodyHash = {};
|
|
186
146
|
retrievedBlocks.retrievedData.forEach((block) => {
|
|
187
147
|
blockNumberToBodyHash[block.number] = block.header.contentCommitment.txsEffectsHash;
|
|
188
148
|
});
|
|
189
|
-
this.log(`Retrieved ${retrievedBlocks.retrievedData.length} block(s) from chain`);
|
|
190
149
|
await Promise.all(retrievedBlocks.retrievedData.map(block => {
|
|
191
150
|
const encryptedLogs = block.body.encryptedLogs;
|
|
192
151
|
const unencryptedLogs = block.body.unencryptedLogs;
|
|
@@ -201,12 +160,6 @@ export class Archiver {
|
|
|
201
160
|
await this.storeRegisteredContractClasses(blockLogs, block.number);
|
|
202
161
|
await this.storeDeployedContractInstances(blockLogs, block.number);
|
|
203
162
|
}));
|
|
204
|
-
// from retrieved L2Blocks, confirm L1 to L2 messages that have been published
|
|
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
163
|
await this.store.addBlocks(retrievedBlocks.retrievedData);
|
|
211
164
|
}
|
|
212
165
|
/**
|
|
@@ -225,24 +178,12 @@ export class Archiver {
|
|
|
225
178
|
* @param allLogs - All logs emitted in a bunch of blocks.
|
|
226
179
|
*/
|
|
227
180
|
async storeDeployedContractInstances(allLogs, blockNum) {
|
|
228
|
-
const contractInstances = ContractInstanceDeployedEvent.fromLogs(allLogs
|
|
181
|
+
const contractInstances = ContractInstanceDeployedEvent.fromLogs(allLogs).map(e => e.toContractInstance());
|
|
229
182
|
if (contractInstances.length > 0) {
|
|
230
183
|
contractInstances.forEach(c => this.log(`Storing contract instance at ${c.address.toString()}`));
|
|
231
184
|
await this.store.addContractInstances(contractInstances, blockNum);
|
|
232
185
|
}
|
|
233
186
|
}
|
|
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
187
|
/**
|
|
247
188
|
* Stops the archiver.
|
|
248
189
|
* @returns A promise signalling completion of the stop process.
|
|
@@ -276,7 +217,7 @@ export class Archiver {
|
|
|
276
217
|
async getBlock(number) {
|
|
277
218
|
// If the number provided is -ve, then return the latest block.
|
|
278
219
|
if (number < 0) {
|
|
279
|
-
number = await this.store.
|
|
220
|
+
number = await this.store.getSynchedL2BlockNumber();
|
|
280
221
|
}
|
|
281
222
|
const blocks = await this.store.getBlocks(number, 1);
|
|
282
223
|
return blocks.length === 0 ? undefined : blocks[0];
|
|
@@ -288,59 +229,21 @@ export class Archiver {
|
|
|
288
229
|
return this.store.getSettledTxReceipt(txHash);
|
|
289
230
|
}
|
|
290
231
|
/**
|
|
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
|
|
232
|
+
* Gets the public function data for a contract.
|
|
233
|
+
* @param address - The contract address containing the function to fetch.
|
|
234
|
+
* @param selector - The function selector of the function to fetch.
|
|
235
|
+
* @returns The public function data (if found).
|
|
302
236
|
*/
|
|
303
|
-
async
|
|
304
|
-
const instance = await this.
|
|
237
|
+
async getPublicFunction(address, selector) {
|
|
238
|
+
const instance = await this.getContract(address);
|
|
305
239
|
if (!instance) {
|
|
306
|
-
|
|
240
|
+
throw new Error(`Contract ${address.toString()} not found`);
|
|
307
241
|
}
|
|
308
|
-
const contractClass = await this.
|
|
242
|
+
const contractClass = await this.getContractClass(instance.contractClassId);
|
|
309
243
|
if (!contractClass) {
|
|
310
|
-
|
|
311
|
-
return undefined;
|
|
244
|
+
throw new Error(`Contract class ${instance.contractClassId.toString()} for ${address.toString()} not found`);
|
|
312
245
|
}
|
|
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);
|
|
246
|
+
return contractClass.publicFunctions.find(f => f.selector.equals(selector));
|
|
344
247
|
}
|
|
345
248
|
/**
|
|
346
249
|
* Gets up to `limit` amount of logs starting from `from`.
|
|
@@ -365,7 +268,7 @@ export class Archiver {
|
|
|
365
268
|
* @returns The number of the latest L2 block processed by the block source implementation.
|
|
366
269
|
*/
|
|
367
270
|
getBlockNumber() {
|
|
368
|
-
return this.store.
|
|
271
|
+
return this.store.getSynchedL2BlockNumber();
|
|
369
272
|
}
|
|
370
273
|
getContractClass(id) {
|
|
371
274
|
return this.store.getContractClass(id);
|
|
@@ -374,64 +277,23 @@ export class Archiver {
|
|
|
374
277
|
return this.store.getContractInstance(address);
|
|
375
278
|
}
|
|
376
279
|
/**
|
|
377
|
-
* Gets
|
|
378
|
-
* @param
|
|
379
|
-
* @returns The
|
|
380
|
-
*/
|
|
381
|
-
getPendingL1ToL2EntryKeys(limit) {
|
|
382
|
-
return this.store.getPendingL1ToL2EntryKeys(limit);
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Gets the confirmed/consumed L1 to L2 message associated with the given entry key
|
|
386
|
-
* @param entryKey - The entry key.
|
|
387
|
-
* @returns The L1 to L2 message (throws if not found).
|
|
280
|
+
* Gets L1 to L2 message (to be) included in a given block.
|
|
281
|
+
* @param blockNumber - L2 block number to get messages for.
|
|
282
|
+
* @returns The L1 to L2 messages/leaves of the messages subtree (throws if not found).
|
|
388
283
|
*/
|
|
389
|
-
|
|
390
|
-
return this.store.
|
|
284
|
+
getL1ToL2Messages(blockNumber) {
|
|
285
|
+
return this.store.getL1ToL2Messages(blockNumber);
|
|
391
286
|
}
|
|
392
287
|
/**
|
|
393
|
-
* Gets
|
|
394
|
-
* @param
|
|
395
|
-
* @returns The L1 to L2
|
|
288
|
+
* Gets the L1 to L2 message index in the L1 to L2 message tree.
|
|
289
|
+
* @param l1ToL2Message - The L1 to L2 message.
|
|
290
|
+
* @returns The index of the L1 to L2 message in the L1 to L2 message tree.
|
|
396
291
|
*/
|
|
397
|
-
|
|
398
|
-
return this.store.
|
|
292
|
+
getL1ToL2MessageIndex(l1ToL2Message) {
|
|
293
|
+
return this.store.getL1ToL2MessageIndex(l1ToL2Message);
|
|
399
294
|
}
|
|
400
295
|
getContractClassIds() {
|
|
401
296
|
return this.store.getContractClassIds();
|
|
402
297
|
}
|
|
403
298
|
}
|
|
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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
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvYXJjaGl2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLE9BQU8sRUFTUCxnQkFBZ0IsR0FDakIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsNEJBQTRCLEVBQW9CLE1BQU0sb0JBQW9CLENBQUM7QUFDcEYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJdEQsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBUXBGLE9BQU8sRUFBc0Msa0JBQWtCLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXBGLE9BQU8sRUFDTCx5Q0FBeUMsRUFDekMsK0JBQStCLEVBQy9CLHNCQUFzQixHQUN2QixNQUFNLHFCQUFxQixDQUFDO0FBTzdCOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQVduQjs7Ozs7Ozs7O09BU0c7SUFDSCxZQUNtQixZQUFnRCxFQUNoRCxhQUF5QixFQUN6Qix5QkFBcUMsRUFDckMsWUFBd0IsRUFDeEIsZUFBMkIsRUFDM0IsS0FBd0IsRUFDeEIsb0JBQW9CLEtBQU0sRUFDMUIsTUFBbUIsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUM7UUFQdEQsaUJBQVksR0FBWixZQUFZLENBQW9DO1FBQ2hELGtCQUFhLEdBQWIsYUFBYSxDQUFZO1FBQ3pCLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBWTtRQUNyQyxpQkFBWSxHQUFaLFlBQVksQ0FBWTtRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBWTtRQUMzQixV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
|