@aztec/epoch-cache 0.0.1-commit.993d240 → 0.0.1-commit.9a89641
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 +4 -5
- 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 +10 -9
- package/dest/epoch_cache.d.ts.map +1 -1
- package/dest/epoch_cache.js +13 -19
- package/dest/test/test_epoch_cache.d.ts +4 -5
- package/dest/test/test_epoch_cache.d.ts.map +1 -1
- package/dest/test/test_epoch_cache.js +14 -13
- package/package.json +5 -5
- package/src/config.ts +3 -9
- package/src/epoch_cache.ts +13 -21
- package/src/test/test_epoch_cache.ts +20 -17
package/README.md
CHANGED
|
@@ -110,10 +110,10 @@ because the slot number is mixed into the hash.
|
|
|
110
110
|
|
|
111
111
|
### Proposer Pipelining
|
|
112
112
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
117
|
|
|
118
118
|
### Empty Committees
|
|
119
119
|
|
|
@@ -205,7 +205,6 @@ used to check validator registration status independently of committee membershi
|
|
|
205
205
|
|-----------|---------|---------|
|
|
206
206
|
| `cacheSize` | 12 | Max number of epoch committee entries to keep |
|
|
207
207
|
| `validatorRefreshIntervalSeconds` | 60 | How often to refresh the full validator list |
|
|
208
|
-
| `enableProposerPipelining` | false | Build for next slot instead of current |
|
|
209
208
|
| `lagInEpochsForValidatorSet` | (from L1) | How far back to snapshot the validator set |
|
|
210
209
|
| `lagInEpochsForRandao` | (from L1) | How far back to sample the RANDAO seed |
|
|
211
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 = {
|
|
@@ -48,8 +48,6 @@ export interface EpochCacheInterface {
|
|
|
48
48
|
getTargetEpochAndSlotInNextL1Slot(): EpochAndSlot & {
|
|
49
49
|
nowSeconds: bigint;
|
|
50
50
|
};
|
|
51
|
-
isProposerPipeliningEnabled(): boolean;
|
|
52
|
-
pipeliningOffset(): number;
|
|
53
51
|
isEscapeHatchOpen(epoch: EpochNumber): Promise<boolean>;
|
|
54
52
|
isEscapeHatchOpenAtSlot(slot: SlotTag): Promise<boolean>;
|
|
55
53
|
getProposerIndexEncoding(epoch: EpochNumber, slot: SlotNumber, seed: bigint): `0x${string}`;
|
|
@@ -67,6 +65,7 @@ export interface EpochCacheInterface {
|
|
|
67
65
|
isInCommittee(slot: SlotTag, validator: EthAddress): Promise<boolean>;
|
|
68
66
|
filterInCommittee(slot: SlotTag, validators: EthAddress[]): Promise<EthAddress[]>;
|
|
69
67
|
getL1Constants(): L1RollupConstants;
|
|
68
|
+
getLagInEpochsForValidatorSet(): number;
|
|
70
69
|
}
|
|
71
70
|
/**
|
|
72
71
|
* Epoch cache
|
|
@@ -84,7 +83,6 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
84
83
|
protected readonly config: {
|
|
85
84
|
cacheSize: number;
|
|
86
85
|
validatorRefreshIntervalSeconds: number;
|
|
87
|
-
enableProposerPipelining: boolean;
|
|
88
86
|
};
|
|
89
87
|
/**
|
|
90
88
|
* Single map holding both resolved entries and in-flight promises.
|
|
@@ -94,21 +92,24 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
94
92
|
private allValidators;
|
|
95
93
|
private lastValidatorRefresh;
|
|
96
94
|
private readonly log;
|
|
97
|
-
protected enableProposerPipelining: boolean;
|
|
98
95
|
constructor(rollup: RollupContract, l1constants: L1RollupConstants & {
|
|
99
96
|
lagInEpochsForValidatorSet: number;
|
|
100
97
|
lagInEpochsForRandao: number;
|
|
101
98
|
}, dateProvider?: DateProvider, config?: {
|
|
102
99
|
cacheSize: number;
|
|
103
100
|
validatorRefreshIntervalSeconds: number;
|
|
104
|
-
enableProposerPipelining: boolean;
|
|
105
101
|
});
|
|
106
102
|
static create(rollupOrAddress: EthAddress | RollupContract, config?: EpochCacheConfig, deps?: {
|
|
107
103
|
dateProvider?: DateProvider;
|
|
108
104
|
}): Promise<EpochCache>;
|
|
109
105
|
getL1Constants(): L1RollupConstants;
|
|
110
|
-
|
|
111
|
-
|
|
106
|
+
/**
|
|
107
|
+
* The number of epochs by which validator-set sampling lags. The committee for epoch `E` samples the
|
|
108
|
+
* validator set as of `lagInEpochsForValidatorSet` epochs before `E` (see
|
|
109
|
+
* `ValidatorSelectionLib.stableEpochToValidatorSetSampleTime` on L1), so a newly staked validator only
|
|
110
|
+
* becomes eligible for a committee this many epochs after staking.
|
|
111
|
+
*/
|
|
112
|
+
getLagInEpochsForValidatorSet(): number;
|
|
112
113
|
getSlotNow(): SlotNumber;
|
|
113
114
|
getTargetSlot(): SlotNumber;
|
|
114
115
|
getEpochNow(): EpochNumber;
|
|
@@ -191,4 +192,4 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
191
192
|
getRegisteredValidators(): Promise<EthAddress[]>;
|
|
192
193
|
}
|
|
193
194
|
export {};
|
|
194
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
195
|
+
//# 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;AAE7E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EACL,KAAK,iBAAiB,EASvB,MAAM,6BAA6B,CAAC;AAIrC,OAAO,EAAE,KAAK,gBAAgB,EAA8B,MAAM,aAAa,CAAC;AAEhF
|
|
1
|
+
{"version":3,"file":"epoch_cache.d.ts","sourceRoot":"","sources":["../src/epoch_cache.ts"],"names":[],"mappings":"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"}
|
package/dest/epoch_cache.js
CHANGED
|
@@ -9,7 +9,7 @@ import { DateProvider } from '@aztec/foundation/timer';
|
|
|
9
9
|
import { getEpochAtSlot, getEpochNumberAtTimestamp, getNextL1SlotTimestamp, getSlotAtNextL1Block, getSlotAtTimestamp, getSlotRangeForEpoch, getStartTimestampForEpoch, getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
10
10
|
import { createPublicClient, encodeAbiParameters, keccak256 } from 'viem';
|
|
11
11
|
import { getEpochCacheConfigEnvVars } from './config.js';
|
|
12
|
-
/**
|
|
12
|
+
/** The proposer pipelines by building one slot ahead. */ export const PROPOSER_PIPELINING_SLOT_OFFSET = 1;
|
|
13
13
|
/**
|
|
14
14
|
* Epoch cache
|
|
15
15
|
*
|
|
@@ -30,11 +30,9 @@ import { getEpochCacheConfigEnvVars } from './config.js';
|
|
|
30
30
|
allValidators;
|
|
31
31
|
lastValidatorRefresh;
|
|
32
32
|
log;
|
|
33
|
-
enableProposerPipelining;
|
|
34
33
|
constructor(rollup, l1constants, dateProvider = new DateProvider(), config = {
|
|
35
34
|
cacheSize: 12,
|
|
36
|
-
validatorRefreshIntervalSeconds: 60
|
|
37
|
-
enableProposerPipelining: false
|
|
35
|
+
validatorRefreshIntervalSeconds: 60
|
|
38
36
|
}){
|
|
39
37
|
this.rollup = rollup;
|
|
40
38
|
this.l1constants = l1constants;
|
|
@@ -44,10 +42,8 @@ import { getEpochCacheConfigEnvVars } from './config.js';
|
|
|
44
42
|
this.allValidators = new Set();
|
|
45
43
|
this.lastValidatorRefresh = 0;
|
|
46
44
|
this.log = createLogger('epoch-cache');
|
|
47
|
-
this.enableProposerPipelining = this.config.enableProposerPipelining;
|
|
48
45
|
this.log.debug(`Initialized EpochCache`, {
|
|
49
|
-
l1constants
|
|
50
|
-
enableProposerPipelining: this.enableProposerPipelining
|
|
46
|
+
l1constants
|
|
51
47
|
});
|
|
52
48
|
}
|
|
53
49
|
static async create(rollupOrAddress, config, deps = {}) {
|
|
@@ -92,25 +88,26 @@ import { getEpochCacheConfigEnvVars } from './config.js';
|
|
|
92
88
|
};
|
|
93
89
|
return new EpochCache(rollup, l1RollupConstants, deps.dateProvider, {
|
|
94
90
|
cacheSize: 12,
|
|
95
|
-
validatorRefreshIntervalSeconds: 60
|
|
96
|
-
enableProposerPipelining: config.enableProposerPipelining
|
|
91
|
+
validatorRefreshIntervalSeconds: 60
|
|
97
92
|
});
|
|
98
93
|
}
|
|
99
94
|
getL1Constants() {
|
|
100
95
|
return this.l1constants;
|
|
101
96
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
97
|
+
/**
|
|
98
|
+
* The number of epochs by which validator-set sampling lags. The committee for epoch `E` samples the
|
|
99
|
+
* validator set as of `lagInEpochsForValidatorSet` epochs before `E` (see
|
|
100
|
+
* `ValidatorSelectionLib.stableEpochToValidatorSetSampleTime` on L1), so a newly staked validator only
|
|
101
|
+
* becomes eligible for a committee this many epochs after staking.
|
|
102
|
+
*/ getLagInEpochsForValidatorSet() {
|
|
103
|
+
return this.l1constants.lagInEpochsForValidatorSet;
|
|
107
104
|
}
|
|
108
105
|
getSlotNow() {
|
|
109
106
|
return this.getEpochAndSlotNow().slot;
|
|
110
107
|
}
|
|
111
108
|
getTargetSlot() {
|
|
112
109
|
const slotNow = this.getSlotNow();
|
|
113
|
-
const offset =
|
|
110
|
+
const offset = PROPOSER_PIPELINING_SLOT_OFFSET;
|
|
114
111
|
return SlotNumber(slotNow + offset);
|
|
115
112
|
}
|
|
116
113
|
getEpochNow() {
|
|
@@ -139,9 +136,6 @@ import { getEpochCacheConfigEnvVars } from './config.js';
|
|
|
139
136
|
};
|
|
140
137
|
}
|
|
141
138
|
getTargetEpochAndSlotInNextL1Slot() {
|
|
142
|
-
if (!this.isProposerPipeliningEnabled()) {
|
|
143
|
-
return this.getEpochAndSlotInNextL1Slot();
|
|
144
|
-
}
|
|
145
139
|
const result = this.getEpochAndSlotInNextL1Slot();
|
|
146
140
|
const offset = PROPOSER_PIPELINING_SLOT_OFFSET;
|
|
147
141
|
const targetSlot = SlotNumber(result.slot + offset);
|
|
@@ -380,7 +374,7 @@ import { getEpochCacheConfigEnvVars } from './config.js';
|
|
|
380
374
|
}
|
|
381
375
|
/** Returns the target and next L2 slot in the next L1 slot. */ getTargetAndNextSlot() {
|
|
382
376
|
const nowSeconds = BigInt(this.dateProvider.nowInSeconds());
|
|
383
|
-
const offset =
|
|
377
|
+
const offset = PROPOSER_PIPELINING_SLOT_OFFSET;
|
|
384
378
|
const currentSlot = getSlotAtTimestamp(nowSeconds, this.l1constants);
|
|
385
379
|
const targetSlot = SlotNumber(currentSlot + offset);
|
|
386
380
|
const nextL2SlotOnL1 = getSlotAtNextL1Block(nowSeconds, this.l1constants);
|
|
@@ -17,8 +17,9 @@ export declare class TestEpochCache implements EpochCacheInterface {
|
|
|
17
17
|
private seed;
|
|
18
18
|
private registeredValidators;
|
|
19
19
|
private l1Constants;
|
|
20
|
-
private
|
|
20
|
+
private lagInEpochsForValidatorSet;
|
|
21
21
|
constructor(l1Constants?: Partial<L1RollupConstants>);
|
|
22
|
+
setLagInEpochsForValidatorSet(lag: number): this;
|
|
22
23
|
/**
|
|
23
24
|
* Sets the committee members. Used in validation and attestation flows.
|
|
24
25
|
* @param committee - Array of committee member addresses.
|
|
@@ -55,14 +56,12 @@ export declare class TestEpochCache implements EpochCacheInterface {
|
|
|
55
56
|
*/
|
|
56
57
|
setL1Constants(constants: Partial<L1RollupConstants>): this;
|
|
57
58
|
getL1Constants(): L1RollupConstants;
|
|
58
|
-
|
|
59
|
+
getLagInEpochsForValidatorSet(): number;
|
|
59
60
|
getCommittee(_slot?: SlotTag): Promise<EpochCommitteeInfo>;
|
|
60
61
|
getSlotNow(): SlotNumber;
|
|
61
62
|
getTargetSlot(): SlotNumber;
|
|
62
63
|
getEpochNow(): EpochNumber;
|
|
63
64
|
getTargetEpoch(): EpochNumber;
|
|
64
|
-
isProposerPipeliningEnabled(): boolean;
|
|
65
|
-
pipeliningOffset(): number;
|
|
66
65
|
getEpochAndSlotNow(): EpochAndSlot & {
|
|
67
66
|
nowMs: bigint;
|
|
68
67
|
};
|
|
@@ -89,4 +88,4 @@ export declare class TestEpochCache implements EpochCacheInterface {
|
|
|
89
88
|
isEscapeHatchOpen(_epoch: EpochNumber): Promise<boolean>;
|
|
90
89
|
isEscapeHatchOpenAtSlot(_slot?: SlotTag): Promise<boolean>;
|
|
91
90
|
}
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9lcG9jaF9jYWNoZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvdGVzdF9lcG9jaF9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBUXJFLE9BQU8sRUFDTCxLQUFLLFlBQVksRUFDakIsS0FBSyxtQkFBbUIsRUFDeEIsS0FBSyxrQkFBa0IsRUFFdkIsS0FBSyxPQUFPLEVBQ2IsTUFBTSxtQkFBbUIsQ0FBQztBQWMzQjs7Ozs7O0dBTUc7QUFDSCxxQkFBYSxjQUFlLFlBQVcsbUJBQW1CO0lBQ3hELE9BQU8sQ0FBQyxTQUFTLENBQW9CO0lBQ3JDLE9BQU8sQ0FBQyxlQUFlLENBQXlCO0lBQ2hELE9BQU8sQ0FBQyxXQUFXLENBQTZCO0lBQ2hELE9BQU8sQ0FBQyxlQUFlLENBQWtCO0lBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQWM7SUFDMUIsT0FBTyxDQUFDLG9CQUFvQixDQUFvQjtJQUNoRCxPQUFPLENBQUMsV0FBVyxDQUFvQjtJQUN2QyxPQUFPLENBQUMsMEJBQTBCLENBQUs7SUFFdkMsWUFBWSxXQUFXLEdBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFNLEVBRXZEO0lBRUQsNkJBQTZCLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBRy9DO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBRzFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FHbEQ7SUFFRDs7O09BR0c7SUFDSCxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxJQUFJLENBR3JDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE9BQU8sR0FBRyxJQUFJLENBR3RDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUcxQjtJQUVEOzs7T0FHRztJQUNILHVCQUF1QixDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBR3REO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBRzFEO0lBRUQsY0FBYyxJQUFJLGlCQUFpQixDQUVsQztJQUVELDZCQUE2QixJQUFJLE1BQU0sQ0FFdEM7SUFFRCxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQVF6RDtJQUVELFVBQVUsSUFBSSxVQUFVLENBRXZCO0lBRUQsYUFBYSxJQUFJLFVBQVUsQ0FFMUI7SUFFRCxXQUFXLElBQUksV0FBVyxDQUV6QjtJQUVELGNBQWMsSUFBSSxXQUFXLENBRTVCO0lBRUQsa0JBQWtCLElBQUksWUFBWSxHQUFHO1FBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBWXJEO0lBRUQsMkJBQTJCLElBQUksWUFBWSxHQUFHO1FBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBWW5FO0lBRUQsaUNBQWlDLElBQUksWUFBWSxHQUFHO1FBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBS3pFO0lBRUQsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FHMUY7SUFFRCxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FLL0Y7SUFFRCxxQkFBcUIsSUFBSTtRQUFFLFdBQVcsRUFBRSxVQUFVLENBQUM7UUFBQyxRQUFRLEVBQUUsVUFBVSxDQUFBO0tBQUUsQ0FRekU7SUFFRCxvQkFBb0IsSUFBSTtRQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFBQyxRQUFRLEVBQUUsVUFBVSxDQUFBO0tBQUUsQ0FRdkU7SUFFRCxnQ0FBZ0MsQ0FBQyxLQUFLLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBRW5GO0lBRUQsdUJBQXVCLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBRS9DO0lBRUQsYUFBYSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBRXJFO0lBRUQsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBR2pGO0lBRUQsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBRXZEO0lBRUQsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FFekQ7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_epoch_cache.d.ts","sourceRoot":"","sources":["../../src/test/test_epoch_cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"test_epoch_cache.d.ts","sourceRoot":"","sources":["../../src/test/test_epoch_cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
-
import { getEpochAtSlot, getSlotAtTimestamp, getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
2
|
+
import { getEpochAtSlot, getSlotAtTimestamp, getTimestampForSlot, getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
3
3
|
import { PROPOSER_PIPELINING_SLOT_OFFSET } from '../epoch_cache.js';
|
|
4
4
|
/** Default L1 constants for testing. */ const DEFAULT_L1_CONSTANTS = {
|
|
5
5
|
l1StartBlock: 0n,
|
|
@@ -25,13 +25,17 @@ import { PROPOSER_PIPELINING_SLOT_OFFSET } from '../epoch_cache.js';
|
|
|
25
25
|
seed = 0n;
|
|
26
26
|
registeredValidators = [];
|
|
27
27
|
l1Constants;
|
|
28
|
-
|
|
28
|
+
lagInEpochsForValidatorSet = 2;
|
|
29
29
|
constructor(l1Constants = {}){
|
|
30
30
|
this.l1Constants = {
|
|
31
31
|
...DEFAULT_L1_CONSTANTS,
|
|
32
32
|
...l1Constants
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
+
setLagInEpochsForValidatorSet(lag) {
|
|
36
|
+
this.lagInEpochsForValidatorSet = lag;
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
35
39
|
/**
|
|
36
40
|
* Sets the committee members. Used in validation and attestation flows.
|
|
37
41
|
* @param committee - Array of committee member addresses.
|
|
@@ -87,8 +91,8 @@ import { PROPOSER_PIPELINING_SLOT_OFFSET } from '../epoch_cache.js';
|
|
|
87
91
|
getL1Constants() {
|
|
88
92
|
return this.l1Constants;
|
|
89
93
|
}
|
|
90
|
-
|
|
91
|
-
this.
|
|
94
|
+
getLagInEpochsForValidatorSet() {
|
|
95
|
+
return this.lagInEpochsForValidatorSet;
|
|
92
96
|
}
|
|
93
97
|
getCommittee(_slot) {
|
|
94
98
|
const epoch = getEpochAtSlot(this.currentSlot, this.l1Constants);
|
|
@@ -103,7 +107,7 @@ import { PROPOSER_PIPELINING_SLOT_OFFSET } from '../epoch_cache.js';
|
|
|
103
107
|
return this.currentSlot;
|
|
104
108
|
}
|
|
105
109
|
getTargetSlot() {
|
|
106
|
-
return
|
|
110
|
+
return SlotNumber(this.currentSlot + PROPOSER_PIPELINING_SLOT_OFFSET);
|
|
107
111
|
}
|
|
108
112
|
getEpochNow() {
|
|
109
113
|
return getEpochAtSlot(this.currentSlot, this.l1Constants);
|
|
@@ -111,15 +115,12 @@ import { PROPOSER_PIPELINING_SLOT_OFFSET } from '../epoch_cache.js';
|
|
|
111
115
|
getTargetEpoch() {
|
|
112
116
|
return getEpochAtSlot(this.getTargetSlot(), this.l1Constants);
|
|
113
117
|
}
|
|
114
|
-
isProposerPipeliningEnabled() {
|
|
115
|
-
return this.proposerPipeliningEnabled;
|
|
116
|
-
}
|
|
117
|
-
pipeliningOffset() {
|
|
118
|
-
return this.proposerPipeliningEnabled ? PROPOSER_PIPELINING_SLOT_OFFSET : 0;
|
|
119
|
-
}
|
|
120
118
|
getEpochAndSlotNow() {
|
|
119
|
+
// Model "now" as the start of the current slot (mirroring the real EpochCache, which derives nowMs
|
|
120
|
+
// from the wall clock). Using the slot start rather than the epoch start keeps nowMs consistent with
|
|
121
|
+
// currentSlot, which the pipelining receive-window check (clock_tolerance) relies on.
|
|
121
122
|
const epochNow = getEpochAtSlot(this.currentSlot, this.l1Constants);
|
|
122
|
-
const ts =
|
|
123
|
+
const ts = getTimestampForSlot(this.currentSlot, this.l1Constants);
|
|
123
124
|
return {
|
|
124
125
|
epoch: epochNow,
|
|
125
126
|
slot: this.currentSlot,
|
|
@@ -142,7 +143,7 @@ import { PROPOSER_PIPELINING_SLOT_OFFSET } from '../epoch_cache.js';
|
|
|
142
143
|
}
|
|
143
144
|
getTargetEpochAndSlotInNextL1Slot() {
|
|
144
145
|
const result = this.getEpochAndSlotInNextL1Slot();
|
|
145
|
-
const offset =
|
|
146
|
+
const offset = PROPOSER_PIPELINING_SLOT_OFFSET;
|
|
146
147
|
const targetSlot = SlotNumber(result.slot + offset);
|
|
147
148
|
return {
|
|
148
149
|
...result,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/epoch-cache",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.9a89641",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"../package.common.json"
|
|
27
27
|
],
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
30
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
31
|
-
"@aztec/l1-artifacts": "0.0
|
|
32
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
29
|
+
"@aztec/ethereum": "0.0.1-commit.9a89641",
|
|
30
|
+
"@aztec/foundation": "0.0.1-commit.9a89641",
|
|
31
|
+
"@aztec/l1-artifacts": "6.0.0-nightly.20260807",
|
|
32
|
+
"@aztec/stdlib": "0.0.1-commit.9a89641",
|
|
33
33
|
"dotenv": "^16.0.3",
|
|
34
34
|
"get-port": "^7.1.0",
|
|
35
35
|
"jest-mock-extended": "^4.0.0",
|
package/src/config.ts
CHANGED
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
import { type L1ContractsConfig, getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
|
|
2
2
|
import { type L1ReaderConfig, getL1ReaderConfigFromEnv } from '@aztec/ethereum/l1-reader';
|
|
3
|
-
import { type PipelineConfig, getPipelineConfigEnvVars } from '@aztec/stdlib/config';
|
|
4
3
|
|
|
5
4
|
export type EpochCacheConfig = Pick<
|
|
6
|
-
L1ReaderConfig & L1ContractsConfig
|
|
7
|
-
| '
|
|
8
|
-
| 'l1ChainId'
|
|
9
|
-
| 'viemPollingIntervalMS'
|
|
10
|
-
| 'ethereumSlotDuration'
|
|
11
|
-
| 'l1HttpTimeoutMS'
|
|
12
|
-
| 'enableProposerPipelining'
|
|
5
|
+
L1ReaderConfig & L1ContractsConfig,
|
|
6
|
+
'l1RpcUrls' | 'l1ChainId' | 'viemPollingIntervalMS' | 'ethereumSlotDuration' | 'l1HttpTimeoutMS'
|
|
13
7
|
>;
|
|
14
8
|
|
|
15
9
|
export function getEpochCacheConfigEnvVars(): EpochCacheConfig {
|
|
16
|
-
return { ...getL1ReaderConfigFromEnv(), ...getL1ContractsConfigEnvVars()
|
|
10
|
+
return { ...getL1ReaderConfigFromEnv(), ...getL1ContractsConfigEnvVars() };
|
|
17
11
|
}
|
package/src/epoch_cache.ts
CHANGED
|
@@ -22,7 +22,7 @@ import { createPublicClient, encodeAbiParameters, keccak256 } from 'viem';
|
|
|
22
22
|
|
|
23
23
|
import { type EpochCacheConfig, getEpochCacheConfigEnvVars } from './config.js';
|
|
24
24
|
|
|
25
|
-
/**
|
|
25
|
+
/** The proposer pipelines by building one slot ahead. */
|
|
26
26
|
export const PROPOSER_PIPELINING_SLOT_OFFSET = 1;
|
|
27
27
|
|
|
28
28
|
/** Flat return type for compound epoch/slot getters. */
|
|
@@ -68,8 +68,6 @@ export interface EpochCacheInterface {
|
|
|
68
68
|
getEpochAndSlotInNextL1Slot(): EpochAndSlot & { nowSeconds: bigint };
|
|
69
69
|
/** Returns epoch/slot info for the next L1 slot with pipeline offset applied. */
|
|
70
70
|
getTargetEpochAndSlotInNextL1Slot(): EpochAndSlot & { nowSeconds: bigint };
|
|
71
|
-
isProposerPipeliningEnabled(): boolean;
|
|
72
|
-
pipeliningOffset(): number;
|
|
73
71
|
isEscapeHatchOpen(epoch: EpochNumber): Promise<boolean>;
|
|
74
72
|
isEscapeHatchOpenAtSlot(slot: SlotTag): Promise<boolean>;
|
|
75
73
|
getProposerIndexEncoding(epoch: EpochNumber, slot: SlotNumber, seed: bigint): `0x${string}`;
|
|
@@ -81,6 +79,7 @@ export interface EpochCacheInterface {
|
|
|
81
79
|
isInCommittee(slot: SlotTag, validator: EthAddress): Promise<boolean>;
|
|
82
80
|
filterInCommittee(slot: SlotTag, validators: EthAddress[]): Promise<EthAddress[]>;
|
|
83
81
|
getL1Constants(): L1RollupConstants;
|
|
82
|
+
getLagInEpochsForValidatorSet(): number;
|
|
84
83
|
}
|
|
85
84
|
|
|
86
85
|
/**
|
|
@@ -102,8 +101,6 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
102
101
|
private lastValidatorRefresh = 0;
|
|
103
102
|
private readonly log: Logger = createLogger('epoch-cache');
|
|
104
103
|
|
|
105
|
-
protected enableProposerPipelining: boolean;
|
|
106
|
-
|
|
107
104
|
constructor(
|
|
108
105
|
private rollup: RollupContract,
|
|
109
106
|
private readonly l1constants: L1RollupConstants & {
|
|
@@ -111,12 +108,10 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
111
108
|
lagInEpochsForRandao: number;
|
|
112
109
|
},
|
|
113
110
|
private readonly dateProvider: DateProvider = new DateProvider(),
|
|
114
|
-
protected readonly config = { cacheSize: 12, validatorRefreshIntervalSeconds: 60
|
|
111
|
+
protected readonly config = { cacheSize: 12, validatorRefreshIntervalSeconds: 60 },
|
|
115
112
|
) {
|
|
116
|
-
this.enableProposerPipelining = this.config.enableProposerPipelining;
|
|
117
113
|
this.log.debug(`Initialized EpochCache`, {
|
|
118
114
|
l1constants,
|
|
119
|
-
enableProposerPipelining: this.enableProposerPipelining,
|
|
120
115
|
});
|
|
121
116
|
}
|
|
122
117
|
|
|
@@ -179,7 +174,6 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
179
174
|
return new EpochCache(rollup, l1RollupConstants, deps.dateProvider, {
|
|
180
175
|
cacheSize: 12,
|
|
181
176
|
validatorRefreshIntervalSeconds: 60,
|
|
182
|
-
enableProposerPipelining: config.enableProposerPipelining,
|
|
183
177
|
});
|
|
184
178
|
}
|
|
185
179
|
|
|
@@ -187,12 +181,14 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
187
181
|
return this.l1constants;
|
|
188
182
|
}
|
|
189
183
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
184
|
+
/**
|
|
185
|
+
* The number of epochs by which validator-set sampling lags. The committee for epoch `E` samples the
|
|
186
|
+
* validator set as of `lagInEpochsForValidatorSet` epochs before `E` (see
|
|
187
|
+
* `ValidatorSelectionLib.stableEpochToValidatorSetSampleTime` on L1), so a newly staked validator only
|
|
188
|
+
* becomes eligible for a committee this many epochs after staking.
|
|
189
|
+
*/
|
|
190
|
+
public getLagInEpochsForValidatorSet(): number {
|
|
191
|
+
return this.l1constants.lagInEpochsForValidatorSet;
|
|
196
192
|
}
|
|
197
193
|
|
|
198
194
|
public getSlotNow(): SlotNumber {
|
|
@@ -201,7 +197,7 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
201
197
|
|
|
202
198
|
public getTargetSlot(): SlotNumber {
|
|
203
199
|
const slotNow = this.getSlotNow();
|
|
204
|
-
const offset =
|
|
200
|
+
const offset = PROPOSER_PIPELINING_SLOT_OFFSET;
|
|
205
201
|
return SlotNumber(slotNow + offset);
|
|
206
202
|
}
|
|
207
203
|
|
|
@@ -230,10 +226,6 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
230
226
|
}
|
|
231
227
|
|
|
232
228
|
public getTargetEpochAndSlotInNextL1Slot(): EpochAndSlot & { nowSeconds: bigint } {
|
|
233
|
-
if (!this.isProposerPipeliningEnabled()) {
|
|
234
|
-
return this.getEpochAndSlotInNextL1Slot();
|
|
235
|
-
}
|
|
236
|
-
|
|
237
229
|
const result = this.getEpochAndSlotInNextL1Slot();
|
|
238
230
|
const offset = PROPOSER_PIPELINING_SLOT_OFFSET;
|
|
239
231
|
const targetSlot = SlotNumber(result.slot + offset);
|
|
@@ -506,7 +498,7 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
506
498
|
/** Returns the target and next L2 slot in the next L1 slot. */
|
|
507
499
|
public getTargetAndNextSlot(): { targetSlot: SlotNumber; nextSlot: SlotNumber } {
|
|
508
500
|
const nowSeconds = BigInt(this.dateProvider.nowInSeconds());
|
|
509
|
-
const offset =
|
|
501
|
+
const offset = PROPOSER_PIPELINING_SLOT_OFFSET;
|
|
510
502
|
|
|
511
503
|
const currentSlot = getSlotAtTimestamp(nowSeconds, this.l1constants);
|
|
512
504
|
const targetSlot = SlotNumber(currentSlot + offset);
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
3
|
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
getEpochAtSlot,
|
|
6
|
+
getSlotAtTimestamp,
|
|
7
|
+
getTimestampForSlot,
|
|
8
|
+
getTimestampRangeForEpoch,
|
|
9
|
+
} from '@aztec/stdlib/epoch-helpers';
|
|
5
10
|
|
|
6
11
|
import {
|
|
7
12
|
type EpochAndSlot,
|
|
@@ -38,12 +43,17 @@ export class TestEpochCache implements EpochCacheInterface {
|
|
|
38
43
|
private seed: bigint = 0n;
|
|
39
44
|
private registeredValidators: EthAddress[] = [];
|
|
40
45
|
private l1Constants: L1RollupConstants;
|
|
41
|
-
private
|
|
46
|
+
private lagInEpochsForValidatorSet = 2;
|
|
42
47
|
|
|
43
48
|
constructor(l1Constants: Partial<L1RollupConstants> = {}) {
|
|
44
49
|
this.l1Constants = { ...DEFAULT_L1_CONSTANTS, ...l1Constants };
|
|
45
50
|
}
|
|
46
51
|
|
|
52
|
+
setLagInEpochsForValidatorSet(lag: number): this {
|
|
53
|
+
this.lagInEpochsForValidatorSet = lag;
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
|
|
47
57
|
/**
|
|
48
58
|
* Sets the committee members. Used in validation and attestation flows.
|
|
49
59
|
* @param committee - Array of committee member addresses.
|
|
@@ -111,8 +121,8 @@ export class TestEpochCache implements EpochCacheInterface {
|
|
|
111
121
|
return this.l1Constants;
|
|
112
122
|
}
|
|
113
123
|
|
|
114
|
-
|
|
115
|
-
this.
|
|
124
|
+
getLagInEpochsForValidatorSet(): number {
|
|
125
|
+
return this.lagInEpochsForValidatorSet;
|
|
116
126
|
}
|
|
117
127
|
|
|
118
128
|
getCommittee(_slot?: SlotTag): Promise<EpochCommitteeInfo> {
|
|
@@ -130,9 +140,7 @@ export class TestEpochCache implements EpochCacheInterface {
|
|
|
130
140
|
}
|
|
131
141
|
|
|
132
142
|
getTargetSlot(): SlotNumber {
|
|
133
|
-
return this.
|
|
134
|
-
? SlotNumber(this.currentSlot + PROPOSER_PIPELINING_SLOT_OFFSET)
|
|
135
|
-
: this.currentSlot;
|
|
143
|
+
return SlotNumber(this.currentSlot + PROPOSER_PIPELINING_SLOT_OFFSET);
|
|
136
144
|
}
|
|
137
145
|
|
|
138
146
|
getEpochNow(): EpochNumber {
|
|
@@ -143,17 +151,12 @@ export class TestEpochCache implements EpochCacheInterface {
|
|
|
143
151
|
return getEpochAtSlot(this.getTargetSlot(), this.l1Constants);
|
|
144
152
|
}
|
|
145
153
|
|
|
146
|
-
isProposerPipeliningEnabled(): boolean {
|
|
147
|
-
return this.proposerPipeliningEnabled;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
pipeliningOffset(): number {
|
|
151
|
-
return this.proposerPipeliningEnabled ? PROPOSER_PIPELINING_SLOT_OFFSET : 0;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
154
|
getEpochAndSlotNow(): EpochAndSlot & { nowMs: bigint } {
|
|
155
|
+
// Model "now" as the start of the current slot (mirroring the real EpochCache, which derives nowMs
|
|
156
|
+
// from the wall clock). Using the slot start rather than the epoch start keeps nowMs consistent with
|
|
157
|
+
// currentSlot, which the pipelining receive-window check (clock_tolerance) relies on.
|
|
155
158
|
const epochNow = getEpochAtSlot(this.currentSlot, this.l1Constants);
|
|
156
|
-
const ts =
|
|
159
|
+
const ts = getTimestampForSlot(this.currentSlot, this.l1Constants);
|
|
157
160
|
return {
|
|
158
161
|
epoch: epochNow,
|
|
159
162
|
slot: this.currentSlot,
|
|
@@ -178,7 +181,7 @@ export class TestEpochCache implements EpochCacheInterface {
|
|
|
178
181
|
|
|
179
182
|
getTargetEpochAndSlotInNextL1Slot(): EpochAndSlot & { nowSeconds: bigint } {
|
|
180
183
|
const result = this.getEpochAndSlotInNextL1Slot();
|
|
181
|
-
const offset =
|
|
184
|
+
const offset = PROPOSER_PIPELINING_SLOT_OFFSET;
|
|
182
185
|
const targetSlot = SlotNumber(result.slot + offset);
|
|
183
186
|
return { ...result, slot: targetSlot, epoch: getEpochAtSlot(targetSlot, this.l1Constants) };
|
|
184
187
|
}
|