@lodestar/beacon-node 1.51.0-dev.09763aa8d2 → 1.51.0-dev.14a10bec65

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.
Files changed (44) hide show
  1. package/lib/metrics/metrics/lodestar.d.ts +3 -0
  2. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  3. package/lib/metrics/metrics/lodestar.js +5 -0
  4. package/lib/metrics/metrics/lodestar.js.map +1 -1
  5. package/lib/network/core/networkCore.d.ts +2 -0
  6. package/lib/network/core/networkCore.d.ts.map +1 -1
  7. package/lib/network/core/networkCore.js +3 -0
  8. package/lib/network/core/networkCore.js.map +1 -1
  9. package/lib/network/core/networkCoreWorker.js +1 -0
  10. package/lib/network/core/networkCoreWorker.js.map +1 -1
  11. package/lib/network/core/networkCoreWorkerHandler.d.ts +2 -0
  12. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  13. package/lib/network/core/networkCoreWorkerHandler.js +3 -0
  14. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  15. package/lib/network/core/types.d.ts +2 -0
  16. package/lib/network/core/types.d.ts.map +1 -1
  17. package/lib/network/interface.d.ts +2 -0
  18. package/lib/network/interface.d.ts.map +1 -1
  19. package/lib/network/network.d.ts +2 -0
  20. package/lib/network/network.d.ts.map +1 -1
  21. package/lib/network/network.js +3 -0
  22. package/lib/network/network.js.map +1 -1
  23. package/lib/network/peers/peerManager.d.ts +2 -1
  24. package/lib/network/peers/peerManager.d.ts.map +1 -1
  25. package/lib/network/peers/peerManager.js.map +1 -1
  26. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  27. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  28. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  29. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  30. package/lib/sync/sync.d.ts +7 -0
  31. package/lib/sync/sync.d.ts.map +1 -1
  32. package/lib/sync/sync.js +61 -3
  33. package/lib/sync/sync.js.map +1 -1
  34. package/package.json +16 -16
  35. package/src/metrics/metrics/lodestar.ts +5 -0
  36. package/src/network/core/networkCore.ts +5 -0
  37. package/src/network/core/networkCoreWorker.ts +1 -0
  38. package/src/network/core/networkCoreWorkerHandler.ts +4 -0
  39. package/src/network/core/types.ts +2 -0
  40. package/src/network/interface.ts +2 -0
  41. package/src/network/network.ts +5 -0
  42. package/src/network/peers/peerManager.ts +1 -1
  43. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  44. package/src/sync/sync.ts +65 -4
@@ -1,4 +1,5 @@
1
- import { isForkPostFulu } from "@lodestar/params";
1
+ import { GENESIS_EPOCH, isForkPostFulu } from "@lodestar/params";
2
+ import { computeEpochAtSlot } from "@lodestar/state-transition";
2
3
  import { ssz } from "@lodestar/types";
3
4
  import { toHex, toRootHex } from "@lodestar/utils";
4
5
  // TODO: Why this value? (From Lighthouse)
@@ -8,6 +9,8 @@ export var IrrelevantPeerCode;
8
9
  IrrelevantPeerCode["INCOMPATIBLE_FORKS"] = "IRRELEVANT_PEER_INCOMPATIBLE_FORKS";
9
10
  IrrelevantPeerCode["DIFFERENT_CLOCKS"] = "IRRELEVANT_PEER_DIFFERENT_CLOCKS";
10
11
  IrrelevantPeerCode["DIFFERENT_FINALIZED"] = "IRRELEVANT_PEER_DIFFERENT_FINALIZED";
12
+ IrrelevantPeerCode["FINALIZED_EPOCH_TOO_HIGH"] = "IRRELEVANT_PEER_FINALIZED_EPOCH_TOO_HIGH";
13
+ IrrelevantPeerCode["INVALID_FINALIZED_ROOT"] = "IRRELEVANT_PEER_INVALID_FINALIZED_ROOT";
11
14
  IrrelevantPeerCode["NO_EARLIEST_AVAILABLE_SLOT"] = "NO_EARLIEST_AVAILABLE_SLOT";
12
15
  })(IrrelevantPeerCode || (IrrelevantPeerCode = {}));
13
16
  /**
@@ -30,32 +33,36 @@ export function assertPeerRelevance(forkName, remote, local, currentSlot) {
30
33
  if (slotDiff > FUTURE_SLOT_TOLERANCE) {
31
34
  return { code: IrrelevantPeerCode.DIFFERENT_CLOCKS, slotDiff };
32
35
  }
33
- // The remote's finalized epoch is less than or equal to ours, but the block root is
34
- // different to the one in our chain. Therefore, the node is on a different chain and we
35
- // should not communicate with them.
36
- if (remote.finalizedEpoch <= local.finalizedEpoch &&
37
- !isZeroRoot(remote.finalizedRoot) &&
38
- !isZeroRoot(local.finalizedRoot)) {
39
- // NOTE: due to preferring to not access chain state here, we can't check the finalized root against our history.
40
- // The impact of not doing check is low: peers that are behind us we can't confirm they are in the same chain as us.
41
- // In the worst case they will attempt to sync from us, fail and disconnect. The ENR fork check should be sufficient
42
- // to differentiate most peers in normal network conditions.
43
- const remoteRoot = remote.finalizedRoot;
44
- const expectedRoot = remote.finalizedEpoch === local.finalizedEpoch ? local.finalizedRoot : null;
45
- if (expectedRoot !== null && !ssz.Root.equals(remoteRoot, expectedRoot)) {
46
- return {
47
- code: IrrelevantPeerCode.DIFFERENT_FINALIZED,
48
- expectedRoot: expectedRoot, // forkChoice returns Tree BranchNode which the logger prints as {}
49
- remoteRoot: remoteRoot,
50
- };
51
- }
36
+ // A checkpoint can be finalized at the earliest at the start of epoch + 2
37
+ const maxFinalizedEpoch = Math.max(GENESIS_EPOCH, computeEpochAtSlot(Math.max(currentSlot, 0) + FUTURE_SLOT_TOLERANCE) - 2);
38
+ if (remote.finalizedEpoch > maxFinalizedEpoch) {
39
+ return {
40
+ code: IrrelevantPeerCode.FINALIZED_EPOCH_TOO_HIGH,
41
+ finalizedEpoch: remote.finalizedEpoch,
42
+ maxFinalizedEpoch,
43
+ };
44
+ }
45
+ if (remote.finalizedEpoch > GENESIS_EPOCH && isZeroRoot(remote.finalizedRoot)) {
46
+ return { code: IrrelevantPeerCode.INVALID_FINALIZED_ROOT };
47
+ }
48
+ // The remote's finalized epoch is equal to ours, but the block root is different to the one in our chain.
49
+ // Therefore, the node is on a different chain and we should not communicate with them.
50
+ if (remote.finalizedEpoch === local.finalizedEpoch &&
51
+ !isZeroRoot(local.finalizedRoot) &&
52
+ !ssz.Root.equals(remote.finalizedRoot, local.finalizedRoot)) {
53
+ return {
54
+ code: IrrelevantPeerCode.DIFFERENT_FINALIZED,
55
+ expectedRoot: local.finalizedRoot,
56
+ remoteRoot: remote.finalizedRoot,
57
+ };
52
58
  }
53
59
  if (isForkPostFulu(forkName) && remote.earliestAvailableSlot === undefined) {
54
60
  return {
55
61
  code: IrrelevantPeerCode.NO_EARLIEST_AVAILABLE_SLOT,
56
62
  };
57
63
  }
58
- // Note: Accept request status finalized checkpoint in the future, we do not know if it is a true finalized root
64
+ // Note: for a behind finalized checkpoint, we validate it more on the main thread against our history,
65
+ // see BeaconSync.verifyPastFinalizedCheckpoint
59
66
  return null;
60
67
  }
61
68
  export function isZeroRoot(root) {
@@ -70,6 +77,10 @@ export function renderIrrelevantPeerType(type) {
70
77
  return `DIFFERENT_CLOCKS slotDiff: ${type.slotDiff}`;
71
78
  case IrrelevantPeerCode.DIFFERENT_FINALIZED:
72
79
  return `DIFFERENT_FINALIZED root: ${toRootHex(type.remoteRoot)} expected: ${toRootHex(type.expectedRoot)}`;
80
+ case IrrelevantPeerCode.FINALIZED_EPOCH_TOO_HIGH:
81
+ return `FINALIZED_EPOCH_TOO_HIGH finalizedEpoch: ${type.finalizedEpoch} max: ${type.maxFinalizedEpoch}`;
82
+ case IrrelevantPeerCode.INVALID_FINALIZED_ROOT:
83
+ return "INVALID_FINALIZED_ROOT zero root for a non-genesis finalized epoch";
73
84
  case IrrelevantPeerCode.NO_EARLIEST_AVAILABLE_SLOT:
74
85
  return "No earliestAvailableSlot announced via peer Status";
75
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"assertPeerRelevance.js","sourceRoot":"","sources":["../../../../src/network/peers/utils/assertPeerRelevance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assertPeerRelevance.js","sourceRoot":"","sources":["../../../../src/network/peers/utils/assertPeerRelevance.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,12 @@
1
+ import { Status } from "@lodestar/types";
2
+ import { PeerIdStr } from "../util/peerId.js";
1
3
  import { IBeaconSync, SyncChainDebugState, SyncModules, SyncState, SyncingStatus } from "./interface.js";
2
4
  import { SyncOptions } from "./options.js";
3
5
  export declare class BeaconSync implements IBeaconSync {
4
6
  private readonly logger;
5
7
  private readonly network;
6
8
  private readonly chain;
9
+ private readonly db;
7
10
  private readonly metrics;
8
11
  private readonly opts;
9
12
  private readonly rangeSync;
@@ -31,6 +34,10 @@ export declare class BeaconSync implements IBeaconSync {
31
34
  * ours that we consider it fully sync'd with respect to our current chain.
32
35
  */
33
36
  private addPeer;
37
+ /**
38
+ * A behind peer's finalized checkpoint must be the canonical block in effect at the start slot of its epoch
39
+ */
40
+ verifyPastFinalizedCheckpoint(peer: PeerIdStr, remote: Status): Promise<void>;
34
41
  /**
35
42
  * Must be called by libp2p when a peer is removed from the peer manager
36
43
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAWA,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAC;AACxH,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAKzC,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IAEnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiB;IAElD,uBAAuB;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;IAChE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAE3C,YAAY,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAmDlD;IAED,KAAK,IAAI,IAAI,CAMZ;IAED,aAAa,IAAI,aAAa,CAyC7B;IAED,SAAS,IAAI,OAAO,CAGnB;IAED,QAAQ,IAAI,OAAO,CAElB;IAED,IAAI,KAAK,IAAI,SAAS,CA8BrB;IAED,wCAAwC;IACxC,uBAAuB,IAAI,mBAAmB,EAAE,CAE/C;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,OAAO,CAwBb;IAEF;;OAEG;IACH,OAAO,CAAC,UAAU,CAIhB;IAEF;;OAEG;IACH,OAAO,CAAC,eAAe,CAqDrB;IAEF,OAAO,CAAC,YAAY,CAMlB;IAEF,OAAO,CAAC,aAAa;CAkBtB"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAO,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAW7C,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAC;AACxH,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAKzC,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IAEnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiB;IAElD,uBAAuB;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;IAChE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAE3C,YAAY,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAoDlD;IAED,KAAK,IAAI,IAAI,CAMZ;IAED,aAAa,IAAI,aAAa,CAyC7B;IAED,SAAS,IAAI,OAAO,CAGnB;IAED,QAAQ,IAAI,OAAO,CAElB;IAED,IAAI,KAAK,IAAI,SAAS,CA8BrB;IAED,wCAAwC;IACxC,uBAAuB,IAAI,mBAAmB,EAAE,CAE/C;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,OAAO,CA6Bb;IAEF;;OAEG;IACG,6BAA6B,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6ClF;IAED;;OAEG;IACH,OAAO,CAAC,UAAU,CAIhB;IAEF;;OAEG;IACH,OAAO,CAAC,eAAe,CAqDrB;IAEF,OAAO,CAAC,YAAY,CAMlB;IAEF,OAAO,CAAC,aAAa;CAkBtB"}
package/lib/sync/sync.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import { SLOTS_PER_EPOCH } from "@lodestar/params";
2
+ import { computeStartSlotAtEpoch } from "@lodestar/state-transition";
2
3
  import { toRootHex } from "@lodestar/utils";
3
- import { GENESIS_SLOT } from "../constants/constants.js";
4
+ import { GENESIS_EPOCH, GENESIS_SLOT } from "../constants/constants.js";
5
+ import { GoodByeReasonCode } from "../constants/index.js";
4
6
  import { ExecutionEngineState } from "../execution/index.js";
5
- import { NetworkEvent } from "../network/index.js";
7
+ import { NetworkEvent, PeerAction } from "../network/index.js";
6
8
  import { ClockEvent } from "../util/clock.js";
7
9
  import { isOptimisticBlock } from "../util/forkChoice.js";
8
10
  import { MIN_EPOCH_TO_START_GOSSIP } from "./constants.js";
@@ -14,6 +16,7 @@ export class BeaconSync {
14
16
  logger;
15
17
  network;
16
18
  chain;
19
+ db;
17
20
  metrics;
18
21
  opts;
19
22
  rangeSync;
@@ -22,10 +25,11 @@ export class BeaconSync {
22
25
  peerSyncType = new Map();
23
26
  slotImportTolerance;
24
27
  constructor(opts, modules) {
25
- const { config, chain, metrics, network, logger } = modules;
28
+ const { config, chain, db, metrics, network, logger } = modules;
26
29
  this.opts = opts;
27
30
  this.network = network;
28
31
  this.chain = chain;
32
+ this.db = db;
29
33
  this.metrics = metrics;
30
34
  this.logger = logger;
31
35
  this.rangeSync = new RangeSync(modules, opts);
@@ -168,6 +172,10 @@ export class BeaconSync {
168
172
  */
169
173
  addPeer = (data) => {
170
174
  const localStatus = this.chain.getStatus();
175
+ // Genesis and equal finalized epochs are already checked by assertPeerRelevance in the network worker
176
+ if (data.status.finalizedEpoch > GENESIS_EPOCH && data.status.finalizedEpoch < localStatus.finalizedEpoch) {
177
+ void this.verifyPastFinalizedCheckpoint(data.peer, data.status);
178
+ }
171
179
  const syncType = getPeerSyncType(localStatus, data.status, this.chain.forkChoice, this.slotImportTolerance);
172
180
  this.logger.verbose("Peer sync type classified", {
173
181
  peer: data.peer,
@@ -188,6 +196,56 @@ export class BeaconSync {
188
196
  }
189
197
  this.updateSyncState();
190
198
  };
199
+ /**
200
+ * A behind peer's finalized checkpoint must be the canonical block in effect at the start slot of its epoch
201
+ */
202
+ async verifyPastFinalizedCheckpoint(peer, remote) {
203
+ const startSlot = computeStartSlotAtEpoch(remote.finalizedEpoch);
204
+ const root = toRootHex(remote.finalizedRoot);
205
+ try {
206
+ let reason = null;
207
+ // After a finality jump, finalized blocks stay in fork choice until the archiver migrates them.
208
+ // Fork choice is pruned only after archiving, so a miss here means the db already has this range.
209
+ const canonicalBlock = this.chain.forkChoice.getCanonicalBlockClosestLteSlot(startSlot);
210
+ if (canonicalBlock !== null) {
211
+ if (canonicalBlock.blockRoot === root)
212
+ return;
213
+ reason = "finalized_root_not_canonical";
214
+ }
215
+ else {
216
+ const slot = await this.db.blockArchive.getSlotByRoot(remote.finalizedRoot);
217
+ if (slot !== null && slot > startSlot) {
218
+ reason = "finalized_root_after_epoch_start";
219
+ }
220
+ else if (slot !== startSlot) {
221
+ const childSlot = await this.db.blockArchive.getSlotByParentRoot(remote.finalizedRoot);
222
+ if (childSlot !== null) {
223
+ if (childSlot <= startSlot)
224
+ reason = "finalized_root_not_in_effect_at_epoch_start";
225
+ }
226
+ else if (slot === null && startSlot > this.chain.earliestAvailableSlot) {
227
+ // childSlot == null too, neither the root nor a child is canonical
228
+ // or they are canonical and both pruned but peer's finalized epoch starts after earliestAvailableSlot
229
+ reason = "unknown_finalized_root";
230
+ }
231
+ }
232
+ }
233
+ if (reason !== null) {
234
+ this.logger.debug("Peer finalized checkpoint not in our chain", {
235
+ peer,
236
+ finalizedEpoch: remote.finalizedEpoch,
237
+ root,
238
+ reason,
239
+ });
240
+ this.metrics?.syncPeerFinalizedCheckpointMismatch.inc({ reason });
241
+ this.network.reportPeer(peer, PeerAction.Fatal, "PeerFinalizedCheckpointMismatch");
242
+ await this.network.goodbyeAndDisconnect(peer, GoodByeReasonCode.IRRELEVANT_NETWORK);
243
+ }
244
+ }
245
+ catch (e) {
246
+ this.logger.debug("Error verifying peer finalized checkpoint", { peer, finalizedEpoch: remote.finalizedEpoch, root }, e);
247
+ }
248
+ }
191
249
  /**
192
250
  * Must be called by libp2p when a peer is removed from the peer manager
193
251
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.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.51.0-dev.09763aa8d2",
14
+ "version": "1.51.0-dev.14a10bec65",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -126,18 +126,18 @@
126
126
  "@libp2p/prometheus-metrics": "^5.0.31",
127
127
  "@libp2p/tcp": "^11.0.30",
128
128
  "@libp2p/utils": "^7.4.3",
129
- "@lodestar/api": "^1.51.0-dev.09763aa8d2",
130
- "@lodestar/config": "^1.51.0-dev.09763aa8d2",
131
- "@lodestar/db": "^1.51.0-dev.09763aa8d2",
132
- "@lodestar/fork-choice": "^1.51.0-dev.09763aa8d2",
133
- "@lodestar/logger": "^1.51.0-dev.09763aa8d2",
134
- "@lodestar/native": "^1.51.0-dev.09763aa8d2",
135
- "@lodestar/params": "^1.51.0-dev.09763aa8d2",
136
- "@lodestar/reqresp": "^1.51.0-dev.09763aa8d2",
137
- "@lodestar/state-transition": "^1.51.0-dev.09763aa8d2",
138
- "@lodestar/types": "^1.51.0-dev.09763aa8d2",
139
- "@lodestar/utils": "^1.51.0-dev.09763aa8d2",
140
- "@lodestar/validator": "^1.51.0-dev.09763aa8d2",
129
+ "@lodestar/api": "^1.51.0-dev.14a10bec65",
130
+ "@lodestar/config": "^1.51.0-dev.14a10bec65",
131
+ "@lodestar/db": "^1.51.0-dev.14a10bec65",
132
+ "@lodestar/fork-choice": "^1.51.0-dev.14a10bec65",
133
+ "@lodestar/logger": "^1.51.0-dev.14a10bec65",
134
+ "@lodestar/native": "^1.51.0-dev.14a10bec65",
135
+ "@lodestar/params": "^1.51.0-dev.14a10bec65",
136
+ "@lodestar/reqresp": "^1.51.0-dev.14a10bec65",
137
+ "@lodestar/state-transition": "^1.51.0-dev.14a10bec65",
138
+ "@lodestar/types": "^1.51.0-dev.14a10bec65",
139
+ "@lodestar/utils": "^1.51.0-dev.14a10bec65",
140
+ "@lodestar/validator": "^1.51.0-dev.14a10bec65",
141
141
  "@multiformats/multiaddr": "^13.0.1",
142
142
  "datastore-core": "^12.0.1",
143
143
  "datastore-level": "^13.0.1",
@@ -159,8 +159,8 @@
159
159
  "@ethereumjs/rlp": "^4.0.1",
160
160
  "@libp2p/interface-internal": "^3.2.0",
161
161
  "@libp2p/logger": "^6.2.15",
162
- "@lodestar/spec-test-util": "^1.51.0-dev.09763aa8d2",
163
- "@lodestar/test-utils": "^1.51.0-dev.09763aa8d2",
162
+ "@lodestar/spec-test-util": "^1.51.0-dev.14a10bec65",
163
+ "@lodestar/test-utils": "^1.51.0-dev.14a10bec65",
164
164
  "@types/js-yaml": "^4.0.5",
165
165
  "@types/qs": "^6.9.7",
166
166
  "@types/tmp": "^0.2.3",
@@ -175,5 +175,5 @@
175
175
  "beacon",
176
176
  "blockchain"
177
177
  ],
178
- "gitHead": "d867a046ddf9403403cbf198a19f049ff18d4cf5"
178
+ "gitHead": "c266b280c2157a42dc85c5c520a109af76b37294"
179
179
  }
@@ -645,6 +645,11 @@ export function createLodestarMetrics(
645
645
  help: "Count of peers by sync type [FullySynced, Advanced, Behind]",
646
646
  labelNames: ["syncType"],
647
647
  }),
648
+ syncPeerFinalizedCheckpointMismatch: register.counter<{reason: string}>({
649
+ name: "lodestar_sync_peer_finalized_checkpoint_mismatch_total",
650
+ help: "Total behind peers whose Status finalized checkpoint is not in our chain, by reason",
651
+ labelNames: ["reason"],
652
+ }),
648
653
  syncSwitchGossipSubscriptions: register.gauge<{action: string}>({
649
654
  name: "lodestar_sync_switch_gossip_subscriptions",
650
655
  help: "Sync switched gossip subscriptions on/off",
@@ -10,6 +10,7 @@ import {isForkPostFulu} from "@lodestar/params";
10
10
  import {ResponseIncoming} from "@lodestar/reqresp";
11
11
  import {Epoch, Status, fulu, sszTypesFor} from "@lodestar/types";
12
12
  import {formatNodePeer} from "../../api/impl/node/utils.js";
13
+ import {GoodByeReasonCode} from "../../constants/index.js";
13
14
  import {RegistryMetricCreator} from "../../metrics/index.js";
14
15
  import {ClockEvent, IClock} from "../../util/clock.js";
15
16
  import {CustodyConfig} from "../../util/dataColumns.js";
@@ -332,6 +333,10 @@ export class NetworkCore implements INetworkCore {
332
333
  this.peerManager.reStatusPeers(peers);
333
334
  }
334
335
 
336
+ async goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void> {
337
+ await this.peerManager.goodbyeAndDisconnect(peerIdFromString(peer), reason);
338
+ }
339
+
335
340
  /**
336
341
  * Request att subnets up `toSlot`. Network will ensure to mantain some peers for each
337
342
  */
@@ -138,6 +138,7 @@ const libp2pWorkerApi: NetworkWorkerApi = {
138
138
  prepareSyncCommitteeSubnets: (subscriptions) => core.prepareSyncCommitteeSubnets(subscriptions),
139
139
  reportPeer: (peer, action, actionName) => core.reportPeer(peer, action, actionName),
140
140
  reStatusPeers: (peers) => core.reStatusPeers(peers),
141
+ goodbyeAndDisconnect: (peer, reason) => core.goodbyeAndDisconnect(peer, reason),
141
142
  subscribeGossipCoreTopics: () => core.subscribeGossipCoreTopics(),
142
143
  unsubscribeGossipCoreTopics: () => core.unsubscribeGossipCoreTopics(),
143
144
 
@@ -11,6 +11,7 @@ import type {LoggerNode} from "@lodestar/logger/node";
11
11
  import {ResponseIncoming, ResponseOutgoing} from "@lodestar/reqresp";
12
12
  import {Status} from "@lodestar/types";
13
13
  import {withTimeout} from "@lodestar/utils";
14
+ import {GoodByeReasonCode} from "../../constants/index.js";
14
15
  import {Metrics} from "../../metrics/index.js";
15
16
  import {AsyncIterableBridgeCaller, AsyncIterableBridgeHandler} from "../../util/asyncIterableToEvents.js";
16
17
  import {PeerIdStr, peerIdFromString} from "../../util/peerId.js";
@@ -205,6 +206,9 @@ export class WorkerNetworkCore implements INetworkCore {
205
206
  reStatusPeers(peers: PeerIdStr[]): Promise<void> {
206
207
  return this.getApi().reStatusPeers(peers);
207
208
  }
209
+ goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void> {
210
+ return this.getApi().goodbyeAndDisconnect(peer, reason);
211
+ }
208
212
  reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): Promise<void> {
209
213
  return this.getApi().reportPeer(peer, action, actionName);
210
214
  }
@@ -5,6 +5,7 @@ import {SpecJson} from "@lodestar/config";
5
5
  import {LoggerNodeOpts} from "@lodestar/logger/node";
6
6
  import {ResponseIncoming} from "@lodestar/reqresp";
7
7
  import {Status} from "@lodestar/types";
8
+ import {GoodByeReasonCode} from "../../constants/index.js";
8
9
  import {PeerIdStr} from "../../util/peerId.js";
9
10
  import {NetworkOptions} from "../options.js";
10
11
  import {PeerAction, PeerScoreStats} from "../peers/index.js";
@@ -53,6 +54,7 @@ export interface INetworkCore extends INetworkCorePublic {
53
54
  // Sync method
54
55
  reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
55
56
  reStatusPeers(peers: PeerIdStr[]): Promise<void>;
57
+ goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void>;
56
58
 
57
59
  // TODO: Duplicated methods with INetwork interface
58
60
  getConnectedPeers(): Promise<PeerIdStr[]>;
@@ -37,6 +37,7 @@ import {
37
37
  phase0,
38
38
  } from "@lodestar/types";
39
39
  import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
40
+ import {GoodByeReasonCode} from "../constants/index.js";
40
41
  import {CustodyConfig} from "../util/dataColumns.js";
41
42
  import {PeerIdStr} from "../util/peerId.js";
42
43
  import {
@@ -74,6 +75,7 @@ export interface INetwork extends INetworkCorePublic {
74
75
  reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
75
76
  shouldAggregate(subnet: SubnetID, slot: Slot): boolean;
76
77
  reStatusPeers(peers: PeerIdStr[]): Promise<void>;
78
+ goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void>;
77
79
  searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
78
80
  searchUnknownEnvelope(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
79
81
  // ReqResp
@@ -34,6 +34,7 @@ import {prettyPrintIndices, sleep} from "@lodestar/utils";
34
34
  import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
35
35
  import {ChainEvent, IBeaconChain} from "../chain/index.js";
36
36
  import {computeSubnetForDataColumnSidecar} from "../chain/validation/dataColumnSidecar.js";
37
+ import {GoodByeReasonCode} from "../constants/index.js";
37
38
  import {IBeaconDb} from "../db/interface.js";
38
39
  import {Metrics, RegistryMetricCreator} from "../metrics/index.js";
39
40
  import {IClock} from "../util/clock.js";
@@ -289,6 +290,10 @@ export class Network implements INetwork {
289
290
  return this.core.reStatusPeers(peers);
290
291
  }
291
292
 
293
+ async goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void> {
294
+ return this.core.goodbyeAndDisconnect(peer, reason);
295
+ }
296
+
292
297
  searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
293
298
  this.networkProcessor.searchUnknownBlock(slotRoot, source, peer);
294
299
  }
@@ -893,7 +893,7 @@ export class PeerManager {
893
893
  }
894
894
  }
895
895
 
896
- private async goodbyeAndDisconnect(peer: PeerId, goodbye: GoodByeReasonCode): Promise<void> {
896
+ async goodbyeAndDisconnect(peer: PeerId, goodbye: GoodByeReasonCode): Promise<void> {
897
897
  const reason = GOODBYE_KNOWN_CODES[goodbye.toString()] || "";
898
898
  const peerIdStr = peer.toString();
899
899
  try {
@@ -1,5 +1,6 @@
1
- import {ForkName, isForkPostFulu} from "@lodestar/params";
2
- import {ForkDigest, Root, Slot, Status, fulu, ssz} from "@lodestar/types";
1
+ import {ForkName, GENESIS_EPOCH, isForkPostFulu} from "@lodestar/params";
2
+ import {computeEpochAtSlot} from "@lodestar/state-transition";
3
+ import {Epoch, ForkDigest, Root, Slot, Status, fulu, ssz} from "@lodestar/types";
3
4
  import {toHex, toRootHex} from "@lodestar/utils";
4
5
 
5
6
  // TODO: Why this value? (From Lighthouse)
@@ -9,6 +10,8 @@ export enum IrrelevantPeerCode {
9
10
  INCOMPATIBLE_FORKS = "IRRELEVANT_PEER_INCOMPATIBLE_FORKS",
10
11
  DIFFERENT_CLOCKS = "IRRELEVANT_PEER_DIFFERENT_CLOCKS",
11
12
  DIFFERENT_FINALIZED = "IRRELEVANT_PEER_DIFFERENT_FINALIZED",
13
+ FINALIZED_EPOCH_TOO_HIGH = "IRRELEVANT_PEER_FINALIZED_EPOCH_TOO_HIGH",
14
+ INVALID_FINALIZED_ROOT = "IRRELEVANT_PEER_INVALID_FINALIZED_ROOT",
12
15
  NO_EARLIEST_AVAILABLE_SLOT = "NO_EARLIEST_AVAILABLE_SLOT",
13
16
  }
14
17
 
@@ -16,6 +19,8 @@ type IrrelevantPeerType =
16
19
  | {code: IrrelevantPeerCode.INCOMPATIBLE_FORKS; ours: ForkDigest; theirs: ForkDigest}
17
20
  | {code: IrrelevantPeerCode.DIFFERENT_CLOCKS; slotDiff: number}
18
21
  | {code: IrrelevantPeerCode.NO_EARLIEST_AVAILABLE_SLOT}
22
+ | {code: IrrelevantPeerCode.FINALIZED_EPOCH_TOO_HIGH; finalizedEpoch: Epoch; maxFinalizedEpoch: Epoch}
23
+ | {code: IrrelevantPeerCode.INVALID_FINALIZED_ROOT}
19
24
  | {code: IrrelevantPeerCode.DIFFERENT_FINALIZED; expectedRoot: Root; remoteRoot: Root};
20
25
 
21
26
  /**
@@ -45,29 +50,35 @@ export function assertPeerRelevance(
45
50
  return {code: IrrelevantPeerCode.DIFFERENT_CLOCKS, slotDiff};
46
51
  }
47
52
 
48
- // The remote's finalized epoch is less than or equal to ours, but the block root is
49
- // different to the one in our chain. Therefore, the node is on a different chain and we
50
- // should not communicate with them.
53
+ // A checkpoint can be finalized at the earliest at the start of epoch + 2
54
+ const maxFinalizedEpoch = Math.max(
55
+ GENESIS_EPOCH,
56
+ computeEpochAtSlot(Math.max(currentSlot, 0) + FUTURE_SLOT_TOLERANCE) - 2
57
+ );
58
+ if (remote.finalizedEpoch > maxFinalizedEpoch) {
59
+ return {
60
+ code: IrrelevantPeerCode.FINALIZED_EPOCH_TOO_HIGH,
61
+ finalizedEpoch: remote.finalizedEpoch,
62
+ maxFinalizedEpoch,
63
+ };
64
+ }
65
+
66
+ if (remote.finalizedEpoch > GENESIS_EPOCH && isZeroRoot(remote.finalizedRoot)) {
67
+ return {code: IrrelevantPeerCode.INVALID_FINALIZED_ROOT};
68
+ }
51
69
 
70
+ // The remote's finalized epoch is equal to ours, but the block root is different to the one in our chain.
71
+ // Therefore, the node is on a different chain and we should not communicate with them.
52
72
  if (
53
- remote.finalizedEpoch <= local.finalizedEpoch &&
54
- !isZeroRoot(remote.finalizedRoot) &&
55
- !isZeroRoot(local.finalizedRoot)
73
+ remote.finalizedEpoch === local.finalizedEpoch &&
74
+ !isZeroRoot(local.finalizedRoot) &&
75
+ !ssz.Root.equals(remote.finalizedRoot, local.finalizedRoot)
56
76
  ) {
57
- // NOTE: due to preferring to not access chain state here, we can't check the finalized root against our history.
58
- // The impact of not doing check is low: peers that are behind us we can't confirm they are in the same chain as us.
59
- // In the worst case they will attempt to sync from us, fail and disconnect. The ENR fork check should be sufficient
60
- // to differentiate most peers in normal network conditions.
61
- const remoteRoot = remote.finalizedRoot;
62
- const expectedRoot = remote.finalizedEpoch === local.finalizedEpoch ? local.finalizedRoot : null;
63
-
64
- if (expectedRoot !== null && !ssz.Root.equals(remoteRoot, expectedRoot)) {
65
- return {
66
- code: IrrelevantPeerCode.DIFFERENT_FINALIZED,
67
- expectedRoot: expectedRoot, // forkChoice returns Tree BranchNode which the logger prints as {}
68
- remoteRoot: remoteRoot,
69
- };
70
- }
77
+ return {
78
+ code: IrrelevantPeerCode.DIFFERENT_FINALIZED,
79
+ expectedRoot: local.finalizedRoot,
80
+ remoteRoot: remote.finalizedRoot,
81
+ };
71
82
  }
72
83
 
73
84
  if (isForkPostFulu(forkName) && (remote as fulu.Status).earliestAvailableSlot === undefined) {
@@ -76,7 +87,8 @@ export function assertPeerRelevance(
76
87
  };
77
88
  }
78
89
 
79
- // Note: Accept request status finalized checkpoint in the future, we do not know if it is a true finalized root
90
+ // Note: for a behind finalized checkpoint, we validate it more on the main thread against our history,
91
+ // see BeaconSync.verifyPastFinalizedCheckpoint
80
92
  return null;
81
93
  }
82
94
 
@@ -93,6 +105,10 @@ export function renderIrrelevantPeerType(type: IrrelevantPeerType): string {
93
105
  return `DIFFERENT_CLOCKS slotDiff: ${type.slotDiff}`;
94
106
  case IrrelevantPeerCode.DIFFERENT_FINALIZED:
95
107
  return `DIFFERENT_FINALIZED root: ${toRootHex(type.remoteRoot)} expected: ${toRootHex(type.expectedRoot)}`;
108
+ case IrrelevantPeerCode.FINALIZED_EPOCH_TOO_HIGH:
109
+ return `FINALIZED_EPOCH_TOO_HIGH finalizedEpoch: ${type.finalizedEpoch} max: ${type.maxFinalizedEpoch}`;
110
+ case IrrelevantPeerCode.INVALID_FINALIZED_ROOT:
111
+ return "INVALID_FINALIZED_ROOT zero root for a non-genesis finalized epoch";
96
112
  case IrrelevantPeerCode.NO_EARLIEST_AVAILABLE_SLOT:
97
113
  return "No earliestAvailableSlot announced via peer Status";
98
114
  }