@lodestar/validator 1.45.0 → 1.46.0-dev.20101a8cc1
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/lib/genesis.d.ts.map +1 -1
- package/lib/genesis.js +7 -3
- package/lib/genesis.js.map +1 -1
- package/lib/metrics.d.ts +3 -0
- package/lib/metrics.d.ts.map +1 -1
- package/lib/metrics.js +5 -0
- package/lib/metrics.js.map +1 -1
- package/lib/services/attestation.d.ts +2 -1
- package/lib/services/attestation.d.ts.map +1 -1
- package/lib/services/attestation.js.map +1 -1
- package/lib/services/attestationDuties.d.ts +2 -1
- package/lib/services/attestationDuties.d.ts.map +1 -1
- package/lib/services/attestationDuties.js +1 -1
- package/lib/services/attestationDuties.js.map +1 -1
- package/lib/services/block.d.ts +3 -1
- package/lib/services/block.d.ts.map +1 -1
- package/lib/services/block.js +86 -40
- package/lib/services/block.js.map +1 -1
- package/lib/services/blockDuties.d.ts +2 -1
- package/lib/services/blockDuties.d.ts.map +1 -1
- package/lib/services/blockDuties.js.map +1 -1
- package/lib/services/doppelgangerService.d.ts +1 -1
- package/lib/services/doppelgangerService.d.ts.map +1 -1
- package/lib/services/doppelgangerService.js.map +1 -1
- package/lib/services/prepareBeaconProposer.d.ts +2 -1
- package/lib/services/prepareBeaconProposer.d.ts.map +1 -1
- package/lib/services/prepareBeaconProposer.js.map +1 -1
- package/lib/services/proposerPreferences.d.ts +2 -1
- package/lib/services/proposerPreferences.d.ts.map +1 -1
- package/lib/services/proposerPreferences.js.map +1 -1
- package/lib/services/ptc.d.ts +2 -1
- package/lib/services/ptc.d.ts.map +1 -1
- package/lib/services/ptc.js.map +1 -1
- package/lib/services/ptcDuties.d.ts +2 -1
- package/lib/services/ptcDuties.d.ts.map +1 -1
- package/lib/services/ptcDuties.js.map +1 -1
- package/lib/services/syncCommittee.d.ts +2 -1
- package/lib/services/syncCommittee.d.ts.map +1 -1
- package/lib/services/syncCommittee.js.map +1 -1
- package/lib/services/syncCommitteeDuties.d.ts +2 -1
- package/lib/services/syncCommitteeDuties.d.ts.map +1 -1
- package/lib/services/syncCommitteeDuties.js.map +1 -1
- package/lib/services/syncingStatusTracker.d.ts +1 -1
- package/lib/services/syncingStatusTracker.d.ts.map +1 -1
- package/lib/services/syncingStatusTracker.js.map +1 -1
- package/lib/services/validatorStore.d.ts +1 -1
- package/lib/services/validatorStore.d.ts.map +1 -1
- package/lib/services/validatorStore.js +12 -6
- package/lib/services/validatorStore.js.map +1 -1
- package/lib/util/index.d.ts +0 -2
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js +0 -2
- package/lib/util/index.js.map +1 -1
- package/lib/util/logger.d.ts +1 -1
- package/lib/util/logger.d.ts.map +1 -1
- package/lib/util/logger.js.map +1 -1
- package/lib/validator.d.ts +2 -1
- package/lib/validator.d.ts.map +1 -1
- package/lib/validator.js +7 -5
- package/lib/validator.js.map +1 -1
- package/package.json +15 -15
- package/src/genesis.ts +6 -4
- package/src/metrics.ts +6 -0
- package/src/services/attestation.ts +2 -2
- package/src/services/attestationDuties.ts +7 -2
- package/src/services/block.ts +113 -52
- package/src/services/blockDuties.ts +2 -2
- package/src/services/doppelgangerService.ts +1 -2
- package/src/services/prepareBeaconProposer.ts +2 -1
- package/src/services/proposerPreferences.ts +2 -2
- package/src/services/ptc.ts +2 -1
- package/src/services/ptcDuties.ts +2 -2
- package/src/services/syncCommittee.ts +2 -1
- package/src/services/syncCommitteeDuties.ts +2 -1
- package/src/services/syncingStatusTracker.ts +1 -1
- package/src/services/validatorStore.ts +22 -7
- package/src/util/index.ts +0 -2
- package/src/util/logger.ts +1 -1
- package/src/validator.ts +14 -5
- package/lib/util/clock.d.ts +0 -55
- package/lib/util/clock.d.ts.map +0 -1
- package/lib/util/clock.js +0 -141
- package/lib/util/clock.js.map +0 -1
- package/lib/util/params.d.ts +0 -20
- package/lib/util/params.d.ts.map +0 -1
- package/lib/util/params.js +0 -295
- package/lib/util/params.js.map +0 -1
- package/src/util/clock.ts +0 -182
- package/src/util/params.ts +0 -341
package/lib/util/clock.js
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { GENESIS_SLOT, SLOTS_PER_EPOCH } from "@lodestar/params";
|
|
2
|
-
import { computeEpochAtSlot, computeTimeAtSlot, getCurrentSlot } from "@lodestar/state-transition";
|
|
3
|
-
import { ErrorAborted, isErrorAborted, sleep } from "@lodestar/utils";
|
|
4
|
-
export { TimeItem };
|
|
5
|
-
var TimeItem;
|
|
6
|
-
(function (TimeItem) {
|
|
7
|
-
TimeItem[TimeItem["Slot"] = 0] = "Slot";
|
|
8
|
-
TimeItem[TimeItem["Epoch"] = 1] = "Epoch";
|
|
9
|
-
})(TimeItem || (TimeItem = {}));
|
|
10
|
-
export class Clock {
|
|
11
|
-
opts;
|
|
12
|
-
genesisTime;
|
|
13
|
-
secondsPerSlot;
|
|
14
|
-
config;
|
|
15
|
-
logger;
|
|
16
|
-
fns = [];
|
|
17
|
-
constructor(config, logger, opts) {
|
|
18
|
-
this.opts = opts;
|
|
19
|
-
this.genesisTime = opts.genesisTime;
|
|
20
|
-
this.secondsPerSlot = config.SLOT_DURATION_MS / 1000;
|
|
21
|
-
this.config = config;
|
|
22
|
-
this.logger = logger;
|
|
23
|
-
}
|
|
24
|
-
get currentEpoch() {
|
|
25
|
-
return computeEpochAtSlot(getCurrentSlot(this.config, this.genesisTime));
|
|
26
|
-
}
|
|
27
|
-
start(signal) {
|
|
28
|
-
for (const { timeItem, fn } of this.fns) {
|
|
29
|
-
this.runAtMostEvery(timeItem, signal, fn).catch((e) => {
|
|
30
|
-
if (!isErrorAborted(e)) {
|
|
31
|
-
this.logger.error("runAtMostEvery", {}, e);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
getCurrentSlot() {
|
|
37
|
-
return getCurrentSlot(this.config, this.genesisTime);
|
|
38
|
-
}
|
|
39
|
-
getCurrentEpoch() {
|
|
40
|
-
return computeEpochAtSlot(getCurrentSlot(this.config, this.genesisTime));
|
|
41
|
-
}
|
|
42
|
-
runEverySlot(fn) {
|
|
43
|
-
this.fns.push({ timeItem: TimeItem.Slot, fn });
|
|
44
|
-
}
|
|
45
|
-
runEveryEpoch(fn) {
|
|
46
|
-
this.fns.push({ timeItem: TimeItem.Epoch, fn });
|
|
47
|
-
}
|
|
48
|
-
/** Milliseconds from now to a specific slot */
|
|
49
|
-
msToSlot(slot) {
|
|
50
|
-
return computeTimeAtSlot(this.config, slot, this.genesisTime) * 1000 - Date.now();
|
|
51
|
-
}
|
|
52
|
-
/** Milliseconds elapsed from a specific slot to now */
|
|
53
|
-
msFromSlot(slot) {
|
|
54
|
-
return Date.now() - computeTimeAtSlot(this.config, slot, this.genesisTime) * 1000;
|
|
55
|
-
}
|
|
56
|
-
/** Seconds elapsed from a specific slot to now */
|
|
57
|
-
secFromSlot(slot) {
|
|
58
|
-
return Date.now() / 1000 - computeTimeAtSlot(this.config, slot, this.genesisTime);
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* If a task happens to take more than one slot to run, we might skip a slot. This is unfortunate,
|
|
62
|
-
* however the alternative is to *always* process every slot, which has the chance of creating a
|
|
63
|
-
* theoretically unlimited backlog of tasks. It was a conscious decision to choose to drop tasks
|
|
64
|
-
* on an overloaded/latent system rather than overload it even more.
|
|
65
|
-
*/
|
|
66
|
-
async runAtMostEvery(timeItem, signal, fn) {
|
|
67
|
-
// Run immediately first
|
|
68
|
-
let slot = getCurrentSlot(this.config, this.genesisTime);
|
|
69
|
-
let slotOrEpoch = timeItem === TimeItem.Slot ? slot : computeEpochAtSlot(slot);
|
|
70
|
-
while (!signal.aborted) {
|
|
71
|
-
// Must catch fn() to ensure `sleep()` is awaited both for resolve and reject
|
|
72
|
-
const task = fn(slotOrEpoch, signal).catch((e) => {
|
|
73
|
-
if (!isErrorAborted(e))
|
|
74
|
-
this.logger.error("Error on runEvery fn", {}, e);
|
|
75
|
-
});
|
|
76
|
-
if (timeItem !== TimeItem.Slot || this.opts.skipSlots !== false) {
|
|
77
|
-
// await response to only continue with next task if current task finished within slot
|
|
78
|
-
await task;
|
|
79
|
-
}
|
|
80
|
-
try {
|
|
81
|
-
await sleep(this.timeUntilNext(timeItem), signal);
|
|
82
|
-
// calling getCurrentSlot here may not be correct when we're close to the next slot
|
|
83
|
-
// it's safe to call getCurrentSlotAround after we sleep
|
|
84
|
-
const nextSlot = getCurrentSlotAround(this.config, this.genesisTime);
|
|
85
|
-
if (timeItem === TimeItem.Slot) {
|
|
86
|
-
if (nextSlot > slot + 1) {
|
|
87
|
-
// It's not very likely that we skip more than one slot as HTTP timeout is set
|
|
88
|
-
// to SLOT_DURATION_MS so we will fail task before skipping another slot.
|
|
89
|
-
this.logger.warn("Skipped slot due to task taking more than one slot to run", {
|
|
90
|
-
skippedSlot: slot + 1,
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
slotOrEpoch = nextSlot;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
slotOrEpoch = computeEpochAtSlot(nextSlot);
|
|
97
|
-
}
|
|
98
|
-
slot = nextSlot;
|
|
99
|
-
}
|
|
100
|
-
catch (e) {
|
|
101
|
-
if (e instanceof ErrorAborted) {
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
throw e;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
timeUntilNext(timeItem) {
|
|
109
|
-
const milliSecondsPerSlot = this.config.SLOT_DURATION_MS;
|
|
110
|
-
const msFromGenesis = Date.now() - this.genesisTime * 1000;
|
|
111
|
-
if (timeItem === TimeItem.Slot) {
|
|
112
|
-
if (msFromGenesis >= 0) {
|
|
113
|
-
return milliSecondsPerSlot - (msFromGenesis % milliSecondsPerSlot);
|
|
114
|
-
}
|
|
115
|
-
return Math.abs(msFromGenesis) % milliSecondsPerSlot;
|
|
116
|
-
}
|
|
117
|
-
const milliSecondsPerEpoch = SLOTS_PER_EPOCH * milliSecondsPerSlot;
|
|
118
|
-
if (msFromGenesis >= 0) {
|
|
119
|
-
return milliSecondsPerEpoch - (msFromGenesis % milliSecondsPerEpoch);
|
|
120
|
-
}
|
|
121
|
-
return Math.abs(msFromGenesis) % milliSecondsPerEpoch;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Same to the spec but we use Math.round instead of Math.floor.
|
|
126
|
-
*/
|
|
127
|
-
export function getCurrentSlotAround(config, genesisTime) {
|
|
128
|
-
const diffInSeconds = Date.now() / 1000 - genesisTime;
|
|
129
|
-
const slotsSinceGenesis = Math.round((diffInSeconds * 1000) / config.SLOT_DURATION_MS);
|
|
130
|
-
return GENESIS_SLOT + slotsSinceGenesis;
|
|
131
|
-
}
|
|
132
|
-
// function useEventStream() {
|
|
133
|
-
// this.stream = this.events.getEventStream([BeaconEventType.BLOCK, BeaconEventType.HEAD, BeaconEventType.CHAIN_REORG]);
|
|
134
|
-
// pipeToEmitter(this.stream, this).catch((e: Error) => {
|
|
135
|
-
// this.logger.error("Error on stream pipe", {}, e);
|
|
136
|
-
// });
|
|
137
|
-
// // On stop
|
|
138
|
-
// this.stream.stop();
|
|
139
|
-
// this.stream = null;
|
|
140
|
-
// }
|
|
141
|
-
//# sourceMappingURL=clock.js.map
|
package/lib/util/clock.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/util/clock.ts"],"names":[],"mappings":"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"}
|
package/lib/util/params.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { ChainConfig, SpecJson } from "@lodestar/config";
|
|
2
|
-
export declare class NotEqualParamsError extends Error {
|
|
3
|
-
}
|
|
4
|
-
/**
|
|
5
|
-
* Assert localConfig values match externalSpecJson. externalSpecJson may contain more values than localConfig.
|
|
6
|
-
*
|
|
7
|
-
* This check ensures that the validator is connected to a beacon node of the exact same network and params.
|
|
8
|
-
* Otherwise, signatures may be rejected, time may be un-equal and other bugs that are harder to debug caused
|
|
9
|
-
* by different parameters.
|
|
10
|
-
*
|
|
11
|
-
* This check however can't compare the full config as is, since some parameters are not critical to the spec and
|
|
12
|
-
* can be changed un-expectedly. Also, fork parameters can change un-expectedly, like their _FORK_VERSION or _EPOCH.
|
|
13
|
-
* Note that the config API endpoint is not precisely specified, so each clients can return a different set of
|
|
14
|
-
* parameters.
|
|
15
|
-
*
|
|
16
|
-
* So this check only compares a specific list of parameters that are consensus critical, ignoring the rest. Typed
|
|
17
|
-
* config and preset ensure new parameters are labeled critical or ignore, facilitating maintenance of the list.
|
|
18
|
-
*/
|
|
19
|
-
export declare function assertEqualParams(localConfig: ChainConfig, externalSpecJson: SpecJson): void;
|
|
20
|
-
//# sourceMappingURL=params.d.ts.map
|
package/lib/util/params.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/util/params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,WAAW,EAAE,QAAQ,EAA6C,MAAM,kBAAkB,CAAC;AAGtH,qBAAa,mBAAoB,SAAQ,KAAK;CAAG;AAIjD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,GAAG,IAAI,CAyE5F"}
|
package/lib/util/params.js
DELETED
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
import { chainConfigToJson, deserializeBlobSchedule } from "@lodestar/config";
|
|
2
|
-
import { activePreset, presetToJson } from "@lodestar/params";
|
|
3
|
-
export class NotEqualParamsError extends Error {
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Assert localConfig values match externalSpecJson. externalSpecJson may contain more values than localConfig.
|
|
7
|
-
*
|
|
8
|
-
* This check ensures that the validator is connected to a beacon node of the exact same network and params.
|
|
9
|
-
* Otherwise, signatures may be rejected, time may be un-equal and other bugs that are harder to debug caused
|
|
10
|
-
* by different parameters.
|
|
11
|
-
*
|
|
12
|
-
* This check however can't compare the full config as is, since some parameters are not critical to the spec and
|
|
13
|
-
* can be changed un-expectedly. Also, fork parameters can change un-expectedly, like their _FORK_VERSION or _EPOCH.
|
|
14
|
-
* Note that the config API endpoint is not precisely specified, so each clients can return a different set of
|
|
15
|
-
* parameters.
|
|
16
|
-
*
|
|
17
|
-
* So this check only compares a specific list of parameters that are consensus critical, ignoring the rest. Typed
|
|
18
|
-
* config and preset ensure new parameters are labeled critical or ignore, facilitating maintenance of the list.
|
|
19
|
-
*/
|
|
20
|
-
export function assertEqualParams(localConfig, externalSpecJson) {
|
|
21
|
-
// Before comparing, add preset which is bundled in api impl config route.
|
|
22
|
-
// config and preset must be serialized to JSON for safe comparisions.
|
|
23
|
-
const localSpecJson = {
|
|
24
|
-
...chainConfigToJson(localConfig),
|
|
25
|
-
...presetToJson(activePreset),
|
|
26
|
-
};
|
|
27
|
-
// Get list of keys to check, and keys to ignore. Otherwise this function throws for false positives
|
|
28
|
-
const criticalParams = getSpecCriticalParams(localConfig);
|
|
29
|
-
// Accumulate errors first and print all of them at once
|
|
30
|
-
const errors = [];
|
|
31
|
-
for (const key of Object.keys(criticalParams)) {
|
|
32
|
-
if (
|
|
33
|
-
// Ignore non-critical params
|
|
34
|
-
!criticalParams[key] ||
|
|
35
|
-
// This condition should never be true, but just in case
|
|
36
|
-
localSpecJson[key] === undefined ||
|
|
37
|
-
// The config/spec endpoint is poorly specified, so in practice each client returns a custom selection of keys.
|
|
38
|
-
// For example Lighthouse returns a manually selected list of keys that may be updated at any time.
|
|
39
|
-
// https://github.com/sigp/lighthouse/blob/bac7c3fa544495a257722aaad9cd8f72fee2f2b4/consensus/types/src/chain_spec.rs#L941
|
|
40
|
-
//
|
|
41
|
-
// So if we assert that spec critical keys are present in the spec we may break interoperability unexpectedly.
|
|
42
|
-
// So it's best to ignore keys are not defined in both specs and trust that the ones defined are sufficient
|
|
43
|
-
// to detect spec discrepancies in all cases.
|
|
44
|
-
externalSpecJson[key] === undefined) {
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
if (key === "BLOB_SCHEDULE") {
|
|
48
|
-
const localBlobSchedule = deserializeBlobSchedule(localSpecJson[key]).sort((a, b) => a.EPOCH - b.EPOCH);
|
|
49
|
-
const remoteBlobSchedule = deserializeBlobSchedule(externalSpecJson[key]).sort((a, b) => a.EPOCH - b.EPOCH);
|
|
50
|
-
if (localBlobSchedule.length !== remoteBlobSchedule.length) {
|
|
51
|
-
errors.push(`BLOB_SCHEDULE different length: ${localBlobSchedule.length} != ${remoteBlobSchedule.length}`);
|
|
52
|
-
// Skip per entry comparison
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
for (let i = 0; i < localBlobSchedule.length; i++) {
|
|
56
|
-
const localEntry = localBlobSchedule[i];
|
|
57
|
-
const remoteEntry = remoteBlobSchedule[i];
|
|
58
|
-
for (const entryKey of ["EPOCH", "MAX_BLOBS_PER_BLOCK"]) {
|
|
59
|
-
const localValue = String(localEntry[entryKey]);
|
|
60
|
-
const remoteValue = String(remoteEntry[entryKey]);
|
|
61
|
-
if (localValue !== remoteValue) {
|
|
62
|
-
errors.push(`BLOB_SCHEDULE[${i}].${entryKey} different value: ${localValue} != ${remoteValue}`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// Skip generic string comparison
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
// Must compare JSON serialized specs, to ensure all strings are rendered in the same way
|
|
70
|
-
// Must compare as lowercase to ensure checksum addresses and names have same capilatization
|
|
71
|
-
const localValue = String(localSpecJson[key]).toLocaleLowerCase();
|
|
72
|
-
const remoteValue = String(externalSpecJson[key]).toLocaleLowerCase();
|
|
73
|
-
if (localValue !== remoteValue) {
|
|
74
|
-
errors.push(`${key} different value: ${localValue} != ${remoteValue}`);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (errors.length > 0) {
|
|
78
|
-
throw new NotEqualParamsError("Local and remote configs are different\n" + errors.join("\n"));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
function getSpecCriticalParams(localConfig) {
|
|
82
|
-
const altairForkRelevant = localConfig.ALTAIR_FORK_EPOCH < Infinity;
|
|
83
|
-
const bellatrixForkRelevant = localConfig.BELLATRIX_FORK_EPOCH < Infinity;
|
|
84
|
-
const capellaForkRelevant = localConfig.CAPELLA_FORK_EPOCH < Infinity;
|
|
85
|
-
const denebForkRelevant = localConfig.DENEB_FORK_EPOCH < Infinity;
|
|
86
|
-
const electraForkRelevant = localConfig.ELECTRA_FORK_EPOCH < Infinity;
|
|
87
|
-
const fuluForkRelevant = localConfig.FULU_FORK_EPOCH < Infinity;
|
|
88
|
-
const gloasForkRelevant = localConfig.GLOAS_FORK_EPOCH < Infinity;
|
|
89
|
-
return {
|
|
90
|
-
// # Config
|
|
91
|
-
///////////
|
|
92
|
-
PRESET_BASE: false, // Not relevant, each preset value is checked below
|
|
93
|
-
CONFIG_NAME: false, // Arbitrary string, not relevant
|
|
94
|
-
// Deprecated - All networks have completed the merge transition
|
|
95
|
-
TERMINAL_TOTAL_DIFFICULTY: false,
|
|
96
|
-
TERMINAL_BLOCK_HASH: false,
|
|
97
|
-
TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH: false,
|
|
98
|
-
// Genesis
|
|
99
|
-
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: true,
|
|
100
|
-
MIN_GENESIS_TIME: true,
|
|
101
|
-
GENESIS_FORK_VERSION: true,
|
|
102
|
-
GENESIS_DELAY: true,
|
|
103
|
-
// Forking
|
|
104
|
-
// Altair
|
|
105
|
-
ALTAIR_FORK_VERSION: altairForkRelevant,
|
|
106
|
-
ALTAIR_FORK_EPOCH: altairForkRelevant,
|
|
107
|
-
// Bellatrix
|
|
108
|
-
BELLATRIX_FORK_VERSION: bellatrixForkRelevant,
|
|
109
|
-
BELLATRIX_FORK_EPOCH: bellatrixForkRelevant,
|
|
110
|
-
// Capella
|
|
111
|
-
CAPELLA_FORK_VERSION: capellaForkRelevant,
|
|
112
|
-
CAPELLA_FORK_EPOCH: capellaForkRelevant,
|
|
113
|
-
// Deneb
|
|
114
|
-
DENEB_FORK_VERSION: denebForkRelevant,
|
|
115
|
-
DENEB_FORK_EPOCH: denebForkRelevant,
|
|
116
|
-
// electra
|
|
117
|
-
ELECTRA_FORK_VERSION: electraForkRelevant,
|
|
118
|
-
ELECTRA_FORK_EPOCH: electraForkRelevant,
|
|
119
|
-
// fulu
|
|
120
|
-
FULU_FORK_VERSION: fuluForkRelevant,
|
|
121
|
-
FULU_FORK_EPOCH: fuluForkRelevant,
|
|
122
|
-
// gloas
|
|
123
|
-
GLOAS_FORK_VERSION: gloasForkRelevant,
|
|
124
|
-
GLOAS_FORK_EPOCH: gloasForkRelevant,
|
|
125
|
-
// Time parameters
|
|
126
|
-
SECONDS_PER_SLOT: false, // Deprecated
|
|
127
|
-
SLOT_DURATION_MS: true,
|
|
128
|
-
SECONDS_PER_ETH1_BLOCK: false, // Legacy
|
|
129
|
-
MIN_VALIDATOR_WITHDRAWABILITY_DELAY: true,
|
|
130
|
-
SHARD_COMMITTEE_PERIOD: true,
|
|
131
|
-
ETH1_FOLLOW_DISTANCE: true,
|
|
132
|
-
PROPOSER_REORG_CUTOFF_BPS: true,
|
|
133
|
-
ATTESTATION_DUE_BPS: true,
|
|
134
|
-
AGGREGATE_DUE_BPS: true,
|
|
135
|
-
// Altair
|
|
136
|
-
SYNC_MESSAGE_DUE_BPS: altairForkRelevant,
|
|
137
|
-
CONTRIBUTION_DUE_BPS: altairForkRelevant,
|
|
138
|
-
// Validator cycle
|
|
139
|
-
INACTIVITY_SCORE_BIAS: true,
|
|
140
|
-
INACTIVITY_SCORE_RECOVERY_RATE: true,
|
|
141
|
-
EJECTION_BALANCE: true,
|
|
142
|
-
MIN_PER_EPOCH_CHURN_LIMIT: true,
|
|
143
|
-
MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT: denebForkRelevant,
|
|
144
|
-
CHURN_LIMIT_QUOTIENT: true,
|
|
145
|
-
// Fork choice
|
|
146
|
-
PROPOSER_SCORE_BOOST: false, // Ignored as it's changing https://github.com/ethereum/consensus-specs/pull/2895
|
|
147
|
-
REORG_HEAD_WEIGHT_THRESHOLD: false, // Non-critical since proposer boost reorg is optional feature
|
|
148
|
-
REORG_PARENT_WEIGHT_THRESHOLD: false, // Non-critical since proposer boost reorg is optional feature
|
|
149
|
-
REORG_MAX_EPOCHS_SINCE_FINALIZATION: false, // Non-critical since proposer boost reorg is optional feature
|
|
150
|
-
// Deposit contract
|
|
151
|
-
DEPOSIT_CHAIN_ID: false, // Non-critical
|
|
152
|
-
DEPOSIT_NETWORK_ID: false, // Non-critical
|
|
153
|
-
DEPOSIT_CONTRACT_ADDRESS: true,
|
|
154
|
-
// Networking (non-critical as those do not affect consensus)
|
|
155
|
-
MAX_PAYLOAD_SIZE: false,
|
|
156
|
-
EPOCHS_PER_SUBNET_SUBSCRIPTION: false,
|
|
157
|
-
ATTESTATION_PROPAGATION_SLOT_RANGE: false,
|
|
158
|
-
MAXIMUM_GOSSIP_CLOCK_DISPARITY: false,
|
|
159
|
-
MESSAGE_DOMAIN_INVALID_SNAPPY: false,
|
|
160
|
-
MESSAGE_DOMAIN_VALID_SNAPPY: false,
|
|
161
|
-
SUBNETS_PER_NODE: false,
|
|
162
|
-
MAX_REQUEST_BLOCKS: false,
|
|
163
|
-
MAX_REQUEST_BLOCKS_DENEB: false,
|
|
164
|
-
MIN_EPOCHS_FOR_BLOCK_REQUESTS: false,
|
|
165
|
-
MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: false,
|
|
166
|
-
MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS: false,
|
|
167
|
-
BLOB_SIDECAR_SUBNET_COUNT: false,
|
|
168
|
-
BLOB_SIDECAR_SUBNET_COUNT_ELECTRA: false,
|
|
169
|
-
DATA_COLUMN_SIDECAR_SUBNET_COUNT: false,
|
|
170
|
-
MAX_REQUEST_BLOB_SIDECARS: false,
|
|
171
|
-
MAX_REQUEST_BLOB_SIDECARS_ELECTRA: false,
|
|
172
|
-
MAX_REQUEST_DATA_COLUMN_SIDECARS: false,
|
|
173
|
-
MAX_REQUEST_PAYLOADS: false,
|
|
174
|
-
// # Phase0Preset
|
|
175
|
-
/////////////////
|
|
176
|
-
MAX_COMMITTEES_PER_SLOT: true,
|
|
177
|
-
TARGET_COMMITTEE_SIZE: true,
|
|
178
|
-
MAX_VALIDATORS_PER_COMMITTEE: true,
|
|
179
|
-
SHUFFLE_ROUND_COUNT: true,
|
|
180
|
-
HYSTERESIS_QUOTIENT: true,
|
|
181
|
-
HYSTERESIS_DOWNWARD_MULTIPLIER: true,
|
|
182
|
-
HYSTERESIS_UPWARD_MULTIPLIER: true,
|
|
183
|
-
// Gwei Values
|
|
184
|
-
MIN_DEPOSIT_AMOUNT: true,
|
|
185
|
-
MAX_EFFECTIVE_BALANCE: true,
|
|
186
|
-
EFFECTIVE_BALANCE_INCREMENT: true,
|
|
187
|
-
// Time parameters
|
|
188
|
-
MIN_ATTESTATION_INCLUSION_DELAY: true,
|
|
189
|
-
SLOTS_PER_EPOCH: true,
|
|
190
|
-
MIN_SEED_LOOKAHEAD: true,
|
|
191
|
-
MAX_SEED_LOOKAHEAD: true,
|
|
192
|
-
EPOCHS_PER_ETH1_VOTING_PERIOD: true,
|
|
193
|
-
SLOTS_PER_HISTORICAL_ROOT: true,
|
|
194
|
-
MIN_EPOCHS_TO_INACTIVITY_PENALTY: true,
|
|
195
|
-
// State vector lengths
|
|
196
|
-
EPOCHS_PER_HISTORICAL_VECTOR: true,
|
|
197
|
-
EPOCHS_PER_SLASHINGS_VECTOR: true,
|
|
198
|
-
HISTORICAL_ROOTS_LIMIT: true,
|
|
199
|
-
VALIDATOR_REGISTRY_LIMIT: true,
|
|
200
|
-
// Reward and penalty quotients
|
|
201
|
-
BASE_REWARD_FACTOR: true,
|
|
202
|
-
WHISTLEBLOWER_REWARD_QUOTIENT: true,
|
|
203
|
-
PROPOSER_REWARD_QUOTIENT: true,
|
|
204
|
-
INACTIVITY_PENALTY_QUOTIENT: true,
|
|
205
|
-
MIN_SLASHING_PENALTY_QUOTIENT: true,
|
|
206
|
-
PROPORTIONAL_SLASHING_MULTIPLIER: true,
|
|
207
|
-
// Max operations per block
|
|
208
|
-
MAX_PROPOSER_SLASHINGS: true,
|
|
209
|
-
MAX_ATTESTER_SLASHINGS: true,
|
|
210
|
-
MAX_ATTESTATIONS: true,
|
|
211
|
-
MAX_DEPOSITS: true,
|
|
212
|
-
MAX_VOLUNTARY_EXITS: true,
|
|
213
|
-
// # AltairPreset
|
|
214
|
-
/////////////////
|
|
215
|
-
SYNC_COMMITTEE_SIZE: altairForkRelevant,
|
|
216
|
-
EPOCHS_PER_SYNC_COMMITTEE_PERIOD: altairForkRelevant,
|
|
217
|
-
INACTIVITY_PENALTY_QUOTIENT_ALTAIR: altairForkRelevant,
|
|
218
|
-
MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR: altairForkRelevant,
|
|
219
|
-
PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR: altairForkRelevant,
|
|
220
|
-
MIN_SYNC_COMMITTEE_PARTICIPANTS: false, // Only relevant for lightclients
|
|
221
|
-
UPDATE_TIMEOUT: false, // Only relevant for lightclients
|
|
222
|
-
// # BellatrixPreset
|
|
223
|
-
/////////////////
|
|
224
|
-
INACTIVITY_PENALTY_QUOTIENT_BELLATRIX: bellatrixForkRelevant,
|
|
225
|
-
MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX: bellatrixForkRelevant,
|
|
226
|
-
PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX: bellatrixForkRelevant,
|
|
227
|
-
MAX_BYTES_PER_TRANSACTION: bellatrixForkRelevant,
|
|
228
|
-
MAX_TRANSACTIONS_PER_PAYLOAD: bellatrixForkRelevant,
|
|
229
|
-
BYTES_PER_LOGS_BLOOM: bellatrixForkRelevant,
|
|
230
|
-
MAX_EXTRA_DATA_BYTES: bellatrixForkRelevant,
|
|
231
|
-
// # CapellaPreset
|
|
232
|
-
/////////////////
|
|
233
|
-
MAX_BLS_TO_EXECUTION_CHANGES: capellaForkRelevant,
|
|
234
|
-
MAX_WITHDRAWALS_PER_PAYLOAD: capellaForkRelevant,
|
|
235
|
-
MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP: capellaForkRelevant,
|
|
236
|
-
// # DenebPreset
|
|
237
|
-
/////////////////
|
|
238
|
-
FIELD_ELEMENTS_PER_BLOB: denebForkRelevant,
|
|
239
|
-
MAX_BLOB_COMMITMENTS_PER_BLOCK: denebForkRelevant,
|
|
240
|
-
KZG_COMMITMENT_INCLUSION_PROOF_DEPTH: denebForkRelevant,
|
|
241
|
-
MAX_BLOBS_PER_BLOCK: denebForkRelevant,
|
|
242
|
-
// ELECTRA
|
|
243
|
-
MAX_DEPOSIT_REQUESTS_PER_PAYLOAD: electraForkRelevant,
|
|
244
|
-
MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD: electraForkRelevant,
|
|
245
|
-
MAX_ATTESTER_SLASHINGS_ELECTRA: electraForkRelevant,
|
|
246
|
-
MAX_ATTESTATIONS_ELECTRA: electraForkRelevant,
|
|
247
|
-
MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP: electraForkRelevant,
|
|
248
|
-
MAX_PENDING_DEPOSITS_PER_EPOCH: electraForkRelevant,
|
|
249
|
-
MAX_EFFECTIVE_BALANCE_ELECTRA: electraForkRelevant,
|
|
250
|
-
MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA: electraForkRelevant,
|
|
251
|
-
MIN_ACTIVATION_BALANCE: electraForkRelevant,
|
|
252
|
-
PENDING_DEPOSITS_LIMIT: electraForkRelevant,
|
|
253
|
-
PENDING_PARTIAL_WITHDRAWALS_LIMIT: electraForkRelevant,
|
|
254
|
-
PENDING_CONSOLIDATIONS_LIMIT: electraForkRelevant,
|
|
255
|
-
MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD: electraForkRelevant,
|
|
256
|
-
WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA: electraForkRelevant,
|
|
257
|
-
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: electraForkRelevant,
|
|
258
|
-
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: electraForkRelevant,
|
|
259
|
-
MAX_BLOBS_PER_BLOCK_ELECTRA: electraForkRelevant,
|
|
260
|
-
// FULU
|
|
261
|
-
/////////////////
|
|
262
|
-
CELLS_PER_EXT_BLOB: fuluForkRelevant,
|
|
263
|
-
FIELD_ELEMENTS_PER_CELL: fuluForkRelevant,
|
|
264
|
-
FIELD_ELEMENTS_PER_EXT_BLOB: fuluForkRelevant,
|
|
265
|
-
KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH: fuluForkRelevant,
|
|
266
|
-
NUMBER_OF_COLUMNS: fuluForkRelevant,
|
|
267
|
-
NUMBER_OF_CUSTODY_GROUPS: fuluForkRelevant,
|
|
268
|
-
SAMPLES_PER_SLOT: fuluForkRelevant,
|
|
269
|
-
CUSTODY_REQUIREMENT: fuluForkRelevant,
|
|
270
|
-
VALIDATOR_CUSTODY_REQUIREMENT: fuluForkRelevant,
|
|
271
|
-
BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: fuluForkRelevant,
|
|
272
|
-
BLOB_SCHEDULE: fuluForkRelevant,
|
|
273
|
-
// GLOAS
|
|
274
|
-
ATTESTATION_DUE_BPS_GLOAS: gloasForkRelevant,
|
|
275
|
-
AGGREGATE_DUE_BPS_GLOAS: gloasForkRelevant,
|
|
276
|
-
SYNC_MESSAGE_DUE_BPS_GLOAS: gloasForkRelevant,
|
|
277
|
-
CONTRIBUTION_DUE_BPS_GLOAS: gloasForkRelevant,
|
|
278
|
-
PAYLOAD_ATTESTATION_DUE_BPS: gloasForkRelevant,
|
|
279
|
-
PAYLOAD_DUE_BPS: gloasForkRelevant,
|
|
280
|
-
PTC_SIZE: gloasForkRelevant,
|
|
281
|
-
MAX_PAYLOAD_ATTESTATIONS: gloasForkRelevant,
|
|
282
|
-
MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD: gloasForkRelevant,
|
|
283
|
-
MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD: gloasForkRelevant,
|
|
284
|
-
BUILDER_REGISTRY_LIMIT: gloasForkRelevant,
|
|
285
|
-
BUILDER_PENDING_WITHDRAWALS_LIMIT: gloasForkRelevant,
|
|
286
|
-
MAX_BUILDERS_PER_WITHDRAWALS_SWEEP: gloasForkRelevant,
|
|
287
|
-
MIN_BUILDER_WITHDRAWABILITY_DELAY: gloasForkRelevant,
|
|
288
|
-
// FastConfirmationRule
|
|
289
|
-
CONFIRMATION_BYZANTINE_THRESHOLD: false,
|
|
290
|
-
CHURN_LIMIT_QUOTIENT_GLOAS: gloasForkRelevant,
|
|
291
|
-
CONSOLIDATION_CHURN_LIMIT_QUOTIENT: gloasForkRelevant,
|
|
292
|
-
MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT_GLOAS: gloasForkRelevant,
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
//# sourceMappingURL=params.js.map
|
package/lib/util/params.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"params.js","sourceRoot":"","sources":["../../src/util/params.ts"],"names":[],"mappings":"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"}
|
package/src/util/clock.ts
DELETED
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import {ChainForkConfig} from "@lodestar/config";
|
|
2
|
-
import {GENESIS_SLOT, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
3
|
-
import {computeEpochAtSlot, computeTimeAtSlot, getCurrentSlot} from "@lodestar/state-transition";
|
|
4
|
-
import {Epoch, Slot, TimeSeconds} from "@lodestar/types";
|
|
5
|
-
import {ErrorAborted, Logger, isErrorAborted, sleep} from "@lodestar/utils";
|
|
6
|
-
|
|
7
|
-
type RunEveryFn = (slot: Slot, signal: AbortSignal) => Promise<void>;
|
|
8
|
-
|
|
9
|
-
export type ClockOptions = {
|
|
10
|
-
skipSlots?: boolean;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export interface IClock {
|
|
14
|
-
readonly genesisTime: number;
|
|
15
|
-
readonly secondsPerSlot: number;
|
|
16
|
-
|
|
17
|
-
readonly currentEpoch: number;
|
|
18
|
-
|
|
19
|
-
start(signal: AbortSignal): void;
|
|
20
|
-
runEverySlot(fn: (slot: Slot, signal: AbortSignal) => Promise<void>): void;
|
|
21
|
-
runEveryEpoch(fn: (epoch: Epoch, signal: AbortSignal) => Promise<void>): void;
|
|
22
|
-
msToSlot(slot: Slot): number;
|
|
23
|
-
msFromSlot(slot: Slot): number;
|
|
24
|
-
secFromSlot(slot: Slot): number;
|
|
25
|
-
getCurrentSlot(): Slot;
|
|
26
|
-
getCurrentEpoch(): Epoch;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export enum TimeItem {
|
|
30
|
-
Slot,
|
|
31
|
-
Epoch,
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export class Clock implements IClock {
|
|
35
|
-
readonly genesisTime: number;
|
|
36
|
-
readonly secondsPerSlot: number;
|
|
37
|
-
private readonly config: ChainForkConfig;
|
|
38
|
-
private readonly logger: Logger;
|
|
39
|
-
private readonly fns: {timeItem: TimeItem; fn: RunEveryFn}[] = [];
|
|
40
|
-
|
|
41
|
-
constructor(
|
|
42
|
-
config: ChainForkConfig,
|
|
43
|
-
logger: Logger,
|
|
44
|
-
private readonly opts: {genesisTime: number} & ClockOptions
|
|
45
|
-
) {
|
|
46
|
-
this.genesisTime = opts.genesisTime;
|
|
47
|
-
this.secondsPerSlot = config.SLOT_DURATION_MS / 1000;
|
|
48
|
-
this.config = config;
|
|
49
|
-
this.logger = logger;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
get currentEpoch(): Epoch {
|
|
53
|
-
return computeEpochAtSlot(getCurrentSlot(this.config, this.genesisTime));
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
start(signal: AbortSignal): void {
|
|
57
|
-
for (const {timeItem, fn} of this.fns) {
|
|
58
|
-
this.runAtMostEvery(timeItem, signal, fn).catch((e: Error) => {
|
|
59
|
-
if (!isErrorAborted(e)) {
|
|
60
|
-
this.logger.error("runAtMostEvery", {}, e);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
getCurrentSlot(): Slot {
|
|
67
|
-
return getCurrentSlot(this.config, this.genesisTime);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
getCurrentEpoch(): Epoch {
|
|
71
|
-
return computeEpochAtSlot(getCurrentSlot(this.config, this.genesisTime));
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
runEverySlot(fn: RunEveryFn): void {
|
|
75
|
-
this.fns.push({timeItem: TimeItem.Slot, fn});
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
runEveryEpoch(fn: RunEveryFn): void {
|
|
79
|
-
this.fns.push({timeItem: TimeItem.Epoch, fn});
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/** Milliseconds from now to a specific slot */
|
|
83
|
-
msToSlot(slot: Slot): number {
|
|
84
|
-
return computeTimeAtSlot(this.config, slot, this.genesisTime) * 1000 - Date.now();
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/** Milliseconds elapsed from a specific slot to now */
|
|
88
|
-
msFromSlot(slot: Slot): number {
|
|
89
|
-
return Date.now() - computeTimeAtSlot(this.config, slot, this.genesisTime) * 1000;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/** Seconds elapsed from a specific slot to now */
|
|
93
|
-
secFromSlot(slot: Slot): number {
|
|
94
|
-
return Date.now() / 1000 - computeTimeAtSlot(this.config, slot, this.genesisTime);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* If a task happens to take more than one slot to run, we might skip a slot. This is unfortunate,
|
|
99
|
-
* however the alternative is to *always* process every slot, which has the chance of creating a
|
|
100
|
-
* theoretically unlimited backlog of tasks. It was a conscious decision to choose to drop tasks
|
|
101
|
-
* on an overloaded/latent system rather than overload it even more.
|
|
102
|
-
*/
|
|
103
|
-
private async runAtMostEvery(timeItem: TimeItem, signal: AbortSignal, fn: RunEveryFn): Promise<void> {
|
|
104
|
-
// Run immediately first
|
|
105
|
-
let slot = getCurrentSlot(this.config, this.genesisTime);
|
|
106
|
-
let slotOrEpoch = timeItem === TimeItem.Slot ? slot : computeEpochAtSlot(slot);
|
|
107
|
-
while (!signal.aborted) {
|
|
108
|
-
// Must catch fn() to ensure `sleep()` is awaited both for resolve and reject
|
|
109
|
-
const task = fn(slotOrEpoch, signal).catch((e: Error) => {
|
|
110
|
-
if (!isErrorAborted(e)) this.logger.error("Error on runEvery fn", {}, e);
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
if (timeItem !== TimeItem.Slot || this.opts.skipSlots !== false) {
|
|
114
|
-
// await response to only continue with next task if current task finished within slot
|
|
115
|
-
await task;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
try {
|
|
119
|
-
await sleep(this.timeUntilNext(timeItem), signal);
|
|
120
|
-
// calling getCurrentSlot here may not be correct when we're close to the next slot
|
|
121
|
-
// it's safe to call getCurrentSlotAround after we sleep
|
|
122
|
-
const nextSlot = getCurrentSlotAround(this.config, this.genesisTime);
|
|
123
|
-
|
|
124
|
-
if (timeItem === TimeItem.Slot) {
|
|
125
|
-
if (nextSlot > slot + 1) {
|
|
126
|
-
// It's not very likely that we skip more than one slot as HTTP timeout is set
|
|
127
|
-
// to SLOT_DURATION_MS so we will fail task before skipping another slot.
|
|
128
|
-
this.logger.warn("Skipped slot due to task taking more than one slot to run", {
|
|
129
|
-
skippedSlot: slot + 1,
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
slotOrEpoch = nextSlot;
|
|
133
|
-
} else {
|
|
134
|
-
slotOrEpoch = computeEpochAtSlot(nextSlot);
|
|
135
|
-
}
|
|
136
|
-
slot = nextSlot;
|
|
137
|
-
} catch (e) {
|
|
138
|
-
if (e instanceof ErrorAborted) {
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
throw e;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
private timeUntilNext(timeItem: TimeItem): number {
|
|
147
|
-
const milliSecondsPerSlot = this.config.SLOT_DURATION_MS;
|
|
148
|
-
const msFromGenesis = Date.now() - this.genesisTime * 1000;
|
|
149
|
-
|
|
150
|
-
if (timeItem === TimeItem.Slot) {
|
|
151
|
-
if (msFromGenesis >= 0) {
|
|
152
|
-
return milliSecondsPerSlot - (msFromGenesis % milliSecondsPerSlot);
|
|
153
|
-
}
|
|
154
|
-
return Math.abs(msFromGenesis) % milliSecondsPerSlot;
|
|
155
|
-
}
|
|
156
|
-
const milliSecondsPerEpoch = SLOTS_PER_EPOCH * milliSecondsPerSlot;
|
|
157
|
-
if (msFromGenesis >= 0) {
|
|
158
|
-
return milliSecondsPerEpoch - (msFromGenesis % milliSecondsPerEpoch);
|
|
159
|
-
}
|
|
160
|
-
return Math.abs(msFromGenesis) % milliSecondsPerEpoch;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Same to the spec but we use Math.round instead of Math.floor.
|
|
166
|
-
*/
|
|
167
|
-
export function getCurrentSlotAround(config: ChainForkConfig, genesisTime: TimeSeconds): Slot {
|
|
168
|
-
const diffInSeconds = Date.now() / 1000 - genesisTime;
|
|
169
|
-
const slotsSinceGenesis = Math.round((diffInSeconds * 1000) / config.SLOT_DURATION_MS);
|
|
170
|
-
return GENESIS_SLOT + slotsSinceGenesis;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// function useEventStream() {
|
|
174
|
-
// this.stream = this.events.getEventStream([BeaconEventType.BLOCK, BeaconEventType.HEAD, BeaconEventType.CHAIN_REORG]);
|
|
175
|
-
// pipeToEmitter(this.stream, this).catch((e: Error) => {
|
|
176
|
-
// this.logger.error("Error on stream pipe", {}, e);
|
|
177
|
-
// });
|
|
178
|
-
|
|
179
|
-
// // On stop
|
|
180
|
-
// this.stream.stop();
|
|
181
|
-
// this.stream = null;
|
|
182
|
-
// }
|