@aztec/epoch-cache 5.0.0-private.20260319 → 5.0.0-rc.1
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 +210 -0
- package/dest/config.d.ts +2 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +1 -3
- package/dest/epoch_cache.d.ts +39 -20
- package/dest/epoch_cache.d.ts.map +1 -1
- package/dest/epoch_cache.js +164 -68
- package/dest/test/test_epoch_cache.d.ts +1 -4
- package/dest/test/test_epoch_cache.d.ts.map +1 -1
- package/dest/test/test_epoch_cache.js +7 -11
- package/package.json +6 -6
- package/src/config.ts +3 -9
- package/src/epoch_cache.ts +207 -70
- package/src/test/test_epoch_cache.ts +12 -15
package/README.md
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# Epoch Cache
|
|
2
|
+
|
|
3
|
+
Caches validator committee information per epoch to reduce L1 RPC traffic. Provides
|
|
4
|
+
the current committee, proposer selection, and escape hatch status for any given slot
|
|
5
|
+
or epoch, used by the sequencer, validator client, and other node components that need
|
|
6
|
+
to know who can propose or attest in a given slot.
|
|
7
|
+
|
|
8
|
+
## Committee Computation
|
|
9
|
+
|
|
10
|
+
Each epoch has a **committee**: a subset of all registered validators selected to
|
|
11
|
+
participate in consensus for that epoch. The committee is determined by three inputs:
|
|
12
|
+
|
|
13
|
+
1. **The validator set** -- the full list of registered attesters, snapshotted at a
|
|
14
|
+
past point in time.
|
|
15
|
+
2. **A RANDAO seed** -- pseudo-random value derived from Ethereum's `block.prevrandao`,
|
|
16
|
+
also sampled from the past.
|
|
17
|
+
3. **A sampling algorithm** -- a Fisher-Yates-style shuffle that picks
|
|
18
|
+
`targetCommitteeSize` indices from the validator set without replacement.
|
|
19
|
+
|
|
20
|
+
Once computed, the committee is fixed for the entire epoch. The L1 rollup contract
|
|
21
|
+
stores a keccak256 commitment of the committee addresses to prevent substitution.
|
|
22
|
+
|
|
23
|
+
### Sampling Algorithm
|
|
24
|
+
|
|
25
|
+
The sampling draws `targetCommitteeSize` indices from a pool of `validatorSetSize`
|
|
26
|
+
using a sample-without-replacement approach:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
for i in 0..committeeSize:
|
|
30
|
+
sampledIndex = keccak256(seed, i) % (poolSize - i)
|
|
31
|
+
committee[i] = pool[sampledIndex]
|
|
32
|
+
swap pool[sampledIndex] with pool[last]
|
|
33
|
+
shrink pool by 1
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Each iteration hashes the seed with the iteration index to pick a random position,
|
|
37
|
+
then swaps the picked element to the end and shrinks the pool, ensuring no validator
|
|
38
|
+
is selected twice.
|
|
39
|
+
|
|
40
|
+
## LAG Values
|
|
41
|
+
|
|
42
|
+
Two lag parameters prevent manipulation of committee composition:
|
|
43
|
+
|
|
44
|
+
### `lagInEpochsForValidatorSet`
|
|
45
|
+
|
|
46
|
+
When computing the committee for epoch N, the validator set is read from a snapshot
|
|
47
|
+
taken `lagInEpochsForValidatorSet` epochs in the past. The sampling timestamp is:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
validatorSetTimestamp = epochStart(N) - (lagInEpochsForValidatorSet * epochDuration * slotDuration)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
This prevents an attacker from registering new validators just before an epoch to
|
|
54
|
+
influence who gets selected. The validator set is locked well in advance.
|
|
55
|
+
|
|
56
|
+
### `lagInEpochsForRandao`
|
|
57
|
+
|
|
58
|
+
The RANDAO seed used for committee selection is sampled from
|
|
59
|
+
`lagInEpochsForRandao` epochs in the past:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
randaoTimestamp = epochStart(N) - (lagInEpochsForRandao * epochDuration * slotDuration)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
This prevents L1 validators from previewing the randomness and coordinating to
|
|
66
|
+
become proposers.
|
|
67
|
+
|
|
68
|
+
### Why Two Separate Lags?
|
|
69
|
+
|
|
70
|
+
The constraint `lagInEpochsForValidatorSet >= lagInEpochsForRandao` is enforced.
|
|
71
|
+
If both lags were equal, an attacker who learns the RANDAO seed could still
|
|
72
|
+
register validators in time to be included in the sampled set. By freezing the
|
|
73
|
+
validator set further back than the RANDAO seed, the attacker knows the randomness
|
|
74
|
+
but can no longer change the input population it selects from.
|
|
75
|
+
|
|
76
|
+
## RANDAO Seed
|
|
77
|
+
|
|
78
|
+
The RANDAO seed provides per-epoch randomness for committee selection and proposer
|
|
79
|
+
assignment. It works as follows:
|
|
80
|
+
|
|
81
|
+
1. **Checkpointing**: Each epoch, `block.prevrandao` (Ethereum's beacon chain
|
|
82
|
+
randomness) is stored in a checkpointed mapping keyed by epoch timestamp.
|
|
83
|
+
Multiple calls in the same epoch are idempotent.
|
|
84
|
+
|
|
85
|
+
2. **Seed derivation**: The actual seed used for sampling is:
|
|
86
|
+
```
|
|
87
|
+
seed = keccak256(abi.encode(epochNumber, storedRandao))
|
|
88
|
+
```
|
|
89
|
+
where `storedRandao` is the value checkpointed at or before the RANDAO sampling
|
|
90
|
+
timestamp (determined by `lagInEpochsForRandao`). Mixing in the epoch number
|
|
91
|
+
ensures distinct seeds even if the same RANDAO value is reused.
|
|
92
|
+
|
|
93
|
+
3. **Bootstrap**: The first two epochs use a bootstrapped RANDAO value stored at
|
|
94
|
+
initialization, since there is no prior history to sample from.
|
|
95
|
+
|
|
96
|
+
## Proposer Selection
|
|
97
|
+
|
|
98
|
+
Within a committee, a single **proposer** is designated for each slot. The proposer
|
|
99
|
+
is responsible for assembling transactions into a block and publishing it.
|
|
100
|
+
|
|
101
|
+
The proposer index within the committee is:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
proposerIndex = keccak256(abi.encode(epoch, slot, seed)) % committeeSize
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
This is deterministic: anyone with the epoch number, slot number, and seed can
|
|
108
|
+
independently compute who the proposer is. Each slot gets a different proposer
|
|
109
|
+
because the slot number is mixed into the hash.
|
|
110
|
+
|
|
111
|
+
### Proposer Pipelining
|
|
112
|
+
|
|
113
|
+
The proposer always builds for the *next* slot rather than the current one
|
|
114
|
+
(`PROPOSER_PIPELINING_SLOT_OFFSET = 1`). This gives the proposer a full slot of
|
|
115
|
+
lead time to assemble and propagate the block. The "target slot" methods on the
|
|
116
|
+
epoch cache apply this offset automatically.
|
|
117
|
+
|
|
118
|
+
### Empty Committees
|
|
119
|
+
|
|
120
|
+
If the committee is empty (i.e., `targetCommitteeSize` is 0), anyone can propose.
|
|
121
|
+
The proposer methods return `undefined` in this case rather than throwing. If the
|
|
122
|
+
committee should exist but doesn't (insufficient validators registered), a
|
|
123
|
+
`NoCommitteeError` is thrown.
|
|
124
|
+
|
|
125
|
+
## Escape Hatch
|
|
126
|
+
|
|
127
|
+
The escape hatch is a censorship-resistance mechanism. It opens periodically
|
|
128
|
+
(every `FREQUENCY` epochs, for `ACTIVE_DURATION` epochs) and allows a single
|
|
129
|
+
designated proposer to submit blocks without committee attestations.
|
|
130
|
+
|
|
131
|
+
### Candidate System
|
|
132
|
+
|
|
133
|
+
The escape hatch has its own candidate pool, separate from the main validator set:
|
|
134
|
+
|
|
135
|
+
- Candidates join by posting a bond (`BOND_SIZE`).
|
|
136
|
+
- A designated proposer is selected per hatch window using a similar
|
|
137
|
+
RANDAO-based random selection from the candidate set.
|
|
138
|
+
- If the designated proposer fails to propose and prove during their window,
|
|
139
|
+
they are penalized (`FAILED_HATCH_PUNISHMENT`).
|
|
140
|
+
- Candidates exit through a two-step process (`initiateExit` then
|
|
141
|
+
`leaveCandidateSet`) with a withdrawal tax.
|
|
142
|
+
|
|
143
|
+
### Integration with Epoch Cache
|
|
144
|
+
|
|
145
|
+
The epoch cache queries `isHatchOpen(epoch)` on the escape hatch contract and
|
|
146
|
+
caches the result alongside the committee info for each epoch. This flag is
|
|
147
|
+
exposed via `isEscapeHatchOpen(epoch)` and `isEscapeHatchOpenAtSlot(slot)`,
|
|
148
|
+
used by the sequencer to decide whether to require committee attestations.
|
|
149
|
+
|
|
150
|
+
## TTL-based Caching with Finalization Tracking
|
|
151
|
+
|
|
152
|
+
Each cache entry stores L1 provenance metadata alongside the committee data:
|
|
153
|
+
the L1 block number, hash, and timestamp at query time, plus a **finalized** flag.
|
|
154
|
+
|
|
155
|
+
### Finalization Check
|
|
156
|
+
|
|
157
|
+
When fetching committee data, the epoch cache queries both the latest and finalized
|
|
158
|
+
L1 blocks in parallel. It computes the **sampling timestamp** for the epoch:
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
samplingTs = epochStart(N) - lagInEpochsForRandao * epochDuration * slotDuration
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Using `lagInEpochsForRandao` as the binding constraint (it is always
|
|
165
|
+
<= `lagInEpochsForValidatorSet`). If `samplingTs <= l1FinalizedTimestamp`, the
|
|
166
|
+
entry is marked as **finalized**.
|
|
167
|
+
|
|
168
|
+
### Cache Behaviour
|
|
169
|
+
|
|
170
|
+
- **Finalized entries** are cached permanently (within LRU limits). An L1 reorg
|
|
171
|
+
cannot change data that has been finalized, so there is no risk of stale data.
|
|
172
|
+
- **Non-finalized entries** are cached with a TTL of one Ethereum slot duration
|
|
173
|
+
(typically 12 seconds). After this TTL, the next request triggers a re-fetch
|
|
174
|
+
from L1. On re-fetch, if the data is now finalized, the entry gets promoted
|
|
175
|
+
to permanent.
|
|
176
|
+
- **Unstable epochs** (sampling timestamp beyond the latest L1 block) cause an
|
|
177
|
+
error, since the L1 contract itself would revert.
|
|
178
|
+
|
|
179
|
+
This approach preserves **safety** (stale data from L1 reorgs gets refreshed
|
|
180
|
+
within one Ethereum slot) while maintaining **liveness** (the cache never refuses
|
|
181
|
+
to serve data that L1 accepts, even if L1 finalization stalls).
|
|
182
|
+
|
|
183
|
+
### Concurrency
|
|
184
|
+
|
|
185
|
+
The cache map stores both resolved entries and in-flight promises. When a fetch
|
|
186
|
+
starts, the promise is placed directly in the cache. Concurrent callers for the
|
|
187
|
+
same epoch detect the promise and await it, ensuring only one L1 query per epoch
|
|
188
|
+
at a time. On failure, the promise is replaced with the previous stale entry (if
|
|
189
|
+
any) so the next caller retries cleanly.
|
|
190
|
+
|
|
191
|
+
## Caching Strategy
|
|
192
|
+
|
|
193
|
+
The epoch cache stores committee info (committee members, seed, escape hatch
|
|
194
|
+
status) per epoch in an LRU-style map with a configurable size (default 12
|
|
195
|
+
epochs). Cache entries are only created for epochs with non-empty committees;
|
|
196
|
+
empty results are not cached to allow retries.
|
|
197
|
+
|
|
198
|
+
The cache also maintains a separate set of all registered validators, refreshed
|
|
199
|
+
on a configurable interval (`validatorRefreshIntervalSeconds`, default 60s),
|
|
200
|
+
used to check validator registration status independently of committee membership.
|
|
201
|
+
|
|
202
|
+
## Configuration
|
|
203
|
+
|
|
204
|
+
| Parameter | Default | Purpose |
|
|
205
|
+
|-----------|---------|---------|
|
|
206
|
+
| `cacheSize` | 12 | Max number of epoch committee entries to keep |
|
|
207
|
+
| `validatorRefreshIntervalSeconds` | 60 | How often to refresh the full validator list |
|
|
208
|
+
| `lagInEpochsForValidatorSet` | (from L1) | How far back to snapshot the validator set |
|
|
209
|
+
| `lagInEpochsForRandao` | (from L1) | How far back to sample the RANDAO seed |
|
|
210
|
+
| `targetCommitteeSize` | (from L1) | Number of validators to select per epoch |
|
package/dest/config.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { type L1ContractsConfig } from '@aztec/ethereum/config';
|
|
2
2
|
import { type L1ReaderConfig } from '@aztec/ethereum/l1-reader';
|
|
3
|
-
|
|
4
|
-
export type EpochCacheConfig = Pick<L1ReaderConfig & L1ContractsConfig & PipelineConfig, 'l1RpcUrls' | 'l1ChainId' | 'viemPollingIntervalMS' | 'ethereumSlotDuration' | 'l1HttpTimeoutMS' | 'enableProposerPipelining'>;
|
|
3
|
+
export type EpochCacheConfig = Pick<L1ReaderConfig & L1ContractsConfig, 'l1RpcUrls' | 'l1ChainId' | 'viemPollingIntervalMS' | 'ethereumSlotDuration' | 'l1HttpTimeoutMS'>;
|
|
5
4
|
export declare function getEpochCacheConfigEnvVars(): EpochCacheConfig;
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUErQixNQUFNLHdCQUF3QixDQUFDO0FBQzdGLE9BQU8sRUFBRSxLQUFLLGNBQWMsRUFBNEIsTUFBTSwyQkFBMkIsQ0FBQztBQUUxRixNQUFNLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUNqQyxjQUFjLEdBQUcsaUJBQWlCLEVBQ2xDLFdBQVcsR0FBRyxXQUFXLEdBQUcsdUJBQXVCLEdBQUcsc0JBQXNCLEdBQUcsaUJBQWlCLENBQ2pHLENBQUM7QUFFRix3QkFBZ0IsMEJBQTBCLElBQUksZ0JBQWdCLENBRTdEIn0=
|
package/dest/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAA+B,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,KAAK,cAAc,EAA4B,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAA+B,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,KAAK,cAAc,EAA4B,MAAM,2BAA2B,CAAC;AAE1F,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,cAAc,GAAG,iBAAiB,EAClC,WAAW,GAAG,WAAW,GAAG,uBAAuB,GAAG,sBAAsB,GAAG,iBAAiB,CACjG,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D"}
|
package/dest/config.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
|
|
2
2
|
import { getL1ReaderConfigFromEnv } from '@aztec/ethereum/l1-reader';
|
|
3
|
-
import { getPipelineConfigEnvVars } from '@aztec/stdlib/config';
|
|
4
3
|
export function getEpochCacheConfigEnvVars() {
|
|
5
4
|
return {
|
|
6
5
|
...getL1ReaderConfigFromEnv(),
|
|
7
|
-
...getL1ContractsConfigEnvVars()
|
|
8
|
-
...getPipelineConfigEnvVars()
|
|
6
|
+
...getL1ContractsConfigEnvVars()
|
|
9
7
|
};
|
|
10
8
|
}
|
package/dest/epoch_cache.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { EthAddress } from '@aztec/foundation/eth-address';
|
|
|
4
4
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
5
5
|
import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
6
6
|
import { type EpochCacheConfig } from './config.js';
|
|
7
|
-
/**
|
|
7
|
+
/** The proposer pipelines by building one slot ahead. */
|
|
8
8
|
export declare const PROPOSER_PIPELINING_SLOT_OFFSET = 1;
|
|
9
9
|
/** Flat return type for compound epoch/slot getters. */
|
|
10
10
|
export type EpochAndSlot = {
|
|
@@ -20,6 +20,18 @@ export type EpochCommitteeInfo = {
|
|
|
20
20
|
isEscapeHatchOpen: boolean;
|
|
21
21
|
};
|
|
22
22
|
export type SlotTag = 'now' | 'next' | SlotNumber;
|
|
23
|
+
/** Resolved cache entry with L1 provenance metadata. */
|
|
24
|
+
type CachedEpochEntry = {
|
|
25
|
+
data: EpochCommitteeInfo;
|
|
26
|
+
/** L1 block number at which the committee data was originally queried. */
|
|
27
|
+
lastQueryL1BlockNumber: bigint;
|
|
28
|
+
/** L1 block hash at which the committee data was originally queried. Used to detect reorgs. */
|
|
29
|
+
lastQueryL1BlockHash: `0x${string}`;
|
|
30
|
+
/** Latest L1 block timestamp at the time of the most recent refresh (full fetch or lightweight check). */
|
|
31
|
+
lastRefreshL1Timestamp: bigint;
|
|
32
|
+
/** Whether the epoch's sampling data falls within finalized L1 history. */
|
|
33
|
+
finalized: boolean;
|
|
34
|
+
};
|
|
23
35
|
export interface EpochCacheInterface {
|
|
24
36
|
getCommittee(slot: SlotTag | undefined): Promise<EpochCommitteeInfo>;
|
|
25
37
|
getSlotNow(): SlotNumber;
|
|
@@ -36,7 +48,6 @@ export interface EpochCacheInterface {
|
|
|
36
48
|
getTargetEpochAndSlotInNextL1Slot(): EpochAndSlot & {
|
|
37
49
|
nowSeconds: bigint;
|
|
38
50
|
};
|
|
39
|
-
isProposerPipeliningEnabled(): boolean;
|
|
40
51
|
isEscapeHatchOpen(epoch: EpochNumber): Promise<boolean>;
|
|
41
52
|
isEscapeHatchOpenAtSlot(slot: SlotTag): Promise<boolean>;
|
|
42
53
|
getProposerIndexEncoding(epoch: EpochNumber, slot: SlotNumber, seed: bigint): `0x${string}`;
|
|
@@ -71,26 +82,26 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
71
82
|
protected readonly config: {
|
|
72
83
|
cacheSize: number;
|
|
73
84
|
validatorRefreshIntervalSeconds: number;
|
|
74
|
-
enableProposerPipelining: boolean;
|
|
75
85
|
};
|
|
76
|
-
|
|
86
|
+
/**
|
|
87
|
+
* Single map holding both resolved entries and in-flight promises.
|
|
88
|
+
* A `Promise` value means a fetch is in progress; concurrent callers await it.
|
|
89
|
+
*/
|
|
90
|
+
protected cache: Map<EpochNumber, CachedEpochEntry | Promise<CachedEpochEntry>>;
|
|
77
91
|
private allValidators;
|
|
78
92
|
private lastValidatorRefresh;
|
|
79
93
|
private readonly log;
|
|
80
|
-
protected enableProposerPipelining: boolean;
|
|
81
94
|
constructor(rollup: RollupContract, l1constants: L1RollupConstants & {
|
|
82
95
|
lagInEpochsForValidatorSet: number;
|
|
83
96
|
lagInEpochsForRandao: number;
|
|
84
97
|
}, dateProvider?: DateProvider, config?: {
|
|
85
98
|
cacheSize: number;
|
|
86
99
|
validatorRefreshIntervalSeconds: number;
|
|
87
|
-
enableProposerPipelining: boolean;
|
|
88
100
|
});
|
|
89
101
|
static create(rollupOrAddress: EthAddress | RollupContract, config?: EpochCacheConfig, deps?: {
|
|
90
102
|
dateProvider?: DateProvider;
|
|
91
103
|
}): Promise<EpochCache>;
|
|
92
104
|
getL1Constants(): L1RollupConstants;
|
|
93
|
-
isProposerPipeliningEnabled(): boolean;
|
|
94
105
|
getSlotNow(): SlotNumber;
|
|
95
106
|
getTargetSlot(): SlotNumber;
|
|
96
107
|
getEpochNow(): EpochNumber;
|
|
@@ -98,7 +109,6 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
98
109
|
getEpochAndSlotNow(): EpochAndSlot & {
|
|
99
110
|
nowMs: bigint;
|
|
100
111
|
};
|
|
101
|
-
nowInSeconds(): bigint;
|
|
102
112
|
private getEpochAndSlotAtSlot;
|
|
103
113
|
getEpochAndSlotInNextL1Slot(): EpochAndSlot & {
|
|
104
114
|
nowSeconds: bigint;
|
|
@@ -108,12 +118,7 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
108
118
|
};
|
|
109
119
|
private getEpochAndSlotAtTimestamp;
|
|
110
120
|
getCommitteeForEpoch(epoch: EpochNumber): Promise<EpochCommitteeInfo>;
|
|
111
|
-
/**
|
|
112
|
-
* Returns whether the escape hatch is open for the given epoch.
|
|
113
|
-
*
|
|
114
|
-
* Uses the already-cached EpochCommitteeInfo when available. If not cached, it will fetch
|
|
115
|
-
* the epoch committee info (which includes the escape hatch flag) and return it.
|
|
116
|
-
*/
|
|
121
|
+
/** Returns whether the escape hatch is open for the given epoch. */
|
|
117
122
|
isEscapeHatchOpen(epoch: EpochNumber): Promise<boolean>;
|
|
118
123
|
/**
|
|
119
124
|
* Returns whether the escape hatch is open for the epoch containing the given slot.
|
|
@@ -123,13 +128,26 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
123
128
|
*/
|
|
124
129
|
isEscapeHatchOpenAtSlot(slot?: SlotTag): Promise<boolean>;
|
|
125
130
|
/**
|
|
126
|
-
* Get the current validator set
|
|
127
|
-
*
|
|
128
|
-
*
|
|
131
|
+
* Get the current validator set.
|
|
132
|
+
*
|
|
133
|
+
* Returns cached data if the entry is finalized or still fresh (queried less than one
|
|
134
|
+
* Ethereum slot ago). Stale non-finalized entries are re-queried, and concurrent callers
|
|
135
|
+
* coalesce on the same in-flight promise so the L1 query happens only once.
|
|
129
136
|
*/
|
|
130
137
|
getCommittee(slot?: SlotTag): Promise<EpochCommitteeInfo>;
|
|
131
138
|
private getEpochAndTimestamp;
|
|
132
|
-
|
|
139
|
+
/** Evicts oldest cache entries (resolved or in-flight) beyond cacheSize. */
|
|
140
|
+
private purgeCache;
|
|
141
|
+
/** Returns true if a non-finalized cache entry is older than one Ethereum slot. */
|
|
142
|
+
private isStale;
|
|
143
|
+
/** Whether a cached epoch entry has been marked as finalized. Returns undefined if not cached or still in-flight. */
|
|
144
|
+
isFinalized(epoch: EpochNumber): boolean | undefined;
|
|
145
|
+
/** Returns the latest L1 timestamp stored in the cached entry. Undefined if not cached or in-flight. */
|
|
146
|
+
getCachedLastRefreshL1Timestamp(epoch: EpochNumber): bigint | undefined;
|
|
147
|
+
/** Computes the sampling timestamp for an epoch's committee data. */
|
|
148
|
+
private getSamplingTimestamp;
|
|
149
|
+
private refreshStaleEntry;
|
|
150
|
+
private fetchAndCache;
|
|
133
151
|
/**
|
|
134
152
|
* Get the ABI encoding of the proposer index - see ValidatorSelectionLib.sol computeProposerIndex
|
|
135
153
|
*/
|
|
@@ -140,7 +158,7 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
140
158
|
currentSlot: SlotNumber;
|
|
141
159
|
nextSlot: SlotNumber;
|
|
142
160
|
};
|
|
143
|
-
/** Returns the
|
|
161
|
+
/** Returns the target and next L2 slot in the next L1 slot. */
|
|
144
162
|
getTargetAndNextSlot(): {
|
|
145
163
|
targetSlot: SlotNumber;
|
|
146
164
|
nextSlot: SlotNumber;
|
|
@@ -165,4 +183,5 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
165
183
|
filterInCommittee(slot: SlotTag, validators: EthAddress[]): Promise<EthAddress[]>;
|
|
166
184
|
getRegisteredValidators(): Promise<EthAddress[]>;
|
|
167
185
|
}
|
|
168
|
-
|
|
186
|
+
export {};
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2hfY2FjaGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lcG9jaF9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQW9CLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsS0FBSyxpQkFBaUIsRUFTdkIsTUFBTSw2QkFBNkIsQ0FBQztBQUlyQyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBOEIsTUFBTSxhQUFhLENBQUM7QUFFaEYseURBQXlEO0FBQ3pELGVBQU8sTUFBTSwrQkFBK0IsSUFBSSxDQUFDO0FBRWpELHdEQUF3RDtBQUN4RCxNQUFNLE1BQU0sWUFBWSxHQUFHO0lBQ3pCLElBQUksRUFBRSxVQUFVLENBQUM7SUFDakIsS0FBSyxFQUFFLFdBQVcsQ0FBQztJQUNuQixFQUFFLEVBQUUsTUFBTSxDQUFDO0NBQ1osQ0FBQztBQUVGLE1BQU0sTUFBTSxrQkFBa0IsR0FBRztJQUMvQixTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLElBQUksRUFBRSxNQUFNLENBQUM7SUFDYixLQUFLLEVBQUUsV0FBVyxDQUFDO0lBQ25CLCtEQUErRDtJQUMvRCxpQkFBaUIsRUFBRSxPQUFPLENBQUM7Q0FDNUIsQ0FBQztBQUVGLE1BQU0sTUFBTSxPQUFPLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUM7QUFLbEQsd0RBQXdEO0FBQ3hELEtBQUssZ0JBQWdCLEdBQUc7SUFDdEIsSUFBSSxFQUFFLGtCQUFrQixDQUFDO0lBQ3pCLDBFQUEwRTtJQUMxRSxzQkFBc0IsRUFBRSxNQUFNLENBQUM7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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epoch_cache.d.ts","sourceRoot":"","sources":["../src/epoch_cache.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"epoch_cache.d.ts","sourceRoot":"","sources":["../src/epoch_cache.ts"],"names":[],"mappings":"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"}
|