@lodestar/beacon-node 1.47.0-dev.742db200d1 → 1.47.0-dev.90204c280d

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.
@@ -14,8 +14,9 @@ export type BuilderCircuitBreakerModules = {
14
14
  /**
15
15
  * Post-gloas circuit breaker for builder bids. The beacon block is produced by the proposer
16
16
  * regardless of bid source, so missed blocks are not a useful builder health signal. Instead
17
- * count blocks whose payload was never revealed and stop selecting builder bids while the
18
- * non-reveal rate in the fault inspection window is too high.
17
+ * count blocks whose payload was never revealed. Activate when the non-reveal rate exceeds the
18
+ * fault budget, and resume selecting builder bids only when the observed blocks are within budget
19
+ * and meet the minimum recovery sample size.
19
20
  */
20
21
  export declare class BuilderCircuitBreaker {
21
22
  private readonly modules;
@@ -1 +1 @@
1
- {"version":3,"file":"builderCircuitBreaker.d.ts","sourceRoot":"","sources":["../../src/chain/builderCircuitBreaker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAC;AAE5C,MAAM,MAAM,yBAAyB,GAAG;IACtC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,WAAW,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,qBAAqB;IAS9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAM;IAE7B,YACE,IAAI,EAAE,yBAAyB,EACd,OAAO,EAAE,4BAA4B,EAKvD;IAED,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAGjC;IAED,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAqC5B;CACF"}
1
+ {"version":3,"file":"builderCircuitBreaker.d.ts","sourceRoot":"","sources":["../../src/chain/builderCircuitBreaker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAC;AAE5C,MAAM,MAAM,yBAAyB,GAAG;IACtC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,WAAW,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB,CAAC;AAKF;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAS9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAM;IAE7B,YACE,IAAI,EAAE,yBAAyB,EACd,OAAO,EAAE,4BAA4B,EAKvD;IAED,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAGjC;IAED,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CA4C5B;CACF"}
@@ -1,9 +1,12 @@
1
1
  import { getFaultInspectionParams } from "../execution/builder/http.js";
2
+ /** Four observations is the minimum useful recovery sample for the default ~25% fault budget */
3
+ const MIN_BLOCKS_TO_DEACTIVATE = 4;
2
4
  /**
3
5
  * Post-gloas circuit breaker for builder bids. The beacon block is produced by the proposer
4
6
  * regardless of bid source, so missed blocks are not a useful builder health signal. Instead
5
- * count blocks whose payload was never revealed and stop selecting builder bids while the
6
- * non-reveal rate in the fault inspection window is too high.
7
+ * count blocks whose payload was never revealed. Activate when the non-reveal rate exceeds the
8
+ * fault budget, and resume selecting builder bids only when the observed blocks are within budget
9
+ * and meet the minimum recovery sample size.
7
10
  */
8
11
  export class BuilderCircuitBreaker {
9
12
  modules;
@@ -32,12 +35,20 @@ export class BuilderCircuitBreaker {
32
35
  const faults = blocksPresent - payloadsRevealed;
33
36
  const wasActive = this.active;
34
37
  // Scale the fault budget by blocks present so sparse windows still trigger on high non-reveal rates
35
- this.active = faults * this.faultInspectionWindow > this.allowedFaults * blocksPresent;
38
+ const exceedsFaultBudget = faults * this.faultInspectionWindow > this.allowedFaults * blocksPresent;
39
+ if (exceedsFaultBudget) {
40
+ this.active = true;
41
+ }
42
+ else if (blocksPresent >= MIN_BLOCKS_TO_DEACTIVATE) {
43
+ // Require a minimum sample within the fault budget before accepting builder bids again
44
+ this.active = false;
45
+ }
36
46
  this.modules.metrics?.builderCircuitBreaker.active.set(this.active ? 1 : 0);
37
47
  this.modules.metrics?.builderCircuitBreaker.faults.set(faults);
38
48
  this.modules.metrics?.builderCircuitBreaker.blocksPresent.set(blocksPresent);
39
49
  this.modules.metrics?.builderCircuitBreaker.payloadsRevealed.set(payloadsRevealed);
40
50
  const logCtx = {
51
+ clockSlot,
41
52
  blocksPresent,
42
53
  faults,
43
54
  faultInspectionWindow: this.faultInspectionWindow,
@@ -1 +1 @@
1
- {"version":3,"file":"builderCircuitBreaker.js","sourceRoot":"","sources":["../../src/chain/builderCircuitBreaker.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,wBAAwB,EAAC,MAAM,8BAA8B,CAAC;AActE;;;;;GAKG;AACH,MAAM,OAAO,qBAAqB;IASb,OAAO;IARjB,qBAAqB,CAAS;IAC9B,aAAa,CAAS;IAEvB,MAAM,GAAG,KAAK,CAAC;IACf,eAAe,GAAG,CAAC,CAAC,CAAC;IAE7B,YACE,IAA+B,EACd,OAAqC;uBAArC,OAAO;QAExB,MAAM,EAAC,qBAAqB,EAAE,aAAa,EAAC,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC9E,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;QACnD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,6EAA6E;IAC7E,QAAQ,CAAC,SAAe;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,SAAe;QACpB,IAAI,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QAEjC,sEAAsE;QACtE,MAAM,EAAC,aAAa,EAAE,gBAAgB,EAAC,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,sBAAsB,CACtF,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,EACnD,SAAS,GAAG,CAAC,CACd,CAAC;QACF,MAAM,MAAM,GAAG,aAAa,GAAG,gBAAgB,CAAC;QAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,oGAAoG;QACpG,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QAEvF,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,qBAAqB,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,qBAAqB,CAAC,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAEnF,MAAM,MAAM,GAAG;YACb,aAAa;YACb,MAAM;YACN,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,0DAA0D,EAAE,MAAM,CAAC,CAAC;YAC/F,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,MAAM,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,gCAAgC,EAAE,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAC,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"builderCircuitBreaker.js","sourceRoot":"","sources":["../../src/chain/builderCircuitBreaker.ts"],"names":[],"mappings":"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"}
@@ -36,7 +36,7 @@ export type IChainOptions = BlockProcessOpts & PoolOpts & SeenCacheOpts & ForkCh
36
36
  nativeStateView?: boolean;
37
37
  /** Builder circuit breaker fault inspection window in slots */
38
38
  faultInspectionWindow?: number;
39
- /** Allowed unrevealed payloads within the fault inspection window */
39
+ /** Unrevealed payloads allowed per `faultInspectionWindow` observed blocks */
40
40
  allowedFaults?: number;
41
41
  };
42
42
  export type BlockProcessOpts = {
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/chain/options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/chain/options.ts"],"names":[],"mappings":"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"}
@@ -41,15 +41,18 @@ export declare class NoBidReceived extends Error {
41
41
  constructor();
42
42
  }
43
43
  /**
44
- * Beacon clients select randomized values from the following ranges when initializing
45
- * the circuit breaker (so at boot time and once for each unique boot).
44
+ * Default circuit breaker parameters:
46
45
  *
47
- * ALLOWED_FAULTS: between 1 and SLOTS_PER_EPOCH // 4
48
- * FAULT_INSPECTION_WINDOW: between SLOTS_PER_EPOCH and 2 * SLOTS_PER_EPOCH
46
+ * SLOTS_PER_EPOCH <= FAULT_INSPECTION_WINDOW < 2 * SLOTS_PER_EPOCH (randomized at initialization)
47
+ * ALLOWED_FAULTS: FAULT_INSPECTION_WINDOW // 4
49
48
  *
50
- * The values are randomized per node so builders cannot predict when a given proposer will
51
- * fall back to local blocks. With fixed thresholds a builder could withhold payloads right up
52
- * to the limit without ever tripping the breaker.
49
+ * e.g. on mainnet SLOTS_PER_EPOCH is 32, so FAULT_INSPECTION_WINDOW is between 32 and 63,
50
+ * and a window of 40 results in ALLOWED_FAULTS = 10.
51
+ *
52
+ * The randomized default window keeps the exact slots under inspection unpredictable per node,
53
+ * so a builder cannot tell when past faults age out of a given proposer's window and time
54
+ * withholding around trip or recovery points. Explicitly configured windows are clamped to at
55
+ * least SLOTS_PER_EPOCH, and configured allowedFaults is capped at the default ~25% budget.
53
56
  */
54
57
  export declare function getFaultInspectionParams(opts: {
55
58
  faultInspectionWindow?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/execution/builder/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/execution/builder/http.ts"],"names":[],"mappings":"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"}
@@ -37,20 +37,23 @@ export class NoBidReceived extends Error {
37
37
  }
38
38
  }
39
39
  /**
40
- * Beacon clients select randomized values from the following ranges when initializing
41
- * the circuit breaker (so at boot time and once for each unique boot).
40
+ * Default circuit breaker parameters:
42
41
  *
43
- * ALLOWED_FAULTS: between 1 and SLOTS_PER_EPOCH // 4
44
- * FAULT_INSPECTION_WINDOW: between SLOTS_PER_EPOCH and 2 * SLOTS_PER_EPOCH
42
+ * SLOTS_PER_EPOCH <= FAULT_INSPECTION_WINDOW < 2 * SLOTS_PER_EPOCH (randomized at initialization)
43
+ * ALLOWED_FAULTS: FAULT_INSPECTION_WINDOW // 4
45
44
  *
46
- * The values are randomized per node so builders cannot predict when a given proposer will
47
- * fall back to local blocks. With fixed thresholds a builder could withhold payloads right up
48
- * to the limit without ever tripping the breaker.
45
+ * e.g. on mainnet SLOTS_PER_EPOCH is 32, so FAULT_INSPECTION_WINDOW is between 32 and 63,
46
+ * and a window of 40 results in ALLOWED_FAULTS = 10.
47
+ *
48
+ * The randomized default window keeps the exact slots under inspection unpredictable per node,
49
+ * so a builder cannot tell when past faults age out of a given proposer's window and time
50
+ * withholding around trip or recovery points. Explicitly configured windows are clamped to at
51
+ * least SLOTS_PER_EPOCH, and configured allowedFaults is capped at the default ~25% budget.
49
52
  */
50
53
  export function getFaultInspectionParams(opts) {
51
54
  const faultInspectionWindow = Math.max(opts.faultInspectionWindow ?? SLOTS_PER_EPOCH + Math.floor(Math.random() * SLOTS_PER_EPOCH), SLOTS_PER_EPOCH);
52
55
  // allowedFaults should be < faultInspectionWindow, limiting them to faultInspectionWindow/4
53
- const allowedFaults = Math.min(opts.allowedFaults ?? Math.floor(faultInspectionWindow / 4), Math.floor(faultInspectionWindow / 4));
56
+ const allowedFaults = Math.min(opts.allowedFaults ?? Infinity, Math.floor(faultInspectionWindow / 4));
54
57
  return { faultInspectionWindow, allowedFaults };
55
58
  }
56
59
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/execution/builder/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/execution/builder/http.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.47.0-dev.742db200d1",
14
+ "version": "1.47.0-dev.90204c280d",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -126,17 +126,17 @@
126
126
  "@libp2p/peer-id": "^6.0.4",
127
127
  "@libp2p/prometheus-metrics": "^5.0.14",
128
128
  "@libp2p/tcp": "^11.0.13",
129
- "@lodestar/api": "^1.47.0-dev.742db200d1",
130
- "@lodestar/config": "^1.47.0-dev.742db200d1",
131
- "@lodestar/db": "^1.47.0-dev.742db200d1",
132
- "@lodestar/fork-choice": "^1.47.0-dev.742db200d1",
133
- "@lodestar/logger": "^1.47.0-dev.742db200d1",
134
- "@lodestar/params": "^1.47.0-dev.742db200d1",
135
- "@lodestar/reqresp": "^1.47.0-dev.742db200d1",
136
- "@lodestar/state-transition": "^1.47.0-dev.742db200d1",
137
- "@lodestar/types": "^1.47.0-dev.742db200d1",
138
- "@lodestar/utils": "^1.47.0-dev.742db200d1",
139
- "@lodestar/validator": "^1.47.0-dev.742db200d1",
129
+ "@lodestar/api": "^1.47.0-dev.90204c280d",
130
+ "@lodestar/config": "^1.47.0-dev.90204c280d",
131
+ "@lodestar/db": "^1.47.0-dev.90204c280d",
132
+ "@lodestar/fork-choice": "^1.47.0-dev.90204c280d",
133
+ "@lodestar/logger": "^1.47.0-dev.90204c280d",
134
+ "@lodestar/params": "^1.47.0-dev.90204c280d",
135
+ "@lodestar/reqresp": "^1.47.0-dev.90204c280d",
136
+ "@lodestar/state-transition": "^1.47.0-dev.90204c280d",
137
+ "@lodestar/types": "^1.47.0-dev.90204c280d",
138
+ "@lodestar/utils": "^1.47.0-dev.90204c280d",
139
+ "@lodestar/validator": "^1.47.0-dev.90204c280d",
140
140
  "@multiformats/multiaddr": "^13.0.1",
141
141
  "datastore-core": "^11.0.2",
142
142
  "datastore-level": "^12.0.2",
@@ -158,7 +158,7 @@
158
158
  "@libp2p/interface-internal": "^3.0.13",
159
159
  "@libp2p/logger": "^6.2.2",
160
160
  "@libp2p/utils": "^7.0.13",
161
- "@lodestar/spec-test-util": "^1.47.0-dev.742db200d1",
161
+ "@lodestar/spec-test-util": "^1.47.0-dev.90204c280d",
162
162
  "@types/js-yaml": "^4.0.5",
163
163
  "@types/qs": "^6.9.7",
164
164
  "@types/tmp": "^0.2.3",
@@ -175,5 +175,5 @@
175
175
  "beacon",
176
176
  "blockchain"
177
177
  ],
178
- "gitHead": "50cef4e6ccfb909a80d9f4236e1ee9e55ef88c72"
178
+ "gitHead": "7a46ea1563ff5c6a33e5f2251bd2e3c0339f060f"
179
179
  }
@@ -15,11 +15,15 @@ export type BuilderCircuitBreakerModules = {
15
15
  metrics: Metrics | null;
16
16
  };
17
17
 
18
+ /** Four observations is the minimum useful recovery sample for the default ~25% fault budget */
19
+ const MIN_BLOCKS_TO_DEACTIVATE = 4;
20
+
18
21
  /**
19
22
  * Post-gloas circuit breaker for builder bids. The beacon block is produced by the proposer
20
23
  * regardless of bid source, so missed blocks are not a useful builder health signal. Instead
21
- * count blocks whose payload was never revealed and stop selecting builder bids while the
22
- * non-reveal rate in the fault inspection window is too high.
24
+ * count blocks whose payload was never revealed. Activate when the non-reveal rate exceeds the
25
+ * fault budget, and resume selecting builder bids only when the observed blocks are within budget
26
+ * and meet the minimum recovery sample size.
23
27
  */
24
28
  export class BuilderCircuitBreaker {
25
29
  readonly faultInspectionWindow: number;
@@ -58,7 +62,13 @@ export class BuilderCircuitBreaker {
58
62
 
59
63
  const wasActive = this.active;
60
64
  // Scale the fault budget by blocks present so sparse windows still trigger on high non-reveal rates
61
- this.active = faults * this.faultInspectionWindow > this.allowedFaults * blocksPresent;
65
+ const exceedsFaultBudget = faults * this.faultInspectionWindow > this.allowedFaults * blocksPresent;
66
+ if (exceedsFaultBudget) {
67
+ this.active = true;
68
+ } else if (blocksPresent >= MIN_BLOCKS_TO_DEACTIVATE) {
69
+ // Require a minimum sample within the fault budget before accepting builder bids again
70
+ this.active = false;
71
+ }
62
72
 
63
73
  this.modules.metrics?.builderCircuitBreaker.active.set(this.active ? 1 : 0);
64
74
  this.modules.metrics?.builderCircuitBreaker.faults.set(faults);
@@ -66,6 +76,7 @@ export class BuilderCircuitBreaker {
66
76
  this.modules.metrics?.builderCircuitBreaker.payloadsRevealed.set(payloadsRevealed);
67
77
 
68
78
  const logCtx = {
79
+ clockSlot,
69
80
  blocksPresent,
70
81
  faults,
71
82
  faultInspectionWindow: this.faultInspectionWindow,
@@ -53,7 +53,7 @@ export type IChainOptions = BlockProcessOpts &
53
53
  nativeStateView?: boolean;
54
54
  /** Builder circuit breaker fault inspection window in slots */
55
55
  faultInspectionWindow?: number;
56
- /** Allowed unrevealed payloads within the fault inspection window */
56
+ /** Unrevealed payloads allowed per `faultInspectionWindow` observed blocks */
57
57
  allowedFaults?: number;
58
58
  };
59
59
 
@@ -71,15 +71,18 @@ export class NoBidReceived extends Error {
71
71
  }
72
72
 
73
73
  /**
74
- * Beacon clients select randomized values from the following ranges when initializing
75
- * the circuit breaker (so at boot time and once for each unique boot).
74
+ * Default circuit breaker parameters:
76
75
  *
77
- * ALLOWED_FAULTS: between 1 and SLOTS_PER_EPOCH // 4
78
- * FAULT_INSPECTION_WINDOW: between SLOTS_PER_EPOCH and 2 * SLOTS_PER_EPOCH
76
+ * SLOTS_PER_EPOCH <= FAULT_INSPECTION_WINDOW < 2 * SLOTS_PER_EPOCH (randomized at initialization)
77
+ * ALLOWED_FAULTS: FAULT_INSPECTION_WINDOW // 4
79
78
  *
80
- * The values are randomized per node so builders cannot predict when a given proposer will
81
- * fall back to local blocks. With fixed thresholds a builder could withhold payloads right up
82
- * to the limit without ever tripping the breaker.
79
+ * e.g. on mainnet SLOTS_PER_EPOCH is 32, so FAULT_INSPECTION_WINDOW is between 32 and 63,
80
+ * and a window of 40 results in ALLOWED_FAULTS = 10.
81
+ *
82
+ * The randomized default window keeps the exact slots under inspection unpredictable per node,
83
+ * so a builder cannot tell when past faults age out of a given proposer's window and time
84
+ * withholding around trip or recovery points. Explicitly configured windows are clamped to at
85
+ * least SLOTS_PER_EPOCH, and configured allowedFaults is capped at the default ~25% budget.
83
86
  */
84
87
  export function getFaultInspectionParams(opts: {faultInspectionWindow?: number; allowedFaults?: number}): {
85
88
  faultInspectionWindow: number;
@@ -90,10 +93,7 @@ export function getFaultInspectionParams(opts: {faultInspectionWindow?: number;
90
93
  SLOTS_PER_EPOCH
91
94
  );
92
95
  // allowedFaults should be < faultInspectionWindow, limiting them to faultInspectionWindow/4
93
- const allowedFaults = Math.min(
94
- opts.allowedFaults ?? Math.floor(faultInspectionWindow / 4),
95
- Math.floor(faultInspectionWindow / 4)
96
- );
96
+ const allowedFaults = Math.min(opts.allowedFaults ?? Infinity, Math.floor(faultInspectionWindow / 4));
97
97
  return {faultInspectionWindow, allowedFaults};
98
98
  }
99
99