@lodestar/beacon-node 1.49.0-dev.09a1892a85 → 1.49.0-dev.213b795b98
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.js +2 -2
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +6 -6
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/pruneHistory.js +5 -1
- package/lib/chain/archiveStore/utils/pruneHistory.js.map +1 -1
- package/lib/chain/blocks/index.js +2 -2
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.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/seenPayloadEnvelopeInput.d.ts +2 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +3 -2
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +2 -2
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +15 -0
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +16 -5
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/package.json +14 -14
- package/src/api/impl/beacon/blocks/index.ts +2 -2
- package/src/api/impl/validator/index.ts +6 -6
- package/src/chain/archiveStore/utils/pruneHistory.ts +5 -1
- package/src/chain/blocks/index.ts +2 -2
- package/src/chain/blocks/payloadEnvelopeInput/types.ts +1 -1
- package/src/chain/produceBlock/produceBlockBody.ts +17 -6
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +3 -2
- package/src/chain/validatorMonitor.ts +12 -2
- package/src/network/gossip/gossipsub.ts +18 -1
- package/src/network/processor/gossipHandlers.ts +18 -5
|
@@ -14,7 +14,7 @@ import {peerIdFromString} from "@libp2p/peer-id";
|
|
|
14
14
|
import {type Multiaddr, multiaddr} from "@multiformats/multiaddr";
|
|
15
15
|
import {ENR} from "@chainsafe/enr";
|
|
16
16
|
import {routes} from "@lodestar/api";
|
|
17
|
-
import {BeaconConfig, ForkBoundary} from "@lodestar/config";
|
|
17
|
+
import {BeaconConfig, ChainConfig, ForkBoundary} from "@lodestar/config";
|
|
18
18
|
import {
|
|
19
19
|
ATTESTATION_SUBNET_COUNT,
|
|
20
20
|
MAX_SIGNED_AGGREGATE_AND_PROOF_SIZE,
|
|
@@ -47,6 +47,22 @@ const GOSSIPSUB_HEARTBEAT_INTERVAL = 0.7 * 1000;
|
|
|
47
47
|
|
|
48
48
|
const MAX_OUTBOUND_BUFFER_SIZE = 2 ** 24; // 16MB
|
|
49
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Snappy worst-case compressed length for a payload of `n` bytes
|
|
52
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.7.0-beta.0/specs/phase0/p2p-interface.md#max_compressed_len
|
|
53
|
+
*/
|
|
54
|
+
function maxCompressedLen(n: number): number {
|
|
55
|
+
return 32 + n + Math.floor(n / 6);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Max size of an inbound gossipsub RPC frame, including all bundled messages and control
|
|
60
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.7.0-beta.0/specs/phase0/p2p-interface.md#max_message_size
|
|
61
|
+
*/
|
|
62
|
+
function getMaxInboundDataLength(config: Pick<ChainConfig, "MAX_PAYLOAD_SIZE">): number {
|
|
63
|
+
return Math.max(maxCompressedLen(config.MAX_PAYLOAD_SIZE) + 1024, 1024 * 1024);
|
|
64
|
+
}
|
|
65
|
+
|
|
50
66
|
export type Eth2Context = {
|
|
51
67
|
activeValidatorCount: number;
|
|
52
68
|
currentSlot: number;
|
|
@@ -176,6 +192,7 @@ export class Eth2Gossipsub {
|
|
|
176
192
|
asyncValidation: true,
|
|
177
193
|
|
|
178
194
|
maxOutboundBufferSize: MAX_OUTBOUND_BUFFER_SIZE,
|
|
195
|
+
maxInboundDataLength: getMaxInboundDataLength(config),
|
|
179
196
|
// serialize message once and send to all peers when publishing
|
|
180
197
|
batchPublish: true,
|
|
181
198
|
// if this is false, only publish to mesh peers. If there is not enough GOSSIP_D mesh peers,
|
|
@@ -244,8 +244,20 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
244
244
|
|
|
245
245
|
// IGNORE means the block is acceptable (e.g. FUTURE_SLOT, ALREADY_KNOWN), just not propagated.
|
|
246
246
|
// Keep the optimistically-added cache entries; they are pruned on finalization. Only REJECT
|
|
247
|
-
// (provably invalid)
|
|
247
|
+
// (provably invalid), unexpected errors and repeat proposals that are not imported prune.
|
|
248
248
|
if (e.action === GossipAction.IGNORE) {
|
|
249
|
+
// Only a signature-verified sibling is imported by the beacon_block handler, any other repeat proposal
|
|
250
|
+
// is dropped from the caches and re-downloaded by sync if it ever becomes relevant. Its signature was not
|
|
251
|
+
// verified, so only its own entry is removed, never its claimed ancestors
|
|
252
|
+
if (
|
|
253
|
+
e.type.code === BlockErrorCode.REPEAT_PROPOSAL &&
|
|
254
|
+
!chain.seenBlockProposers.hasBlockRoot(slot, signedBlock.message.proposerIndex, blockRootHex)
|
|
255
|
+
) {
|
|
256
|
+
chain.seenBlockInputCache.remove(blockRootHex);
|
|
257
|
+
if (isForkPostGloas(fork)) {
|
|
258
|
+
chain.seenPayloadEnvelopeInputCache.remove(blockRootHex);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
249
261
|
throw e;
|
|
250
262
|
}
|
|
251
263
|
|
|
@@ -258,10 +270,10 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
258
270
|
}
|
|
259
271
|
|
|
260
272
|
// REJECT or unexpected (non-BlockGossipError) error: drop the optimistically-added entries from
|
|
261
|
-
// both caches, keeping them consistent.
|
|
262
|
-
chain.seenBlockInputCache.
|
|
273
|
+
// both caches, keeping them consistent. The block may carry any parent root, so only its own entry is removed
|
|
274
|
+
chain.seenBlockInputCache.remove(blockRootHex);
|
|
263
275
|
if (isForkPostGloas(fork)) {
|
|
264
|
-
chain.seenPayloadEnvelopeInputCache.
|
|
276
|
+
chain.seenPayloadEnvelopeInputCache.remove(blockRootHex);
|
|
265
277
|
}
|
|
266
278
|
throw e;
|
|
267
279
|
} finally {
|
|
@@ -738,7 +750,8 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
738
750
|
if (
|
|
739
751
|
e instanceof BlockGossipError &&
|
|
740
752
|
e.type.code === BlockErrorCode.REPEAT_PROPOSAL &&
|
|
741
|
-
//
|
|
753
|
+
// Only a signature-verified sibling recorded in the seen cache is imported. The cache holds at most two
|
|
754
|
+
// roots per proposer and slot, which bounds full imports over gossip to one alternate
|
|
742
755
|
chain.seenBlockProposers.hasBlockRoot(signedBlock.message.slot, e.type.proposerIndex, e.type.root)
|
|
743
756
|
) {
|
|
744
757
|
// blockInput was optimistically seeded in validateBeaconBlock and retained on IGNORE
|