@lodestar/beacon-node 1.34.0-dev.d5a4e7a09c → 1.34.0-dev.eb034b5727
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 +136 -30
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts +1 -1
- package/lib/api/impl/debug/index.js +24 -1
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +11 -5
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts +1 -1
- package/lib/chain/archiveStore/archiveStore.js +2 -2
- package/lib/chain/archiveStore/interface.d.ts +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +91 -23
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/beaconProposerCache.d.ts +1 -0
- package/lib/chain/beaconProposerCache.js +3 -0
- package/lib/chain/beaconProposerCache.js.map +1 -1
- package/lib/chain/blocks/importBlock.js +3 -2
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +66 -23
- package/lib/chain/blocks/types.js +39 -5
- 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/chain.d.ts +17 -28
- package/lib/chain/chain.js +71 -6
- 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 +10 -4
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/options.d.ts +4 -1
- package/lib/chain/options.js +1 -0
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.js +2 -1
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +4 -2
- package/lib/chain/produceBlock/produceBlockBody.js +9 -4
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +3 -2
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +28 -2
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +64 -18
- package/lib/chain/seenCache/seenGossipBlockInput.js +321 -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 +248 -0
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -0
- 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/execution/builder/http.d.ts +18 -2
- package/lib/execution/builder/http.js +27 -8
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/builder/interface.d.ts +3 -2
- package/lib/execution/engine/http.d.ts +6 -3
- package/lib/execution/engine/http.js +56 -42
- 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/types.d.ts +10 -0
- package/lib/execution/engine/types.js +6 -0
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +14 -0
- package/lib/metrics/metrics/beacon.js +57 -0
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +24 -1
- package/lib/metrics/metrics/lodestar.js +45 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/core/metrics.d.ts +10 -3
- package/lib/network/core/metrics.js +22 -4
- package/lib/network/core/metrics.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +15 -4
- package/lib/network/core/networkCore.js +73 -23
- 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 +5 -3
- package/lib/network/core/networkCoreWorkerHandler.js +6 -1
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +7 -4
- package/lib/network/events.d.ts +4 -2
- package/lib/network/events.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +2 -2
- package/lib/network/gossip/gossipsub.js +8 -6
- package/lib/network/gossip/gossipsub.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/scoringParameters.d.ts +6 -2
- package/lib/network/gossip/scoringParameters.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +1077 -1056
- package/lib/network/gossip/topic.js +29 -1
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +9 -1
- package/lib/network/metadata.d.ts +9 -5
- package/lib/network/metadata.js +26 -5
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/network.d.ts +12 -2
- package/lib/network/network.js +73 -11
- package/lib/network/network.js.map +1 -1
- package/lib/network/networkConfig.d.ts +12 -0
- package/lib/network/networkConfig.js +2 -0
- package/lib/network/networkConfig.js.map +1 -0
- package/lib/network/options.d.ts +1 -0
- package/lib/network/options.js +5 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/discover.d.ts +8 -3
- package/lib/network/peers/discover.js +99 -14
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +10 -4
- package/lib/network/peers/peerManager.js +105 -19
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/peersData.d.ts +17 -3
- package/lib/network/peers/peersData.js.map +1 -1
- package/lib/network/peers/score/interface.d.ts +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 +3 -1
- package/lib/network/peers/score/store.js +6 -2
- package/lib/network/peers/score/store.js.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts +7 -3
- package/lib/network/peers/utils/assertPeerRelevance.js +10 -1
- package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +18 -7
- package/lib/network/peers/utils/prioritizePeers.js +43 -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 +156 -10
- 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.js +1 -0
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts +2 -2
- package/lib/network/reqresp/ReqRespBeaconNode.js +36 -14
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +24 -4
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +259 -20
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +32 -6
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +283 -28
- 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 +92 -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 +50 -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 +4 -0
- package/lib/network/reqresp/protocols.js +20 -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/score.js +3 -0
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +11 -4
- package/lib/network/reqresp/types.js +12 -3
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/statusCache.d.ts +5 -5
- package/lib/network/statusCache.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 +1 -0
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/constants.d.ts +18 -3
- package/lib/sync/constants.js +21 -3
- package/lib/sync/constants.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 +17 -2
- package/lib/sync/range/batch.js +39 -7
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +15 -1
- package/lib/sync/range/chain.js +124 -33
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.d.ts +3 -2
- package/lib/sync/range/range.js +9 -3
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/range/utils/chainTarget.d.ts +5 -1
- package/lib/sync/range/utils/chainTarget.js +26 -1
- package/lib/sync/range/utils/chainTarget.js.map +1 -1
- package/lib/sync/range/utils/peerBalancer.d.ts +19 -5
- package/lib/sync/range/utils/peerBalancer.js +104 -10
- package/lib/sync/range/utils/peerBalancer.js.map +1 -1
- package/lib/sync/sync.js +1 -1
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +8 -1
- package/lib/sync/unknownBlock.js +223 -67
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/remoteSyncType.d.ts +4 -4
- package/lib/sync/utils/remoteSyncType.js.map +1 -1
- package/lib/util/blobs.d.ts +23 -1
- package/lib/util/blobs.js +156 -1
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/dataColumns.d.ts +135 -0
- package/lib/util/dataColumns.js +353 -0
- package/lib/util/dataColumns.js.map +1 -0
- package/lib/util/metadata.d.ts +5 -0
- package/lib/util/metadata.js +10 -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 +16 -16
- package/lib/network/reqresp/handlers/status.d.ts +0 -4
- package/lib/network/reqresp/handlers/status.js +0 -11
- package/lib/network/reqresp/handlers/status.js.map +0 -1
package/lib/util/blobs.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { digest as sha256Digest } from "@chainsafe/as-sha256";
|
|
2
2
|
import { Tree } from "@chainsafe/persistent-merkle-tree";
|
|
3
|
-
import { KZG_COMMITMENT_GINDEX0, VERSIONED_HASH_VERSION_KZG } from "@lodestar/params";
|
|
3
|
+
import { BYTES_PER_CELL, BYTES_PER_FIELD_ELEMENT, CELLS_PER_EXT_BLOB, FIELD_ELEMENTS_PER_BLOB, KZG_COMMITMENTS_GINDEX, KZG_COMMITMENT_GINDEX0, NUMBER_OF_COLUMNS, VERSIONED_HASH_VERSION_KZG, } from "@lodestar/params";
|
|
4
4
|
import { signedBlockToSignedHeader } from "@lodestar/state-transition";
|
|
5
5
|
import { ssz } from "@lodestar/types";
|
|
6
|
+
import { kzg } from "./kzg.js";
|
|
6
7
|
export function kzgCommitmentToVersionedHash(kzgCommitment) {
|
|
7
8
|
const hash = sha256Digest(kzgCommitment);
|
|
8
9
|
// Equivalent to `VERSIONED_HASH_VERSION_KZG + hash(kzg_commitment)[1:]`
|
|
@@ -14,6 +15,10 @@ export function computeInclusionProof(fork, body, index) {
|
|
|
14
15
|
const commitmentGindex = KZG_COMMITMENT_GINDEX0 + index;
|
|
15
16
|
return new Tree(bodyView.node).getSingleProof(BigInt(commitmentGindex));
|
|
16
17
|
}
|
|
18
|
+
export function computeKzgCommitmentsInclusionProof(fork, body) {
|
|
19
|
+
const bodyView = ssz[fork].BeaconBlockBody.toView(body);
|
|
20
|
+
return new Tree(bodyView.node).getSingleProof(BigInt(KZG_COMMITMENTS_GINDEX));
|
|
21
|
+
}
|
|
17
22
|
export function computeBlobSidecars(config, signedBlock, contents) {
|
|
18
23
|
const blobKzgCommitments = signedBlock.message.body.blobKzgCommitments;
|
|
19
24
|
if (blobKzgCommitments === undefined) {
|
|
@@ -28,4 +33,154 @@ export function computeBlobSidecars(config, signedBlock, contents) {
|
|
|
28
33
|
return { index, blob, kzgCommitment, kzgProof, signedBlockHeader, kzgCommitmentInclusionProof };
|
|
29
34
|
});
|
|
30
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Turns a SignedBeaconBlock and an array of Blobs from a given slot into an array of
|
|
38
|
+
* DataColumnSidecars that are ready to be served by gossip and req/resp.
|
|
39
|
+
*
|
|
40
|
+
* Implementation of get_data_column_sidecars
|
|
41
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/_features/eip7594/das-core.md#get_data_column_sidecars
|
|
42
|
+
*/
|
|
43
|
+
export function computeDataColumnSidecars(config, signedBlock, contents) {
|
|
44
|
+
const blobKzgCommitments = signedBlock.message.body.blobKzgCommitments;
|
|
45
|
+
if (blobKzgCommitments === undefined) {
|
|
46
|
+
throw Error("Invalid block with missing blobKzgCommitments for computeDataColumnSidecars");
|
|
47
|
+
}
|
|
48
|
+
if (blobKzgCommitments.length === 0) {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
const fork = config.getForkName(signedBlock.message.slot);
|
|
52
|
+
const signedBlockHeader = signedBlockToSignedHeader(config, signedBlock);
|
|
53
|
+
const kzgCommitmentsInclusionProof = contents.kzgCommitmentsInclusionProof ?? computeKzgCommitmentsInclusionProof(fork, signedBlock.message.body);
|
|
54
|
+
const { blobs, kzgProofs } = contents;
|
|
55
|
+
const cellsAndProofs = Array.from({ length: blobs.length }, (_, rowNumber) => {
|
|
56
|
+
const cells = contents.cells?.[rowNumber] ?? kzg.computeCells(blobs[rowNumber]);
|
|
57
|
+
const proofs = kzgProofs.slice(rowNumber * NUMBER_OF_COLUMNS, (rowNumber + 1) * NUMBER_OF_COLUMNS);
|
|
58
|
+
return { cells, proofs };
|
|
59
|
+
});
|
|
60
|
+
return Array.from({ length: NUMBER_OF_COLUMNS }, (_, columnIndex) => {
|
|
61
|
+
// columnIndex'th column
|
|
62
|
+
const column = Array.from({ length: blobs.length }, (_, rowNumber) => cellsAndProofs[rowNumber].cells[columnIndex]);
|
|
63
|
+
const kzgProofs = Array.from({ length: blobs.length }, (_, rowNumber) => cellsAndProofs[rowNumber].proofs[columnIndex]);
|
|
64
|
+
return {
|
|
65
|
+
index: columnIndex,
|
|
66
|
+
column,
|
|
67
|
+
kzgCommitments: blobKzgCommitments,
|
|
68
|
+
kzgProofs,
|
|
69
|
+
signedBlockHeader,
|
|
70
|
+
kzgCommitmentsInclusionProof,
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* If the node obtains 50%+ of all the columns, it SHOULD reconstruct the full data matrix via the recover_matrix helper
|
|
76
|
+
* See https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.4/specs/fulu/das-core.md#recover_matrix
|
|
77
|
+
*/
|
|
78
|
+
export async function recoverDataColumnSidecars(partialSidecars) {
|
|
79
|
+
const columnCount = partialSidecars.size;
|
|
80
|
+
if (columnCount < NUMBER_OF_COLUMNS / 2) {
|
|
81
|
+
// We don't have enough columns to recover
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
if (columnCount === NUMBER_OF_COLUMNS) {
|
|
85
|
+
// full columns, no need to recover
|
|
86
|
+
return Array.from(partialSidecars.values());
|
|
87
|
+
}
|
|
88
|
+
const firstDataColumn = partialSidecars.values().next().value;
|
|
89
|
+
if (firstDataColumn == null) {
|
|
90
|
+
// should not happen because we check the size of the cache before this
|
|
91
|
+
throw new Error("No data column found in cache to recover from");
|
|
92
|
+
}
|
|
93
|
+
const blobCount = firstDataColumn.kzgCommitments.length;
|
|
94
|
+
const fullColumns = Array.from({ length: NUMBER_OF_COLUMNS }, () => new Array(blobCount));
|
|
95
|
+
const blobProofs = Array.from({ length: blobCount });
|
|
96
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.4/specs/fulu/das-core.md#recover_matrix
|
|
97
|
+
const cellsAndProofs = await Promise.all(blobProofs.map((_, blobIndex) => {
|
|
98
|
+
const cellIndices = [];
|
|
99
|
+
const cells = [];
|
|
100
|
+
for (const [columnIndex, dataColumn] of partialSidecars.entries()) {
|
|
101
|
+
cellIndices.push(columnIndex);
|
|
102
|
+
cells.push(dataColumn.column[blobIndex]);
|
|
103
|
+
}
|
|
104
|
+
// recovered cells and proofs are of the same row/blob, their length should be NUMBER_OF_COLUMNS
|
|
105
|
+
return kzg.asyncRecoverCellsAndKzgProofs(cellIndices, cells);
|
|
106
|
+
}));
|
|
107
|
+
for (let blobIndex = 0; blobIndex < blobCount; blobIndex++) {
|
|
108
|
+
const recoveredCells = cellsAndProofs[blobIndex].cells;
|
|
109
|
+
blobProofs[blobIndex] = cellsAndProofs[blobIndex].proofs;
|
|
110
|
+
for (let columnIndex = 0; columnIndex < NUMBER_OF_COLUMNS; columnIndex++) {
|
|
111
|
+
fullColumns[columnIndex][blobIndex] = recoveredCells[columnIndex];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const result = new Array(NUMBER_OF_COLUMNS);
|
|
115
|
+
for (let columnIndex = 0; columnIndex < NUMBER_OF_COLUMNS; columnIndex++) {
|
|
116
|
+
let sidecar = partialSidecars.get(columnIndex);
|
|
117
|
+
if (sidecar) {
|
|
118
|
+
// We already have this column
|
|
119
|
+
result[columnIndex] = sidecar;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
sidecar = {
|
|
123
|
+
index: columnIndex,
|
|
124
|
+
column: fullColumns[columnIndex],
|
|
125
|
+
kzgCommitments: firstDataColumn.kzgCommitments,
|
|
126
|
+
kzgProofs: Array.from({ length: blobCount }, (_, rowIndex) => blobProofs[rowIndex][columnIndex]),
|
|
127
|
+
signedBlockHeader: firstDataColumn.signedBlockHeader,
|
|
128
|
+
kzgCommitmentsInclusionProof: firstDataColumn.kzgCommitmentsInclusionProof,
|
|
129
|
+
};
|
|
130
|
+
result[columnIndex] = sidecar;
|
|
131
|
+
}
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Reconstruct blobs from a set of data columns, at least 50%+ of all the columns
|
|
136
|
+
* must be provided to allow to reconstruct the full data matrix
|
|
137
|
+
*/
|
|
138
|
+
export async function reconstructBlobs(sidecars) {
|
|
139
|
+
if (sidecars.length < NUMBER_OF_COLUMNS / 2) {
|
|
140
|
+
throw Error(`Expected at least ${NUMBER_OF_COLUMNS / 2} data columns to reconstruct blobs, received ${sidecars.length}`);
|
|
141
|
+
}
|
|
142
|
+
let fullSidecars;
|
|
143
|
+
if (sidecars.length === NUMBER_OF_COLUMNS) {
|
|
144
|
+
// Full columns, no need to recover
|
|
145
|
+
fullSidecars = sidecars;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
const sidecarsByIndex = new Map(sidecars.map((sc) => [sc.index, sc]));
|
|
149
|
+
const recoveredSidecars = await recoverDataColumnSidecars(sidecarsByIndex);
|
|
150
|
+
if (recoveredSidecars === null) {
|
|
151
|
+
// Should not happen because we check the column count above
|
|
152
|
+
throw Error("Failed to reconstruct the full data matrix");
|
|
153
|
+
}
|
|
154
|
+
fullSidecars = recoveredSidecars;
|
|
155
|
+
}
|
|
156
|
+
const blobCount = fullSidecars[0].column.length;
|
|
157
|
+
const blobs = new Array(blobCount);
|
|
158
|
+
const ordered = fullSidecars.slice().sort((a, b) => a.index - b.index);
|
|
159
|
+
for (let row = 0; row < blobCount; row++) {
|
|
160
|
+
// 128 cells that make up one "extended blob" row
|
|
161
|
+
const cells = ordered.map((col) => col.column[row]);
|
|
162
|
+
blobs[row] = cellsToBlob(cells);
|
|
163
|
+
}
|
|
164
|
+
return blobs;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Concatenate the systematic half (columns 0‑63) of a row of cells into
|
|
168
|
+
* the original 131072 byte blob. The parity half (64‑127) is ignored as
|
|
169
|
+
* it is only needed for erasure‑coding recovery when columns are missing.
|
|
170
|
+
*/
|
|
171
|
+
function cellsToBlob(cells) {
|
|
172
|
+
if (cells.length !== CELLS_PER_EXT_BLOB) {
|
|
173
|
+
throw Error(`Expected ${CELLS_PER_EXT_BLOB} cells to reconstruct blob, received ${cells.length}`);
|
|
174
|
+
}
|
|
175
|
+
const blob = new Uint8Array(BYTES_PER_FIELD_ELEMENT * FIELD_ELEMENTS_PER_BLOB);
|
|
176
|
+
// Only the first 64 cells hold the original bytes
|
|
177
|
+
for (let i = 0; i < CELLS_PER_EXT_BLOB / 2; i++) {
|
|
178
|
+
const cell = cells[i];
|
|
179
|
+
if (cell.length !== BYTES_PER_CELL) {
|
|
180
|
+
throw Error(`Cell ${i} has incorrect byte size ${cell.length} != ${BYTES_PER_CELL}`);
|
|
181
|
+
}
|
|
182
|
+
blob.set(cell, i * BYTES_PER_CELL);
|
|
183
|
+
}
|
|
184
|
+
return blob;
|
|
185
|
+
}
|
|
31
186
|
//# sourceMappingURL=blobs.js.map
|
package/lib/util/blobs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blobs.js","sourceRoot":"","sources":["../../src/util/blobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,IAAI,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAC,IAAI,EAAC,MAAM,mCAAmC,CAAC;AAEvD,OAAO,
|
|
1
|
+
{"version":3,"file":"blobs.js","sourceRoot":"","sources":["../../src/util/blobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { ChainForkConfig } from "@lodestar/config";
|
|
2
|
+
import { ColumnIndex, CustodyIndex, SignedBeaconBlockHeader, deneb, fulu } from "@lodestar/types";
|
|
3
|
+
import { DataColumnsCacheMap } from "../chain/blocks/types.js";
|
|
4
|
+
import { ChainEventEmitter } from "../chain/emitter.js";
|
|
5
|
+
import { BlockInputCacheType } from "../chain/seenCache/seenGossipBlockInput.js";
|
|
6
|
+
import { IExecutionEngine } from "../execution/engine/interface.js";
|
|
7
|
+
import { Metrics } from "../metrics/metrics.js";
|
|
8
|
+
import { NodeId } from "../network/subnets/index.js";
|
|
9
|
+
import { IClock } from "./clock.js";
|
|
10
|
+
export declare enum RecoverResult {
|
|
11
|
+
NotAttemptedLessThanHalf = "not_attempted_less_than_half",
|
|
12
|
+
NotAttemptedFull = "not_attempted_full",
|
|
13
|
+
SuccessResolved = "success_resolved",
|
|
14
|
+
SuccessLate = "success_late",
|
|
15
|
+
Failed = "failed"
|
|
16
|
+
}
|
|
17
|
+
export type CustodyConfigOpts = {
|
|
18
|
+
nodeId: NodeId;
|
|
19
|
+
config: ChainForkConfig;
|
|
20
|
+
initialCustodyGroupCount?: number;
|
|
21
|
+
};
|
|
22
|
+
export declare class CustodyConfig {
|
|
23
|
+
/**
|
|
24
|
+
* The number of custody groups the node should subscribe to
|
|
25
|
+
*/
|
|
26
|
+
targetCustodyGroupCount: number;
|
|
27
|
+
/**
|
|
28
|
+
* The custody columns the node should subscribe to
|
|
29
|
+
*/
|
|
30
|
+
custodyColumns: ColumnIndex[];
|
|
31
|
+
/**
|
|
32
|
+
* Custody columns map which column maps to which index in the array of columns custodied
|
|
33
|
+
* with zero representing it is not custodied
|
|
34
|
+
*/
|
|
35
|
+
custodyColumnsIndex: Uint8Array;
|
|
36
|
+
/**
|
|
37
|
+
* The number of custody groups the node will sample
|
|
38
|
+
*/
|
|
39
|
+
sampledGroupCount: number;
|
|
40
|
+
/**
|
|
41
|
+
* Custody groups sampled by the node as part of custody sampling
|
|
42
|
+
*/
|
|
43
|
+
sampleGroups: CustodyIndex[];
|
|
44
|
+
/**
|
|
45
|
+
* Data columns sampled by the node as part of custody sampling
|
|
46
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.4/specs/fulu/das-core.md#custody-sampling
|
|
47
|
+
*
|
|
48
|
+
* TODO: Consider race conditions if this updates during sync/backfill
|
|
49
|
+
*/
|
|
50
|
+
sampledColumns: ColumnIndex[];
|
|
51
|
+
/**
|
|
52
|
+
* Subnets sampled by the node as part of custody sampling
|
|
53
|
+
*/
|
|
54
|
+
sampledSubnets: number[];
|
|
55
|
+
private config;
|
|
56
|
+
private nodeId;
|
|
57
|
+
constructor(opts: CustodyConfigOpts);
|
|
58
|
+
updateTargetCustodyGroupCount(targetCustodyGroupCount: number): void;
|
|
59
|
+
private getCustodyColumnsIndex;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Calculate the number of custody groups the node should subscribe to based on the node's effective balance
|
|
63
|
+
*
|
|
64
|
+
* SPEC FUNCTION
|
|
65
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.3/specs/fulu/validator.md#validator-custody
|
|
66
|
+
*/
|
|
67
|
+
export declare function getValidatorsCustodyRequirement(config: ChainForkConfig, effectiveBalances: number[]): number;
|
|
68
|
+
/**
|
|
69
|
+
* Converts a custody group to an array of column indices. Should be 1-1 as long there are 128
|
|
70
|
+
* columns and 128 custody groups.
|
|
71
|
+
*
|
|
72
|
+
* SPEC FUNCTION
|
|
73
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.4/specs/fulu/das-core.md#compute_columns_for_custody_group
|
|
74
|
+
*/
|
|
75
|
+
export declare function computeColumnsForCustodyGroup(custodyIndex: CustodyIndex): ColumnIndex[];
|
|
76
|
+
/**
|
|
77
|
+
* Converts nodeId and a the number of custody groups to an array of custody indices. Indexes must be
|
|
78
|
+
* further converted to column indices
|
|
79
|
+
*
|
|
80
|
+
* SPEC FUNCTION
|
|
81
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.4/specs/fulu/das-core.md#get_custody_groups
|
|
82
|
+
*/
|
|
83
|
+
export declare function getCustodyGroups(nodeId: NodeId, custodyGroupCount: number): CustodyIndex[];
|
|
84
|
+
export declare function getDataColumns(nodeId: NodeId, custodyGroupCount: number): ColumnIndex[];
|
|
85
|
+
/**
|
|
86
|
+
* Computes the cells for each blob and combines them with cell proofs.
|
|
87
|
+
* Similar to the computeMatrix function described below.
|
|
88
|
+
*
|
|
89
|
+
* SPEC FUNCTION (note: spec currently computes proofs, but we already have them)
|
|
90
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.4/specs/fulu/das-core.md#compute_matrix
|
|
91
|
+
*/
|
|
92
|
+
export declare function getCellsAndProofs(blobBundles: fulu.BlobAndProofV2[]): {
|
|
93
|
+
cells: Uint8Array[];
|
|
94
|
+
proofs: Uint8Array[];
|
|
95
|
+
}[];
|
|
96
|
+
/**
|
|
97
|
+
* Given a signed block header and the commitments, inclusion proof, cells/proofs associated with
|
|
98
|
+
* each blob in the block, assemble the sidecars which can be distributed to peers.
|
|
99
|
+
*
|
|
100
|
+
* SPEC FUNCTION
|
|
101
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.4/specs/fulu/validator.md#get_data_column_sidecars
|
|
102
|
+
*/
|
|
103
|
+
export declare function getDataColumnSidecars(signedBlockHeader: SignedBeaconBlockHeader, kzgCommitments: deneb.KZGCommitment[], kzgCommitmentsInclusionProof: fulu.KzgCommitmentsInclusionProof, cellsAndKzgProofs: {
|
|
104
|
+
cells: Uint8Array[];
|
|
105
|
+
proofs: Uint8Array[];
|
|
106
|
+
}[]): fulu.DataColumnSidecars;
|
|
107
|
+
/**
|
|
108
|
+
* Given a signed block and the cells/proofs associated with each blob in the
|
|
109
|
+
* block, assemble the sidecars which can be distributed to peers.
|
|
110
|
+
*
|
|
111
|
+
* SPEC FUNCTION
|
|
112
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.4/specs/fulu/validator.md#get_data_column_sidecars_from_block
|
|
113
|
+
*/
|
|
114
|
+
export declare function getDataColumnSidecarsFromBlock(config: ChainForkConfig, signedBlock: fulu.SignedBeaconBlock, cellsAndKzgProofs: {
|
|
115
|
+
cells: Uint8Array[];
|
|
116
|
+
proofs: Uint8Array[];
|
|
117
|
+
}[]): fulu.DataColumnSidecars;
|
|
118
|
+
/**
|
|
119
|
+
* Given a DataColumnSidecar and the cells/proofs associated with each blob corresponding
|
|
120
|
+
* to the commitments it contains, assemble all sidecars for distribution to peers.
|
|
121
|
+
*
|
|
122
|
+
* SPEC FUNCTION
|
|
123
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.4/specs/fulu/validator.md#get_data_column_sidecars_from_column_sidecar
|
|
124
|
+
*/
|
|
125
|
+
export declare function getDataColumnSidecarsFromColumnSidecar(sidecar: fulu.DataColumnSidecar, cellsAndKzgProofs: {
|
|
126
|
+
cells: Uint8Array[];
|
|
127
|
+
proofs: Uint8Array[];
|
|
128
|
+
}[]): fulu.DataColumnSidecars;
|
|
129
|
+
/**
|
|
130
|
+
* If we receive more than half of NUMBER_OF_COLUMNS (64) we should recover all remaining columns
|
|
131
|
+
*/
|
|
132
|
+
export declare function recoverDataColumnSidecars(dataColumnCache: DataColumnsCacheMap, clock: IClock, metrics: Metrics | null): Promise<RecoverResult>;
|
|
133
|
+
export declare function hasSampledDataColumns(custodyConfig: CustodyConfig, dataColumnCache: DataColumnsCacheMap): boolean;
|
|
134
|
+
export declare function getDataColumnsFromExecution(config: ChainForkConfig, custodyConfig: CustodyConfig, executionEngine: IExecutionEngine, emitter: ChainEventEmitter, blockCache: BlockInputCacheType, metrics: Metrics | null): Promise<boolean>;
|
|
135
|
+
//# sourceMappingURL=dataColumns.d.ts.map
|