@lodestar/beacon-node 1.34.0-dev.e082a5188a → 1.34.0-dev.e53169f3a9
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 +21 -10
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +5 -5
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.js +9 -4
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/debug/index.js +4 -4
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/events/index.js +1 -1
- package/lib/api/impl/events/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +31 -25
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/impl/validator/utils.d.ts +3 -3
- package/lib/api/impl/validator/utils.js +2 -2
- package/lib/api/impl/validator/utils.js.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +19 -20
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/blocks/utils/blowfishBanner.js +1 -0
- package/lib/chain/blocks/utils/blowfishBanner.js.map +1 -1
- package/lib/chain/blocks/utils/giraffeBanner.js +1 -0
- package/lib/chain/blocks/utils/giraffeBanner.js.map +1 -1
- package/lib/chain/blocks/utils/zebraBanner.d.ts +2 -0
- package/lib/chain/blocks/utils/zebraBanner.js +46 -0
- package/lib/chain/blocks/utils/zebraBanner.js.map +1 -0
- package/lib/chain/blocks/verifyBlock.js +18 -5
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +7 -34
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/multithread/index.js +2 -2
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/chain.js +27 -19
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts +2 -1
- package/lib/chain/forkChoice/index.js +2 -2
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +13 -3
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +1 -1
- package/lib/chain/opPools/attestationPool.js +7 -7
- package/lib/chain/prepareNextSlot.js +2 -1
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/rewards/syncCommitteeRewards.js +4 -4
- package/lib/chain/rewards/syncCommitteeRewards.js.map +1 -1
- package/lib/chain/validation/aggregateAndProof.d.ts +1 -1
- package/lib/chain/validation/aggregateAndProof.js +8 -8
- package/lib/chain/validation/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/attestation.d.ts +3 -3
- package/lib/chain/validation/attestation.js +10 -10
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.js +13 -4
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js +2 -2
- package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
- package/lib/db/beacon.d.ts +3 -3
- package/lib/db/beacon.js +3 -3
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/interface.d.ts +3 -3
- package/lib/db/repositories/dataColumnSidecar.d.ts +26 -0
- package/lib/db/repositories/dataColumnSidecar.js +39 -0
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -0
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts +24 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js +39 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -0
- package/lib/db/repositories/index.d.ts +2 -2
- package/lib/db/repositories/index.js +2 -2
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/db/repositories/stateArchive.js +1 -1
- package/lib/db/repositories/stateArchive.js.map +1 -1
- package/lib/execution/engine/http.js +10 -5
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +4 -1
- package/lib/execution/engine/mock.js +54 -16
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/types.d.ts +3 -3
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/execution/engine/utils.js +1 -1
- package/lib/execution/engine/utils.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +1 -23
- package/lib/metrics/metrics/beacon.js +5 -61
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +6 -0
- package/lib/metrics/metrics/lodestar.js +14 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/metrics.d.ts +2 -1
- package/lib/metrics/metrics.js +3 -0
- package/lib/metrics/metrics.js.map +1 -1
- package/lib/network/core/networkCore.js +0 -1
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/gossip/scoringParameters.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +90 -90
- package/lib/network/interface.d.ts +3 -3
- package/lib/network/network.d.ts +3 -3
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.js +2 -2
- package/lib/network/peers/peerManager.js +4 -1
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/processor/gossipHandlers.js +13 -13
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +7 -2
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +4 -4
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js +3 -3
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts +2 -2
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +2 -2
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js +2 -3
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +3 -3
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +55 -46
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +2 -2
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +43 -35
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/index.js +4 -3
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/rateLimit.js +9 -3
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +3 -3
- package/lib/network/reqresp/types.js +3 -3
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts +14 -0
- package/lib/network/reqresp/utils/dataColumnResponseValidation.js +56 -0
- package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -0
- package/lib/sync/backfill/backfill.js +1 -1
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +44 -3
- package/lib/sync/unknownBlock.js +272 -193
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/util/dataColumns.js +4 -0
- package/lib/util/dataColumns.js.map +1 -1
- package/lib/util/queue/fnQueue.js +1 -1
- package/lib/util/queue/fnQueue.js.map +1 -1
- package/lib/util/queue/itemQueue.js +1 -1
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/sszBytes.d.ts +2 -0
- package/lib/util/sszBytes.js +23 -0
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/types.d.ts +7 -0
- package/lib/util/types.js +3 -0
- package/lib/util/types.js.map +1 -1
- package/package.json +17 -18
- package/lib/db/repositories/dataColumnSidecars.d.ts +0 -47
- package/lib/db/repositories/dataColumnSidecars.js +0 -40
- package/lib/db/repositories/dataColumnSidecars.js.map +0 -1
- package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +0 -15
- package/lib/db/repositories/dataColumnSidecarsArchive.js +0 -23
- package/lib/db/repositories/dataColumnSidecarsArchive.js.map +0 -1
|
@@ -1,23 +1,43 @@
|
|
|
1
|
-
import { GENESIS_SLOT
|
|
1
|
+
import { GENESIS_SLOT } from "@lodestar/params";
|
|
2
2
|
import { RespStatus, ResponseError } from "@lodestar/reqresp";
|
|
3
3
|
import { computeEpochAtSlot } from "@lodestar/state-transition";
|
|
4
|
-
import { ssz } from "@lodestar/types";
|
|
5
4
|
import { fromHex } from "@lodestar/utils";
|
|
6
|
-
import {
|
|
5
|
+
import { validateRequestedDataColumns } from "../utils/dataColumnResponseValidation.js";
|
|
7
6
|
export async function* onDataColumnSidecarsByRange(request, chain, db) {
|
|
8
7
|
// Non-finalized range of columns
|
|
9
|
-
const { startSlot, count, columns } = validateDataColumnSidecarsByRangeRequest(request);
|
|
8
|
+
const { startSlot, count, columns: requestedColumns } = validateDataColumnSidecarsByRangeRequest(chain.config, request);
|
|
9
|
+
const availableColumns = validateRequestedDataColumns(chain, requestedColumns);
|
|
10
10
|
const endSlot = startSlot + count;
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
if (availableColumns.length === 0) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const finalized = db.dataColumnSidecarArchive;
|
|
15
|
+
const unfinalized = db.dataColumnSidecar;
|
|
13
16
|
const finalizedSlot = chain.forkChoice.getFinalizedBlock().slot;
|
|
14
17
|
// Finalized range of columns
|
|
15
18
|
if (startSlot <= finalizedSlot) {
|
|
16
|
-
for
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
for (let slot = startSlot; slot < endSlot; slot++) {
|
|
20
|
+
const dataColumnSidecars = await finalized.getManyBinary(slot, availableColumns);
|
|
21
|
+
for (const dataColumnSidecarBytes of dataColumnSidecars) {
|
|
22
|
+
if (dataColumnSidecarBytes) {
|
|
23
|
+
yield {
|
|
24
|
+
data: dataColumnSidecarBytes,
|
|
25
|
+
boundary: chain.config.getForkBoundaryAtEpoch(computeEpochAtSlot(slot)),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// TODO: Check blobs for that block and respond resource_unavailable
|
|
29
|
+
// After we have consensus from other teams on the specs
|
|
30
|
+
// else {
|
|
31
|
+
// await handleColumnSidecarUnavailability({
|
|
32
|
+
// chain,
|
|
33
|
+
// db,
|
|
34
|
+
// unavailableColumnIndex: availableColumns[index],
|
|
35
|
+
// slot,
|
|
36
|
+
// requestedColumns,
|
|
37
|
+
// availableColumns,
|
|
38
|
+
// });
|
|
39
|
+
// }
|
|
40
|
+
}
|
|
21
41
|
}
|
|
22
42
|
}
|
|
23
43
|
// Non-finalized range of columns
|
|
@@ -33,12 +53,28 @@ export async function* onDataColumnSidecarsByRange(request, chain, db) {
|
|
|
33
53
|
// at the time of the start of the request. Spec is clear the chain of columns must be consistent, but on
|
|
34
54
|
// re-org there's no need to abort the request
|
|
35
55
|
// Spec: https://github.com/ethereum/consensus-specs/blob/ad36024441cf910d428d03f87f331fbbd2b3e5f1/specs/fulu/p2p-interface.md#L425-L429
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
56
|
+
const dataColumnSidecars = await unfinalized.getManyBinary(fromHex(block.blockRoot), availableColumns);
|
|
57
|
+
for (const dataColumnSidecarBytes of dataColumnSidecars) {
|
|
58
|
+
if (dataColumnSidecarBytes) {
|
|
59
|
+
yield {
|
|
60
|
+
data: dataColumnSidecarBytes,
|
|
61
|
+
boundary: chain.config.getForkBoundaryAtEpoch(computeEpochAtSlot(block.slot)),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// TODO: Check blobs for that block and respond resource_unavailable
|
|
65
|
+
// After we have consensus from other teams on the specs
|
|
66
|
+
// else {
|
|
67
|
+
// await handleColumnSidecarUnavailability({
|
|
68
|
+
// chain,
|
|
69
|
+
// db,
|
|
70
|
+
// unavailableColumnIndex: availableColumns[index],
|
|
71
|
+
// blockRoot: fromHex(block.blockRoot),
|
|
72
|
+
// slot: block.slot,
|
|
73
|
+
// requestedColumns,
|
|
74
|
+
// availableColumns,
|
|
75
|
+
// });
|
|
76
|
+
// }
|
|
40
77
|
}
|
|
41
|
-
yield* iterateDataColumnBytesFromWrapper(chain, dataColumnSidecarsBytesWrapped, block.slot, columns);
|
|
42
78
|
}
|
|
43
79
|
// If block is after endSlot, stop iterating
|
|
44
80
|
else if (block.slot >= endSlot) {
|
|
@@ -47,34 +83,7 @@ export async function* onDataColumnSidecarsByRange(request, chain, db) {
|
|
|
47
83
|
}
|
|
48
84
|
}
|
|
49
85
|
}
|
|
50
|
-
export function
|
|
51
|
-
const retrivedColumnsLen = ssz.Uint8.deserialize(dataColumnSidecarsBytesWrapped.slice(NUM_COLUMNS_IN_WRAPPER_INDEX, COLUMN_SIZE_IN_WRAPPER_INDEX));
|
|
52
|
-
const retrievedColumnsSizeBytes = dataColumnSidecarsBytesWrapped.slice(COLUMN_SIZE_IN_WRAPPER_INDEX, CUSTODY_COLUMNS_IN_IN_WRAPPER_INDEX);
|
|
53
|
-
const columnsSize = ssz.UintNum64.deserialize(retrievedColumnsSizeBytes);
|
|
54
|
-
const dataColumnsIndex = dataColumnSidecarsBytesWrapped.slice(CUSTODY_COLUMNS_IN_IN_WRAPPER_INDEX, CUSTODY_COLUMNS_IN_IN_WRAPPER_INDEX + NUMBER_OF_COLUMNS);
|
|
55
|
-
const allDataColumnSidecarsBytes = dataColumnSidecarsBytesWrapped.slice(DATA_COLUMN_SIDECARS_IN_WRAPPER_INDEX + 4 * retrivedColumnsLen);
|
|
56
|
-
const columnsLen = allDataColumnSidecarsBytes.length / columnsSize;
|
|
57
|
-
// no columns possibly no blobs
|
|
58
|
-
if (columnsLen === 0) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
for (const index of columns) {
|
|
62
|
-
// get the index at which the column is
|
|
63
|
-
const dataIndex = (dataColumnsIndex[index] ?? 0) - 1;
|
|
64
|
-
if (dataIndex < 0) {
|
|
65
|
-
throw new ResponseError(RespStatus.SERVER_ERROR, `dataColumnSidecar index=${index} dataIndex=${dataIndex} not custodied`);
|
|
66
|
-
}
|
|
67
|
-
const dataColumnSidecarBytes = allDataColumnSidecarsBytes.slice(dataIndex * columnsSize, (dataIndex + 1) * columnsSize);
|
|
68
|
-
if (dataColumnSidecarBytes.length !== columnsSize) {
|
|
69
|
-
throw new ResponseError(RespStatus.SERVER_ERROR, `Invalid dataColumnSidecar index=${index} dataIndex=${dataIndex} bytes length=${dataColumnSidecarBytes.length} expected=${columnsSize} for slot ${blockSlot} blobsLen=${columnsLen}`);
|
|
70
|
-
}
|
|
71
|
-
yield {
|
|
72
|
-
data: dataColumnSidecarBytes,
|
|
73
|
-
boundary: chain.config.getForkBoundaryAtEpoch(computeEpochAtSlot(blockSlot)),
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
export function validateDataColumnSidecarsByRangeRequest(request) {
|
|
86
|
+
export function validateDataColumnSidecarsByRangeRequest(config, request) {
|
|
78
87
|
const { startSlot, columns } = request;
|
|
79
88
|
let { count } = request;
|
|
80
89
|
if (count < 1) {
|
|
@@ -84,8 +93,8 @@ export function validateDataColumnSidecarsByRangeRequest(request) {
|
|
|
84
93
|
if (startSlot < GENESIS_SLOT) {
|
|
85
94
|
throw new ResponseError(RespStatus.INVALID_REQUEST, "startSlot < genesis");
|
|
86
95
|
}
|
|
87
|
-
if (count > MAX_REQUEST_BLOCKS_DENEB) {
|
|
88
|
-
count = MAX_REQUEST_BLOCKS_DENEB;
|
|
96
|
+
if (count > config.MAX_REQUEST_BLOCKS_DENEB) {
|
|
97
|
+
count = config.MAX_REQUEST_BLOCKS_DENEB;
|
|
89
98
|
}
|
|
90
99
|
return { startSlot, count, columns };
|
|
91
100
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataColumnSidecarsByRange.js","sourceRoot":"","sources":["../../../../src/network/reqresp/handlers/dataColumnSidecarsByRange.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dataColumnSidecarsByRange.js","sourceRoot":"","sources":["../../../../src/network/reqresp/handlers/dataColumnSidecarsByRange.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ResponseOutgoing } from "@lodestar/reqresp";
|
|
2
|
-
import { fulu } from "@lodestar/types";
|
|
3
2
|
import { IBeaconChain } from "../../../chain/index.js";
|
|
4
3
|
import { IBeaconDb } from "../../../db/index.js";
|
|
5
|
-
|
|
4
|
+
import { DataColumnSidecarsByRootRequest } from "../../../util/types.js";
|
|
5
|
+
export declare function onDataColumnSidecarsByRoot(requestBody: DataColumnSidecarsByRootRequest, chain: IBeaconChain, db: IBeaconDb): AsyncIterable<ResponseOutgoing>;
|
|
6
6
|
//# sourceMappingURL=dataColumnSidecarsByRoot.d.ts.map
|
|
@@ -1,49 +1,57 @@
|
|
|
1
|
-
import { NUMBER_OF_COLUMNS } from "@lodestar/params";
|
|
2
|
-
import { RespStatus, ResponseError } from "@lodestar/reqresp";
|
|
3
1
|
import { computeEpochAtSlot } from "@lodestar/state-transition";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { COLUMN_SIZE_IN_WRAPPER_INDEX, CUSTODY_COLUMNS_IN_IN_WRAPPER_INDEX, DATA_COLUMN_SIDECARS_IN_WRAPPER_INDEX, NUM_COLUMNS_IN_WRAPPER_INDEX, } from "../../../db/repositories/dataColumnSidecars.js";
|
|
2
|
+
import { toRootHex } from "@lodestar/utils";
|
|
3
|
+
import { validateRequestedDataColumns } from "../utils/dataColumnResponseValidation.js";
|
|
7
4
|
export async function* onDataColumnSidecarsByRoot(requestBody, chain, db) {
|
|
8
|
-
// SPEC: minimum_request_epoch = max(
|
|
9
|
-
const finalizedEpoch = chain.forkChoice.getFinalizedCheckpoint().epoch;
|
|
5
|
+
// SPEC: minimum_request_epoch = max(current_epoch - MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS, FULU_FORK_EPOCH)
|
|
10
6
|
const currentEpoch = chain.clock.currentEpoch;
|
|
11
|
-
const minimumRequestEpoch = Math.max(
|
|
7
|
+
const minimumRequestEpoch = Math.max(currentEpoch - chain.config.MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS, chain.config.FULU_FORK_EPOCH);
|
|
12
8
|
for (const dataColumnsByRootIdentifier of requestBody) {
|
|
13
|
-
const { blockRoot, columns } = dataColumnsByRootIdentifier;
|
|
14
|
-
const
|
|
9
|
+
const { blockRoot, columns: requestedColumns } = dataColumnsByRootIdentifier;
|
|
10
|
+
const availableColumns = validateRequestedDataColumns(chain, requestedColumns);
|
|
11
|
+
if (availableColumns.length === 0) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const blockRootHex = toRootHex(blockRoot);
|
|
15
15
|
const block = chain.forkChoice.getBlockHex(blockRootHex);
|
|
16
|
-
//
|
|
16
|
+
// If the block is not in fork choice, it may be finalized. Attempt to find its slot in block archive
|
|
17
|
+
const slot = block ? block.slot : await db.blockArchive.getSlotByRoot(blockRoot);
|
|
18
|
+
if (slot === null) {
|
|
19
|
+
// We haven't seen the block
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const requestedEpoch = computeEpochAtSlot(slot);
|
|
17
23
|
// SPEC: Clients MUST support requesting sidecars since minimum_request_epoch.
|
|
18
24
|
// If any root in the request content references a block earlier than minimum_request_epoch, peers MAY respond with
|
|
19
25
|
// error code 3: ResourceUnavailable or not include the data column sidecar in the response.
|
|
20
|
-
// https://github.com/ethereum/consensus-specs/blob/
|
|
21
|
-
if (
|
|
26
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.5/specs/fulu/p2p-interface.md#datacolumnsidecarsbyroot-v1
|
|
27
|
+
if (requestedEpoch < minimumRequestEpoch) {
|
|
22
28
|
continue;
|
|
23
29
|
}
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const dataIndex = (dataColumnsIndex[index] ?? 0) - 1;
|
|
36
|
-
if (dataIndex < 0) {
|
|
37
|
-
throw new ResponseError(RespStatus.SERVER_ERROR, `dataColumnSidecar index=${index} not custodied`);
|
|
38
|
-
}
|
|
39
|
-
const dataColumnSidecarBytes = dataColumnSidecarsBytes.slice(dataIndex * columnsSize, (dataIndex + 1) * columnsSize);
|
|
40
|
-
if (dataColumnSidecarBytes.length !== columnsSize) {
|
|
41
|
-
throw Error(`Inconsistent state, dataColumnSidecar blockRoot=${blockRootHex} index=${index} dataColumnSidecarBytes=${dataColumnSidecarBytes.length} expected=${columnsSize}`);
|
|
30
|
+
const dataColumns = block
|
|
31
|
+
? // Non-finalized sidecars are stored by block root
|
|
32
|
+
await db.dataColumnSidecar.getManyBinary(blockRoot, availableColumns)
|
|
33
|
+
: // Finalized sidecars are archived and stored by slot
|
|
34
|
+
await db.dataColumnSidecarArchive.getManyBinary(slot, availableColumns);
|
|
35
|
+
for (const dataColumnBytes of dataColumns) {
|
|
36
|
+
if (dataColumnBytes) {
|
|
37
|
+
yield {
|
|
38
|
+
data: dataColumnBytes,
|
|
39
|
+
boundary: chain.config.getForkBoundaryAtEpoch(requestedEpoch),
|
|
40
|
+
};
|
|
42
41
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
// TODO: Check blobs for that block and respond resource_unavailable
|
|
43
|
+
// After we have consensus from other teams on the specs
|
|
44
|
+
// else {
|
|
45
|
+
// await handleColumnSidecarUnavailability({
|
|
46
|
+
// chain,
|
|
47
|
+
// db,
|
|
48
|
+
// unavailableColumnIndex: availableColumns[index],
|
|
49
|
+
// slot: block.slot,
|
|
50
|
+
// blockRoot: fromHex(block.blockRoot),
|
|
51
|
+
// requestedColumns,
|
|
52
|
+
// availableColumns,
|
|
53
|
+
// });
|
|
54
|
+
// }
|
|
47
55
|
}
|
|
48
56
|
}
|
|
49
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataColumnSidecarsByRoot.js","sourceRoot":"","sources":["../../../../src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dataColumnSidecarsByRoot.js","sourceRoot":"","sources":["../../../../src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAI1C,OAAO,EAAC,4BAA4B,EAAC,MAAM,0CAA0C,CAAC;AAEtF,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,0BAA0B,CAC/C,WAA4C,EAC5C,KAAmB,EACnB,EAAa;IAEb,mHAAmH;IACnH,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;IAC9C,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAClC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,4CAA4C,EACxE,KAAK,CAAC,MAAM,CAAC,eAAe,CAC7B,CAAC;IAEF,KAAK,MAAM,2BAA2B,IAAI,WAAW,EAAE,CAAC;QACtD,MAAM,EAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAC,GAAG,2BAA2B,CAAC;QAC3E,MAAM,gBAAgB,GAAG,4BAA4B,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAC/E,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACzD,qGAAqG;QACrG,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAEjF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,4BAA4B;YAC5B,SAAS;QACX,CAAC;QAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEhD,8EAA8E;QAC9E,mHAAmH;QACnH,4FAA4F;QAC5F,0HAA0H;QAC1H,IAAI,cAAc,GAAG,mBAAmB,EAAE,CAAC;YACzC,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,KAAK;YACvB,CAAC,CAAC,kDAAkD;gBAClD,MAAM,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,SAAS,EAAE,gBAAgB,CAAC;YACvE,CAAC,CAAC,qDAAqD;gBACrD,MAAM,EAAE,CAAC,wBAAwB,CAAC,aAAa,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAE5E,KAAK,MAAM,eAAe,IAAI,WAAW,EAAE,CAAC;YAC1C,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM;oBACJ,IAAI,EAAE,eAAe;oBACrB,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,cAAc,CAAC;iBAC9D,CAAC;YACJ,CAAC;YAED,oEAAoE;YACpE,wDAAwD;YACxD,SAAS;YACT,8CAA8C;YAC9C,aAAa;YACb,UAAU;YACV,uDAAuD;YACvD,wBAAwB;YACxB,2CAA2C;YAC3C,wBAAwB;YACxB,wBAAwB;YACxB,QAAQ;YACR,IAAI;QACN,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ssz } from "@lodestar/types";
|
|
2
|
-
import { BlobSidecarsByRootRequestType } from "../../../util/types.js";
|
|
2
|
+
import { BeaconBlocksByRootRequestType, BlobSidecarsByRootRequestType, DataColumnSidecarsByRootRequestType, } from "../../../util/types.js";
|
|
3
3
|
import { ReqRespMethod } from "../types.js";
|
|
4
4
|
import { onBeaconBlocksByRange } from "./beaconBlocksByRange.js";
|
|
5
5
|
import { onBeaconBlocksByRoot } from "./beaconBlocksByRoot.js";
|
|
@@ -31,7 +31,8 @@ export function getReqRespHandlers({ db, chain }) {
|
|
|
31
31
|
return onBeaconBlocksByRange(body, chain, db);
|
|
32
32
|
},
|
|
33
33
|
[ReqRespMethod.BeaconBlocksByRoot]: (req) => {
|
|
34
|
-
const
|
|
34
|
+
const fork = chain.config.getForkName(chain.clock.currentSlot);
|
|
35
|
+
const body = BeaconBlocksByRootRequestType(fork, chain.config).deserialize(req.data);
|
|
35
36
|
return onBeaconBlocksByRoot(body, chain, db);
|
|
36
37
|
},
|
|
37
38
|
[ReqRespMethod.BlobSidecarsByRoot]: (req) => {
|
|
@@ -48,7 +49,7 @@ export function getReqRespHandlers({ db, chain }) {
|
|
|
48
49
|
return onDataColumnSidecarsByRange(body, chain, db);
|
|
49
50
|
},
|
|
50
51
|
[ReqRespMethod.DataColumnSidecarsByRoot]: (req) => {
|
|
51
|
-
const body =
|
|
52
|
+
const body = DataColumnSidecarsByRootRequestType(chain.config).deserialize(req.data);
|
|
52
53
|
return onDataColumnSidecarsByRoot(body, chain, db);
|
|
53
54
|
},
|
|
54
55
|
[ReqRespMethod.LightClientBootstrap]: (req) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/network/reqresp/handlers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAGpC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/network/reqresp/handlers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MAX_REQUEST_LIGHT_CLIENT_UPDATES, isForkPostDeneb } from "@lodestar/params";
|
|
2
2
|
import { ReqRespMethod, requestSszTypeByMethod } from "./types.js";
|
|
3
3
|
export const rateLimitQuotas = (fork, config) => ({
|
|
4
4
|
[ReqRespMethod.Status]: {
|
|
@@ -20,12 +20,18 @@ export const rateLimitQuotas = (fork, config) => ({
|
|
|
20
20
|
// Do not matter
|
|
21
21
|
[ReqRespMethod.BeaconBlocksByRange]: {
|
|
22
22
|
// Rationale: https://github.com/sigp/lighthouse/blob/bf533c8e42cc73c35730e285c21df8add0195369/beacon_node/lighthouse_network/src/rpc/mod.rs#L118-L130
|
|
23
|
-
byPeer: {
|
|
23
|
+
byPeer: {
|
|
24
|
+
quota: isForkPostDeneb(fork) ? config.MAX_REQUEST_BLOCKS_DENEB : config.MAX_REQUEST_BLOCKS,
|
|
25
|
+
quotaTimeMs: 10_000,
|
|
26
|
+
},
|
|
24
27
|
getRequestCount: getRequestCountFn(fork, config, ReqRespMethod.BeaconBlocksByRange, (req) => req.count),
|
|
25
28
|
},
|
|
26
29
|
[ReqRespMethod.BeaconBlocksByRoot]: {
|
|
27
30
|
// Rationale: https://github.com/sigp/lighthouse/blob/bf533c8e42cc73c35730e285c21df8add0195369/beacon_node/lighthouse_network/src/rpc/mod.rs#L118-L130
|
|
28
|
-
byPeer: {
|
|
31
|
+
byPeer: {
|
|
32
|
+
quota: isForkPostDeneb(fork) ? config.MAX_REQUEST_BLOCKS_DENEB : config.MAX_REQUEST_BLOCKS,
|
|
33
|
+
quotaTimeMs: 10_000,
|
|
34
|
+
},
|
|
29
35
|
getRequestCount: getRequestCountFn(fork, config, ReqRespMethod.BeaconBlocksByRoot, (req) => req.length),
|
|
30
36
|
},
|
|
31
37
|
[ReqRespMethod.BlobSidecarsByRange]: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../../src/network/reqresp/rateLimit.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../../src/network/reqresp/rateLimit.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { BeaconConfig } from "@lodestar/config";
|
|
|
3
3
|
import { ForkName } from "@lodestar/params";
|
|
4
4
|
import { Protocol, ProtocolHandler, ReqRespRequest } from "@lodestar/reqresp";
|
|
5
5
|
import { LightClientBootstrap, LightClientFinalityUpdate, LightClientOptimisticUpdate, LightClientUpdate, Metadata, Root, SignedBeaconBlock, Status, altair, deneb, fulu, phase0 } from "@lodestar/types";
|
|
6
|
-
import { BlobSidecarsByRootRequest } from "../../util/types.js";
|
|
6
|
+
import { BeaconBlocksByRootRequest, BlobSidecarsByRootRequest, DataColumnSidecarsByRootRequest } from "../../util/types.js";
|
|
7
7
|
export type ProtocolNoHandler = Omit<Protocol, "handler">;
|
|
8
8
|
/** ReqResp protocol names or methods. Each ReqRespMethod can have multiple versions and encodings */
|
|
9
9
|
export declare enum ReqRespMethod {
|
|
@@ -28,11 +28,11 @@ export type RequestBodyByMethod = {
|
|
|
28
28
|
[ReqRespMethod.Ping]: phase0.Ping;
|
|
29
29
|
[ReqRespMethod.Metadata]: null;
|
|
30
30
|
[ReqRespMethod.BeaconBlocksByRange]: phase0.BeaconBlocksByRangeRequest;
|
|
31
|
-
[ReqRespMethod.BeaconBlocksByRoot]:
|
|
31
|
+
[ReqRespMethod.BeaconBlocksByRoot]: BeaconBlocksByRootRequest;
|
|
32
32
|
[ReqRespMethod.BlobSidecarsByRange]: deneb.BlobSidecarsByRangeRequest;
|
|
33
33
|
[ReqRespMethod.BlobSidecarsByRoot]: BlobSidecarsByRootRequest;
|
|
34
34
|
[ReqRespMethod.DataColumnSidecarsByRange]: fulu.DataColumnSidecarsByRangeRequest;
|
|
35
|
-
[ReqRespMethod.DataColumnSidecarsByRoot]:
|
|
35
|
+
[ReqRespMethod.DataColumnSidecarsByRoot]: DataColumnSidecarsByRootRequest;
|
|
36
36
|
[ReqRespMethod.LightClientBootstrap]: Root;
|
|
37
37
|
[ReqRespMethod.LightClientUpdatesByRange]: altair.LightClientUpdatesByRange;
|
|
38
38
|
[ReqRespMethod.LightClientFinalityUpdate]: null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isForkPostAltair } from "@lodestar/params";
|
|
2
2
|
import { ssz, sszTypesFor, } from "@lodestar/types";
|
|
3
|
-
import { BlobSidecarsByRootRequestType } from "../../util/types.js";
|
|
3
|
+
import { BeaconBlocksByRootRequestType, BlobSidecarsByRootRequestType, DataColumnSidecarsByRootRequestType, } from "../../util/types.js";
|
|
4
4
|
/** ReqResp protocol names or methods. Each ReqRespMethod can have multiple versions and encodings */
|
|
5
5
|
export var ReqRespMethod;
|
|
6
6
|
(function (ReqRespMethod) {
|
|
@@ -29,11 +29,11 @@ export const requestSszTypeByMethod = (fork, config) => ({
|
|
|
29
29
|
[ReqRespMethod.Ping]: ssz.phase0.Ping,
|
|
30
30
|
[ReqRespMethod.Metadata]: null,
|
|
31
31
|
[ReqRespMethod.BeaconBlocksByRange]: ssz.phase0.BeaconBlocksByRangeRequest,
|
|
32
|
-
[ReqRespMethod.BeaconBlocksByRoot]:
|
|
32
|
+
[ReqRespMethod.BeaconBlocksByRoot]: BeaconBlocksByRootRequestType(fork, config),
|
|
33
33
|
[ReqRespMethod.BlobSidecarsByRange]: ssz.deneb.BlobSidecarsByRangeRequest,
|
|
34
34
|
[ReqRespMethod.BlobSidecarsByRoot]: BlobSidecarsByRootRequestType(fork, config),
|
|
35
35
|
[ReqRespMethod.DataColumnSidecarsByRange]: ssz.fulu.DataColumnSidecarsByRangeRequest,
|
|
36
|
-
[ReqRespMethod.DataColumnSidecarsByRoot]:
|
|
36
|
+
[ReqRespMethod.DataColumnSidecarsByRoot]: DataColumnSidecarsByRootRequestType(config),
|
|
37
37
|
[ReqRespMethod.LightClientBootstrap]: ssz.Root,
|
|
38
38
|
[ReqRespMethod.LightClientUpdatesByRange]: ssz.altair.LightClientUpdatesByRange,
|
|
39
39
|
[ReqRespMethod.LightClientFinalityUpdate]: null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/network/reqresp/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAE5E,OAAO,EAaL,GAAG,EACH,WAAW,GACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/network/reqresp/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ColumnIndex, Slot } from "@lodestar/types";
|
|
2
|
+
import { IBeaconChain } from "../../../chain/interface.js";
|
|
3
|
+
import { IBeaconDb } from "../../../db/interface.js";
|
|
4
|
+
export declare function handleColumnSidecarUnavailability({ chain, db, unavailableColumnIndex, requestedColumns, availableColumns, slot, blockRoot, }: {
|
|
5
|
+
chain: IBeaconChain;
|
|
6
|
+
db: IBeaconDb;
|
|
7
|
+
slot: Slot;
|
|
8
|
+
blockRoot?: Uint8Array;
|
|
9
|
+
unavailableColumnIndex: ColumnIndex;
|
|
10
|
+
requestedColumns: ColumnIndex[];
|
|
11
|
+
availableColumns: ColumnIndex[];
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
export declare function validateRequestedDataColumns(chain: IBeaconChain, requestedColumns: ColumnIndex[]): ColumnIndex[];
|
|
14
|
+
//# sourceMappingURL=dataColumnResponseValidation.d.ts.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { RespStatus, ResponseError } from "@lodestar/reqresp";
|
|
2
|
+
import { prettyBytes, prettyPrintIndices } from "@lodestar/utils";
|
|
3
|
+
import { getBlobKzgCommitmentsCountFromSignedBeaconBlockSerialized } from "../../../util/sszBytes.js";
|
|
4
|
+
export async function handleColumnSidecarUnavailability({ chain, db, unavailableColumnIndex, requestedColumns, availableColumns, slot, blockRoot, }) {
|
|
5
|
+
const logData = {
|
|
6
|
+
unavailableColumnIndex,
|
|
7
|
+
requestedColumns: prettyPrintIndices(requestedColumns),
|
|
8
|
+
availableColumns: prettyPrintIndices(availableColumns),
|
|
9
|
+
slot,
|
|
10
|
+
};
|
|
11
|
+
if (blockRoot) {
|
|
12
|
+
logData.blockRoot = prettyBytes(blockRoot);
|
|
13
|
+
}
|
|
14
|
+
chain.logger.debug("dataColumnSidecar requested unavailable", logData);
|
|
15
|
+
const blockBytes = blockRoot ? await db.block.getBinary(blockRoot) : await db.blockArchive.getBinary(slot);
|
|
16
|
+
if (!blockBytes) {
|
|
17
|
+
chain.logger.error(`Expected ${blockRoot ? "unfinalized" : "finalized"} block not found while handling unavailable dataColumnSidecar`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// Check for blob count in actual block
|
|
21
|
+
const blobsCount = getBlobKzgCommitmentsCountFromSignedBeaconBlockSerialized(chain.config, blockBytes);
|
|
22
|
+
// There are zero blobs for that column index, so we can safely return without any error
|
|
23
|
+
if (blobsCount > 0)
|
|
24
|
+
return;
|
|
25
|
+
// There are blobs for that column index so we should have synced for it
|
|
26
|
+
// We need to inform to peers that we don't have that expected data
|
|
27
|
+
// NOTE: We may look to add some metrics to track such scenario
|
|
28
|
+
throw new ResponseError(RespStatus.RESOURCE_UNAVAILABLE, `dataColumnSidecar requested and within custody not available for columnIndex=${unavailableColumnIndex}`);
|
|
29
|
+
}
|
|
30
|
+
export function validateRequestedDataColumns(chain, requestedColumns) {
|
|
31
|
+
if (requestedColumns.length === 0) {
|
|
32
|
+
throw new ResponseError(RespStatus.INVALID_REQUEST, "dataColumnSidecar requested without column indices");
|
|
33
|
+
}
|
|
34
|
+
const custodyColumns = chain.custodyConfig.custodyColumns;
|
|
35
|
+
const availableColumns = requestedColumns.filter((c) => custodyColumns.includes(c));
|
|
36
|
+
const missingColumns = requestedColumns.filter((c) => !custodyColumns.includes(c));
|
|
37
|
+
if (missingColumns.length > 0) {
|
|
38
|
+
chain.logger.verbose("Requested dataColumnSidecar for non-custody columns", {
|
|
39
|
+
requestedColumns: prettyPrintIndices(requestedColumns),
|
|
40
|
+
custodyColumns: prettyPrintIndices(custodyColumns),
|
|
41
|
+
availableColumns: prettyPrintIndices(availableColumns),
|
|
42
|
+
missingColumns: prettyPrintIndices(missingColumns),
|
|
43
|
+
});
|
|
44
|
+
// TODO: We should throw error and only respond to valid requests
|
|
45
|
+
// A peer must check what we announced in our custody and only ask for those columns
|
|
46
|
+
// throw new ResponseError(RespStatus.INVALID_REQUEST, "dataColumnSidecar requested for non-custody columns");
|
|
47
|
+
}
|
|
48
|
+
if (availableColumns.length === 0) {
|
|
49
|
+
chain.logger.verbose("Requested dataColumnSidecars not available", {
|
|
50
|
+
requestedColumns: prettyPrintIndices(requestedColumns),
|
|
51
|
+
custodyColumns: prettyPrintIndices(custodyColumns),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return availableColumns;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=dataColumnResponseValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataColumnResponseValidation.js","sourceRoot":"","sources":["../../../../src/network/reqresp/utils/dataColumnResponseValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -452,7 +452,7 @@ export class BackfillSync extends EventEmitter {
|
|
|
452
452
|
let parentBlock, backCount = 1;
|
|
453
453
|
let isPrevFinWsConfirmedAnchorParent = false;
|
|
454
454
|
while (backCount !== this.opts.backfillBatchSize &&
|
|
455
|
-
// biome-ignore lint/suspicious/noAssignInExpressions:
|
|
455
|
+
// biome-ignore lint/suspicious/noAssignInExpressions: May be refactored later
|
|
456
456
|
(parentBlock = await this.db.blockArchive.getByRoot(anchorBlock.message.parentRoot))) {
|
|
457
457
|
// Before moving anchorBlock back, we need check for prevFinalizedCheckpointBlock
|
|
458
458
|
if (anchorBlock.message.slot < this.prevFinalizedCheckpointBlock.slot) {
|