@aztec/epoch-cache 0.0.1-commit.f295ac2 → 0.0.1-commit.f8ca9b2f3
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/epoch_cache.d.ts +11 -17
- package/dest/epoch_cache.d.ts.map +1 -1
- package/dest/epoch_cache.js +10 -14
- package/dest/test/index.d.ts +2 -0
- package/dest/test/index.d.ts.map +1 -0
- package/dest/test/index.js +1 -0
- package/dest/test/test_epoch_cache.d.ts +76 -0
- package/dest/test/test_epoch_cache.d.ts.map +1 -0
- package/dest/test/test_epoch_cache.js +151 -0
- package/package.json +5 -5
- package/src/epoch_cache.ts +12 -24
- package/src/test/index.ts +1 -0
- package/src/test/test_epoch_cache.ts +170 -0
package/dest/epoch_cache.d.ts
CHANGED
|
@@ -19,22 +19,23 @@ export type EpochCommitteeInfo = {
|
|
|
19
19
|
export type SlotTag = 'now' | 'next' | SlotNumber;
|
|
20
20
|
export interface EpochCacheInterface {
|
|
21
21
|
getCommittee(slot: SlotTag | undefined): Promise<EpochCommitteeInfo>;
|
|
22
|
-
getEpochAndSlotNow(): EpochAndSlot
|
|
22
|
+
getEpochAndSlotNow(): EpochAndSlot & {
|
|
23
|
+
nowMs: bigint;
|
|
24
|
+
};
|
|
23
25
|
getEpochAndSlotInNextL1Slot(): EpochAndSlot & {
|
|
24
26
|
now: bigint;
|
|
25
27
|
};
|
|
26
28
|
getProposerIndexEncoding(epoch: EpochNumber, slot: SlotNumber, seed: bigint): `0x${string}`;
|
|
27
29
|
computeProposerIndex(slot: SlotNumber, epoch: EpochNumber, seed: bigint, size: bigint): bigint;
|
|
28
|
-
|
|
29
|
-
currentProposer: EthAddress | undefined;
|
|
30
|
-
nextProposer: EthAddress | undefined;
|
|
30
|
+
getCurrentAndNextSlot(): {
|
|
31
31
|
currentSlot: SlotNumber;
|
|
32
32
|
nextSlot: SlotNumber;
|
|
33
|
-
}
|
|
33
|
+
};
|
|
34
34
|
getProposerAttesterAddressInSlot(slot: SlotNumber): Promise<EthAddress | undefined>;
|
|
35
35
|
getRegisteredValidators(): Promise<EthAddress[]>;
|
|
36
36
|
isInCommittee(slot: SlotTag, validator: EthAddress): Promise<boolean>;
|
|
37
37
|
filterInCommittee(slot: SlotTag, validators: EthAddress[]): Promise<EthAddress[]>;
|
|
38
|
+
getL1Constants(): L1RollupConstants;
|
|
38
39
|
}
|
|
39
40
|
/**
|
|
40
41
|
* Epoch cache
|
|
@@ -69,7 +70,7 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
69
70
|
}): Promise<EpochCache>;
|
|
70
71
|
getL1Constants(): L1RollupConstants;
|
|
71
72
|
getEpochAndSlotNow(): EpochAndSlot & {
|
|
72
|
-
|
|
73
|
+
nowMs: bigint;
|
|
73
74
|
};
|
|
74
75
|
nowInSeconds(): bigint;
|
|
75
76
|
private getEpochAndSlotAtSlot;
|
|
@@ -105,18 +106,11 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
105
106
|
*/
|
|
106
107
|
getProposerIndexEncoding(epoch: EpochNumber, slot: SlotNumber, seed: bigint): `0x${string}`;
|
|
107
108
|
computeProposerIndex(slot: SlotNumber, epoch: EpochNumber, seed: bigint, size: bigint): bigint;
|
|
108
|
-
/**
|
|
109
|
-
|
|
110
|
-
*
|
|
111
|
-
* We return the next proposer's attester address as the node will check if it is the proposer at the next ethereum block,
|
|
112
|
-
* which can be the next slot. If this is the case, then it will send proposals early.
|
|
113
|
-
*/
|
|
114
|
-
getProposerAttesterAddressInCurrentOrNextSlot(): Promise<{
|
|
109
|
+
/** Returns the current and next L2 slot numbers. */
|
|
110
|
+
getCurrentAndNextSlot(): {
|
|
115
111
|
currentSlot: SlotNumber;
|
|
116
112
|
nextSlot: SlotNumber;
|
|
117
|
-
|
|
118
|
-
nextProposer: EthAddress | undefined;
|
|
119
|
-
}>;
|
|
113
|
+
};
|
|
120
114
|
/**
|
|
121
115
|
* Get the proposer attester address in the given L2 slot
|
|
122
116
|
* @returns The proposer attester address. If the committee does not exist, we throw a NoCommitteeError.
|
|
@@ -137,4 +131,4 @@ export declare class EpochCache implements EpochCacheInterface {
|
|
|
137
131
|
filterInCommittee(slot: SlotTag, validators: EthAddress[]): Promise<EthAddress[]>;
|
|
138
132
|
getRegisteredValidators(): Promise<EthAddress[]>;
|
|
139
133
|
}
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2hfY2FjaGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lcG9jaF9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQW9CLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsS0FBSyxpQkFBaUIsRUFPdkIsTUFBTSw2QkFBNkIsQ0FBQztBQUlyQyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBOEIsTUFBTSxhQUFhLENBQUM7QUFFaEYsTUFBTSxNQUFNLFlBQVksR0FBRztJQUN6QixLQUFLLEVBQUUsV0FBVyxDQUFDO0lBQ25CLElBQUksRUFBRSxVQUFVLENBQUM7SUFDakIsRUFBRSxFQUFFLE1BQU0sQ0FBQztDQUNaLENBQUM7QUFFRixNQUFNLE1BQU0sa0JBQWtCLEdBQUc7SUFDL0IsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUNwQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ2IsS0FBSyxFQUFFLFdBQVcsQ0FBQztJQUNuQiwrREFBK0Q7SUFDL0QsaUJBQWlCLEVBQUUsT0FBTyxDQUFDO0NBQzVCLENBQUM7QUFFRixNQUFNLE1BQU0sT0FBTyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsVUFBVSxDQUFDO0FBRWxELE1BQU0sV0FBVyxtQkFBbUI7SUFDbEMsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3JFLGtCQUFrQixJQUFJLFlBQVksR0FBRztRQUFFLEtBQUssRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDO0lBQ3ZE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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epoch_cache.d.ts","sourceRoot":"","sources":["../src/epoch_cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC7E,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,EAOvB,MAAM,6BAA6B,CAAC;AAIrC,OAAO,EAAE,KAAK,gBAAgB,EAA8B,MAAM,aAAa,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,+DAA+D;IAC/D,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrE,kBAAkB,IAAI,YAAY,CAAC;
|
|
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
|
@@ -57,14 +57,15 @@ import { getEpochCacheConfigEnvVars } from './config.js';
|
|
|
57
57
|
});
|
|
58
58
|
rollup = new RollupContract(publicClient, rollupOrAddress.toString());
|
|
59
59
|
}
|
|
60
|
-
const [l1StartBlock, l1GenesisTime, proofSubmissionEpochs, slotDuration, epochDuration, lagInEpochsForValidatorSet, lagInEpochsForRandao] = await Promise.all([
|
|
60
|
+
const [l1StartBlock, l1GenesisTime, proofSubmissionEpochs, slotDuration, epochDuration, lagInEpochsForValidatorSet, lagInEpochsForRandao, targetCommitteeSize] = await Promise.all([
|
|
61
61
|
rollup.getL1StartBlock(),
|
|
62
62
|
rollup.getL1GenesisTime(),
|
|
63
63
|
rollup.getProofSubmissionEpochs(),
|
|
64
64
|
rollup.getSlotDuration(),
|
|
65
65
|
rollup.getEpochDuration(),
|
|
66
66
|
rollup.getLagInEpochsForValidatorSet(),
|
|
67
|
-
rollup.getLagInEpochsForRandao()
|
|
67
|
+
rollup.getLagInEpochsForRandao(),
|
|
68
|
+
rollup.getTargetCommitteeSize()
|
|
68
69
|
]);
|
|
69
70
|
const l1RollupConstants = {
|
|
70
71
|
l1StartBlock,
|
|
@@ -74,7 +75,8 @@ import { getEpochCacheConfigEnvVars } from './config.js';
|
|
|
74
75
|
epochDuration: Number(epochDuration),
|
|
75
76
|
ethereumSlotDuration: config.ethereumSlotDuration,
|
|
76
77
|
lagInEpochsForValidatorSet: Number(lagInEpochsForValidatorSet),
|
|
77
|
-
lagInEpochsForRandao: Number(lagInEpochsForRandao)
|
|
78
|
+
lagInEpochsForRandao: Number(lagInEpochsForRandao),
|
|
79
|
+
targetCommitteeSize: Number(targetCommitteeSize)
|
|
78
80
|
};
|
|
79
81
|
return new EpochCache(rollup, l1RollupConstants, deps.dateProvider);
|
|
80
82
|
}
|
|
@@ -82,10 +84,11 @@ import { getEpochCacheConfigEnvVars } from './config.js';
|
|
|
82
84
|
return this.l1constants;
|
|
83
85
|
}
|
|
84
86
|
getEpochAndSlotNow() {
|
|
85
|
-
const
|
|
87
|
+
const nowMs = BigInt(this.dateProvider.now());
|
|
88
|
+
const nowSeconds = nowMs / 1000n;
|
|
86
89
|
return {
|
|
87
|
-
...this.getEpochAndSlotAtTimestamp(
|
|
88
|
-
|
|
90
|
+
...this.getEpochAndSlotAtTimestamp(nowSeconds),
|
|
91
|
+
nowMs
|
|
89
92
|
};
|
|
90
93
|
}
|
|
91
94
|
nowInSeconds() {
|
|
@@ -224,17 +227,10 @@ import { getEpochCacheConfigEnvVars } from './config.js';
|
|
|
224
227
|
}
|
|
225
228
|
return BigInt(keccak256(this.getProposerIndexEncoding(epoch, slot, seed))) % size;
|
|
226
229
|
}
|
|
227
|
-
/**
|
|
228
|
-
* Returns the current and next proposer's attester address
|
|
229
|
-
*
|
|
230
|
-
* We return the next proposer's attester address as the node will check if it is the proposer at the next ethereum block,
|
|
231
|
-
* which can be the next slot. If this is the case, then it will send proposals early.
|
|
232
|
-
*/ async getProposerAttesterAddressInCurrentOrNextSlot() {
|
|
230
|
+
/** Returns the current and next L2 slot numbers. */ getCurrentAndNextSlot() {
|
|
233
231
|
const current = this.getEpochAndSlotNow();
|
|
234
232
|
const next = this.getEpochAndSlotInNextL1Slot();
|
|
235
233
|
return {
|
|
236
|
-
currentProposer: await this.getProposerAttesterAddressAt(current),
|
|
237
|
-
nextProposer: await this.getProposerAttesterAddressAt(next),
|
|
238
234
|
currentSlot: current.slot,
|
|
239
235
|
nextSlot: next.slot
|
|
240
236
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './test_epoch_cache.js';
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
4
|
+
import type { EpochAndSlot, EpochCacheInterface, EpochCommitteeInfo, SlotTag } from '../epoch_cache.js';
|
|
5
|
+
/**
|
|
6
|
+
* A test implementation of EpochCacheInterface that allows manual configuration
|
|
7
|
+
* of committee, proposer, slot, and escape hatch state for use in tests.
|
|
8
|
+
*
|
|
9
|
+
* Unlike the real EpochCache, this class doesn't require any RPC connections
|
|
10
|
+
* or mock setup. Simply use the setter methods to configure the test state.
|
|
11
|
+
*/
|
|
12
|
+
export declare class TestEpochCache implements EpochCacheInterface {
|
|
13
|
+
private committee;
|
|
14
|
+
private proposerAddress;
|
|
15
|
+
private currentSlot;
|
|
16
|
+
private escapeHatchOpen;
|
|
17
|
+
private seed;
|
|
18
|
+
private registeredValidators;
|
|
19
|
+
private l1Constants;
|
|
20
|
+
constructor(l1Constants?: Partial<L1RollupConstants>);
|
|
21
|
+
/**
|
|
22
|
+
* Sets the committee members. Used in validation and attestation flows.
|
|
23
|
+
* @param committee - Array of committee member addresses.
|
|
24
|
+
*/
|
|
25
|
+
setCommittee(committee: EthAddress[]): this;
|
|
26
|
+
/**
|
|
27
|
+
* Sets the proposer address returned by getProposerAttesterAddressInSlot.
|
|
28
|
+
* @param proposer - The address of the current proposer.
|
|
29
|
+
*/
|
|
30
|
+
setProposer(proposer: EthAddress | undefined): this;
|
|
31
|
+
/**
|
|
32
|
+
* Sets the current slot number.
|
|
33
|
+
* @param slot - The slot number to set.
|
|
34
|
+
*/
|
|
35
|
+
setCurrentSlot(slot: SlotNumber): this;
|
|
36
|
+
/**
|
|
37
|
+
* Sets whether the escape hatch is open.
|
|
38
|
+
* @param open - True if escape hatch should be open.
|
|
39
|
+
*/
|
|
40
|
+
setEscapeHatchOpen(open: boolean): this;
|
|
41
|
+
/**
|
|
42
|
+
* Sets the randomness seed used for proposer selection.
|
|
43
|
+
* @param seed - The seed value.
|
|
44
|
+
*/
|
|
45
|
+
setSeed(seed: bigint): this;
|
|
46
|
+
/**
|
|
47
|
+
* Sets the list of registered validators (all validators, not just committee).
|
|
48
|
+
* @param validators - Array of validator addresses.
|
|
49
|
+
*/
|
|
50
|
+
setRegisteredValidators(validators: EthAddress[]): this;
|
|
51
|
+
/**
|
|
52
|
+
* Sets the L1 constants used for epoch/slot calculations.
|
|
53
|
+
* @param constants - Partial constants to override defaults.
|
|
54
|
+
*/
|
|
55
|
+
setL1Constants(constants: Partial<L1RollupConstants>): this;
|
|
56
|
+
getL1Constants(): L1RollupConstants;
|
|
57
|
+
getCommittee(_slot?: SlotTag): Promise<EpochCommitteeInfo>;
|
|
58
|
+
getEpochAndSlotNow(): EpochAndSlot & {
|
|
59
|
+
nowMs: bigint;
|
|
60
|
+
};
|
|
61
|
+
getEpochAndSlotInNextL1Slot(): EpochAndSlot & {
|
|
62
|
+
now: bigint;
|
|
63
|
+
};
|
|
64
|
+
getProposerIndexEncoding(epoch: EpochNumber, slot: SlotNumber, seed: bigint): `0x${string}`;
|
|
65
|
+
computeProposerIndex(slot: SlotNumber, _epoch: EpochNumber, _seed: bigint, size: bigint): bigint;
|
|
66
|
+
getCurrentAndNextSlot(): {
|
|
67
|
+
currentSlot: SlotNumber;
|
|
68
|
+
nextSlot: SlotNumber;
|
|
69
|
+
};
|
|
70
|
+
getProposerAttesterAddressInSlot(_slot: SlotNumber): Promise<EthAddress | undefined>;
|
|
71
|
+
getRegisteredValidators(): Promise<EthAddress[]>;
|
|
72
|
+
isInCommittee(_slot: SlotTag, validator: EthAddress): Promise<boolean>;
|
|
73
|
+
filterInCommittee(_slot: SlotTag, validators: EthAddress[]): Promise<EthAddress[]>;
|
|
74
|
+
isEscapeHatchOpenAtSlot(_slot?: SlotTag): Promise<boolean>;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9lcG9jaF9jYWNoZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvdGVzdF9lcG9jaF9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3JFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWF4Rzs7Ozs7O0dBTUc7QUFDSCxxQkFBYSxjQUFlLFlBQVcsbUJBQW1CO0lBQ3hELE9BQU8sQ0FBQyxTQUFTLENBQW9CO0lBQ3JDLE9BQU8sQ0FBQyxlQUFlLENBQXlCO0lBQ2hELE9BQU8sQ0FBQyxXQUFXLENBQTZCO0lBQ2hELE9BQU8sQ0FBQyxlQUFlLENBQWtCO0lBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQWM7SUFDMUIsT0FBTyxDQUFDLG9CQUFvQixDQUFvQjtJQUNoRCxPQUFPLENBQUMsV0FBVyxDQUFvQjtJQUV2QyxZQUFZLFdBQVcsR0FBRSxPQUFPLENBQUMsaUJBQWlCLENBQU0sRUFFdkQ7SUFFRDs7O09BR0c7SUFDSCxZQUFZLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FHMUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUdsRDtJQUVEOzs7T0FHRztJQUNILGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FHckM7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxHQUFHLElBQUksQ0FHdEM7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBRzFCO0lBRUQ7OztPQUdHO0lBQ0gsdUJBQXVCLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FHdEQ7SUFFRDs7O09BR0c7SUFDSCxjQUFjLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLElBQUksQ0FHMUQ7SUFFRCxjQUFjLElBQUksaUJBQWlCLENBRWxDO0lBRUQsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FRekQ7SUFFRCxrQkFBa0IsSUFBSSxZQUFZLEdBQUc7UUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FJckQ7SUFFRCwyQkFBMkIsSUFBSSxZQUFZLEdBQUc7UUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FPNUQ7SUFFRCx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sR0FBRyxLQUFLLE1BQU0sRUFBRSxDQUcxRjtJQUVELG9CQUFvQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUsvRjtJQUVELHFCQUFxQixJQUFJO1FBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQztRQUFDLFFBQVEsRUFBRSxVQUFVLENBQUE7S0FBRSxDQUt6RTtJQUVELGdDQUFnQyxDQUFDLEtBQUssRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FFbkY7SUFFRCx1QkFBdUIsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FFL0M7SUFFRCxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FFckU7SUFFRCxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FHakY7SUFFRCx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUV6RDtDQUNGIn0=
|
|
@@ -0,0 +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;AAGrE,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAaxG;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,mBAAmB;IACxD,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,oBAAoB,CAAoB;IAChD,OAAO,CAAC,WAAW,CAAoB;IAEvC,YAAY,WAAW,GAAE,OAAO,CAAC,iBAAiB,CAAM,EAEvD;IAED;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,CAG1C;IAED;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,CAGlD;IAED;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAGrC;IAED;;;OAGG;IACH,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAGtC;IAED;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG1B;IAED;;;OAGG;IACH,uBAAuB,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAGtD;IAED;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAG1D;IAED,cAAc,IAAI,iBAAiB,CAElC;IAED,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQzD;IAED,kBAAkB,IAAI,YAAY,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAIrD;IAED,2BAA2B,IAAI,YAAY,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAO5D;IAED,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAG1F;IAED,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK/F;IAED,qBAAqB,IAAI;QAAE,WAAW,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,UAAU,CAAA;KAAE,CAKzE;IAED,gCAAgC,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAEnF;IAED,uBAAuB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAE/C;IAED,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAErE;IAED,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGjF;IAED,uBAAuB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzD;CACF"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { getEpochAtSlot, getSlotAtTimestamp, getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
3
|
+
/** Default L1 constants for testing. */ const DEFAULT_L1_CONSTANTS = {
|
|
4
|
+
l1StartBlock: 0n,
|
|
5
|
+
l1GenesisTime: 0n,
|
|
6
|
+
slotDuration: 24,
|
|
7
|
+
epochDuration: 16,
|
|
8
|
+
ethereumSlotDuration: 12,
|
|
9
|
+
proofSubmissionEpochs: 2,
|
|
10
|
+
targetCommitteeSize: 48
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* A test implementation of EpochCacheInterface that allows manual configuration
|
|
14
|
+
* of committee, proposer, slot, and escape hatch state for use in tests.
|
|
15
|
+
*
|
|
16
|
+
* Unlike the real EpochCache, this class doesn't require any RPC connections
|
|
17
|
+
* or mock setup. Simply use the setter methods to configure the test state.
|
|
18
|
+
*/ export class TestEpochCache {
|
|
19
|
+
committee = [];
|
|
20
|
+
proposerAddress;
|
|
21
|
+
currentSlot = SlotNumber(0);
|
|
22
|
+
escapeHatchOpen = false;
|
|
23
|
+
seed = 0n;
|
|
24
|
+
registeredValidators = [];
|
|
25
|
+
l1Constants;
|
|
26
|
+
constructor(l1Constants = {}){
|
|
27
|
+
this.l1Constants = {
|
|
28
|
+
...DEFAULT_L1_CONSTANTS,
|
|
29
|
+
...l1Constants
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Sets the committee members. Used in validation and attestation flows.
|
|
34
|
+
* @param committee - Array of committee member addresses.
|
|
35
|
+
*/ setCommittee(committee) {
|
|
36
|
+
this.committee = committee;
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Sets the proposer address returned by getProposerAttesterAddressInSlot.
|
|
41
|
+
* @param proposer - The address of the current proposer.
|
|
42
|
+
*/ setProposer(proposer) {
|
|
43
|
+
this.proposerAddress = proposer;
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Sets the current slot number.
|
|
48
|
+
* @param slot - The slot number to set.
|
|
49
|
+
*/ setCurrentSlot(slot) {
|
|
50
|
+
this.currentSlot = slot;
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Sets whether the escape hatch is open.
|
|
55
|
+
* @param open - True if escape hatch should be open.
|
|
56
|
+
*/ setEscapeHatchOpen(open) {
|
|
57
|
+
this.escapeHatchOpen = open;
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Sets the randomness seed used for proposer selection.
|
|
62
|
+
* @param seed - The seed value.
|
|
63
|
+
*/ setSeed(seed) {
|
|
64
|
+
this.seed = seed;
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Sets the list of registered validators (all validators, not just committee).
|
|
69
|
+
* @param validators - Array of validator addresses.
|
|
70
|
+
*/ setRegisteredValidators(validators) {
|
|
71
|
+
this.registeredValidators = validators;
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Sets the L1 constants used for epoch/slot calculations.
|
|
76
|
+
* @param constants - Partial constants to override defaults.
|
|
77
|
+
*/ setL1Constants(constants) {
|
|
78
|
+
this.l1Constants = {
|
|
79
|
+
...this.l1Constants,
|
|
80
|
+
...constants
|
|
81
|
+
};
|
|
82
|
+
return this;
|
|
83
|
+
}
|
|
84
|
+
getL1Constants() {
|
|
85
|
+
return this.l1Constants;
|
|
86
|
+
}
|
|
87
|
+
getCommittee(_slot) {
|
|
88
|
+
const epoch = getEpochAtSlot(this.currentSlot, this.l1Constants);
|
|
89
|
+
return Promise.resolve({
|
|
90
|
+
committee: this.committee,
|
|
91
|
+
epoch,
|
|
92
|
+
seed: this.seed,
|
|
93
|
+
isEscapeHatchOpen: this.escapeHatchOpen
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
getEpochAndSlotNow() {
|
|
97
|
+
const epoch = getEpochAtSlot(this.currentSlot, this.l1Constants);
|
|
98
|
+
const ts = getTimestampRangeForEpoch(epoch, this.l1Constants)[0];
|
|
99
|
+
return {
|
|
100
|
+
epoch,
|
|
101
|
+
slot: this.currentSlot,
|
|
102
|
+
ts,
|
|
103
|
+
nowMs: ts * 1000n
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
getEpochAndSlotInNextL1Slot() {
|
|
107
|
+
const now = getTimestampRangeForEpoch(getEpochAtSlot(this.currentSlot, this.l1Constants), this.l1Constants)[0];
|
|
108
|
+
const nextSlotTs = now + BigInt(this.l1Constants.ethereumSlotDuration);
|
|
109
|
+
const nextSlot = getSlotAtTimestamp(nextSlotTs, this.l1Constants);
|
|
110
|
+
const epoch = getEpochAtSlot(nextSlot, this.l1Constants);
|
|
111
|
+
const ts = getTimestampRangeForEpoch(epoch, this.l1Constants)[0];
|
|
112
|
+
return {
|
|
113
|
+
epoch,
|
|
114
|
+
slot: nextSlot,
|
|
115
|
+
ts,
|
|
116
|
+
now
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
getProposerIndexEncoding(epoch, slot, seed) {
|
|
120
|
+
// Simple encoding for testing purposes
|
|
121
|
+
return `0x${epoch.toString(16).padStart(64, '0')}${slot.toString(16).padStart(64, '0')}${seed.toString(16).padStart(64, '0')}`;
|
|
122
|
+
}
|
|
123
|
+
computeProposerIndex(slot, _epoch, _seed, size) {
|
|
124
|
+
if (size === 0n) {
|
|
125
|
+
return 0n;
|
|
126
|
+
}
|
|
127
|
+
return BigInt(slot) % size;
|
|
128
|
+
}
|
|
129
|
+
getCurrentAndNextSlot() {
|
|
130
|
+
return {
|
|
131
|
+
currentSlot: this.currentSlot,
|
|
132
|
+
nextSlot: SlotNumber(this.currentSlot + 1)
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
getProposerAttesterAddressInSlot(_slot) {
|
|
136
|
+
return Promise.resolve(this.proposerAddress);
|
|
137
|
+
}
|
|
138
|
+
getRegisteredValidators() {
|
|
139
|
+
return Promise.resolve(this.registeredValidators);
|
|
140
|
+
}
|
|
141
|
+
isInCommittee(_slot, validator) {
|
|
142
|
+
return Promise.resolve(this.committee.some((v)=>v.equals(validator)));
|
|
143
|
+
}
|
|
144
|
+
filterInCommittee(_slot, validators) {
|
|
145
|
+
const committeeSet = new Set(this.committee.map((v)=>v.toString()));
|
|
146
|
+
return Promise.resolve(validators.filter((v)=>committeeSet.has(v.toString())));
|
|
147
|
+
}
|
|
148
|
+
isEscapeHatchOpenAtSlot(_slot) {
|
|
149
|
+
return Promise.resolve(this.escapeHatchOpen);
|
|
150
|
+
}
|
|
151
|
+
}
|
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.f8ca9b2f3",
|
|
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.1-commit.
|
|
32
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
29
|
+
"@aztec/ethereum": "0.0.1-commit.f8ca9b2f3",
|
|
30
|
+
"@aztec/foundation": "0.0.1-commit.f8ca9b2f3",
|
|
31
|
+
"@aztec/l1-artifacts": "0.0.1-commit.f8ca9b2f3",
|
|
32
|
+
"@aztec/stdlib": "0.0.1-commit.f8ca9b2f3",
|
|
33
33
|
"@viem/anvil": "^0.0.10",
|
|
34
34
|
"dotenv": "^16.0.3",
|
|
35
35
|
"get-port": "^7.1.0",
|
package/src/epoch_cache.ts
CHANGED
|
@@ -36,20 +36,16 @@ export type SlotTag = 'now' | 'next' | SlotNumber;
|
|
|
36
36
|
|
|
37
37
|
export interface EpochCacheInterface {
|
|
38
38
|
getCommittee(slot: SlotTag | undefined): Promise<EpochCommitteeInfo>;
|
|
39
|
-
getEpochAndSlotNow(): EpochAndSlot;
|
|
39
|
+
getEpochAndSlotNow(): EpochAndSlot & { nowMs: bigint };
|
|
40
40
|
getEpochAndSlotInNextL1Slot(): EpochAndSlot & { now: bigint };
|
|
41
41
|
getProposerIndexEncoding(epoch: EpochNumber, slot: SlotNumber, seed: bigint): `0x${string}`;
|
|
42
42
|
computeProposerIndex(slot: SlotNumber, epoch: EpochNumber, seed: bigint, size: bigint): bigint;
|
|
43
|
-
|
|
44
|
-
currentProposer: EthAddress | undefined;
|
|
45
|
-
nextProposer: EthAddress | undefined;
|
|
46
|
-
currentSlot: SlotNumber;
|
|
47
|
-
nextSlot: SlotNumber;
|
|
48
|
-
}>;
|
|
43
|
+
getCurrentAndNextSlot(): { currentSlot: SlotNumber; nextSlot: SlotNumber };
|
|
49
44
|
getProposerAttesterAddressInSlot(slot: SlotNumber): Promise<EthAddress | undefined>;
|
|
50
45
|
getRegisteredValidators(): Promise<EthAddress[]>;
|
|
51
46
|
isInCommittee(slot: SlotTag, validator: EthAddress): Promise<boolean>;
|
|
52
47
|
filterInCommittee(slot: SlotTag, validators: EthAddress[]): Promise<EthAddress[]>;
|
|
48
|
+
getL1Constants(): L1RollupConstants;
|
|
53
49
|
}
|
|
54
50
|
|
|
55
51
|
/**
|
|
@@ -111,6 +107,7 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
111
107
|
epochDuration,
|
|
112
108
|
lagInEpochsForValidatorSet,
|
|
113
109
|
lagInEpochsForRandao,
|
|
110
|
+
targetCommitteeSize,
|
|
114
111
|
] = await Promise.all([
|
|
115
112
|
rollup.getL1StartBlock(),
|
|
116
113
|
rollup.getL1GenesisTime(),
|
|
@@ -119,6 +116,7 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
119
116
|
rollup.getEpochDuration(),
|
|
120
117
|
rollup.getLagInEpochsForValidatorSet(),
|
|
121
118
|
rollup.getLagInEpochsForRandao(),
|
|
119
|
+
rollup.getTargetCommitteeSize(),
|
|
122
120
|
] as const);
|
|
123
121
|
|
|
124
122
|
const l1RollupConstants = {
|
|
@@ -130,6 +128,7 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
130
128
|
ethereumSlotDuration: config.ethereumSlotDuration,
|
|
131
129
|
lagInEpochsForValidatorSet: Number(lagInEpochsForValidatorSet),
|
|
132
130
|
lagInEpochsForRandao: Number(lagInEpochsForRandao),
|
|
131
|
+
targetCommitteeSize: Number(targetCommitteeSize),
|
|
133
132
|
};
|
|
134
133
|
|
|
135
134
|
return new EpochCache(rollup, l1RollupConstants, deps.dateProvider);
|
|
@@ -139,9 +138,10 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
139
138
|
return this.l1constants;
|
|
140
139
|
}
|
|
141
140
|
|
|
142
|
-
public getEpochAndSlotNow(): EpochAndSlot & {
|
|
143
|
-
const
|
|
144
|
-
|
|
141
|
+
public getEpochAndSlotNow(): EpochAndSlot & { nowMs: bigint } {
|
|
142
|
+
const nowMs = BigInt(this.dateProvider.now());
|
|
143
|
+
const nowSeconds = nowMs / 1000n;
|
|
144
|
+
return { ...this.getEpochAndSlotAtTimestamp(nowSeconds), nowMs };
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
public nowInSeconds(): bigint {
|
|
@@ -283,24 +283,12 @@ export class EpochCache implements EpochCacheInterface {
|
|
|
283
283
|
return BigInt(keccak256(this.getProposerIndexEncoding(epoch, slot, seed))) % size;
|
|
284
284
|
}
|
|
285
285
|
|
|
286
|
-
/**
|
|
287
|
-
|
|
288
|
-
*
|
|
289
|
-
* We return the next proposer's attester address as the node will check if it is the proposer at the next ethereum block,
|
|
290
|
-
* which can be the next slot. If this is the case, then it will send proposals early.
|
|
291
|
-
*/
|
|
292
|
-
public async getProposerAttesterAddressInCurrentOrNextSlot(): Promise<{
|
|
293
|
-
currentSlot: SlotNumber;
|
|
294
|
-
nextSlot: SlotNumber;
|
|
295
|
-
currentProposer: EthAddress | undefined;
|
|
296
|
-
nextProposer: EthAddress | undefined;
|
|
297
|
-
}> {
|
|
286
|
+
/** Returns the current and next L2 slot numbers. */
|
|
287
|
+
public getCurrentAndNextSlot(): { currentSlot: SlotNumber; nextSlot: SlotNumber } {
|
|
298
288
|
const current = this.getEpochAndSlotNow();
|
|
299
289
|
const next = this.getEpochAndSlotInNextL1Slot();
|
|
300
290
|
|
|
301
291
|
return {
|
|
302
|
-
currentProposer: await this.getProposerAttesterAddressAt(current),
|
|
303
|
-
nextProposer: await this.getProposerAttesterAddressAt(next),
|
|
304
292
|
currentSlot: current.slot,
|
|
305
293
|
nextSlot: next.slot,
|
|
306
294
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './test_epoch_cache.js';
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
4
|
+
import { getEpochAtSlot, getSlotAtTimestamp, getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
5
|
+
|
|
6
|
+
import type { EpochAndSlot, EpochCacheInterface, EpochCommitteeInfo, SlotTag } from '../epoch_cache.js';
|
|
7
|
+
|
|
8
|
+
/** Default L1 constants for testing. */
|
|
9
|
+
const DEFAULT_L1_CONSTANTS: L1RollupConstants = {
|
|
10
|
+
l1StartBlock: 0n,
|
|
11
|
+
l1GenesisTime: 0n,
|
|
12
|
+
slotDuration: 24,
|
|
13
|
+
epochDuration: 16,
|
|
14
|
+
ethereumSlotDuration: 12,
|
|
15
|
+
proofSubmissionEpochs: 2,
|
|
16
|
+
targetCommitteeSize: 48,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A test implementation of EpochCacheInterface that allows manual configuration
|
|
21
|
+
* of committee, proposer, slot, and escape hatch state for use in tests.
|
|
22
|
+
*
|
|
23
|
+
* Unlike the real EpochCache, this class doesn't require any RPC connections
|
|
24
|
+
* or mock setup. Simply use the setter methods to configure the test state.
|
|
25
|
+
*/
|
|
26
|
+
export class TestEpochCache implements EpochCacheInterface {
|
|
27
|
+
private committee: EthAddress[] = [];
|
|
28
|
+
private proposerAddress: EthAddress | undefined;
|
|
29
|
+
private currentSlot: SlotNumber = SlotNumber(0);
|
|
30
|
+
private escapeHatchOpen: boolean = false;
|
|
31
|
+
private seed: bigint = 0n;
|
|
32
|
+
private registeredValidators: EthAddress[] = [];
|
|
33
|
+
private l1Constants: L1RollupConstants;
|
|
34
|
+
|
|
35
|
+
constructor(l1Constants: Partial<L1RollupConstants> = {}) {
|
|
36
|
+
this.l1Constants = { ...DEFAULT_L1_CONSTANTS, ...l1Constants };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Sets the committee members. Used in validation and attestation flows.
|
|
41
|
+
* @param committee - Array of committee member addresses.
|
|
42
|
+
*/
|
|
43
|
+
setCommittee(committee: EthAddress[]): this {
|
|
44
|
+
this.committee = committee;
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Sets the proposer address returned by getProposerAttesterAddressInSlot.
|
|
50
|
+
* @param proposer - The address of the current proposer.
|
|
51
|
+
*/
|
|
52
|
+
setProposer(proposer: EthAddress | undefined): this {
|
|
53
|
+
this.proposerAddress = proposer;
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Sets the current slot number.
|
|
59
|
+
* @param slot - The slot number to set.
|
|
60
|
+
*/
|
|
61
|
+
setCurrentSlot(slot: SlotNumber): this {
|
|
62
|
+
this.currentSlot = slot;
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Sets whether the escape hatch is open.
|
|
68
|
+
* @param open - True if escape hatch should be open.
|
|
69
|
+
*/
|
|
70
|
+
setEscapeHatchOpen(open: boolean): this {
|
|
71
|
+
this.escapeHatchOpen = open;
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Sets the randomness seed used for proposer selection.
|
|
77
|
+
* @param seed - The seed value.
|
|
78
|
+
*/
|
|
79
|
+
setSeed(seed: bigint): this {
|
|
80
|
+
this.seed = seed;
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Sets the list of registered validators (all validators, not just committee).
|
|
86
|
+
* @param validators - Array of validator addresses.
|
|
87
|
+
*/
|
|
88
|
+
setRegisteredValidators(validators: EthAddress[]): this {
|
|
89
|
+
this.registeredValidators = validators;
|
|
90
|
+
return this;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Sets the L1 constants used for epoch/slot calculations.
|
|
95
|
+
* @param constants - Partial constants to override defaults.
|
|
96
|
+
*/
|
|
97
|
+
setL1Constants(constants: Partial<L1RollupConstants>): this {
|
|
98
|
+
this.l1Constants = { ...this.l1Constants, ...constants };
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
getL1Constants(): L1RollupConstants {
|
|
103
|
+
return this.l1Constants;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
getCommittee(_slot?: SlotTag): Promise<EpochCommitteeInfo> {
|
|
107
|
+
const epoch = getEpochAtSlot(this.currentSlot, this.l1Constants);
|
|
108
|
+
return Promise.resolve({
|
|
109
|
+
committee: this.committee,
|
|
110
|
+
epoch,
|
|
111
|
+
seed: this.seed,
|
|
112
|
+
isEscapeHatchOpen: this.escapeHatchOpen,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
getEpochAndSlotNow(): EpochAndSlot & { nowMs: bigint } {
|
|
117
|
+
const epoch = getEpochAtSlot(this.currentSlot, this.l1Constants);
|
|
118
|
+
const ts = getTimestampRangeForEpoch(epoch, this.l1Constants)[0];
|
|
119
|
+
return { epoch, slot: this.currentSlot, ts, nowMs: ts * 1000n };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
getEpochAndSlotInNextL1Slot(): EpochAndSlot & { now: bigint } {
|
|
123
|
+
const now = getTimestampRangeForEpoch(getEpochAtSlot(this.currentSlot, this.l1Constants), this.l1Constants)[0];
|
|
124
|
+
const nextSlotTs = now + BigInt(this.l1Constants.ethereumSlotDuration);
|
|
125
|
+
const nextSlot = getSlotAtTimestamp(nextSlotTs, this.l1Constants);
|
|
126
|
+
const epoch = getEpochAtSlot(nextSlot, this.l1Constants);
|
|
127
|
+
const ts = getTimestampRangeForEpoch(epoch, this.l1Constants)[0];
|
|
128
|
+
return { epoch, slot: nextSlot, ts, now };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
getProposerIndexEncoding(epoch: EpochNumber, slot: SlotNumber, seed: bigint): `0x${string}` {
|
|
132
|
+
// Simple encoding for testing purposes
|
|
133
|
+
return `0x${epoch.toString(16).padStart(64, '0')}${slot.toString(16).padStart(64, '0')}${seed.toString(16).padStart(64, '0')}`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
computeProposerIndex(slot: SlotNumber, _epoch: EpochNumber, _seed: bigint, size: bigint): bigint {
|
|
137
|
+
if (size === 0n) {
|
|
138
|
+
return 0n;
|
|
139
|
+
}
|
|
140
|
+
return BigInt(slot) % size;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
getCurrentAndNextSlot(): { currentSlot: SlotNumber; nextSlot: SlotNumber } {
|
|
144
|
+
return {
|
|
145
|
+
currentSlot: this.currentSlot,
|
|
146
|
+
nextSlot: SlotNumber(this.currentSlot + 1),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
getProposerAttesterAddressInSlot(_slot: SlotNumber): Promise<EthAddress | undefined> {
|
|
151
|
+
return Promise.resolve(this.proposerAddress);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
getRegisteredValidators(): Promise<EthAddress[]> {
|
|
155
|
+
return Promise.resolve(this.registeredValidators);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
isInCommittee(_slot: SlotTag, validator: EthAddress): Promise<boolean> {
|
|
159
|
+
return Promise.resolve(this.committee.some(v => v.equals(validator)));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
filterInCommittee(_slot: SlotTag, validators: EthAddress[]): Promise<EthAddress[]> {
|
|
163
|
+
const committeeSet = new Set(this.committee.map(v => v.toString()));
|
|
164
|
+
return Promise.resolve(validators.filter(v => committeeSet.has(v.toString())));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
isEscapeHatchOpenAtSlot(_slot?: SlotTag): Promise<boolean> {
|
|
168
|
+
return Promise.resolve(this.escapeHatchOpen);
|
|
169
|
+
}
|
|
170
|
+
}
|