@lodestar/beacon-node 1.30.0-dev.dd729f5ece → 1.30.0-peerDAS.490e786a03
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/README.md +1 -1
- package/lib/api/impl/beacon/blocks/index.d.ts +1 -1
- package/lib/api/impl/beacon/blocks/index.js +44 -16
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/blocks/utils.js +1 -1
- package/lib/api/impl/beacon/blocks/utils.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +1 -1
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.js +14 -9
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.js +2 -2
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/lodestar/index.js +3 -1
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/proof/index.js +4 -2
- package/lib/api/impl/proof/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +1 -21
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/rest/base.js +0 -10
- package/lib/api/rest/base.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts +1 -2
- package/lib/chain/archiveStore/archiveStore.js +16 -15
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js +0 -2
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/archiveStore/interface.d.ts +2 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +89 -24
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/beaconProposerCache.d.ts +2 -3
- package/lib/chain/beaconProposerCache.js +4 -2
- package/lib/chain/beaconProposerCache.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +164 -0
- package/lib/chain/blocks/blockInput/blockInput.js +522 -0
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -0
- package/lib/chain/blocks/blockInput/errors.d.ts +38 -0
- package/lib/chain/blocks/blockInput/errors.js +17 -0
- package/lib/chain/blocks/blockInput/errors.js.map +1 -0
- package/lib/chain/blocks/blockInput/index.d.ts +4 -0
- package/lib/chain/blocks/blockInput/index.js +4 -0
- package/lib/chain/blocks/blockInput/index.js.map +1 -0
- package/lib/chain/blocks/blockInput/types.d.ts +116 -0
- package/lib/chain/blocks/blockInput/types.js +19 -0
- package/lib/chain/blocks/blockInput/types.js.map +1 -0
- package/lib/chain/blocks/importBlock.js +56 -14
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +65 -24
- package/lib/chain/blocks/types.js +39 -6
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +21 -10
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +89 -15
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +1 -1
- package/lib/chain/bls/multithread/index.js +1 -3
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/jobItem.d.ts +1 -1
- package/lib/chain/bls/multithread/jobItem.js +4 -12
- package/lib/chain/bls/multithread/jobItem.js.map +1 -1
- package/lib/chain/bls/multithread/worker.js +0 -1
- package/lib/chain/bls/multithread/worker.js.map +1 -1
- package/lib/chain/chain.d.ts +35 -4
- package/lib/chain/chain.js +28 -12
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +18 -2
- package/lib/chain/emitter.js +13 -0
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/dataColumnSidecarError.d.ts +69 -0
- package/lib/chain/errors/dataColumnSidecarError.js +21 -0
- package/lib/chain/errors/dataColumnSidecarError.js.map +1 -0
- package/lib/chain/errors/index.d.ts +1 -0
- package/lib/chain/errors/index.js +1 -0
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/interface.d.ts +9 -3
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/options.d.ts +4 -1
- package/lib/chain/options.js +5 -0
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +4 -2
- package/lib/chain/produceBlock/produceBlockBody.js +11 -2
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +3 -2
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +31 -2
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
- package/lib/chain/regen/queued.d.ts +0 -1
- package/lib/chain/regen/queued.js +0 -1
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/seenCache/seenAttestationData.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +61 -18
- package/lib/chain/seenCache/seenGossipBlockInput.js +254 -53
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts +28 -0
- package/lib/chain/validation/dataColumnSidecar.js +245 -0
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -0
- package/lib/chain/validatorMonitor.d.ts +3 -3
- package/lib/chain/validatorMonitor.js +273 -56
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/beacon.d.ts +3 -1
- package/lib/db/beacon.js +3 -1
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/buckets.d.ts +3 -1
- package/lib/db/buckets.js +2 -0
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/interface.d.ts +3 -1
- package/lib/db/repositories/dataColumnSidecars.d.ts +47 -0
- package/lib/db/repositories/dataColumnSidecars.js +40 -0
- package/lib/db/repositories/dataColumnSidecars.js.map +1 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +15 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.js +23 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.js.map +1 -0
- package/lib/db/repositories/index.d.ts +2 -0
- package/lib/db/repositories/index.js +2 -0
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/eth1/provider/eth1Provider.js +1 -2
- package/lib/eth1/provider/eth1Provider.js.map +1 -1
- package/lib/eth1/provider/jsonRpcHttpClient.js +1 -2
- package/lib/eth1/provider/jsonRpcHttpClient.js.map +1 -1
- package/lib/execution/engine/http.d.ts +5 -3
- package/lib/execution/engine/http.js +68 -31
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +4 -2
- package/lib/execution/engine/interface.js +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +1 -0
- package/lib/execution/engine/mock.js +5 -0
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts +0 -3
- package/lib/execution/engine/payloadIdCache.js +1 -2
- package/lib/execution/engine/payloadIdCache.js.map +1 -1
- package/lib/execution/engine/types.d.ts +10 -0
- package/lib/execution/engine/types.js +6 -0
- 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 +8 -0
- package/lib/metrics/metrics/beacon.js +27 -0
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +4 -100
- package/lib/metrics/metrics/lodestar.js +5 -307
- 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/monitoring/service.js +1 -2
- package/lib/monitoring/service.js.map +1 -1
- package/lib/monitoring/system.js +0 -1
- package/lib/monitoring/system.js.map +1 -1
- package/lib/network/core/metrics.d.ts +11 -3
- package/lib/network/core/metrics.js +26 -4
- package/lib/network/core/metrics.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +9 -1
- package/lib/network/core/networkCore.js +38 -33
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +2 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +8 -4
- package/lib/network/core/networkCoreWorkerHandler.js +7 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +5 -1
- package/lib/network/events.d.ts +3 -1
- package/lib/network/events.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +8 -1
- package/lib/network/gossip/interface.js +1 -0
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +1419 -1374
- package/lib/network/gossip/topic.js +20 -1
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +13 -1
- package/lib/network/libp2p/index.js +1 -1
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/metadata.d.ts +10 -6
- package/lib/network/metadata.js +23 -4
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/network.d.ts +12 -2
- package/lib/network/network.js +59 -7
- package/lib/network/network.js.map +1 -1
- package/lib/network/networkConfig.d.ts +23 -0
- package/lib/network/networkConfig.js +32 -0
- package/lib/network/networkConfig.js.map +1 -0
- package/lib/network/options.d.ts +18 -0
- package/lib/network/options.js +2 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/discover.d.ts +15 -6
- package/lib/network/peers/discover.js +139 -15
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +11 -2
- package/lib/network/peers/peerManager.js +119 -11
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/peersData.d.ts +9 -2
- package/lib/network/peers/peersData.js.map +1 -1
- package/lib/network/peers/score/interface.d.ts +2 -2
- package/lib/network/peers/score/interface.js.map +1 -1
- package/lib/network/peers/score/score.d.ts +2 -2
- package/lib/network/peers/score/score.js +4 -1
- package/lib/network/peers/score/score.js.map +1 -1
- package/lib/network/peers/score/store.d.ts +5 -2
- package/lib/network/peers/score/store.js +7 -3
- package/lib/network/peers/score/store.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +36 -5
- package/lib/network/peers/utils/prioritizePeers.js +79 -7
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +8 -1
- package/lib/network/processor/extractSlotRootFns.js.map +1 -1
- package/lib/network/processor/gossipHandlers.js +157 -9
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.js +5 -0
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/index.d.ts +1 -1
- package/lib/network/processor/index.js +5 -1
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +23 -5
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +14 -5
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +199 -14
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +32 -5
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +280 -26
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +8 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +106 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +6 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +57 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -0
- package/lib/network/reqresp/handlers/index.js +10 -0
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +3 -0
- package/lib/network/reqresp/protocols.js +15 -0
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.js +11 -1
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +13 -6
- package/lib/network/reqresp/types.js +9 -2
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/subnets/interface.d.ts +3 -0
- package/lib/network/subnets/interface.js +14 -1
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/network/subnets/syncnetsService.js +4 -5
- package/lib/network/subnets/syncnetsService.js.map +1 -1
- package/lib/node/nodejs.js +4 -3
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/interface.d.ts +2 -2
- package/lib/sync/interface.js +1 -1
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/range/batch.d.ts +8 -2
- package/lib/sync/range/batch.js +19 -7
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +7 -2
- package/lib/sync/range/chain.js +45 -21
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.js +3 -3
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/range/utils/peerBalancer.d.ts +4 -1
- package/lib/sync/range/utils/peerBalancer.js +20 -2
- package/lib/sync/range/utils/peerBalancer.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +8 -1
- package/lib/sync/unknownBlock.js +222 -62
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/util/blobs.d.ts +13 -1
- package/lib/util/blobs.js +44 -1
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/dataColumns.d.ts +111 -0
- package/lib/util/dataColumns.js +277 -0
- package/lib/util/dataColumns.js.map +1 -0
- package/lib/util/kzg.d.ts +9 -21
- package/lib/util/kzg.js +12 -90
- package/lib/util/kzg.js.map +1 -1
- package/lib/util/metadata.d.ts +4 -0
- package/lib/util/metadata.js +7 -0
- package/lib/util/metadata.js.map +1 -1
- package/lib/util/sszBytes.d.ts +1 -0
- package/lib/util/sszBytes.js +17 -0
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +22 -22
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Root, Slot, SubnetID, deneb, fulu } from "@lodestar/types";
|
|
2
|
+
import { Metrics } from "../../metrics/metrics.js";
|
|
3
|
+
import { IBeaconChain } from "../interface.js";
|
|
4
|
+
export declare function validateGossipDataColumnSidecar(chain: IBeaconChain, dataColumnSidecar: fulu.DataColumnSidecar, gossipSubnet: SubnetID): Promise<void>;
|
|
5
|
+
export declare function validateDataColumnsSidecars(blockSlot: Slot, blockRoot: Root, blockKzgCommitments: deneb.BlobKzgCommitments, dataColumnSidecars: fulu.DataColumnSidecars, metrics: Metrics | null, opts?: {
|
|
6
|
+
skipProofsCheck: boolean;
|
|
7
|
+
}): void;
|
|
8
|
+
/**
|
|
9
|
+
* SPEC FUNCTION
|
|
10
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar
|
|
11
|
+
*/
|
|
12
|
+
export declare function verifyDataColumnSidecar(dataColumnSidecar: fulu.DataColumnSidecar): void;
|
|
13
|
+
/**
|
|
14
|
+
* SPEC FUNCTION
|
|
15
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar_kzg_proofs
|
|
16
|
+
*/
|
|
17
|
+
export declare function verifyDataColumnSidecarKzgProofs(commitments: Uint8Array[], cellIndices: number[], cells: Uint8Array[], proofs: Uint8Array[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* SPEC FUNCTION
|
|
20
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar_inclusion_proof
|
|
21
|
+
*/
|
|
22
|
+
export declare function verifyDataColumnSidecarInclusionProof(dataColumnSidecar: fulu.DataColumnSidecar): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* SPEC FUNCTION
|
|
25
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#compute_subnet_for_data_column_sidecar
|
|
26
|
+
*/
|
|
27
|
+
export declare function computeSubnetForDataColumnSidecar(columnSidecar: fulu.DataColumnSidecar): SubnetID;
|
|
28
|
+
//# sourceMappingURL=dataColumnSidecar.d.ts.map
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { DATA_COLUMN_SIDECAR_SUBNET_COUNT, KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH, KZG_COMMITMENTS_SUBTREE_INDEX, NUMBER_OF_COLUMNS, } from "@lodestar/params";
|
|
2
|
+
import { ssz } from "@lodestar/types";
|
|
3
|
+
import { toHex, toRootHex, verifyMerkleBranch } from "@lodestar/utils";
|
|
4
|
+
import { computeStartSlotAtEpoch, getBlockHeaderProposerSignatureSet } from "@lodestar/state-transition";
|
|
5
|
+
import { byteArrayEquals } from "../../util/bytes.js";
|
|
6
|
+
import { ckzg } from "../../util/kzg.js";
|
|
7
|
+
import { DataColumnSidecarErrorCode, DataColumnSidecarGossipError } from "../errors/dataColumnSidecarError.js";
|
|
8
|
+
import { GossipAction } from "../errors/gossipValidation.js";
|
|
9
|
+
import { RegenCaller } from "../regen/interface.js";
|
|
10
|
+
// SPEC FUNCTION
|
|
11
|
+
// https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#data_column_sidecar_subnet_id
|
|
12
|
+
export async function validateGossipDataColumnSidecar(chain, dataColumnSidecar, gossipSubnet) {
|
|
13
|
+
const blockHeader = dataColumnSidecar.signedBlockHeader.message;
|
|
14
|
+
// 1) [REJECT] The sidecar is valid as verified by verify_data_column_sidecar
|
|
15
|
+
verifyDataColumnSidecar(dataColumnSidecar);
|
|
16
|
+
// 2) [REJECT] The sidecar is for the correct subnet -- i.e. compute_subnet_for_data_column_sidecar(sidecar.index) == subnet_id
|
|
17
|
+
if (computeSubnetForDataColumnSidecar(dataColumnSidecar) !== gossipSubnet) {
|
|
18
|
+
throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
|
|
19
|
+
code: DataColumnSidecarErrorCode.INVALID_SUBNET,
|
|
20
|
+
columnIdx: dataColumnSidecar.index,
|
|
21
|
+
gossipSubnet: gossipSubnet,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
// 3) [IGNORE] The sidecar is not from a future slot (with a MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance)
|
|
25
|
+
// -- i.e. validate that sidecar.slot <= current_slot (a client MAY queue future blocks
|
|
26
|
+
// for processing at the appropriate slot).
|
|
27
|
+
const currentSlotWithGossipDisparity = chain.clock.currentSlotWithGossipDisparity;
|
|
28
|
+
if (currentSlotWithGossipDisparity < blockHeader.slot) {
|
|
29
|
+
throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
|
|
30
|
+
code: DataColumnSidecarErrorCode.FUTURE_SLOT,
|
|
31
|
+
currentSlot: currentSlotWithGossipDisparity,
|
|
32
|
+
blockSlot: blockHeader.slot,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// 4) [IGNORE] The sidecar is from a slot greater than the latest finalized slot -- i.e. validate that
|
|
36
|
+
// sidecar.slot > compute_start_slot_at_epoch(state.finalized_checkpoint.epoch)
|
|
37
|
+
const finalizedCheckpoint = chain.forkChoice.getFinalizedCheckpoint();
|
|
38
|
+
const finalizedSlot = computeStartSlotAtEpoch(finalizedCheckpoint.epoch);
|
|
39
|
+
if (blockHeader.slot <= finalizedSlot) {
|
|
40
|
+
throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
|
|
41
|
+
code: DataColumnSidecarErrorCode.WOULD_REVERT_FINALIZED_SLOT,
|
|
42
|
+
blockSlot: blockHeader.slot,
|
|
43
|
+
finalizedSlot,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
// 6) [IGNORE] The sidecar's block's parent (defined by block_header.parent_root) has been seen (via gossip
|
|
47
|
+
// or non-gossip sources)
|
|
48
|
+
const parentRoot = toRootHex(blockHeader.parentRoot);
|
|
49
|
+
const parentBlock = chain.forkChoice.getBlockHex(parentRoot);
|
|
50
|
+
if (parentBlock === null) {
|
|
51
|
+
// If fork choice does *not* consider the parent to be a descendant of the finalized block,
|
|
52
|
+
// then there are two more cases:
|
|
53
|
+
//
|
|
54
|
+
// 1. We have the parent stored in our database. Because fork-choice has confirmed the
|
|
55
|
+
// parent is *not* in our post-finalization DAG, all other blocks must be either
|
|
56
|
+
// pre-finalization or conflicting with finalization.
|
|
57
|
+
// 2. The parent is unknown to us, we probably want to download it since it might actually
|
|
58
|
+
// descend from the finalized root.
|
|
59
|
+
// (Non-Lighthouse): Since we prune all blocks non-descendant from finalized checking the `db.block` database won't be useful to guard
|
|
60
|
+
// against known bad fork blocks, so we throw PARENT_UNKNOWN for cases (1) and (2)
|
|
61
|
+
throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
|
|
62
|
+
code: DataColumnSidecarErrorCode.PARENT_UNKNOWN,
|
|
63
|
+
parentRoot,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// 8) [REJECT] The sidecar is from a higher slot than the sidecar's block's parent
|
|
67
|
+
if (parentBlock.slot >= blockHeader.slot) {
|
|
68
|
+
throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
|
|
69
|
+
code: DataColumnSidecarErrorCode.NOT_LATER_THAN_PARENT,
|
|
70
|
+
parentSlot: parentBlock.slot,
|
|
71
|
+
slot: blockHeader.slot,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// getBlockSlotState also checks for whether the current finalized checkpoint is an ancestor of the block.
|
|
75
|
+
// As a result, we throw an IGNORE (whereas the spec says we should REJECT for this scenario).
|
|
76
|
+
// this is something we should change this in the future to make the code airtight to the spec.
|
|
77
|
+
// 7) [REJECT] The sidecar's block's parent passes validation.
|
|
78
|
+
const blockState = await chain.regen
|
|
79
|
+
.getBlockSlotState(parentRoot, blockHeader.slot, { dontTransferCache: true }, RegenCaller.validateGossipBlock)
|
|
80
|
+
.catch(() => {
|
|
81
|
+
throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
|
|
82
|
+
code: DataColumnSidecarErrorCode.PARENT_UNKNOWN,
|
|
83
|
+
parentRoot,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
// 5) [REJECT] The proposer signature of sidecar.signed_block_header, is valid with respect to the block_header.proposer_index pubkey.
|
|
87
|
+
const signatureSet = getBlockHeaderProposerSignatureSet(blockState, dataColumnSidecar.signedBlockHeader);
|
|
88
|
+
// Don't batch so verification is not delayed
|
|
89
|
+
if (!(await chain.bls.verifySignatureSets([signatureSet], {
|
|
90
|
+
verifyOnMainThread: blockHeader.slot > chain.forkChoice.getHead().slot,
|
|
91
|
+
}))) {
|
|
92
|
+
throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
|
|
93
|
+
code: DataColumnSidecarErrorCode.PROPOSAL_SIGNATURE_INVALID,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// 9) [REJECT] The current finalized_checkpoint is an ancestor of the sidecar's block
|
|
97
|
+
// -- i.e. get_checkpoint_block(store, block_header.parent_root, store.finalized_checkpoint.epoch)
|
|
98
|
+
// == store.finalized_checkpoint.root
|
|
99
|
+
// Handled by 7)
|
|
100
|
+
// 10) [REJECT] The sidecar's kzg_commitments field inclusion proof is valid as verified by
|
|
101
|
+
// verify_data_column_sidecar_inclusion_proof
|
|
102
|
+
// TODO: Can cache result on (commitments, proof, header) in the future
|
|
103
|
+
if (!verifyDataColumnSidecarInclusionProof(dataColumnSidecar)) {
|
|
104
|
+
throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
|
|
105
|
+
code: DataColumnSidecarErrorCode.INCLUSION_PROOF_INVALID,
|
|
106
|
+
slot: dataColumnSidecar.signedBlockHeader.message.slot,
|
|
107
|
+
columnIdx: dataColumnSidecar.index,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// 11) [REJECT] The sidecar's column data is valid as verified by verify_data_column_sidecar_kzg_proofs
|
|
111
|
+
try {
|
|
112
|
+
verifyDataColumnSidecarKzgProofs(dataColumnSidecar.kzgCommitments, Array.from({ length: dataColumnSidecar.column.length }, () => dataColumnSidecar.index), dataColumnSidecar.column, dataColumnSidecar.kzgProofs);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
|
|
116
|
+
code: DataColumnSidecarErrorCode.INVALID_KZG_PROOF,
|
|
117
|
+
slot: blockHeader.slot,
|
|
118
|
+
columnIdx: dataColumnSidecar.index,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
// 12) [IGNORE] The sidecar is the first sidecar for the tuple (block_header.slot, block_header.proposer_index,
|
|
122
|
+
// sidecar.index) with valid header signature, sidecar inclusion proof, and kzg proof
|
|
123
|
+
// -- Handled in seenGossipBlockInput
|
|
124
|
+
// 13) [REJECT] The sidecar is proposed by the expected proposer_index for the block's slot in the context of the current
|
|
125
|
+
// shuffling (defined by block_header.parent_root/block_header.slot). If the proposer_index cannot
|
|
126
|
+
// immediately be verified against the expected shuffling, the sidecar MAY be queued for later processing
|
|
127
|
+
// while proposers for the block's branch are calculated -- in such a case do not REJECT, instead IGNORE
|
|
128
|
+
// this message.
|
|
129
|
+
const proposerIndex = blockHeader.proposerIndex;
|
|
130
|
+
const expectedProposerIndex = blockState.epochCtx.getBeaconProposer(blockHeader.slot);
|
|
131
|
+
if (proposerIndex !== expectedProposerIndex) {
|
|
132
|
+
throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
|
|
133
|
+
code: DataColumnSidecarErrorCode.INCORRECT_PROPOSER,
|
|
134
|
+
actualProposerIndex: proposerIndex,
|
|
135
|
+
expectedProposerIndex,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export function validateDataColumnsSidecars(blockSlot, blockRoot, blockKzgCommitments, dataColumnSidecars, metrics, opts = { skipProofsCheck: false }) {
|
|
140
|
+
const commitmentBytes = [];
|
|
141
|
+
const cellIndices = [];
|
|
142
|
+
const cells = [];
|
|
143
|
+
const proofBytes = [];
|
|
144
|
+
for (let sidecarsIndex = 0; sidecarsIndex < dataColumnSidecars.length; sidecarsIndex++) {
|
|
145
|
+
const columnSidecar = dataColumnSidecars[sidecarsIndex];
|
|
146
|
+
const { index: columnIndex, column, kzgCommitments, kzgProofs } = columnSidecar;
|
|
147
|
+
const columnBlockHeader = columnSidecar.signedBlockHeader.message;
|
|
148
|
+
const columnBlockRoot = ssz.phase0.BeaconBlockHeader.hashTreeRoot(columnBlockHeader);
|
|
149
|
+
if (columnBlockHeader.slot !== blockSlot ||
|
|
150
|
+
!byteArrayEquals(columnBlockRoot, blockRoot) ||
|
|
151
|
+
kzgCommitments.length === 0 ||
|
|
152
|
+
blockKzgCommitments.length === 0 ||
|
|
153
|
+
blockKzgCommitments.length !== kzgCommitments.length ||
|
|
154
|
+
blockKzgCommitments
|
|
155
|
+
.map((commitment, i) => byteArrayEquals(commitment, kzgCommitments[i]))
|
|
156
|
+
.filter((result) => result === false).length) {
|
|
157
|
+
throw new Error(`Invalid data column sidecar slot=${columnBlockHeader.slot} columnBlockRoot=${toHex(columnBlockRoot)} columnIndex=${columnIndex} for the block blockRoot=${toHex(blockRoot)} slot=${blockSlot} sidecarsIndex=${sidecarsIndex}`);
|
|
158
|
+
}
|
|
159
|
+
if (columnIndex >= NUMBER_OF_COLUMNS) {
|
|
160
|
+
throw new Error(`Invalid data sidecar columnIndex=${columnIndex} in slot=${blockSlot} blockRoot=${toHex(blockRoot)} sidecarsIndex=${sidecarsIndex}`);
|
|
161
|
+
}
|
|
162
|
+
if (column.length !== kzgCommitments.length || column.length !== kzgProofs.length) {
|
|
163
|
+
throw new Error(`Invalid data sidecar array lengths for columnIndex=${columnIndex} in slot=${blockSlot} blockRoot=${toHex(blockRoot)}`);
|
|
164
|
+
}
|
|
165
|
+
commitmentBytes.push(...kzgCommitments);
|
|
166
|
+
cellIndices.push(...Array.from({ length: column.length }, () => columnIndex));
|
|
167
|
+
cells.push(...column);
|
|
168
|
+
proofBytes.push(...kzgProofs);
|
|
169
|
+
}
|
|
170
|
+
if (opts.skipProofsCheck) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
let valid;
|
|
174
|
+
try {
|
|
175
|
+
const timer = metrics?.peerDas.kzgVerificationDataColumnBatchTime.startTimer();
|
|
176
|
+
valid = ckzg.verifyCellKzgProofBatch(commitmentBytes, cellIndices, cells, proofBytes);
|
|
177
|
+
timer?.();
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
err.message = `Error in verifyCellKzgProofBatch for slot=${blockSlot} blockRoot=${toHex(blockRoot)}`;
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
if (!valid) {
|
|
184
|
+
throw new Error(`Invalid data column sidecars in slot=${blockSlot} blockRoot=${toHex(blockRoot)}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* SPEC FUNCTION
|
|
189
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar
|
|
190
|
+
*/
|
|
191
|
+
export function verifyDataColumnSidecar(dataColumnSidecar) {
|
|
192
|
+
if (dataColumnSidecar.index >= NUMBER_OF_COLUMNS) {
|
|
193
|
+
throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
|
|
194
|
+
code: DataColumnSidecarErrorCode.INVALID_INDEX,
|
|
195
|
+
columnIdx: dataColumnSidecar.index,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (dataColumnSidecar.kzgCommitments.length === 0) {
|
|
199
|
+
throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
|
|
200
|
+
code: DataColumnSidecarErrorCode.NO_COMMITMENTS,
|
|
201
|
+
columnIdx: dataColumnSidecar.index,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
if (dataColumnSidecar.column.length !== dataColumnSidecar.kzgCommitments.length ||
|
|
205
|
+
dataColumnSidecar.column.length !== dataColumnSidecar.kzgProofs.length) {
|
|
206
|
+
throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
|
|
207
|
+
code: DataColumnSidecarErrorCode.MISMATCHED_LENGTHS,
|
|
208
|
+
columnLength: dataColumnSidecar.column.length,
|
|
209
|
+
commitmentsLength: dataColumnSidecar.kzgCommitments.length,
|
|
210
|
+
proofsLength: dataColumnSidecar.kzgProofs.length,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* SPEC FUNCTION
|
|
216
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar_kzg_proofs
|
|
217
|
+
*/
|
|
218
|
+
export function verifyDataColumnSidecarKzgProofs(commitments, cellIndices, cells, proofs) {
|
|
219
|
+
let valid;
|
|
220
|
+
try {
|
|
221
|
+
valid = ckzg.verifyCellKzgProofBatch(commitments, cellIndices, cells, proofs);
|
|
222
|
+
}
|
|
223
|
+
catch (e) {
|
|
224
|
+
e.message = `Error on verifyCellKzgProofBatch: ${e.message}`;
|
|
225
|
+
throw e;
|
|
226
|
+
}
|
|
227
|
+
if (!valid) {
|
|
228
|
+
throw Error("Invalid verifyCellKzgProofBatch");
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* SPEC FUNCTION
|
|
233
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#verify_data_column_sidecar_inclusion_proof
|
|
234
|
+
*/
|
|
235
|
+
export function verifyDataColumnSidecarInclusionProof(dataColumnSidecar) {
|
|
236
|
+
return verifyMerkleBranch(ssz.deneb.BlobKzgCommitments.hashTreeRoot(dataColumnSidecar.kzgCommitments), dataColumnSidecar.kzgCommitmentsInclusionProof, KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH, KZG_COMMITMENTS_SUBTREE_INDEX, dataColumnSidecar.signedBlockHeader.message.bodyRoot);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* SPEC FUNCTION
|
|
240
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#compute_subnet_for_data_column_sidecar
|
|
241
|
+
*/
|
|
242
|
+
export function computeSubnetForDataColumnSidecar(columnSidecar) {
|
|
243
|
+
return columnSidecar.index % DATA_COLUMN_SIDECAR_SUBNET_COUNT;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=dataColumnSidecar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataColumnSidecar.js","sourceRoot":"","sources":["../../../src/chain/validation/dataColumnSidecar.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { BeaconBlock, RootHex, SubnetID, altair, deneb } from "@lodestar/types";
|
|
|
4
4
|
import { Epoch, Slot, ValidatorIndex } from "@lodestar/types";
|
|
5
5
|
import { IndexedAttestation, SignedAggregateAndProof } from "@lodestar/types";
|
|
6
6
|
import { Logger } from "@lodestar/utils";
|
|
7
|
-
import {
|
|
7
|
+
import { RegistryMetricCreator } from "../metrics/index.js";
|
|
8
8
|
type Seconds = number;
|
|
9
9
|
export declare enum OpSource {
|
|
10
10
|
api = "api",
|
|
@@ -14,7 +14,7 @@ export type ValidatorMonitor = {
|
|
|
14
14
|
registerLocalValidator(index: number): void;
|
|
15
15
|
registerLocalValidatorInSyncCommittee(index: number, untilEpoch: Epoch): void;
|
|
16
16
|
registerValidatorStatuses(currentEpoch: Epoch, inclusionDelays: number[], flags: number[], isActiveCurrEpoch: boolean[], isActivePrevEpoch: boolean[], balances?: number[]): void;
|
|
17
|
-
registerBeaconBlock(src: OpSource,
|
|
17
|
+
registerBeaconBlock(src: OpSource, delaySec: Seconds, block: BeaconBlock): void;
|
|
18
18
|
registerBlobSidecar(src: OpSource, seenTimestampSec: Seconds, blob: deneb.BlobSidecar): void;
|
|
19
19
|
registerImportedBlock(block: BeaconBlock, data: {
|
|
20
20
|
proposerBalanceDelta: number;
|
|
@@ -34,7 +34,7 @@ export type ValidatorMonitorOpts = {
|
|
|
34
34
|
validatorMonitorLogs?: boolean;
|
|
35
35
|
};
|
|
36
36
|
export declare const defaultValidatorMonitorOpts: ValidatorMonitorOpts;
|
|
37
|
-
export declare function createValidatorMonitor(
|
|
37
|
+
export declare function createValidatorMonitor(metricsRegister: RegistryMetricCreator | null, config: ChainForkConfig, genesisTime: number, logger: Logger, opts: ValidatorMonitorOpts): ValidatorMonitor;
|
|
38
38
|
/**
|
|
39
39
|
* Cache to prevent accessing the state tree to fetch block roots repeteadly.
|
|
40
40
|
* In normal network conditions the same root is read multiple times, specially the target.
|