@lodestar/beacon-node 1.35.0-dev.ba92bd8a88 → 1.35.0-dev.c1880f6940
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/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +5 -3
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +4 -3
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +8 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +1 -7
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +2 -3
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +2 -3
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/attestationPool.js +3 -5
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts +3 -2
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +6 -5
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/types.d.ts +1 -1
- package/lib/chain/opPools/types.d.ts.map +1 -1
- package/lib/chain/opPools/types.js +1 -1
- package/lib/chain/opPools/types.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts +3 -3
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +8 -8
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +9 -8
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/validation/lightClientFinalityUpdate.d.ts.map +1 -1
- package/lib/chain/validation/lightClientFinalityUpdate.js +4 -3
- package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.d.ts +6 -4
- package/lib/chain/validation/lightClientOptimisticUpdate.d.ts.map +1 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.js +11 -11
- package/lib/chain/validation/lightClientOptimisticUpdate.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +20 -14
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +1 -1
- package/lib/metrics/metrics/lodestar.js +3 -3
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/network.d.ts +1 -1
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +9 -9
- package/lib/network/network.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +0 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +5 -5
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/util/clock.d.ts +5 -0
- package/lib/util/clock.d.ts.map +1 -1
- package/lib/util/clock.js +3 -0
- package/lib/util/clock.js.map +1 -1
- package/package.json +14 -14
- package/src/api/impl/validator/index.ts +5 -3
- package/src/chain/blocks/blockInput/blockInput.ts +2 -1
- package/src/chain/blocks/importBlock.ts +4 -10
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +10 -2
- package/src/chain/blocks/writeBlockInputToDb.ts +1 -9
- package/src/chain/chain.ts +2 -13
- package/src/chain/opPools/attestationPool.ts +2 -3
- package/src/chain/opPools/syncCommitteeMessagePool.ts +5 -3
- package/src/chain/opPools/types.ts +1 -1
- package/src/chain/prepareNextSlot.ts +8 -8
- package/src/chain/stateCache/persistentCheckpointsCache.ts +10 -8
- package/src/chain/validation/lightClientFinalityUpdate.ts +4 -3
- package/src/chain/validation/lightClientOptimisticUpdate.ts +12 -11
- package/src/chain/validatorMonitor.ts +27 -17
- package/src/metrics/metrics/lodestar.ts +3 -3
- package/src/network/network.ts +9 -9
- package/src/sync/unknownBlock.ts +5 -5
- package/src/util/clock.ts +8 -0
package/lib/util/clock.d.ts
CHANGED
|
@@ -52,6 +52,10 @@ export type IClock = StrictEventEmitter<EventEmitter, ClockEvents> & {
|
|
|
52
52
|
* Return second from a slot to either toSec or now.
|
|
53
53
|
*/
|
|
54
54
|
secFromSlot(slot: Slot, toSec?: number): number;
|
|
55
|
+
/**
|
|
56
|
+
* Return milliseconds from a slot to either toMs or now.
|
|
57
|
+
*/
|
|
58
|
+
msFromSlot(slot: Slot, toMs?: number): number;
|
|
55
59
|
};
|
|
56
60
|
/**
|
|
57
61
|
* A local clock, the clock time is assumed to be trusted
|
|
@@ -84,6 +88,7 @@ export declare class Clock extends EventEmitter implements IClock {
|
|
|
84
88
|
isCurrentSlotGivenGossipDisparity(slot: Slot): boolean;
|
|
85
89
|
waitForSlot(slot: Slot): Promise<void>;
|
|
86
90
|
secFromSlot(slot: Slot, toSec?: number): number;
|
|
91
|
+
msFromSlot(slot: Slot, toMs?: number): number;
|
|
87
92
|
private onNextSlot;
|
|
88
93
|
private msUntilNextSlot;
|
|
89
94
|
}
|
package/lib/util/clock.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../../src/util/clock.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,KAAK,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAIjD,oBAAY,UAAU;IACpB;;;OAGG;IACH,IAAI,eAAe;IACnB;;;OAGG;IACH,KAAK,gBAAgB;CACtB;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACxC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,MAAM,GAAG,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG;IACnE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B;;OAEG;IACH,QAAQ,CAAC,8BAA8B,EAAE,IAAI,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC;IAC7B,8EAA8E;IAC9E,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACpD,8EAA8E;IAC9E,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD;;OAEG;IACH,iCAAiC,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IACvD;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../../src/util/clock.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,KAAK,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAIjD,oBAAY,UAAU;IACpB;;;OAGG;IACH,IAAI,eAAe;IACnB;;;OAGG;IACH,KAAK,gBAAgB;CACtB;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACxC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,MAAM,GAAG,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG;IACnE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B;;OAEG;IACH,QAAQ,CAAC,8BAA8B,EAAE,IAAI,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC;IAC7B,8EAA8E;IAC9E,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACpD,8EAA8E;IAC9E,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD;;OAEG;IACH,iCAAiC,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IACvD;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/C,CAAC;AAEF;;GAEG;AACH,qBAAa,KAAM,SAAQ,YAAa,YAAW,MAAM;IACvD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,YAAY,CAAS;gBAEjB,EAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAC,EAAE;QAAC,MAAM,EAAE,eAAe,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAC;IAW9G,IAAI,WAAW,IAAI,IAAI,CAOtB;IAED;;;OAGG;IACH,IAAI,8BAA8B,IAAI,IAAI,CAIzC;IAED,IAAI,YAAY,IAAI,KAAK,CAExB;IAED,8EAA8E;IAC9E,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAKnD,8EAA8E;IAC9E,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAKjD;;OAEG;IACH,iCAAiC,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAkBhD,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC5C,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,SAAoB,GAAG,MAAM;IAI1D,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,SAAa,GAAG,MAAM;IAIjD,OAAO,CAAC,UAAU,CAqBhB;IAEF,OAAO,CAAC,eAAe;CAKxB"}
|
package/lib/util/clock.js
CHANGED
|
@@ -112,6 +112,9 @@ export class Clock extends EventEmitter {
|
|
|
112
112
|
secFromSlot(slot, toSec = Date.now() / 1000) {
|
|
113
113
|
return toSec - (this.genesisTime + slot * this.config.SECONDS_PER_SLOT);
|
|
114
114
|
}
|
|
115
|
+
msFromSlot(slot, toMs = Date.now()) {
|
|
116
|
+
return toMs - (this.genesisTime * 1000 + slot * this.config.SLOT_DURATION_MS);
|
|
117
|
+
}
|
|
115
118
|
onNextSlot = (slot) => {
|
|
116
119
|
const clockSlot = slot ?? getCurrentSlot(this.config, this.genesisTime);
|
|
117
120
|
// process multiple clock slots in the case the main thread has been saturated for > SECONDS_PER_SLOT
|
package/lib/util/clock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/util/clock.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AAGvC,OAAO,EAAC,kBAAkB,EAAE,iBAAiB,EAAE,cAAc,EAAC,MAAM,4BAA4B,CAAC;AAEjG,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAC,8BAA8B,EAAC,MAAM,2BAA2B,CAAC;AAEzE,MAAM,CAAN,IAAY,UAWX;AAXD,WAAY,UAAU;IACpB;;;OAGG;IACH,iCAAmB,CAAA;IACnB;;;OAGG;IACH,mCAAqB,CAAA;AACvB,CAAC,EAXW,UAAU,KAAV,UAAU,QAWrB;
|
|
1
|
+
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/util/clock.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"bugs": {
|
|
12
12
|
"url": "https://github.com/ChainSafe/lodestar/issues"
|
|
13
13
|
},
|
|
14
|
-
"version": "1.35.0-dev.
|
|
14
|
+
"version": "1.35.0-dev.c1880f6940",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -134,18 +134,18 @@
|
|
|
134
134
|
"@libp2p/peer-id": "^5.1.0",
|
|
135
135
|
"@libp2p/prometheus-metrics": "^4.3.15",
|
|
136
136
|
"@libp2p/tcp": "^10.1.8",
|
|
137
|
-
"@lodestar/api": "1.35.0-dev.
|
|
138
|
-
"@lodestar/config": "1.35.0-dev.
|
|
139
|
-
"@lodestar/db": "1.35.0-dev.
|
|
140
|
-
"@lodestar/fork-choice": "1.35.0-dev.
|
|
141
|
-
"@lodestar/light-client": "1.35.0-dev.
|
|
142
|
-
"@lodestar/logger": "1.35.0-dev.
|
|
143
|
-
"@lodestar/params": "1.35.0-dev.
|
|
144
|
-
"@lodestar/reqresp": "1.35.0-dev.
|
|
145
|
-
"@lodestar/state-transition": "1.35.0-dev.
|
|
146
|
-
"@lodestar/types": "1.35.0-dev.
|
|
147
|
-
"@lodestar/utils": "1.35.0-dev.
|
|
148
|
-
"@lodestar/validator": "1.35.0-dev.
|
|
137
|
+
"@lodestar/api": "1.35.0-dev.c1880f6940",
|
|
138
|
+
"@lodestar/config": "1.35.0-dev.c1880f6940",
|
|
139
|
+
"@lodestar/db": "1.35.0-dev.c1880f6940",
|
|
140
|
+
"@lodestar/fork-choice": "1.35.0-dev.c1880f6940",
|
|
141
|
+
"@lodestar/light-client": "1.35.0-dev.c1880f6940",
|
|
142
|
+
"@lodestar/logger": "1.35.0-dev.c1880f6940",
|
|
143
|
+
"@lodestar/params": "1.35.0-dev.c1880f6940",
|
|
144
|
+
"@lodestar/reqresp": "1.35.0-dev.c1880f6940",
|
|
145
|
+
"@lodestar/state-transition": "1.35.0-dev.c1880f6940",
|
|
146
|
+
"@lodestar/types": "1.35.0-dev.c1880f6940",
|
|
147
|
+
"@lodestar/utils": "1.35.0-dev.c1880f6940",
|
|
148
|
+
"@lodestar/validator": "1.35.0-dev.c1880f6940",
|
|
149
149
|
"@multiformats/multiaddr": "^12.1.3",
|
|
150
150
|
"datastore-core": "^10.0.2",
|
|
151
151
|
"datastore-fs": "^10.0.6",
|
|
@@ -180,5 +180,5 @@
|
|
|
180
180
|
"beacon",
|
|
181
181
|
"blockchain"
|
|
182
182
|
],
|
|
183
|
-
"gitHead": "
|
|
183
|
+
"gitHead": "24dc56226b371993a4b44a05d474e836e914fe21"
|
|
184
184
|
}
|
|
@@ -66,7 +66,7 @@ import {
|
|
|
66
66
|
SyncCommitteeErrorCode,
|
|
67
67
|
} from "../../../chain/errors/index.js";
|
|
68
68
|
import {ChainEvent, CheckpointHex, CommonBlockBody} from "../../../chain/index.js";
|
|
69
|
-
import {
|
|
69
|
+
import {PREPARE_NEXT_SLOT_BPS} from "../../../chain/prepareNextSlot.js";
|
|
70
70
|
import {BlockType, ProduceFullDeneb} from "../../../chain/produceBlock/index.js";
|
|
71
71
|
import {RegenCaller} from "../../../chain/regen/index.js";
|
|
72
72
|
import {validateApiAggregateAndProof} from "../../../chain/validation/index.js";
|
|
@@ -108,6 +108,8 @@ export const SYNC_TOLERANCE_EPOCHS = 1;
|
|
|
108
108
|
* Empirically the builder block resolves in ~1 second, and execution block resolves in <500 ms.
|
|
109
109
|
* A cutoff of 2 seconds gives enough time and if there are unexpected delays it ensures we publish
|
|
110
110
|
* in time as proposals post 4 seconds into the slot will likely be orphaned due to proposer boost reorg.
|
|
111
|
+
*
|
|
112
|
+
* TODO GLOAS: re-evaluate cutoff timing
|
|
111
113
|
*/
|
|
112
114
|
const BLOCK_PRODUCTION_RACE_CUTOFF_MS = 2_000;
|
|
113
115
|
/** Overall timeout for execution and block production apis */
|
|
@@ -666,7 +668,7 @@ export function getValidatorApi(
|
|
|
666
668
|
: Promise.reject(new Error("Engine disabled"));
|
|
667
669
|
|
|
668
670
|
// Calculate cutoff time based on start of the slot
|
|
669
|
-
const cutoffMs = Math.max(0, BLOCK_PRODUCTION_RACE_CUTOFF_MS -
|
|
671
|
+
const cutoffMs = Math.max(0, BLOCK_PRODUCTION_RACE_CUTOFF_MS - chain.clock.msFromSlot(slot));
|
|
670
672
|
|
|
671
673
|
logger.verbose("Block production race (builder vs execution) starting", {
|
|
672
674
|
...loggerContext,
|
|
@@ -1017,7 +1019,7 @@ export function getValidatorApi(
|
|
|
1017
1019
|
let state: CachedBeaconStateAllForks | undefined = undefined;
|
|
1018
1020
|
const startSlot = computeStartSlotAtEpoch(epoch);
|
|
1019
1021
|
const slotMs = config.SECONDS_PER_SLOT * 1000;
|
|
1020
|
-
const prepareNextSlotLookAheadMs = slotMs
|
|
1022
|
+
const prepareNextSlotLookAheadMs = slotMs - config.getSlotComponentDurationMs(PREPARE_NEXT_SLOT_BPS);
|
|
1021
1023
|
const toNextEpochMs = msToNextEpoch();
|
|
1022
1024
|
// validators may request next epoch's duties when it's close to next epoch
|
|
1023
1025
|
// this is to avoid missed block proposal due to 0 epoch look ahead
|
|
@@ -652,7 +652,8 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
|
|
|
652
652
|
static createFromColumn(
|
|
653
653
|
props: AddColumn & CreateBlockInputMeta & {sampledColumns: ColumnIndex[]; custodyColumns: ColumnIndex[]}
|
|
654
654
|
): BlockInputColumns {
|
|
655
|
-
const hasAllData =
|
|
655
|
+
const hasAllData =
|
|
656
|
+
props.daOutOfRange || props.columnSidecar.kzgCommitments.length === 0 || props.sampledColumns.length === 0;
|
|
656
657
|
const state: BlockInputColumnsState = {
|
|
657
658
|
hasBlock: false,
|
|
658
659
|
hasAllData,
|
|
@@ -7,14 +7,7 @@ import {
|
|
|
7
7
|
ForkChoiceErrorCode,
|
|
8
8
|
NotReorgedReason,
|
|
9
9
|
} from "@lodestar/fork-choice";
|
|
10
|
-
import {
|
|
11
|
-
ForkPostAltair,
|
|
12
|
-
ForkPostElectra,
|
|
13
|
-
ForkSeq,
|
|
14
|
-
INTERVALS_PER_SLOT,
|
|
15
|
-
MAX_SEED_LOOKAHEAD,
|
|
16
|
-
SLOTS_PER_EPOCH,
|
|
17
|
-
} from "@lodestar/params";
|
|
10
|
+
import {ForkPostAltair, ForkPostElectra, ForkSeq, MAX_SEED_LOOKAHEAD, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
18
11
|
import {
|
|
19
12
|
CachedBeaconStateAltair,
|
|
20
13
|
EpochCache,
|
|
@@ -267,8 +260,9 @@ export async function importBlock(
|
|
|
267
260
|
// We want to track recent blocks coming from gossip, unknown block sync, and API.
|
|
268
261
|
if (delaySec < SLOTS_PER_EPOCH * this.config.SECONDS_PER_SLOT) {
|
|
269
262
|
this.metrics.importBlock.elapsedTimeTillBecomeHead.observe(delaySec);
|
|
270
|
-
|
|
271
|
-
|
|
263
|
+
const cutOffSec = this.config.getAttestationDueMs(this.config.getForkName(blockSlot)) / 1000;
|
|
264
|
+
if (delaySec > cutOffSec) {
|
|
265
|
+
this.metrics.importBlock.setHeadAfterCutoff.inc();
|
|
272
266
|
}
|
|
273
267
|
}
|
|
274
268
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {DataAvailabilityStatus} from "@lodestar/state-transition";
|
|
2
|
-
import {DAType, IBlockInput} from "./blockInput/index.js";
|
|
2
|
+
import {DAData, DAType, IBlockInput} from "./blockInput/index.js";
|
|
3
3
|
|
|
4
4
|
// we can now wait for full 12 seconds because unavailable block sync will try pulling
|
|
5
5
|
// the blobs from the network anyway after 500ms of seeing the block
|
|
@@ -18,7 +18,15 @@ export async function verifyBlocksDataAvailability(
|
|
|
18
18
|
dataAvailabilityStatuses: DataAvailabilityStatus[];
|
|
19
19
|
availableTime: number;
|
|
20
20
|
}> {
|
|
21
|
-
|
|
21
|
+
const promises: Promise<DAData>[] = [];
|
|
22
|
+
for (const blockInput of blocks) {
|
|
23
|
+
// block verification is triggered on a verified gossip block so we only need to wait for all data
|
|
24
|
+
if (!blockInput.hasAllData()) {
|
|
25
|
+
promises.push(blockInput.waitForAllData(BLOB_AVAILABILITY_TIMEOUT, signal));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
await Promise.all(promises);
|
|
29
|
+
|
|
22
30
|
const availableTime = Math.max(0, Math.max(...blocks.map((blockInput) => blockInput.getTimeComplete())));
|
|
23
31
|
const dataAvailabilityStatuses: DataAvailabilityStatus[] = blocks.map((blockInput) => {
|
|
24
32
|
if (blockInput.type === DAType.PreData) {
|
|
@@ -102,15 +102,7 @@ export async function removeEagerlyPersistedBlockInputs(this: BeaconChain, block
|
|
|
102
102
|
if (!this.forkChoice.hasBlockHex(blockRootHex)) {
|
|
103
103
|
blockToRemove.push(block);
|
|
104
104
|
|
|
105
|
-
if (isBlockInputColumns(blockInput)) {
|
|
106
|
-
const {custodyColumns} = this.custodyConfig;
|
|
107
|
-
const dataColumnsLen = custodyColumns.length;
|
|
108
|
-
const dataColumnSidecars = blockInput.getCustodyColumns();
|
|
109
|
-
if (dataColumnSidecars.length !== dataColumnsLen) {
|
|
110
|
-
throw Error(
|
|
111
|
-
`Invalid dataColumnSidecars=${dataColumnSidecars.length} for custody expected custodyColumnsLen=${dataColumnsLen}`
|
|
112
|
-
);
|
|
113
|
-
}
|
|
105
|
+
if (isBlockInputColumns(blockInput) && blockInput.getCustodyColumns().length > 0) {
|
|
114
106
|
dataColumnsToRemove.push(blockRoot);
|
|
115
107
|
} else if (isBlockInputBlobs(blockInput)) {
|
|
116
108
|
const blobSidecars = blockInput.getBlobs();
|
package/src/chain/chain.ts
CHANGED
|
@@ -254,20 +254,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
254
254
|
if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
|
|
255
255
|
|
|
256
256
|
this.blacklistedBlocks = new Map((opts.blacklistedBlocks ?? []).map((hex) => [hex, null]));
|
|
257
|
-
|
|
258
|
-
this.attestationPool = new AttestationPool(
|
|
259
|
-
config,
|
|
260
|
-
clock,
|
|
261
|
-
preAggregateCutOffTime,
|
|
262
|
-
this.opts?.preaggregateSlotDistance,
|
|
263
|
-
metrics
|
|
264
|
-
);
|
|
257
|
+
this.attestationPool = new AttestationPool(config, clock, this.opts?.preaggregateSlotDistance, metrics);
|
|
265
258
|
this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
|
|
266
|
-
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(
|
|
267
|
-
clock,
|
|
268
|
-
preAggregateCutOffTime,
|
|
269
|
-
this.opts?.preaggregateSlotDistance
|
|
270
|
-
);
|
|
259
|
+
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
|
|
271
260
|
this.syncContributionAndProofPool = new SyncContributionAndProofPool(clock, metrics, logger);
|
|
272
261
|
|
|
273
262
|
this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
|
|
@@ -74,7 +74,6 @@ export class AttestationPool {
|
|
|
74
74
|
constructor(
|
|
75
75
|
private readonly config: ChainForkConfig,
|
|
76
76
|
private readonly clock: IClock,
|
|
77
|
-
private readonly cutOffSecFromSlot: number,
|
|
78
77
|
private readonly preaggregateSlotDistance = 0,
|
|
79
78
|
private readonly metrics: Metrics | null = null
|
|
80
79
|
) {}
|
|
@@ -98,7 +97,7 @@ export class AttestationPool {
|
|
|
98
97
|
* `SignedAggregateAndProof`.
|
|
99
98
|
*
|
|
100
99
|
* If the attestation is too old (low slot) to be included in the pool it is simply dropped
|
|
101
|
-
* and no error is returned. Also if it's at clock slot but come to the pool later than
|
|
100
|
+
* and no error is returned. Also if it's at clock slot but come to the pool later than AGGREGATE_DUE_BPS
|
|
102
101
|
* of slot time, it's dropped too since it's not helpful for the validator anymore
|
|
103
102
|
*
|
|
104
103
|
* Expects the attestation to be fully validated:
|
|
@@ -126,7 +125,7 @@ export class AttestationPool {
|
|
|
126
125
|
|
|
127
126
|
// Reject gossip attestations in the current slot but come to this pool very late
|
|
128
127
|
// for api attestations, we allow them to be added to the pool
|
|
129
|
-
if (!priority && this.clock.
|
|
128
|
+
if (!priority && this.clock.msFromSlot(slot) > this.config.getAggregateDueMs(fork)) {
|
|
130
129
|
return InsertOutcome.Late;
|
|
131
130
|
}
|
|
132
131
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {Signature, aggregateSignatures} from "@chainsafe/blst";
|
|
2
2
|
import {BitArray} from "@chainsafe/ssz";
|
|
3
|
+
import {ChainForkConfig} from "@lodestar/config";
|
|
3
4
|
import {SYNC_COMMITTEE_SIZE, SYNC_COMMITTEE_SUBNET_COUNT} from "@lodestar/params";
|
|
4
5
|
import {Root, Slot, SubcommitteeIndex, SubnetID, altair} from "@lodestar/types";
|
|
5
6
|
import {MapDef, toRootHex} from "@lodestar/utils";
|
|
@@ -44,8 +45,8 @@ export class SyncCommitteeMessagePool {
|
|
|
44
45
|
private lowestPermissibleSlot = 0;
|
|
45
46
|
|
|
46
47
|
constructor(
|
|
48
|
+
private readonly config: ChainForkConfig,
|
|
47
49
|
private readonly clock: IClock,
|
|
48
|
-
private readonly cutOffSecFromSlot: number,
|
|
49
50
|
private readonly preaggregateSlotDistance = 0
|
|
50
51
|
) {}
|
|
51
52
|
|
|
@@ -68,6 +69,7 @@ export class SyncCommitteeMessagePool {
|
|
|
68
69
|
priority?: boolean
|
|
69
70
|
): InsertOutcome {
|
|
70
71
|
const {slot, beaconBlockRoot} = signature;
|
|
72
|
+
const fork = this.config.getForkName(slot);
|
|
71
73
|
const rootHex = toRootHex(beaconBlockRoot);
|
|
72
74
|
const lowestPermissibleSlot = this.lowestPermissibleSlot;
|
|
73
75
|
|
|
@@ -76,8 +78,8 @@ export class SyncCommitteeMessagePool {
|
|
|
76
78
|
return InsertOutcome.Old;
|
|
77
79
|
}
|
|
78
80
|
|
|
79
|
-
// validator gets SyncCommitteeContribution at
|
|
80
|
-
if (!priority && this.clock.
|
|
81
|
+
// validator gets SyncCommitteeContribution at CONTRIBUTION_DUE_BPS of slot, it's no use to preaggregate later than that time
|
|
82
|
+
if (!priority && this.clock.msFromSlot(slot) > this.config.getSyncContributionDueMs(fork)) {
|
|
81
83
|
return InsertOutcome.Late;
|
|
82
84
|
}
|
|
83
85
|
|
|
@@ -13,7 +13,7 @@ export enum InsertOutcome {
|
|
|
13
13
|
Old = "Old",
|
|
14
14
|
/** The pool has reached its limit. No changes were made. */
|
|
15
15
|
ReachLimit = "ReachLimit",
|
|
16
|
-
/** Messages don't bring any value, for example attestations come to the pool at >
|
|
16
|
+
/** Messages don't bring any value, for example attestations come to the pool at > AGGREGATE_DUE_BPS of slot. No changes were made */
|
|
17
17
|
Late = "Late",
|
|
18
18
|
/** The data is know, and the new participants have been added to the aggregated signature */
|
|
19
19
|
Aggregated = "Aggregated",
|
|
@@ -22,17 +22,18 @@ import {IBeaconChain} from "./interface.js";
|
|
|
22
22
|
import {getPayloadAttributesForSSE, prepareExecutionPayload} from "./produceBlock/produceBlockBody.js";
|
|
23
23
|
import {RegenCaller} from "./regen/index.js";
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
// TODO GLOAS: re-evaluate this timing
|
|
26
|
+
/* With 12s slot times, this scheduler will run 4s before the start of each slot (`12 - 0.6667 * 12 = 4`). */
|
|
27
|
+
export const PREPARE_NEXT_SLOT_BPS = 6667;
|
|
27
28
|
|
|
28
29
|
/* We don't want to do more epoch transition than this */
|
|
29
30
|
const PREPARE_EPOCH_LIMIT = 1;
|
|
30
31
|
|
|
31
32
|
/**
|
|
32
33
|
* At Bellatrix, if we are responsible for proposing in next slot, we want to prepare payload
|
|
33
|
-
* 4s
|
|
34
|
+
* 4s before the start of next slot at PREPARE_NEXT_SLOT_BPS of the current slot.
|
|
34
35
|
*
|
|
35
|
-
* For all forks, when clock
|
|
36
|
+
* For all forks, when clock reaches PREPARE_NEXT_SLOT_BPS of slot before an epoch, we want to prepare for the next epoch
|
|
36
37
|
* transition from our head so that:
|
|
37
38
|
* + validators vote for block head on time through attestation
|
|
38
39
|
* + validators propose blocks on time
|
|
@@ -74,10 +75,9 @@ export class PrepareNextSlotScheduler {
|
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
try {
|
|
77
|
-
// At
|
|
78
|
-
// epoch transition
|
|
79
|
-
|
|
80
|
-
await sleep(slotMs - slotMs / SCHEDULER_LOOKAHEAD_FACTOR, this.signal);
|
|
78
|
+
// At PREPARE_NEXT_SLOT_BPS (~67%) of the current slot we prepare payload for the next slot
|
|
79
|
+
// or precompute epoch transition
|
|
80
|
+
await sleep(this.config.getSlotComponentDurationMs(PREPARE_NEXT_SLOT_BPS), this.signal);
|
|
81
81
|
|
|
82
82
|
// calling updateHead() here before we produce a block to reduce reorg possibility
|
|
83
83
|
const {slot: headSlot, blockRoot: headRoot} = this.chain.recomputeForkChoiceHead(
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
|
-
import {INTERVALS_PER_SLOT} from "@lodestar/params";
|
|
3
2
|
import {
|
|
4
3
|
CachedBeaconStateAllForks,
|
|
5
4
|
computeStartSlotAtEpoch,
|
|
@@ -59,6 +58,9 @@ type LoadedStateBytesData = {persistedKey: DatastoreKey; stateBytes: Uint8Array}
|
|
|
59
58
|
*/
|
|
60
59
|
export const DEFAULT_MAX_CP_STATE_EPOCHS_IN_MEMORY = 3;
|
|
61
60
|
|
|
61
|
+
// TODO GLOAS: re-evaluate this timing
|
|
62
|
+
const PROCESS_CHECKPOINT_STATES_BPS = 6667;
|
|
63
|
+
|
|
62
64
|
/**
|
|
63
65
|
* An implementation of CheckpointStateCache that keep up to n epoch checkpoint states in memory and persist the rest to disk
|
|
64
66
|
* - If it's more than `maxEpochsInMemory` epochs old, it will persist n last epochs to disk based on the view of the block
|
|
@@ -464,14 +466,14 @@ export class PersistentCheckpointStateCache implements CheckpointStateCache {
|
|
|
464
466
|
}
|
|
465
467
|
|
|
466
468
|
const blockSlot = state.slot;
|
|
467
|
-
const
|
|
469
|
+
const processCPStatesTimeMs = state.config.getSlotComponentDurationMs(PROCESS_CHECKPOINT_STATES_BPS);
|
|
468
470
|
// we always have clock in production, fallback value is only for test
|
|
469
|
-
const
|
|
470
|
-
const
|
|
471
|
-
if (
|
|
472
|
-
//
|
|
473
|
-
// normally it should only persist checkpoint states at
|
|
474
|
-
await sleep(
|
|
471
|
+
const msFromSlot = this.clock?.msFromSlot(blockSlot) ?? processCPStatesTimeMs;
|
|
472
|
+
const msToProcessCPStates = processCPStatesTimeMs - msFromSlot;
|
|
473
|
+
if (msToProcessCPStates > 0) {
|
|
474
|
+
// At ~67% of slot is the most free time of every slot, take that chance to persist checkpoint states
|
|
475
|
+
// normally it should only persist checkpoint states at ~67% of slot 0 of epoch
|
|
476
|
+
await sleep(msToProcessCPStates, this.signal);
|
|
475
477
|
}
|
|
476
478
|
// at syncing time, it's critical to persist checkpoint states as soon as possible to avoid OOM during unfinality time
|
|
477
479
|
// if node is synced this is not a hot time because block comes late, we'll likely miss attestation already, or the block is orphaned
|
|
@@ -25,9 +25,10 @@ export function validateLightClientFinalityUpdate(
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
// [IGNORE] The finality_update is received after the block at signature_slot was given enough time to propagate
|
|
28
|
-
// through the network -- i.e. validate that
|
|
29
|
-
// (
|
|
30
|
-
|
|
28
|
+
// through the network -- i.e. validate that `get_sync_message_due_ms(epoch)`
|
|
29
|
+
// milliseconds (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance) has
|
|
30
|
+
// transpired since the start of `signature_slot`.
|
|
31
|
+
if (updateReceivedTooEarly(config, chain.clock, gossipedFinalityUpdate)) {
|
|
31
32
|
throw new LightClientError(GossipAction.IGNORE, {
|
|
32
33
|
code: LightClientErrorCode.FINALITY_UPDATE_RECEIVED_TOO_EARLY,
|
|
33
34
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {ChainForkConfig} from "@lodestar/config";
|
|
2
|
-
import {computeTimeAtSlot} from "@lodestar/state-transition";
|
|
3
2
|
import {LightClientOptimisticUpdate} from "@lodestar/types";
|
|
4
3
|
import {MAXIMUM_GOSSIP_CLOCK_DISPARITY} from "../../constants/index.js";
|
|
5
4
|
import {assertLightClientServer} from "../../node/utils/lightclient.js";
|
|
5
|
+
import {IClock} from "../../util/clock.js";
|
|
6
6
|
import {GossipAction} from "../errors/index.js";
|
|
7
7
|
import {LightClientError, LightClientErrorCode} from "../errors/lightClientError.js";
|
|
8
8
|
import {IBeaconChain} from "../interface.js";
|
|
@@ -26,9 +26,10 @@ export function validateLightClientOptimisticUpdate(
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// [IGNORE] The optimistic_update is received after the block at signature_slot was given enough time to propagate
|
|
29
|
-
// through the network -- i.e. validate that
|
|
30
|
-
// (
|
|
31
|
-
|
|
29
|
+
// through the network -- i.e. validate that `get_sync_message_due_ms(epoch)`
|
|
30
|
+
// milliseconds (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance) has
|
|
31
|
+
// transpired since the start of `signature_slot`.
|
|
32
|
+
if (updateReceivedTooEarly(config, chain.clock, gossipedOptimisticUpdate)) {
|
|
32
33
|
throw new LightClientError(GossipAction.IGNORE, {
|
|
33
34
|
code: LightClientErrorCode.OPTIMISTIC_UPDATE_RECEIVED_TOO_EARLY,
|
|
34
35
|
});
|
|
@@ -48,20 +49,20 @@ export function validateLightClientOptimisticUpdate(
|
|
|
48
49
|
/**
|
|
49
50
|
* Returns true, if the spec condition below triggers an IGNORE.
|
|
50
51
|
*
|
|
51
|
-
* Sig +
|
|
52
|
+
* Sig + SYNC_MESSAGE_DUE_BPS time
|
|
52
53
|
* -----|-----
|
|
53
54
|
* xxx|------- (x is not okay)
|
|
54
55
|
*
|
|
55
56
|
* [IGNORE] The *update is received after the block at signature_slot was given enough time to propagate
|
|
56
|
-
* through the network -- i.e. validate that
|
|
57
|
-
* (
|
|
57
|
+
* through the network -- i.e. validate that `get_sync_message_due_ms(epoch)`
|
|
58
|
+
* milliseconds (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance) has
|
|
59
|
+
* transpired since the start of `signature_slot`.
|
|
58
60
|
*/
|
|
59
61
|
export function updateReceivedTooEarly(
|
|
60
62
|
config: ChainForkConfig,
|
|
61
|
-
|
|
63
|
+
clock: IClock,
|
|
62
64
|
update: Pick<LightClientOptimisticUpdate, "signatureSlot">
|
|
63
65
|
): boolean {
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
return Date.now() < earliestAllowedTimestampMs;
|
|
66
|
+
const fork = config.getForkName(update.signatureSlot);
|
|
67
|
+
return clock.msFromSlot(update.signatureSlot) < config.getSyncMessageDueMs(fork) - MAXIMUM_GOSSIP_CLOCK_DISPARITY;
|
|
67
68
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {ForkSeq,
|
|
1
|
+
import {ChainForkConfig} from "@lodestar/config";
|
|
2
|
+
import {ForkSeq, MIN_ATTESTATION_INCLUSION_DELAY, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
3
3
|
import {
|
|
4
4
|
CachedBeaconStateAllForks,
|
|
5
5
|
CachedBeaconStateAltair,
|
|
@@ -34,8 +34,9 @@ const MAX_CACHED_EPOCHS = 4;
|
|
|
34
34
|
|
|
35
35
|
const MAX_CACHED_DISTINCT_TARGETS = 4;
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
const
|
|
37
|
+
// TODO GLOAS: re-evaluate these timings
|
|
38
|
+
const LATE_ATTESTATION_SUBMISSION_BPS = 5000;
|
|
39
|
+
const LATE_BLOCK_SUBMISSION_BPS = 2500;
|
|
39
40
|
|
|
40
41
|
const RETAIN_REGISTERED_VALIDATORS_MS = 1 * 3600 * 1000; // 1 hour
|
|
41
42
|
|
|
@@ -450,8 +451,11 @@ export function createValidatorMonitor(
|
|
|
450
451
|
|
|
451
452
|
onPoolSubmitUnaggregatedAttestation(seenTimestampSec, indexedAttestation, subnet, sentPeers) {
|
|
452
453
|
const data = indexedAttestation.data;
|
|
453
|
-
|
|
454
|
-
|
|
454
|
+
const fork = config.getForkName(data.slot);
|
|
455
|
+
// Returns the duration between when the attestation `data` could be produced (ATTESTATION_DUE_BPS through the slot) and `seenTimestamp`.
|
|
456
|
+
const delaySec =
|
|
457
|
+
seenTimestampSec -
|
|
458
|
+
(genesisTime + data.slot * config.SECONDS_PER_SLOT + config.getAttestationDueMs(fork) / 1000);
|
|
455
459
|
for (const index of indexedAttestation.attestingIndices) {
|
|
456
460
|
const validator = validators.get(index);
|
|
457
461
|
if (validator) {
|
|
@@ -483,8 +487,11 @@ export function createValidatorMonitor(
|
|
|
483
487
|
const src = OpSource.gossip;
|
|
484
488
|
const data = indexedAttestation.data;
|
|
485
489
|
const epoch = computeEpochAtSlot(data.slot);
|
|
486
|
-
|
|
487
|
-
|
|
490
|
+
const fork = config.getForkName(data.slot);
|
|
491
|
+
// Returns the duration between when the attestation `data` could be produced (ATTESTATION_DUE_BPS through the slot) and `seenTimestamp`.
|
|
492
|
+
const delaySec =
|
|
493
|
+
seenTimestampSec -
|
|
494
|
+
(genesisTime + data.slot * config.SECONDS_PER_SLOT + config.getAttestationDueMs(fork) / 1000);
|
|
488
495
|
|
|
489
496
|
for (const index of indexedAttestation.attestingIndices) {
|
|
490
497
|
const validator = validators.get(index);
|
|
@@ -500,8 +507,10 @@ export function createValidatorMonitor(
|
|
|
500
507
|
|
|
501
508
|
onPoolSubmitAggregatedAttestation(seenTimestampSec, indexedAttestation, sentPeers) {
|
|
502
509
|
const data = indexedAttestation.data;
|
|
503
|
-
|
|
504
|
-
|
|
510
|
+
const fork = config.getForkName(data.slot);
|
|
511
|
+
// Returns the duration between when a `AggregateAndproof` with `data` could be produced (AGGREGATE_DUE_BPS through the slot) and `seenTimestamp`.
|
|
512
|
+
const delaySec =
|
|
513
|
+
seenTimestampSec - (genesisTime + data.slot * config.SECONDS_PER_SLOT + config.getAggregateDueMs(fork) / 1000);
|
|
505
514
|
|
|
506
515
|
for (const index of indexedAttestation.attestingIndices) {
|
|
507
516
|
const validator = validators.get(index);
|
|
@@ -527,8 +536,10 @@ export function createValidatorMonitor(
|
|
|
527
536
|
const src = OpSource.gossip;
|
|
528
537
|
const data = indexedAttestation.data;
|
|
529
538
|
const epoch = computeEpochAtSlot(data.slot);
|
|
530
|
-
|
|
531
|
-
|
|
539
|
+
const fork = config.getForkName(data.slot);
|
|
540
|
+
// Returns the duration between when a `AggregateAndproof` with `data` could be produced (AGGREGATE_DUE_BPS through the slot) and `seenTimestamp`.
|
|
541
|
+
const delaySec =
|
|
542
|
+
seenTimestampSec - (genesisTime + data.slot * config.SECONDS_PER_SLOT + config.getAggregateDueMs(fork) / 1000);
|
|
532
543
|
|
|
533
544
|
const aggregatorIndex = signedAggregateAndProof.message.aggregatorIndex;
|
|
534
545
|
const validatorAggregator = validators.get(aggregatorIndex);
|
|
@@ -822,7 +833,7 @@ export function createValidatorMonitor(
|
|
|
822
833
|
* - Was the attestation seen in a block?
|
|
823
834
|
*/
|
|
824
835
|
function renderAttestationSummary(
|
|
825
|
-
config:
|
|
836
|
+
config: ChainForkConfig,
|
|
826
837
|
rootCache: RootHexCache,
|
|
827
838
|
summary: AttestationSummary | undefined,
|
|
828
839
|
flags: ParticipationFlags
|
|
@@ -925,8 +936,7 @@ function renderAttestationSummary(
|
|
|
925
936
|
}
|
|
926
937
|
|
|
927
938
|
const submittedLate =
|
|
928
|
-
summary.poolSubmitDelayMinSec >
|
|
929
|
-
(INTERVALS_LATE_ATTESTATION_SUBMISSION * config.SECONDS_PER_SLOT) / INTERVALS_PER_SLOT;
|
|
939
|
+
summary.poolSubmitDelayMinSec > config.getSlotComponentDurationMs(LATE_ATTESTATION_SUBMISSION_BPS) / 1000;
|
|
930
940
|
|
|
931
941
|
const aggregateInclusion = summary.aggregateInclusionDelaysSec.length > 0;
|
|
932
942
|
|
|
@@ -1030,7 +1040,7 @@ function isMissedSlot(rootCache: RootHexCache, slot: Slot): boolean {
|
|
|
1030
1040
|
}
|
|
1031
1041
|
|
|
1032
1042
|
function renderBlockProposalSummary(
|
|
1033
|
-
config:
|
|
1043
|
+
config: ChainForkConfig,
|
|
1034
1044
|
rootCache: RootHexCache,
|
|
1035
1045
|
summary: EpochSummary | undefined,
|
|
1036
1046
|
proposalSlot: Slot
|
|
@@ -1053,7 +1063,7 @@ function renderBlockProposalSummary(
|
|
|
1053
1063
|
|
|
1054
1064
|
if (
|
|
1055
1065
|
proposal.poolSubmitDelaySec !== null &&
|
|
1056
|
-
proposal.poolSubmitDelaySec >
|
|
1066
|
+
proposal.poolSubmitDelaySec > config.getSlotComponentDurationMs(LATE_BLOCK_SUBMISSION_BPS) / 1000
|
|
1057
1067
|
) {
|
|
1058
1068
|
out += "_late";
|
|
1059
1069
|
}
|
|
@@ -862,9 +862,9 @@ export function createLodestarMetrics(
|
|
|
862
862
|
help: "Time elapsed between block slot time and the time block becomes head",
|
|
863
863
|
buckets: [0.5, 1, 2, 4, 6, 12],
|
|
864
864
|
}),
|
|
865
|
-
|
|
866
|
-
name: "
|
|
867
|
-
help: "Total times an imported block is set as head after the
|
|
865
|
+
setHeadAfterCutoff: register.gauge({
|
|
866
|
+
name: "lodestar_import_block_set_head_after_cutoff_total",
|
|
867
|
+
help: "Total times an imported block is set as head after ATTESTATION_DUE_BPS of the slot",
|
|
868
868
|
}),
|
|
869
869
|
bySource: register.gauge<{source: BlockInputSource}>({
|
|
870
870
|
name: "lodestar_import_block_by_source_total",
|