@lodestar/beacon-node 1.32.0-dev.b4d490c7e7 → 1.32.0-peerDAS.0536c19e44
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/LICENSE +188 -165
- package/README.md +1 -1
- package/lib/api/impl/beacon/blocks/index.js +40 -14
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +14 -3
- 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 +88 -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 +56 -15
- 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/chain.d.ts +13 -5
- package/lib/chain/chain.js +23 -8
- 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/opPools/syncContributionAndProofPool.js +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/options.d.ts +4 -1
- package/lib/chain/options.js +4 -0
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -3
- 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 +25 -2
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.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/blobSidecar.d.ts +1 -1
- package/lib/chain/validation/blobSidecar.js +6 -6
- package/lib/chain/validation/blobSidecar.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/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/engine/http.d.ts +5 -3
- package/lib/execution/engine/http.js +70 -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 +8 -3
- 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 +13 -0
- package/lib/metrics/metrics/beacon.js +42 -0
- package/lib/metrics/metrics/beacon.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 +6 -0
- package/lib/network/core/networkCore.js +20 -8
- 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 +2 -0
- package/lib/network/core/networkCoreWorkerHandler.js +7 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +4 -0
- 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 +1047 -1031
- 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/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 -1
- package/lib/network/network.js +57 -4
- 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.js +2 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/discover.d.ts +16 -3
- package/lib/network/peers/discover.js +139 -13
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +10 -2
- package/lib/network/peers/peerManager.js +96 -10
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/peersData.d.ts +8 -2
- 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/prioritizePeers.d.ts +15 -4
- package/lib/network/peers/utils/prioritizePeers.js +30 -5
- 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 +154 -8
- 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.js +21 -3
- 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 +1 -6
- 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 +125 -0
- package/lib/util/dataColumns.js +280 -0
- package/lib/util/dataColumns.js.map +1 -0
- package/lib/util/kzg.d.ts +2 -34
- package/lib/util/kzg.js +2 -123
- 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 +16 -16
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { ChainForkConfig } from "@lodestar/config";
|
|
2
|
+
import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
|
|
3
|
+
import { ColumnIndex, CustodyIndex, SignedBeaconBlockHeader, ValidatorIndex, deneb, fulu } from "@lodestar/types";
|
|
4
|
+
import { DataColumnsCacheMap } from "../chain/blocks/types.js";
|
|
5
|
+
import { ChainEventEmitter } from "../chain/emitter.js";
|
|
6
|
+
import { BlockInputCacheType } from "../chain/seenCache/seenGossipBlockInput.js";
|
|
7
|
+
import { IExecutionEngine } from "../execution/engine/interface.js";
|
|
8
|
+
import { Metrics } from "../metrics/metrics.js";
|
|
9
|
+
import { NodeId } from "../network/subnets/index.js";
|
|
10
|
+
export declare class CustodyConfig {
|
|
11
|
+
/**
|
|
12
|
+
* The number of custody groups the node should subscribe to
|
|
13
|
+
*/
|
|
14
|
+
targetCustodyGroupCount: number;
|
|
15
|
+
/**
|
|
16
|
+
* The custody columns the node should subscribe to
|
|
17
|
+
*/
|
|
18
|
+
custodyColumns: ColumnIndex[];
|
|
19
|
+
/**
|
|
20
|
+
* Custody columns map which column maps to which index in the array of columns custodied
|
|
21
|
+
* with zero representing it is not custodied
|
|
22
|
+
*/
|
|
23
|
+
custodyColumnsIndex: Uint8Array;
|
|
24
|
+
/**
|
|
25
|
+
* The number of custody groups the node will advertise to the network
|
|
26
|
+
*/
|
|
27
|
+
advertisedCustodyGroupCount: number;
|
|
28
|
+
/**
|
|
29
|
+
* The number of custody groups the node will sample
|
|
30
|
+
*/
|
|
31
|
+
sampledGroupCount: number;
|
|
32
|
+
/**
|
|
33
|
+
* Custody groups sampled by the node as part of custody sampling
|
|
34
|
+
*/
|
|
35
|
+
sampleGroups: CustodyIndex[];
|
|
36
|
+
/**
|
|
37
|
+
* Data columns sampled by the node as part of custody sampling
|
|
38
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#custody-sampling
|
|
39
|
+
*
|
|
40
|
+
* TODO: Consider race conditions if this updates during sync/backfill
|
|
41
|
+
*/
|
|
42
|
+
sampledColumns: ColumnIndex[];
|
|
43
|
+
/**
|
|
44
|
+
* Subnets sampled by the node as part of custody sampling
|
|
45
|
+
*/
|
|
46
|
+
sampledSubnets: number[];
|
|
47
|
+
private config;
|
|
48
|
+
private nodeId;
|
|
49
|
+
private readonly metrics;
|
|
50
|
+
constructor(nodeId: NodeId, config: ChainForkConfig, metrics: Metrics | null);
|
|
51
|
+
updateTargetCustodyGroupCount(targetCustodyGroupCount: number): void;
|
|
52
|
+
updateAdvertisedCustodyGroupCount(advertisedCustodyGroupCount: number): void;
|
|
53
|
+
private getCustodyColumnsIndex;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Calculate the number of custody groups the node should subscribe to based on the node's effective balance
|
|
57
|
+
*
|
|
58
|
+
* SPEC FUNCTION
|
|
59
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#validator-custody
|
|
60
|
+
*/
|
|
61
|
+
export declare function getValidatorsCustodyRequirement(state: CachedBeaconStateAllForks, validatorIndices: ValidatorIndex[], config: ChainForkConfig): number;
|
|
62
|
+
/**
|
|
63
|
+
* Converts a custody group to an array of column indices. Should be 1-1 as long there are 128
|
|
64
|
+
* columns and 128 custody groups.
|
|
65
|
+
*
|
|
66
|
+
* SPEC FUNCTION
|
|
67
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_columns_for_custody_group
|
|
68
|
+
*/
|
|
69
|
+
export declare function computeColumnsForCustodyGroup(custodyIndex: CustodyIndex): ColumnIndex[];
|
|
70
|
+
/**
|
|
71
|
+
* Converts nodeId and a the number of custody groups to an array of custody indices. Indexes must be
|
|
72
|
+
* further converted to column indices
|
|
73
|
+
*
|
|
74
|
+
* SPEC FUNCTION
|
|
75
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#get_custody_groups
|
|
76
|
+
*/
|
|
77
|
+
export declare function getCustodyGroups(nodeId: NodeId, custodyGroupCount: number): CustodyIndex[];
|
|
78
|
+
export declare function getDataColumns(nodeId: NodeId, custodyGroupCount: number): ColumnIndex[];
|
|
79
|
+
/**
|
|
80
|
+
* Computes the cells for each blob and combines them with cell proofs.
|
|
81
|
+
* Similar to the computeMatrix function described below.
|
|
82
|
+
*
|
|
83
|
+
* SPEC FUNCTION (note: spec currently computes proofs, but we already have them)
|
|
84
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_matrix
|
|
85
|
+
*/
|
|
86
|
+
export declare function getCellsAndProofs(blobBundles: fulu.BlobAndProofV2[]): {
|
|
87
|
+
cells: Uint8Array[];
|
|
88
|
+
proofs: Uint8Array[];
|
|
89
|
+
}[];
|
|
90
|
+
/**
|
|
91
|
+
* Given a signed block header and the commitments, inclusion proof, cells/proofs associated with
|
|
92
|
+
* each blob in the block, assemble the sidecars which can be distributed to peers.
|
|
93
|
+
*
|
|
94
|
+
* SPEC FUNCTION
|
|
95
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars
|
|
96
|
+
*/
|
|
97
|
+
export declare function getDataColumnSidecars(signedBlockHeader: SignedBeaconBlockHeader, kzgCommitments: deneb.KZGCommitment[], kzgCommitmentsInclusionProof: fulu.KzgCommitmentsInclusionProof, cellsAndKzgProofs: {
|
|
98
|
+
cells: Uint8Array[];
|
|
99
|
+
proofs: Uint8Array[];
|
|
100
|
+
}[]): fulu.DataColumnSidecars;
|
|
101
|
+
/**
|
|
102
|
+
* Given a signed block and the cells/proofs associated with each blob in the
|
|
103
|
+
* block, assemble the sidecars which can be distributed to peers.
|
|
104
|
+
*
|
|
105
|
+
* SPEC FUNCTION
|
|
106
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_block
|
|
107
|
+
*/
|
|
108
|
+
export declare function getDataColumnSidecarsFromBlock(config: ChainForkConfig, signedBlock: fulu.SignedBeaconBlock, cellsAndKzgProofs: {
|
|
109
|
+
cells: Uint8Array[];
|
|
110
|
+
proofs: Uint8Array[];
|
|
111
|
+
}[]): fulu.DataColumnSidecars;
|
|
112
|
+
/**
|
|
113
|
+
* Given a DataColumnSidecar and the cells/proofs associated with each blob corresponding
|
|
114
|
+
* to the commitments it contains, assemble all sidecars for distribution to peers.
|
|
115
|
+
*
|
|
116
|
+
* SPEC FUNCTION
|
|
117
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_column_sidecar
|
|
118
|
+
*/
|
|
119
|
+
export declare function getDataColumnSidecarsFromColumnSidecar(sidecar: fulu.DataColumnSidecar, cellsAndKzgProofs: {
|
|
120
|
+
cells: Uint8Array[];
|
|
121
|
+
proofs: Uint8Array[];
|
|
122
|
+
}[]): fulu.DataColumnSidecars;
|
|
123
|
+
export declare function hasSampledDataColumns(custodyConfig: CustodyConfig, dataColumnCache: DataColumnsCacheMap): boolean;
|
|
124
|
+
export declare function getDataColumnsFromExecution(config: ChainForkConfig, custodyConfig: CustodyConfig, executionEngine: IExecutionEngine, emitter: ChainEventEmitter, blockCache: BlockInputCacheType): Promise<boolean>;
|
|
125
|
+
//# sourceMappingURL=dataColumns.d.ts.map
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { digest } from "@chainsafe/as-sha256";
|
|
2
|
+
import { DATA_COLUMN_SIDECAR_SUBNET_COUNT, EFFECTIVE_BALANCE_INCREMENT, ForkName, NUMBER_OF_COLUMNS, NUMBER_OF_CUSTODY_GROUPS, } from "@lodestar/params";
|
|
3
|
+
import { signedBlockToSignedHeader } from "@lodestar/state-transition";
|
|
4
|
+
import { ssz } from "@lodestar/types";
|
|
5
|
+
import { bytesToBigInt } from "@lodestar/utils";
|
|
6
|
+
import { BlockSource, DataColumnsSource, getBlockInput, getBlockInputDataColumns, } from "../chain/blocks/types.js";
|
|
7
|
+
import { ChainEvent } from "../chain/emitter.js";
|
|
8
|
+
import { computeKzgCommitmentsInclusionProof, kzgCommitmentToVersionedHash } from "./blobs.js";
|
|
9
|
+
import { kzg } from "./kzg.js";
|
|
10
|
+
export class CustodyConfig {
|
|
11
|
+
constructor(nodeId, config, metrics) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.nodeId = nodeId;
|
|
14
|
+
this.metrics = metrics;
|
|
15
|
+
this.targetCustodyGroupCount = Math.max(config.CUSTODY_REQUIREMENT, config.NODE_CUSTODY_REQUIREMENT);
|
|
16
|
+
this.custodyColumns = getDataColumns(this.nodeId, this.targetCustodyGroupCount);
|
|
17
|
+
this.custodyColumnsIndex = this.getCustodyColumnsIndex(this.custodyColumns);
|
|
18
|
+
this.advertisedCustodyGroupCount = this.targetCustodyGroupCount;
|
|
19
|
+
this.metrics?.peerDas.custodyGroupCount.set(this.advertisedCustodyGroupCount);
|
|
20
|
+
this.sampledGroupCount = Math.max(this.targetCustodyGroupCount, this.config.SAMPLES_PER_SLOT);
|
|
21
|
+
this.sampleGroups = getCustodyGroups(this.nodeId, this.sampledGroupCount);
|
|
22
|
+
this.sampledColumns = getDataColumns(this.nodeId, this.sampledGroupCount);
|
|
23
|
+
this.sampledSubnets = this.sampledColumns.map(computeSubnetForDataColumn);
|
|
24
|
+
}
|
|
25
|
+
updateTargetCustodyGroupCount(targetCustodyGroupCount) {
|
|
26
|
+
this.targetCustodyGroupCount = targetCustodyGroupCount;
|
|
27
|
+
this.custodyColumns = getDataColumns(this.nodeId, this.targetCustodyGroupCount);
|
|
28
|
+
this.custodyColumnsIndex = this.getCustodyColumnsIndex(this.custodyColumns);
|
|
29
|
+
// TODO: Porting this over to match current behavior, but I think this incorrectly mixes units:
|
|
30
|
+
// SAMPLES_PER_SLOT is in columns, and CUSTODY_GROUP_COUNT is in groups
|
|
31
|
+
this.sampledGroupCount = Math.max(this.targetCustodyGroupCount, this.config.SAMPLES_PER_SLOT);
|
|
32
|
+
this.sampleGroups = getCustodyGroups(this.nodeId, this.sampledGroupCount);
|
|
33
|
+
this.sampledColumns = getDataColumns(this.nodeId, this.sampledGroupCount);
|
|
34
|
+
this.sampledSubnets = this.sampledColumns.map(computeSubnetForDataColumn);
|
|
35
|
+
}
|
|
36
|
+
updateAdvertisedCustodyGroupCount(advertisedCustodyGroupCount) {
|
|
37
|
+
this.advertisedCustodyGroupCount = advertisedCustodyGroupCount;
|
|
38
|
+
this.metrics?.peerDas.custodyGroupCount.set(this.advertisedCustodyGroupCount);
|
|
39
|
+
}
|
|
40
|
+
getCustodyColumnsIndex(custodyColumns) {
|
|
41
|
+
// custody columns map which column maps to which index in the array of columns custodied
|
|
42
|
+
// with zero representing it is not custodied
|
|
43
|
+
const custodyColumnsIndex = new Uint8Array(NUMBER_OF_COLUMNS);
|
|
44
|
+
let custodyAtIndex = 1;
|
|
45
|
+
for (const columnIndex of custodyColumns) {
|
|
46
|
+
custodyColumnsIndex[columnIndex] = custodyAtIndex;
|
|
47
|
+
custodyAtIndex++;
|
|
48
|
+
}
|
|
49
|
+
return custodyColumnsIndex;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function computeSubnetForDataColumn(columnIndex) {
|
|
53
|
+
return columnIndex % DATA_COLUMN_SIDECAR_SUBNET_COUNT;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Calculate the number of custody groups the node should subscribe to based on the node's effective balance
|
|
57
|
+
*
|
|
58
|
+
* SPEC FUNCTION
|
|
59
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#validator-custody
|
|
60
|
+
*/
|
|
61
|
+
export function getValidatorsCustodyRequirement(state, validatorIndices, config) {
|
|
62
|
+
if (validatorIndices.length === 0) {
|
|
63
|
+
return config.CUSTODY_REQUIREMENT;
|
|
64
|
+
}
|
|
65
|
+
const totalNodeEffectiveBalance = validatorIndices.reduce((total, validatorIndex) => {
|
|
66
|
+
return total + state.epochCtx.effectiveBalanceIncrements[validatorIndex] * EFFECTIVE_BALANCE_INCREMENT;
|
|
67
|
+
}, 0);
|
|
68
|
+
// Must custody one group for every BALANCE_PER_ADDITIONAL_CUSTODY_GROUP of effective balance
|
|
69
|
+
let validatorsCustodyRequirement = Math.floor(totalNodeEffectiveBalance / config.BALANCE_PER_ADDITIONAL_CUSTODY_GROUP);
|
|
70
|
+
// Any node with at least 1 validator must custody at least VALIDATOR_CUSTODY_REQUIREMENT
|
|
71
|
+
validatorsCustodyRequirement = Math.max(validatorsCustodyRequirement, config.VALIDATOR_CUSTODY_REQUIREMENT);
|
|
72
|
+
// Cannot custody more than NUMBER_OF_CUSTODY_GROUPS
|
|
73
|
+
validatorsCustodyRequirement = Math.min(validatorsCustodyRequirement, NUMBER_OF_CUSTODY_GROUPS);
|
|
74
|
+
// Validators custody requirement must be at least configured node custody requirement
|
|
75
|
+
return Math.max(validatorsCustodyRequirement, config.NODE_CUSTODY_REQUIREMENT);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Converts a custody group to an array of column indices. Should be 1-1 as long there are 128
|
|
79
|
+
* columns and 128 custody groups.
|
|
80
|
+
*
|
|
81
|
+
* SPEC FUNCTION
|
|
82
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_columns_for_custody_group
|
|
83
|
+
*/
|
|
84
|
+
export function computeColumnsForCustodyGroup(custodyIndex) {
|
|
85
|
+
if (custodyIndex > NUMBER_OF_CUSTODY_GROUPS) {
|
|
86
|
+
custodyIndex = NUMBER_OF_CUSTODY_GROUPS;
|
|
87
|
+
}
|
|
88
|
+
const columnsPerCustodyGroup = Number(NUMBER_OF_COLUMNS / NUMBER_OF_CUSTODY_GROUPS);
|
|
89
|
+
const columnIndexes = [];
|
|
90
|
+
for (let i = 0; i < columnsPerCustodyGroup; i++) {
|
|
91
|
+
columnIndexes.push(NUMBER_OF_CUSTODY_GROUPS * i + custodyIndex);
|
|
92
|
+
}
|
|
93
|
+
columnIndexes.sort((a, b) => a - b);
|
|
94
|
+
return columnIndexes;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Converts nodeId and a the number of custody groups to an array of custody indices. Indexes must be
|
|
98
|
+
* further converted to column indices
|
|
99
|
+
*
|
|
100
|
+
* SPEC FUNCTION
|
|
101
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#get_custody_groups
|
|
102
|
+
*/
|
|
103
|
+
export function getCustodyGroups(nodeId, custodyGroupCount) {
|
|
104
|
+
if (custodyGroupCount > NUMBER_OF_CUSTODY_GROUPS) {
|
|
105
|
+
custodyGroupCount = NUMBER_OF_CUSTODY_GROUPS;
|
|
106
|
+
}
|
|
107
|
+
const custodyGroups = [];
|
|
108
|
+
// nodeId is in bigendian and all computes are in little endian
|
|
109
|
+
let currentId = bytesToBigInt(nodeId, "be");
|
|
110
|
+
while (custodyGroups.length < custodyGroupCount) {
|
|
111
|
+
// could be optimized
|
|
112
|
+
const currentIdBytes = ssz.UintBn256.serialize(currentId);
|
|
113
|
+
const custodyGroup = Number(ssz.UintBn64.deserialize(digest(currentIdBytes).slice(0, 8)) % BigInt(NUMBER_OF_CUSTODY_GROUPS));
|
|
114
|
+
if (!custodyGroups.includes(custodyGroup)) {
|
|
115
|
+
custodyGroups.push(custodyGroup);
|
|
116
|
+
}
|
|
117
|
+
const willOverflow = currentIdBytes.reduce((acc, elem) => acc && elem === 0xff, true);
|
|
118
|
+
if (willOverflow) {
|
|
119
|
+
currentId = BigInt(0);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
currentId++;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
custodyGroups.sort((a, b) => a - b);
|
|
126
|
+
return custodyGroups;
|
|
127
|
+
}
|
|
128
|
+
export function getDataColumns(nodeId, custodyGroupCount) {
|
|
129
|
+
return getCustodyGroups(nodeId, custodyGroupCount)
|
|
130
|
+
.flatMap(computeColumnsForCustodyGroup)
|
|
131
|
+
.sort((a, b) => a - b);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Computes the cells for each blob and combines them with cell proofs.
|
|
135
|
+
* Similar to the computeMatrix function described below.
|
|
136
|
+
*
|
|
137
|
+
* SPEC FUNCTION (note: spec currently computes proofs, but we already have them)
|
|
138
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_matrix
|
|
139
|
+
*/
|
|
140
|
+
export function getCellsAndProofs(blobBundles) {
|
|
141
|
+
return blobBundles.map(({ blob, proofs }) => {
|
|
142
|
+
const cells = kzg.computeCells(blob);
|
|
143
|
+
return { cells, proofs };
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Given a signed block header and the commitments, inclusion proof, cells/proofs associated with
|
|
148
|
+
* each blob in the block, assemble the sidecars which can be distributed to peers.
|
|
149
|
+
*
|
|
150
|
+
* SPEC FUNCTION
|
|
151
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars
|
|
152
|
+
*/
|
|
153
|
+
export function getDataColumnSidecars(signedBlockHeader, kzgCommitments, kzgCommitmentsInclusionProof, cellsAndKzgProofs) {
|
|
154
|
+
if (cellsAndKzgProofs.length !== kzgCommitments.length) {
|
|
155
|
+
throw Error("Invalid cellsAndKzgProofs length for getDataColumnSidecars");
|
|
156
|
+
}
|
|
157
|
+
const sidecars = [];
|
|
158
|
+
for (let columnIndex = 0; columnIndex < NUMBER_OF_COLUMNS; columnIndex++) {
|
|
159
|
+
const columnCells = [];
|
|
160
|
+
const columnProofs = [];
|
|
161
|
+
for (const { cells, proofs } of cellsAndKzgProofs) {
|
|
162
|
+
columnCells.push(cells[columnIndex]);
|
|
163
|
+
columnProofs.push(proofs[columnIndex]);
|
|
164
|
+
}
|
|
165
|
+
sidecars.push({
|
|
166
|
+
index: columnIndex,
|
|
167
|
+
column: columnCells,
|
|
168
|
+
kzgCommitments,
|
|
169
|
+
kzgProofs: columnProofs,
|
|
170
|
+
signedBlockHeader,
|
|
171
|
+
kzgCommitmentsInclusionProof,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
return sidecars;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Given a signed block and the cells/proofs associated with each blob in the
|
|
178
|
+
* block, assemble the sidecars which can be distributed to peers.
|
|
179
|
+
*
|
|
180
|
+
* SPEC FUNCTION
|
|
181
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_block
|
|
182
|
+
*/
|
|
183
|
+
export function getDataColumnSidecarsFromBlock(config, signedBlock, cellsAndKzgProofs) {
|
|
184
|
+
const blobKzgCommitments = signedBlock.message.body.blobKzgCommitments;
|
|
185
|
+
const fork = config.getForkName(signedBlock.message.slot);
|
|
186
|
+
const signedBlockHeader = signedBlockToSignedHeader(config, signedBlock);
|
|
187
|
+
const kzgCommitmentsInclusionProof = computeKzgCommitmentsInclusionProof(fork, signedBlock.message.body);
|
|
188
|
+
return getDataColumnSidecars(signedBlockHeader, blobKzgCommitments, kzgCommitmentsInclusionProof, cellsAndKzgProofs);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Given a DataColumnSidecar and the cells/proofs associated with each blob corresponding
|
|
192
|
+
* to the commitments it contains, assemble all sidecars for distribution to peers.
|
|
193
|
+
*
|
|
194
|
+
* SPEC FUNCTION
|
|
195
|
+
* https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_column_sidecar
|
|
196
|
+
*/
|
|
197
|
+
export function getDataColumnSidecarsFromColumnSidecar(sidecar, cellsAndKzgProofs) {
|
|
198
|
+
return getDataColumnSidecars(sidecar.signedBlockHeader, sidecar.kzgCommitments, sidecar.kzgCommitmentsInclusionProof, cellsAndKzgProofs);
|
|
199
|
+
}
|
|
200
|
+
export function hasSampledDataColumns(custodyConfig, dataColumnCache) {
|
|
201
|
+
return (dataColumnCache.size >= custodyConfig.sampledColumns.length &&
|
|
202
|
+
custodyConfig.sampledColumns.reduce((acc, columnIndex) => acc && dataColumnCache.has(columnIndex), true));
|
|
203
|
+
}
|
|
204
|
+
export async function getDataColumnsFromExecution(config, custodyConfig, executionEngine, emitter, blockCache) {
|
|
205
|
+
if (blockCache.fork !== ForkName.fulu) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
if (!blockCache.cachedData) {
|
|
209
|
+
// this condition should never get hit... just a sanity check
|
|
210
|
+
throw new Error("invalid blockCache");
|
|
211
|
+
}
|
|
212
|
+
if (blockCache.cachedData.fork !== ForkName.fulu) {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
// If already have all columns, exit
|
|
216
|
+
if (hasSampledDataColumns(custodyConfig, blockCache.cachedData.dataColumnsCache)) {
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
let commitments;
|
|
220
|
+
if (blockCache.block) {
|
|
221
|
+
const block = blockCache.block;
|
|
222
|
+
commitments = block.message.body.blobKzgCommitments;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
const firstSidecar = blockCache.cachedData.dataColumnsCache.values().next().value;
|
|
226
|
+
commitments = firstSidecar?.dataColumn.kzgCommitments;
|
|
227
|
+
}
|
|
228
|
+
if (!commitments) {
|
|
229
|
+
throw new Error("blockInputCache missing both block and cachedData");
|
|
230
|
+
}
|
|
231
|
+
// Return if block has no blobs
|
|
232
|
+
if (commitments.length === 0) {
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
// Process KZG commitments into versioned hashes
|
|
236
|
+
const versionedHashes = commitments.map(kzgCommitmentToVersionedHash);
|
|
237
|
+
// Get blobs from execution engine
|
|
238
|
+
const blobs = await executionEngine.getBlobs(blockCache.fork, versionedHashes);
|
|
239
|
+
// Execution engine was unable to find one or more blobs
|
|
240
|
+
if (blobs === null) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
// Return if we received all data columns while waiting for getBlobs
|
|
244
|
+
if (hasSampledDataColumns(custodyConfig, blockCache.cachedData.dataColumnsCache)) {
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
let dataColumnSidecars;
|
|
248
|
+
const cellsAndProofs = getCellsAndProofs(blobs);
|
|
249
|
+
if (blockCache.block) {
|
|
250
|
+
dataColumnSidecars = getDataColumnSidecarsFromBlock(config, blockCache.block, cellsAndProofs);
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
const firstSidecar = blockCache.cachedData.dataColumnsCache.values().next().value;
|
|
254
|
+
if (!firstSidecar) {
|
|
255
|
+
throw new Error("blockInputCache missing both block and data column sidecar");
|
|
256
|
+
}
|
|
257
|
+
dataColumnSidecars = getDataColumnSidecarsFromColumnSidecar(firstSidecar.dataColumn, cellsAndProofs);
|
|
258
|
+
}
|
|
259
|
+
// Publish columns if and only if subscribed to them
|
|
260
|
+
const sampledColumns = custodyConfig.sampledColumns.map((columnIndex) => dataColumnSidecars[columnIndex]);
|
|
261
|
+
emitter.emit(ChainEvent.publishDataColumns, sampledColumns);
|
|
262
|
+
for (const column of sampledColumns) {
|
|
263
|
+
blockCache.cachedData.dataColumnsCache.set(column.index, { dataColumn: column, dataColumnBytes: null });
|
|
264
|
+
}
|
|
265
|
+
const allDataColumns = getBlockInputDataColumns(blockCache.cachedData.dataColumnsCache, custodyConfig.sampledColumns);
|
|
266
|
+
// TODO: Add metrics
|
|
267
|
+
// metrics?.syncUnknownBlock.resolveAvailabilitySource.inc({source: BlockInputAvailabilitySource.GOSSIP});
|
|
268
|
+
const blockData = {
|
|
269
|
+
fork: blockCache.cachedData.fork,
|
|
270
|
+
...allDataColumns,
|
|
271
|
+
dataColumnsSource: DataColumnsSource.gossip,
|
|
272
|
+
};
|
|
273
|
+
blockCache.cachedData.resolveAvailability(blockData);
|
|
274
|
+
if (blockCache.block !== undefined) {
|
|
275
|
+
const blockInput = getBlockInput.availableData(config, blockCache.block, BlockSource.gossip, blockData);
|
|
276
|
+
blockCache.resolveBlockInput(blockInput);
|
|
277
|
+
}
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=dataColumns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataColumns.js","sourceRoot":"","sources":["../../src/util/dataColumns.ts"],"names":[],"mappings":"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"}
|
package/lib/util/kzg.d.ts
CHANGED
|
@@ -1,35 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export declare
|
|
3
|
-
freeTrustedSetup(): void;
|
|
4
|
-
loadTrustedSetup(filePath: string): void;
|
|
5
|
-
blobToKzgCommitment(blob: Uint8Array): Uint8Array;
|
|
6
|
-
computeBlobKzgProof(blob: Uint8Array, commitment: Uint8Array): Uint8Array;
|
|
7
|
-
verifyBlobKzgProof(blob: Uint8Array, commitment: Uint8Array, proof: Uint8Array): boolean;
|
|
8
|
-
verifyBlobKzgProofBatch(blobs: Uint8Array[], expectedKzgCommitments: Uint8Array[], kzgProofs: Uint8Array[]): boolean;
|
|
9
|
-
};
|
|
10
|
-
export declare const TRUSTED_SETUP_BIN_FILEPATH: string;
|
|
11
|
-
export declare function initCKZG(): Promise<void>;
|
|
12
|
-
export declare enum TrustedFileMode {
|
|
13
|
-
Bin = "bin",
|
|
14
|
-
Txt = "txt"
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Load our KZG trusted setup into C-KZG for later use.
|
|
18
|
-
* We persist the trusted setup as serialized bytes to save space over TXT or JSON formats.
|
|
19
|
-
* However the current c-kzg API **requires** to read from a file with a specific .txt format
|
|
20
|
-
*/
|
|
21
|
-
export declare function loadEthereumTrustedSetup(mode?: TrustedFileMode, filePath?: string): void;
|
|
22
|
-
export interface TrustedSetupJSON {
|
|
23
|
-
setup_G1: string[];
|
|
24
|
-
setup_G2: string[];
|
|
25
|
-
}
|
|
26
|
-
type TrustedSetupBin = Uint8Array;
|
|
27
|
-
type TrustedSetupTXT = string;
|
|
28
|
-
/**
|
|
29
|
-
* Custom format defined in https://github.com/ethereum/c-kzg-4844/issues/3
|
|
30
|
-
*/
|
|
31
|
-
export declare function trustedSetupJsonToBin(data: TrustedSetupJSON): TrustedSetupBin;
|
|
32
|
-
export declare function trustedSetupBinToJson(bytes: TrustedSetupBin): TrustedSetupJSON;
|
|
33
|
-
export declare function trustedSetupJsonToTxt(data: TrustedSetupJSON): TrustedSetupTXT;
|
|
34
|
-
export {};
|
|
1
|
+
import { DasContextJs } from "@crate-crypto/node-eth-kzg";
|
|
2
|
+
export declare const kzg: DasContextJs;
|
|
35
3
|
//# sourceMappingURL=kzg.d.ts.map
|
package/lib/util/kzg.js
CHANGED
|
@@ -1,124 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { fromHex, strip0xPrefix, toHex } from "@lodestar/utils";
|
|
5
|
-
// "c-kzg" has hardcoded the mainnet value, do not use params
|
|
6
|
-
export const FIELD_ELEMENTS_PER_BLOB_MAINNET = 4096;
|
|
7
|
-
function ckzgNotLoaded() {
|
|
8
|
-
throw Error("c-kzg library not loaded");
|
|
9
|
-
}
|
|
10
|
-
export let ckzg = {
|
|
11
|
-
freeTrustedSetup: ckzgNotLoaded,
|
|
12
|
-
loadTrustedSetup: ckzgNotLoaded,
|
|
13
|
-
blobToKzgCommitment: ckzgNotLoaded,
|
|
14
|
-
computeBlobKzgProof: ckzgNotLoaded,
|
|
15
|
-
verifyBlobKzgProof: ckzgNotLoaded,
|
|
16
|
-
verifyBlobKzgProofBatch: ckzgNotLoaded,
|
|
17
|
-
};
|
|
18
|
-
// Global variable __dirname no longer available in ES6 modules.
|
|
19
|
-
// Solutions: https://stackoverflow.com/questions/46745014/alternative-for-dirname-in-node-js-when-using-es6-modules
|
|
20
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
21
|
-
export const TRUSTED_SETUP_BIN_FILEPATH = path.join(__dirname, "../../trusted_setup.bin");
|
|
22
|
-
const TRUSTED_SETUP_JSON_FILEPATH = path.join(__dirname, "../../trusted_setup.json");
|
|
23
|
-
const TRUSTED_SETUP_TXT_FILEPATH = path.join(__dirname, "../../trusted_setup.txt");
|
|
24
|
-
const POINT_COUNT_BYTES = 4;
|
|
25
|
-
const G1POINT_BYTES = 48;
|
|
26
|
-
const G2POINT_BYTES = 96;
|
|
27
|
-
const G1POINT_COUNT = FIELD_ELEMENTS_PER_BLOB_MAINNET;
|
|
28
|
-
const G2POINT_COUNT = 65;
|
|
29
|
-
const TOTAL_SIZE = 2 * POINT_COUNT_BYTES + G1POINT_BYTES * G1POINT_COUNT + G2POINT_BYTES * G2POINT_COUNT;
|
|
30
|
-
export async function initCKZG() {
|
|
31
|
-
// @ts-ignore
|
|
32
|
-
ckzg = (await import("c-kzg")).default;
|
|
33
|
-
}
|
|
34
|
-
export var TrustedFileMode;
|
|
35
|
-
(function (TrustedFileMode) {
|
|
36
|
-
TrustedFileMode["Bin"] = "bin";
|
|
37
|
-
TrustedFileMode["Txt"] = "txt";
|
|
38
|
-
})(TrustedFileMode || (TrustedFileMode = {}));
|
|
39
|
-
/**
|
|
40
|
-
* Load our KZG trusted setup into C-KZG for later use.
|
|
41
|
-
* We persist the trusted setup as serialized bytes to save space over TXT or JSON formats.
|
|
42
|
-
* However the current c-kzg API **requires** to read from a file with a specific .txt format
|
|
43
|
-
*/
|
|
44
|
-
export function loadEthereumTrustedSetup(mode = TrustedFileMode.Txt, filePath) {
|
|
45
|
-
try {
|
|
46
|
-
let setupFilePath;
|
|
47
|
-
if (mode === TrustedFileMode.Bin) {
|
|
48
|
-
const binPath = filePath ?? TRUSTED_SETUP_BIN_FILEPATH;
|
|
49
|
-
const bytes = fs.readFileSync(binPath);
|
|
50
|
-
const json = trustedSetupBinToJson(bytes);
|
|
51
|
-
const txt = trustedSetupJsonToTxt(json);
|
|
52
|
-
fs.writeFileSync(TRUSTED_SETUP_TXT_FILEPATH, txt);
|
|
53
|
-
setupFilePath = TRUSTED_SETUP_TXT_FILEPATH;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
setupFilePath = filePath ?? TRUSTED_SETUP_TXT_FILEPATH;
|
|
57
|
-
}
|
|
58
|
-
try {
|
|
59
|
-
// in unit tests, calling loadTrustedSetup() twice has error so we have to free and retry
|
|
60
|
-
ckzg.loadTrustedSetup(setupFilePath);
|
|
61
|
-
}
|
|
62
|
-
catch (e) {
|
|
63
|
-
if (e.message !== "Error trusted setup is already loaded") {
|
|
64
|
-
throw e;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch (e) {
|
|
69
|
-
e.message = `Error loading trusted setup ${TRUSTED_SETUP_JSON_FILEPATH}: ${e.message}`;
|
|
70
|
-
throw e;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Custom format defined in https://github.com/ethereum/c-kzg-4844/issues/3
|
|
75
|
-
*/
|
|
76
|
-
export function trustedSetupJsonToBin(data) {
|
|
77
|
-
const out = new Uint8Array(TOTAL_SIZE);
|
|
78
|
-
const dv = new DataView(out.buffer, out.byteOffset, out.byteLength);
|
|
79
|
-
dv.setUint32(0, G1POINT_COUNT);
|
|
80
|
-
dv.setUint32(POINT_COUNT_BYTES, G2POINT_BYTES);
|
|
81
|
-
for (let i = 0; i < G1POINT_COUNT; i++) {
|
|
82
|
-
const point = fromHex(data.setup_G1[i]);
|
|
83
|
-
if (point.length !== G1POINT_BYTES)
|
|
84
|
-
throw Error(`g1 point size ${point.length} != ${G1POINT_BYTES}`);
|
|
85
|
-
out.set(point, 2 * POINT_COUNT_BYTES + i * G1POINT_BYTES);
|
|
86
|
-
}
|
|
87
|
-
for (let i = 0; i < G2POINT_COUNT; i++) {
|
|
88
|
-
const point = fromHex(data.setup_G2[i]);
|
|
89
|
-
if (point.length !== G2POINT_BYTES)
|
|
90
|
-
throw Error(`g2 point size ${point.length} != ${G2POINT_BYTES}`);
|
|
91
|
-
out.set(point, 2 * POINT_COUNT_BYTES + G1POINT_COUNT * G1POINT_BYTES + i * G2POINT_BYTES);
|
|
92
|
-
}
|
|
93
|
-
return out;
|
|
94
|
-
}
|
|
95
|
-
export function trustedSetupBinToJson(bytes) {
|
|
96
|
-
const data = {
|
|
97
|
-
// biome-ignore lint/style/useNamingConvention: Need to be consistent with KZG pattern
|
|
98
|
-
setup_G1: [],
|
|
99
|
-
// biome-ignore lint/style/useNamingConvention: Need to be consistent with KZG pattern
|
|
100
|
-
setup_G2: [],
|
|
101
|
-
};
|
|
102
|
-
if (bytes.length < TOTAL_SIZE) {
|
|
103
|
-
throw Error(`trusted_setup size ${bytes.length} < ${TOTAL_SIZE}`);
|
|
104
|
-
}
|
|
105
|
-
for (let i = 0; i < G1POINT_COUNT; i++) {
|
|
106
|
-
const start = 2 * POINT_COUNT_BYTES + i * G1POINT_BYTES;
|
|
107
|
-
data.setup_G1.push(toHex(bytes.slice(start, start + G1POINT_BYTES)));
|
|
108
|
-
}
|
|
109
|
-
for (let i = 0; i < G2POINT_COUNT; i++) {
|
|
110
|
-
const start = 2 * POINT_COUNT_BYTES + G1POINT_COUNT * G1POINT_BYTES + i * G2POINT_BYTES;
|
|
111
|
-
data.setup_G1.push(toHex(bytes.slice(start, start + G2POINT_BYTES)));
|
|
112
|
-
}
|
|
113
|
-
return data;
|
|
114
|
-
}
|
|
115
|
-
export function trustedSetupJsonToTxt(data) {
|
|
116
|
-
return [
|
|
117
|
-
// ↵
|
|
118
|
-
G1POINT_COUNT,
|
|
119
|
-
G2POINT_COUNT,
|
|
120
|
-
...data.setup_G1.map(strip0xPrefix),
|
|
121
|
-
...data.setup_G2.map(strip0xPrefix),
|
|
122
|
-
].join("\n");
|
|
123
|
-
}
|
|
1
|
+
import { DasContextJs } from "@crate-crypto/node-eth-kzg";
|
|
2
|
+
export const kzg = DasContextJs.create({ usePrecomp: true });
|
|
124
3
|
//# sourceMappingURL=kzg.js.map
|
package/lib/util/kzg.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kzg.js","sourceRoot":"","sources":["../../src/util/kzg.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"kzg.js","sourceRoot":"","sources":["../../src/util/kzg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAExD,MAAM,CAAC,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,EAAC,UAAU,EAAE,IAAI,EAAC,CAAC,CAAC"}
|
package/lib/util/metadata.d.ts
CHANGED
|
@@ -3,4 +3,8 @@ export declare function getLodestarClientVersion(info?: {
|
|
|
3
3
|
version?: string;
|
|
4
4
|
commit?: string;
|
|
5
5
|
}): ClientVersion;
|
|
6
|
+
/**
|
|
7
|
+
* Serializes a custody group count value into a Uint8Array suitable for the the ENR field `cgc`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function serializeCgc(cgc: number): Uint8Array;
|
|
6
10
|
//# sourceMappingURL=metadata.d.ts.map
|
package/lib/util/metadata.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { intToBytes } from "@lodestar/utils";
|
|
1
2
|
import { ClientCode } from "../execution/index.js";
|
|
2
3
|
export function getLodestarClientVersion(info) {
|
|
3
4
|
return {
|
|
@@ -7,4 +8,10 @@ export function getLodestarClientVersion(info) {
|
|
|
7
8
|
commit: info?.commit?.slice(0, 8) ?? "",
|
|
8
9
|
};
|
|
9
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Serializes a custody group count value into a Uint8Array suitable for the the ENR field `cgc`.
|
|
13
|
+
*/
|
|
14
|
+
export function serializeCgc(cgc) {
|
|
15
|
+
return intToBytes(cgc, Math.ceil(Math.log2(cgc + 1) / 8), "be");
|
|
16
|
+
}
|
|
10
17
|
//# sourceMappingURL=metadata.js.map
|
package/lib/util/metadata.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/util/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAgB,MAAM,uBAAuB,CAAC;AAEhE,MAAM,UAAU,wBAAwB,CAAC,IAA0C;IACjF,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,EAAE;QACnB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE;QAC5B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;KACxC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/util/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAC,UAAU,EAAgB,MAAM,uBAAuB,CAAC;AAEhE,MAAM,UAAU,wBAAwB,CAAC,IAA0C;IACjF,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,EAAE;QACnB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE;QAC5B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;KACxC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC"}
|
package/lib/util/sszBytes.d.ts
CHANGED
|
@@ -102,4 +102,5 @@ export declare function getCommitteeBitsFromSignedAggregateAndProofElectra(data:
|
|
|
102
102
|
export declare function getAttDataFromSignedAggregateAndProofPhase0(data: Uint8Array): AttDataBase64 | null;
|
|
103
103
|
export declare function getSlotFromSignedBeaconBlockSerialized(data: Uint8Array): Slot | null;
|
|
104
104
|
export declare function getSlotFromBlobSidecarSerialized(data: Uint8Array): Slot | null;
|
|
105
|
+
export declare function getSlotFromDataColumnSidecarSerialized(data: Uint8Array): Slot | null;
|
|
105
106
|
//# sourceMappingURL=sszBytes.d.ts.map
|