@lodestar/beacon-node 1.46.0-dev.9be1d27b00 → 1.46.0-dev.a03686d0dc
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/beacon/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +37 -15
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +15 -6
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +3 -3
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +3 -4
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +6 -0
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
- package/lib/chain/blocks/utils/chainSegment.js +31 -25
- package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
- package/lib/chain/blocks/utils/polarBearBanner.d.ts +2 -0
- package/lib/chain/blocks/utils/polarBearBanner.d.ts.map +1 -0
- package/lib/chain/blocks/utils/polarBearBanner.js +51 -0
- package/lib/chain/blocks/utils/polarBearBanner.js.map +1 -0
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +21 -1
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/chain.d.ts +5 -0
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +55 -0
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +6 -0
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +5 -0
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/interface.d.ts +2 -0
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/options.d.ts +2 -0
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +1 -0
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +107 -29
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +6 -6
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/seenCache/seenBlockProposers.d.ts +20 -4
- package/lib/chain/seenCache/seenBlockProposers.d.ts.map +1 -1
- package/lib/chain/seenCache/seenBlockProposers.js +49 -2
- package/lib/chain/seenCache/seenBlockProposers.js.map +1 -1
- package/lib/chain/validation/block.d.ts +4 -1
- package/lib/chain/validation/block.d.ts.map +1 -1
- package/lib/chain/validation/block.js +32 -18
- package/lib/chain/validation/block.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.js +21 -16
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +14 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +38 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +12 -1
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +20 -3
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/network.d.ts +1 -0
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +11 -1
- package/lib/network/network.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +8 -0
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/reqresp/score.d.ts.map +1 -1
- package/lib/network/reqresp/score.js +20 -3
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +15 -3
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/utils/hashBlocks.d.ts +16 -4
- package/lib/sync/range/utils/hashBlocks.d.ts.map +1 -1
- package/lib/sync/range/utils/hashBlocks.js +49 -18
- package/lib/sync/range/utils/hashBlocks.js.map +1 -1
- package/lib/util/clock.d.ts +2 -7
- package/lib/util/clock.d.ts.map +1 -1
- package/lib/util/clock.js +2 -7
- package/lib/util/clock.js.map +1 -1
- package/lib/util/workerEvents.d.ts +7 -1
- package/lib/util/workerEvents.d.ts.map +1 -1
- package/lib/util/workerEvents.js +17 -5
- package/lib/util/workerEvents.js.map +1 -1
- package/package.json +15 -15
- package/src/api/impl/beacon/blocks/index.ts +65 -16
- package/src/api/impl/validator/index.ts +19 -6
- package/src/chain/blocks/importBlock.ts +3 -2
- package/src/chain/blocks/importExecutionPayload.ts +8 -4
- package/src/chain/blocks/index.ts +7 -0
- package/src/chain/blocks/utils/chainSegment.ts +35 -28
- package/src/chain/blocks/utils/polarBearBanner.ts +50 -0
- package/src/chain/blocks/verifyBlock.ts +28 -2
- package/src/chain/chain.ts +60 -0
- package/src/chain/emitter.ts +7 -0
- package/src/chain/interface.ts +3 -0
- package/src/chain/options.ts +3 -0
- package/src/chain/prepareNextSlot.ts +140 -39
- package/src/chain/produceBlock/produceBlockBody.ts +11 -6
- package/src/chain/seenCache/seenBlockProposers.ts +72 -5
- package/src/chain/validation/block.ts +41 -19
- package/src/chain/validation/dataColumnSidecar.ts +27 -17
- package/src/metrics/metrics/lodestar.ts +39 -0
- package/src/network/core/networkCore.ts +13 -1
- package/src/network/core/networkCoreWorkerHandler.ts +18 -3
- package/src/network/network.ts +16 -1
- package/src/network/processor/gossipHandlers.ts +7 -0
- package/src/network/reqresp/score.ts +22 -3
- package/src/sync/range/batch.ts +20 -3
- package/src/sync/range/utils/hashBlocks.ts +56 -21
- package/src/util/clock.ts +2 -7
- package/src/util/workerEvents.ts +18 -6
|
@@ -1,23 +1,54 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { digest } from "@chainsafe/as-sha256";
|
|
2
|
+
import { ssz } from "@lodestar/types";
|
|
3
|
+
import { fromHex, toRootHex } from "@lodestar/utils";
|
|
4
|
+
const ROOT_SIZE = 32;
|
|
5
|
+
const SIGNATURE_SIZE = 96;
|
|
6
|
+
/** Every block and every payload envelope contributes a fixed-size (root, signature) entry */
|
|
7
|
+
const ENTRY_SIZE = ROOT_SIZE + SIGNATURE_SIZE;
|
|
8
|
+
/** uint32 LE counts of block and envelope entries, so the variable-length sections are self-describing */
|
|
9
|
+
const COUNT_SIZE = 4;
|
|
10
|
+
const HEADER_SIZE = COUNT_SIZE * 2;
|
|
2
11
|
/**
|
|
3
|
-
*
|
|
12
|
+
* Root uniquely identifying a batch attempt (its blocks AND payloads). Used for peer scoring and to
|
|
13
|
+
* compare if two attempts are equivalent.
|
|
14
|
+
*
|
|
15
|
+
* Signatures are part of the id for BOTH blocks and payload envelopes, not just their message roots:
|
|
16
|
+
* a peer serving a correct message with a garbage signature would otherwise produce the same id as
|
|
17
|
+
* the honest attempt and escape scoring in `SyncChain.advanceChain`. Signatures are not verified at
|
|
18
|
+
* download time, only during processChainSegment (block signatures in verifyBlocksSignatures,
|
|
19
|
+
* envelope signatures in importExecutionPayload).
|
|
20
|
+
*
|
|
21
|
+
* Entries are written as raw bytes into a single exactly-sized buffer and digested once, so an
|
|
22
|
+
* `Attempt` retains 32 bytes rather than the ~16 KB a full 32-slot gloas batch would need if the
|
|
23
|
+
* roots and signatures were concatenated as hex. sha256 (not a 64-bit hash) because a peer that
|
|
24
|
+
* could force a collision with the winning attempt would escape peer scoring.
|
|
4
25
|
*/
|
|
5
|
-
export function hashBlocks(blocks,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
26
|
+
export function hashBlocks(blocks, payloadEnvelopes) {
|
|
27
|
+
// Envelopes without a payload carry no attributable data, so they are skipped entirely. A `null`
|
|
28
|
+
// map and a map whose entries all lack a payload are therefore equivalent, which is intended.
|
|
29
|
+
const envelopes = payloadEnvelopes && payloadEnvelopes.size > 0
|
|
30
|
+
? Array.from(payloadEnvelopes.entries())
|
|
31
|
+
.filter(([, envelope]) => envelope.hasPayloadEnvelope())
|
|
32
|
+
.sort(([slotA], [slotB]) => slotA - slotB)
|
|
33
|
+
: [];
|
|
34
|
+
const buf = Buffer.allocUnsafe(HEADER_SIZE + (blocks.length + envelopes.length) * ENTRY_SIZE);
|
|
35
|
+
buf.writeUInt32LE(blocks.length, 0);
|
|
36
|
+
buf.writeUInt32LE(envelopes.length, COUNT_SIZE);
|
|
37
|
+
let offset = HEADER_SIZE;
|
|
38
|
+
for (const block of blocks) {
|
|
39
|
+
buf.set(fromHex(block.blockRootHex), offset);
|
|
40
|
+
offset += ROOT_SIZE;
|
|
41
|
+
buf.set(block.getBlock().signature, offset);
|
|
42
|
+
offset += SIGNATURE_SIZE;
|
|
21
43
|
}
|
|
44
|
+
for (const [, envelope] of envelopes) {
|
|
45
|
+
const signedEnvelope = envelope.getPayloadEnvelope();
|
|
46
|
+
// envelope's root is cached thanks to cachePermanentRootStruct, so this avoids re-hashing
|
|
47
|
+
buf.set(ssz.gloas.ExecutionPayloadEnvelope.hashTreeRoot(signedEnvelope.message), offset);
|
|
48
|
+
offset += ROOT_SIZE;
|
|
49
|
+
buf.set(signedEnvelope.signature, offset);
|
|
50
|
+
offset += SIGNATURE_SIZE;
|
|
51
|
+
}
|
|
52
|
+
return toRootHex(digest(buf));
|
|
22
53
|
}
|
|
23
54
|
//# sourceMappingURL=hashBlocks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashBlocks.js","sourceRoot":"","sources":["../../../../src/sync/range/utils/hashBlocks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hashBlocks.js","sourceRoot":"","sources":["../../../../src/sync/range/utils/hashBlocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAgB,GAAG,EAAC,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAC,OAAO,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAInD,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,8FAA8F;AAC9F,MAAM,UAAU,GAAG,SAAS,GAAG,cAAc,CAAC;AAC9C,0GAA0G;AAC1G,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,WAAW,GAAG,UAAU,GAAG,CAAC,CAAC;AAEnC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,UAAU,CAAC,MAAqB,EAAE,gBAAwD;IACxG,iGAAiG;IACjG,8FAA8F;IAC9F,MAAM,SAAS,GACb,gBAAgB,IAAI,gBAAgB,CAAC,IAAI,GAAG,CAAC;QAC3C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;aACnC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;aACvD,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC;QAC9C,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC;IAC9F,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACpC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChD,IAAI,MAAM,GAAG,WAAW,CAAC;IAEzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,IAAI,SAAS,CAAC;QACpB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,cAAc,CAAC;IAC3B,CAAC;IAED,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QACrC,MAAM,cAAc,GAAG,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QACrD,0FAA0F;QAC1F,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QACzF,MAAM,IAAI,SAAS,CAAC;QACpB,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,IAAI,cAAc,CAAC;IAC3B,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAChC,CAAC"}
|
package/lib/util/clock.d.ts
CHANGED
|
@@ -74,10 +74,7 @@ export declare class Clock extends EventEmitter implements IClock {
|
|
|
74
74
|
get currentSlot(): Slot;
|
|
75
75
|
/**
|
|
76
76
|
* If it's too close to next slot given MAXIMUM_GOSSIP_CLOCK_DISPARITY, return currentSlot + 1.
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* Spec: phase0/p2p-interface.md - gossip validation uses `current_time + MAXIMUM_GOSSIP_CLOCK_DISPARITY < message_time`
|
|
80
|
-
* to reject future messages (strict `<`), so the boundary (exactly equal) is accepted, hence `<=` here.
|
|
77
|
+
* Spec: phase0/p2p-interface.md rejects future messages with strict `<`, hence `<=` here.
|
|
81
78
|
*/
|
|
82
79
|
get currentSlotWithGossipDisparity(): Slot;
|
|
83
80
|
get currentEpoch(): Epoch;
|
|
@@ -87,9 +84,7 @@ export declare class Clock extends EventEmitter implements IClock {
|
|
|
87
84
|
slotWithPastTolerance(toleranceSec: number): Slot;
|
|
88
85
|
/**
|
|
89
86
|
* Check if a slot is current slot given MAXIMUM_GOSSIP_CLOCK_DISPARITY.
|
|
90
|
-
*
|
|
91
|
-
* Uses `<=` for disparity checks because the spec rejects with strict `<`
|
|
92
|
-
* (phase0/p2p-interface.md), meaning the boundary (exactly equal) is accepted.
|
|
87
|
+
* Spec: phase0/p2p-interface.md rejects future messages with strict `<`, hence `<=`.
|
|
93
88
|
*/
|
|
94
89
|
isCurrentSlotGivenGossipDisparity(slot: Slot): boolean;
|
|
95
90
|
waitForSlot(slot: Slot): Promise<void>;
|
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;AAGjD,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;IAE7B,YAAY,EAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAC,EAAE;QAAC,MAAM,EAAE,eAAe,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAC,EAS7G;IAED,IAAI,WAAW,IAAI,IAAI,CAOtB;IACD
|
|
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;AAGjD,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;IAE7B,YAAY,EAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAC,EAAE;QAAC,MAAM,EAAE,eAAe,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAC,EAS7G;IAED,IAAI,WAAW,IAAI,IAAI,CAOtB;IACD;;;OAGG;IACH,IAAI,8BAA8B,IAAI,IAAI,CAIzC;IAED,IAAI,YAAY,IAAI,KAAK,CAExB;IAED,8EAA8E;IAC9E,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAGlD;IAED,8EAA8E;IAC9E,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAGhD;IAED;;;OAGG;IACH,iCAAiC,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAgBrD;IAEK,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B3C;IAED,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,SAAoB,GAAG,MAAM,CAEzD;IAED,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,SAAa,GAAG,MAAM,CAEhD;IAED,OAAO,CAAC,UAAU,CAqBhB;IAEF,OAAO,CAAC,eAAe;CAKxB"}
|
package/lib/util/clock.js
CHANGED
|
@@ -42,10 +42,7 @@ export class Clock extends EventEmitter {
|
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
44
|
* If it's too close to next slot given MAXIMUM_GOSSIP_CLOCK_DISPARITY, return currentSlot + 1.
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* Spec: phase0/p2p-interface.md - gossip validation uses `current_time + MAXIMUM_GOSSIP_CLOCK_DISPARITY < message_time`
|
|
48
|
-
* to reject future messages (strict `<`), so the boundary (exactly equal) is accepted, hence `<=` here.
|
|
45
|
+
* Spec: phase0/p2p-interface.md rejects future messages with strict `<`, hence `<=` here.
|
|
49
46
|
*/
|
|
50
47
|
get currentSlotWithGossipDisparity() {
|
|
51
48
|
const currentSlot = this.currentSlot;
|
|
@@ -67,9 +64,7 @@ export class Clock extends EventEmitter {
|
|
|
67
64
|
}
|
|
68
65
|
/**
|
|
69
66
|
* Check if a slot is current slot given MAXIMUM_GOSSIP_CLOCK_DISPARITY.
|
|
70
|
-
*
|
|
71
|
-
* Uses `<=` for disparity checks because the spec rejects with strict `<`
|
|
72
|
-
* (phase0/p2p-interface.md), meaning the boundary (exactly equal) is accepted.
|
|
67
|
+
* Spec: phase0/p2p-interface.md rejects future messages with strict `<`, hence `<=`.
|
|
73
68
|
*/
|
|
74
69
|
isCurrentSlotGivenGossipDisparity(slot) {
|
|
75
70
|
const currentSlot = this.currentSlot;
|
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;AAE7C,MAAM,CAAN,IAAY,UAWX;AAXD,WAAY,UAAU;IACpB;;;OAGG;IACH,iCAAmB,CAAA;IACnB;;;OAGG;IACH,mCAAqB,CAAA;AACvB,CAAC,EAXW,UAAU,KAAV,UAAU,QAWrB;AA+CD;;GAEG;AACH,MAAM,OAAO,KAAM,SAAQ,YAAY;IAC5B,WAAW,CAAS;IACZ,MAAM,CAAkB;IACjC,SAAS,CAA0B;IAC1B,MAAM,CAAc;IAC7B,YAAY,CAAS;IAE7B,YAAY,EAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAsE;QAC5G,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,WAAW;QACb,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3D,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD
|
|
1
|
+
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/util/clock.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,10 +23,16 @@ export declare function wireEventsOnWorkerThread<EventData>(mainEventName: strin
|
|
|
23
23
|
export declare function wireEventsOnMainThread<EventData>(mainEventName: string, events: StrictEventEmitterSingleArg<EventData>, worker: Pick<Worker, "on" | "postMessage">, metrics: Metrics | null, isWorkerToMain: {
|
|
24
24
|
[K in keyof EventData]: EventDirection;
|
|
25
25
|
}): void;
|
|
26
|
+
/**
|
|
27
|
+
* Terminate a worker thread, bounded to `retryCount * retryMs`.
|
|
28
|
+
*
|
|
29
|
+
* @returns `false` if it could not be terminated, the worker thread is then still running and the
|
|
30
|
+
* caller has to decide how to proceed without it.
|
|
31
|
+
*/
|
|
26
32
|
export declare function terminateWorkerThread({ worker, retryMs, retryCount, logger, }: {
|
|
27
33
|
worker: Thread;
|
|
28
34
|
retryMs: number;
|
|
29
35
|
retryCount: number;
|
|
30
36
|
logger?: Logger;
|
|
31
|
-
}): Promise<
|
|
37
|
+
}): Promise<boolean>;
|
|
32
38
|
//# sourceMappingURL=workerEvents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerEvents.d.ts","sourceRoot":"","sources":["../../src/util/workerEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAC,MAAM,EAAC,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAC,OAAO,EAAC,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAC,wBAAwB,EAAC,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAC,cAAc,EAAe,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAC,2BAA2B,EAAC,MAAM,mBAAmB,CAAC;AAI9D,MAAM,MAAM,iBAAiB,CAAC,SAAS,IAAI;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,SAAS,CAAC;IACvB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,IAAI,EAAE,SAAS,CAAC,MAAM,SAAS,CAAC,CAAC;CAClC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAChD,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,EAC9C,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,wBAAwB,GAAG,IAAI,EACxC,cAAc,EAAE;KAAE,CAAC,IAAI,MAAM,SAAS,GAAG,cAAc;CAAC,GACvD,IAAI,CAuCN;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAC9C,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,EAC9C,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,aAAa,CAAC,EAC1C,OAAO,EAAE,OAAO,GAAG,IAAI,EACvB,cAAc,EAAE;KAAE,CAAC,IAAI,MAAM,SAAS,GAAG,cAAc;CAAC,GACvD,IAAI,CAiCN;AAED,wBAAsB,qBAAqB,CAAC,EAC1C,MAAM,EACN,OAAO,EACP,UAAU,EACV,MAAM,GACP,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"workerEvents.d.ts","sourceRoot":"","sources":["../../src/util/workerEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAC,MAAM,EAAC,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAC,OAAO,EAAC,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAC,wBAAwB,EAAC,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAC,cAAc,EAAe,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAC,2BAA2B,EAAC,MAAM,mBAAmB,CAAC;AAI9D,MAAM,MAAM,iBAAiB,CAAC,SAAS,IAAI;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,SAAS,CAAC;IACvB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,IAAI,EAAE,SAAS,CAAC,MAAM,SAAS,CAAC,CAAC;CAClC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAChD,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,EAC9C,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,wBAAwB,GAAG,IAAI,EACxC,cAAc,EAAE;KAAE,CAAC,IAAI,MAAM,SAAS,GAAG,cAAc;CAAC,GACvD,IAAI,CAuCN;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAC9C,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,EAC9C,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,aAAa,CAAC,EAC1C,OAAO,EAAE,OAAO,GAAG,IAAI,EACvB,cAAc,EAAE;KAAE,CAAC,IAAI,MAAM,SAAS,GAAG,cAAc;CAAC,GACvD,IAAI,CAiCN;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,EAC1C,MAAM,EACN,OAAO,EACP,UAAU,EACV,MAAM,GACP,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBnB"}
|
package/lib/util/workerEvents.js
CHANGED
|
@@ -70,6 +70,12 @@ export function wireEventsOnMainThread(mainEventName, events, worker, metrics, i
|
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Terminate a worker thread, bounded to `retryCount * retryMs`.
|
|
75
|
+
*
|
|
76
|
+
* @returns `false` if it could not be terminated, the worker thread is then still running and the
|
|
77
|
+
* caller has to decide how to proceed without it.
|
|
78
|
+
*/
|
|
73
79
|
export async function terminateWorkerThread({ worker, retryMs, retryCount, logger, }) {
|
|
74
80
|
const terminated = new Promise((resolve) => {
|
|
75
81
|
Thread.events(worker).subscribe((event) => {
|
|
@@ -79,12 +85,18 @@ export async function terminateWorkerThread({ worker, retryMs, retryCount, logge
|
|
|
79
85
|
});
|
|
80
86
|
});
|
|
81
87
|
for (let i = 0; i < retryCount; i++) {
|
|
82
|
-
|
|
83
|
-
|
|
88
|
+
// `Worker.terminate()` resolves only once the worker thread exits, and the thread can spin
|
|
89
|
+
// forever in `Environment::CleanupHandles()` when a libuv handle on its loop never closes, so
|
|
90
|
+
// it has to be raced too, otherwise `retryCount * retryMs` never applies.
|
|
91
|
+
const result = await Promise.race([
|
|
92
|
+
Thread.terminate(worker).then(() => terminated),
|
|
93
|
+
sleep(retryMs).then(() => false),
|
|
94
|
+
]);
|
|
84
95
|
if (result)
|
|
85
|
-
return;
|
|
86
|
-
logger?.
|
|
96
|
+
return true;
|
|
97
|
+
logger?.debug("Worker thread failed to terminate, retrying...");
|
|
87
98
|
}
|
|
88
|
-
|
|
99
|
+
logger?.debug(`Worker thread failed to terminate in ${retryCount * retryMs}ms`);
|
|
100
|
+
return false;
|
|
89
101
|
}
|
|
90
102
|
//# sourceMappingURL=workerEvents.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerEvents.js","sourceRoot":"","sources":["../../src/util/workerEvents.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"workerEvents.js","sourceRoot":"","sources":["../../src/util/workerEvents.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.46.0-dev.
|
|
14
|
+
"version": "1.46.0-dev.a03686d0dc",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
"@chainsafe/discv5": "^12.0.1",
|
|
106
106
|
"@chainsafe/enr": "^6.0.1",
|
|
107
107
|
"@chainsafe/libp2p-noise": "^17.0.0",
|
|
108
|
-
"@chainsafe/libp2p-quic": "^2.1.
|
|
108
|
+
"@chainsafe/libp2p-quic": "^2.1.3",
|
|
109
109
|
"@chainsafe/persistent-merkle-tree": "^1.3.0",
|
|
110
110
|
"@chainsafe/prometheus-gc-stats": "^1.0.0",
|
|
111
111
|
"@chainsafe/snappy-wasm": "^0.5.0",
|
|
@@ -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.46.0-dev.
|
|
130
|
-
"@lodestar/config": "^1.46.0-dev.
|
|
131
|
-
"@lodestar/db": "^1.46.0-dev.
|
|
132
|
-
"@lodestar/fork-choice": "^1.46.0-dev.
|
|
133
|
-
"@lodestar/logger": "^1.46.0-dev.
|
|
134
|
-
"@lodestar/params": "^1.46.0-dev.
|
|
135
|
-
"@lodestar/reqresp": "^1.46.0-dev.
|
|
136
|
-
"@lodestar/state-transition": "^1.46.0-dev.
|
|
137
|
-
"@lodestar/types": "^1.46.0-dev.
|
|
138
|
-
"@lodestar/utils": "^1.46.0-dev.
|
|
139
|
-
"@lodestar/validator": "^1.46.0-dev.
|
|
129
|
+
"@lodestar/api": "^1.46.0-dev.a03686d0dc",
|
|
130
|
+
"@lodestar/config": "^1.46.0-dev.a03686d0dc",
|
|
131
|
+
"@lodestar/db": "^1.46.0-dev.a03686d0dc",
|
|
132
|
+
"@lodestar/fork-choice": "^1.46.0-dev.a03686d0dc",
|
|
133
|
+
"@lodestar/logger": "^1.46.0-dev.a03686d0dc",
|
|
134
|
+
"@lodestar/params": "^1.46.0-dev.a03686d0dc",
|
|
135
|
+
"@lodestar/reqresp": "^1.46.0-dev.a03686d0dc",
|
|
136
|
+
"@lodestar/state-transition": "^1.46.0-dev.a03686d0dc",
|
|
137
|
+
"@lodestar/types": "^1.46.0-dev.a03686d0dc",
|
|
138
|
+
"@lodestar/utils": "^1.46.0-dev.a03686d0dc",
|
|
139
|
+
"@lodestar/validator": "^1.46.0-dev.a03686d0dc",
|
|
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.46.0-dev.
|
|
161
|
+
"@lodestar/spec-test-util": "^1.46.0-dev.a03686d0dc",
|
|
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": "
|
|
178
|
+
"gitHead": "51bcf39abe9e6f9a76ec1184729f5fe93f226a27"
|
|
179
179
|
}
|
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
ProduceFullGloas,
|
|
59
59
|
} from "../../../../chain/produceBlock/index.js";
|
|
60
60
|
import {RegenCaller} from "../../../../chain/regen/index.js";
|
|
61
|
-
import {validateGossipBlock} from "../../../../chain/validation/block.js";
|
|
61
|
+
import {validateGossipBlock, verifyBlockProposerSignature} from "../../../../chain/validation/block.js";
|
|
62
62
|
import {validateApiExecutionPayloadBid} from "../../../../chain/validation/executionPayloadBid.js";
|
|
63
63
|
import {validateApiExecutionPayloadEnvelope} from "../../../../chain/validation/executionPayloadEnvelope.js";
|
|
64
64
|
import {OpSource} from "../../../../chain/validatorMonitor.js";
|
|
@@ -268,7 +268,6 @@ export function getBeaconBlockApi({
|
|
|
268
268
|
await verifyBlocksInEpoch.call(chain as BeaconChain, parentBlock, [blockForImport], null, {
|
|
269
269
|
...opts,
|
|
270
270
|
verifyOnly: true,
|
|
271
|
-
skipVerifyBlockSignatures: true,
|
|
272
271
|
skipVerifyExecutionPayload: true,
|
|
273
272
|
seenTimestampSec,
|
|
274
273
|
});
|
|
@@ -285,12 +284,31 @@ export function getBeaconBlockApi({
|
|
|
285
284
|
|
|
286
285
|
chain.logger.debug("Consensus validated while publishing block", valLogMeta);
|
|
287
286
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
287
|
+
// Non-local blocks had their proposer and block-body signatures checked by verifyBlocksInEpoch above
|
|
288
|
+
// Locally produced blocks already passed block production validation, so only their proposer signature is unchecked
|
|
289
|
+
// Verify that signature and observe the block root here
|
|
290
|
+
if (blockLocallyProduced) {
|
|
291
|
+
try {
|
|
292
|
+
await verifyBlockProposerSignature(chain, signedBlock, blockRoot);
|
|
293
|
+
chain.seenBlockProposers.observeBlockRoot(
|
|
294
|
+
slot,
|
|
295
|
+
signedBlock.message.proposerIndex,
|
|
296
|
+
blockRoot,
|
|
297
|
+
signedBlockToSignedHeader(config, signedBlock)
|
|
298
|
+
);
|
|
299
|
+
} catch (e) {
|
|
300
|
+
chain.logger.error(
|
|
301
|
+
"Proposer signature validation failed while publishing the block",
|
|
302
|
+
valLogMeta,
|
|
303
|
+
e as Error
|
|
304
|
+
);
|
|
305
|
+
chain.persistInvalidSszValue(
|
|
306
|
+
chain.config.getForkTypes(slot).SignedBeaconBlock,
|
|
307
|
+
signedBlock,
|
|
308
|
+
"api_reject_consensus_failure"
|
|
309
|
+
);
|
|
310
|
+
throw e;
|
|
292
311
|
}
|
|
293
|
-
chain.logger.warn(message, valLogMeta);
|
|
294
312
|
}
|
|
295
313
|
break;
|
|
296
314
|
}
|
|
@@ -318,6 +336,25 @@ export function getBeaconBlockApi({
|
|
|
318
336
|
await sleep(msToBlockSlot);
|
|
319
337
|
}
|
|
320
338
|
|
|
339
|
+
if (broadcastValidation === routes.beacon.BroadcastValidation.consensusAndEquivocation) {
|
|
340
|
+
const conflictingRoots = chain.seenBlockProposers.getConflictingBlockRoots(
|
|
341
|
+
slot,
|
|
342
|
+
signedBlock.message.proposerIndex,
|
|
343
|
+
blockRoot
|
|
344
|
+
);
|
|
345
|
+
if (conflictingRoots.length > 0) {
|
|
346
|
+
chain.logger.warn("Not publishing block due to proposer equivocation", {
|
|
347
|
+
...valLogMeta,
|
|
348
|
+
conflictingRoots: conflictingRoots.join(", "),
|
|
349
|
+
});
|
|
350
|
+
throw new ApiError(
|
|
351
|
+
400,
|
|
352
|
+
`Block is a proposer equivocation, conflicting block roots: ${conflictingRoots.join(", ")}`
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
chain.logger.debug("Equivocation validated while publishing the block", valLogMeta);
|
|
356
|
+
}
|
|
357
|
+
|
|
321
358
|
// TODO: Validate block
|
|
322
359
|
const delaySec = seenTimestampSec - computeTimeAtSlot(config, slot, chain.genesisTime);
|
|
323
360
|
metrics?.gossipBlock.elapsedTimeTillReceived.observe({source: OpSource.api}, delaySec);
|
|
@@ -775,15 +812,6 @@ export function getBeaconBlockApi({
|
|
|
775
812
|
throw new ApiError(400, (error as Error).message);
|
|
776
813
|
}
|
|
777
814
|
chain.logger.debug("Consensus validated while publishing execution payload envelope", valLogMeta);
|
|
778
|
-
|
|
779
|
-
// TODO GLOAS: check the block is not a proposer equivocation before publishing the envelope
|
|
780
|
-
if (broadcastValidation === routes.beacon.BroadcastValidation.consensusAndEquivocation) {
|
|
781
|
-
const message = `Equivocation checks not yet implemented for broadcastValidation=${broadcastValidation}`;
|
|
782
|
-
if (chain.opts.broadcastValidationStrictness === "error") {
|
|
783
|
-
throw Error(message);
|
|
784
|
-
}
|
|
785
|
-
chain.logger.warn(message, valLogMeta);
|
|
786
|
-
}
|
|
787
815
|
break;
|
|
788
816
|
}
|
|
789
817
|
|
|
@@ -886,6 +914,27 @@ export function getBeaconBlockApi({
|
|
|
886
914
|
await sleep(msToBlockSlot);
|
|
887
915
|
}
|
|
888
916
|
|
|
917
|
+
// Keep this as the final async validation before publishing. A conflicting block may be observed while the
|
|
918
|
+
// envelope, blob data, or slot timing is being validated above.
|
|
919
|
+
if (broadcastValidation === routes.beacon.BroadcastValidation.consensusAndEquivocation) {
|
|
920
|
+
const conflictingRoots = chain.seenBlockProposers.getConflictingBlockRoots(
|
|
921
|
+
slot,
|
|
922
|
+
payloadInput.proposerIndex,
|
|
923
|
+
blockRootHex
|
|
924
|
+
);
|
|
925
|
+
if (conflictingRoots.length > 0) {
|
|
926
|
+
chain.logger.warn("Not publishing execution payload envelope due to proposer equivocation", {
|
|
927
|
+
...valLogMeta,
|
|
928
|
+
conflictingRoots: conflictingRoots.join(", "),
|
|
929
|
+
});
|
|
930
|
+
throw new ApiError(
|
|
931
|
+
400,
|
|
932
|
+
`Block of execution payload envelope is a proposer equivocation, conflicting block roots: ${conflictingRoots.join(", ")}`
|
|
933
|
+
);
|
|
934
|
+
}
|
|
935
|
+
chain.logger.debug("Equivocation validated while publishing execution payload envelope", valLogMeta);
|
|
936
|
+
}
|
|
937
|
+
|
|
889
938
|
if (payloadInput.hasPayloadEnvelope()) {
|
|
890
939
|
// The envelope may have been added while this request was being validated, e.g. via gossip
|
|
891
940
|
chain.logger.debug("Execution payload envelope already added during publishing", valLogMeta);
|
|
@@ -339,12 +339,13 @@ export function getValidatorApi(
|
|
|
339
339
|
* Following activities should be skipped on an Optimistic head (with Syncing status):
|
|
340
340
|
* 1. Attestation if targetRoot is optimistic
|
|
341
341
|
* 2. SyncCommitteeContribution if if the root for which to produce contribution is Optimistic.
|
|
342
|
-
* 3. ProduceBlock if the parentRoot (chain's current head is optimistic
|
|
343
|
-
*
|
|
344
|
-
*
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
*
|
|
342
|
+
* 3. ProduceBlock if the parentRoot (chain's current head) is optimistic. Must be checked
|
|
343
|
+
* explicitly as only local payload production consults the EL, blinded blocks from an
|
|
344
|
+
* external builder or bid based blocks (gloas) can be produced without a synced EL.
|
|
345
|
+
* 4. SyncCommitteeSignature (base sync committee message) is aborted in the validator client
|
|
346
|
+
* (see SyncCommitteeService) when the head root it would sign is optimistic, since it is
|
|
347
|
+
* produced from the head root without a beacon-node produce endpoint to gate here. Spec:
|
|
348
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.6.1/sync/optimistic.md#participating-in-sync-committees
|
|
348
349
|
*/
|
|
349
350
|
|
|
350
351
|
function notOnOptimisticBlockRoot(beaconBlockRoot: Root): void {
|
|
@@ -545,6 +546,12 @@ export function getValidatorApi(
|
|
|
545
546
|
const parentBlock = chain.getProposerHead(slot);
|
|
546
547
|
const {blockRoot: parentBlockRootHex, slot: parentSlot} = parentBlock;
|
|
547
548
|
const parentBlockRoot = fromHex(parentBlockRootHex);
|
|
549
|
+
// An optimistic validator MUST NOT produce a block
|
|
550
|
+
if (isOptimisticBlock(parentBlock)) {
|
|
551
|
+
throw new NodeIsSyncing(
|
|
552
|
+
`Parent block's execution payload not yet validated, executionPayloadBlockHash=${parentBlock.executionPayloadBlockHash}`
|
|
553
|
+
);
|
|
554
|
+
}
|
|
548
555
|
notOnOutOfRangeData(parentBlockRoot);
|
|
549
556
|
metrics?.blockProductionSlotDelta.set(slot - parentSlot);
|
|
550
557
|
|
|
@@ -870,6 +877,12 @@ export function getValidatorApi(
|
|
|
870
877
|
const parentBlock = chain.getProposerHead(slot);
|
|
871
878
|
const {blockRoot: parentBlockRootHex, slot: parentSlot} = parentBlock;
|
|
872
879
|
const parentBlockRoot = fromHex(parentBlockRootHex);
|
|
880
|
+
// An optimistic validator MUST NOT produce a block
|
|
881
|
+
if (isOptimisticBlock(parentBlock)) {
|
|
882
|
+
throw new NodeIsSyncing(
|
|
883
|
+
`Parent block's execution payload not yet validated, executionPayloadBlockHash=${parentBlock.executionPayloadBlockHash}`
|
|
884
|
+
);
|
|
885
|
+
}
|
|
873
886
|
notOnOutOfRangeData(parentBlockRoot);
|
|
874
887
|
metrics?.blockProductionSlotDelta.set(slot - parentSlot);
|
|
875
888
|
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
ForkChoiceError,
|
|
7
7
|
ForkChoiceErrorCode,
|
|
8
8
|
NotReorgedReason,
|
|
9
|
+
getFinalizedExecutionBlockHash,
|
|
9
10
|
getSafeExecutionBlockHash,
|
|
10
11
|
} from "@lodestar/fork-choice";
|
|
11
12
|
import {
|
|
@@ -443,8 +444,8 @@ export async function importBlock(
|
|
|
443
444
|
* the current finalized block does not contain any execution payload at all (pre MERGE_EPOCH) or if it contains a
|
|
444
445
|
* zero block hash (pre TTD)
|
|
445
446
|
*/
|
|
446
|
-
const safeBlockHash = getSafeExecutionBlockHash(this.forkChoice);
|
|
447
|
-
const finalizedBlockHash = this.forkChoice.
|
|
447
|
+
const safeBlockHash = getSafeExecutionBlockHash(this.forkChoice, this.logger);
|
|
448
|
+
const finalizedBlockHash = getFinalizedExecutionBlockHash(this.forkChoice, this.logger);
|
|
448
449
|
if (headBlockHash !== ZERO_HASH_HEX) {
|
|
449
450
|
this.executionEngine
|
|
450
451
|
.notifyForkchoiceUpdate(
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
ExecutionStatus,
|
|
4
|
+
PayloadExecutionStatus,
|
|
5
|
+
getFinalizedExecutionBlockHash,
|
|
6
|
+
getSafeExecutionBlockHash,
|
|
7
|
+
} from "@lodestar/fork-choice";
|
|
3
8
|
import {DataAvailabilityStatus, isStatePostGloas} from "@lodestar/state-transition";
|
|
4
9
|
import {isErrorAborted} from "@lodestar/utils";
|
|
5
|
-
import {ZERO_HASH_HEX} from "../../constants/index.js";
|
|
6
10
|
import {ExecutionPayloadStatus} from "../../execution/index.js";
|
|
7
11
|
import {isQueueErrorAborted} from "../../util/queue/index.js";
|
|
8
12
|
import {BeaconChain} from "../chain.js";
|
|
@@ -245,8 +249,8 @@ export async function importExecutionPayload(
|
|
|
245
249
|
// 7. Queue notifyForkchoiceUpdate to engine api
|
|
246
250
|
const head = this.forkChoice.getHead();
|
|
247
251
|
if (!this.opts.disableImportExecutionFcU && blockRootHex === head.blockRoot) {
|
|
248
|
-
const safeBlockHash = getSafeExecutionBlockHash(this.forkChoice);
|
|
249
|
-
const finalizedBlockHash = this.forkChoice.
|
|
252
|
+
const safeBlockHash = getSafeExecutionBlockHash(this.forkChoice, this.logger);
|
|
253
|
+
const finalizedBlockHash = getFinalizedExecutionBlockHash(this.forkChoice, this.logger);
|
|
250
254
|
this.executionEngine.notifyForkchoiceUpdate(fork, blockHashHex, safeBlockHash, finalizedBlockHash).catch((e) => {
|
|
251
255
|
if (!isErrorAborted(e) && !isQueueErrorAborted(e)) {
|
|
252
256
|
this.logger.error("Error pushing notifyForkchoiceUpdate()", {blockHashHex, finalizedBlockHash}, e);
|
|
@@ -108,6 +108,13 @@ export async function processBlocks(
|
|
|
108
108
|
throw segmentExecStatus.execAborted.execError;
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
if (opts.skipVerifyBlockSignatures !== true) {
|
|
112
|
+
for (const blockInput of relevantBlocks) {
|
|
113
|
+
const block = blockInput.getBlock().message;
|
|
114
|
+
this.seenBlockProposers.add(block.slot, block.proposerIndex);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
111
118
|
const {executionStatuses} = segmentExecStatus;
|
|
112
119
|
const verifiedBlocksBySlot = new Map<Slot, FullyVerifiedBlock>();
|
|
113
120
|
for (let i = 0; i < relevantBlocks.length; i++) {
|