@lodestar/beacon-node 1.31.0-peerDAS.d70dab2e57 → 1.31.0-rc.1

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.
Files changed (204) hide show
  1. package/lib/api/impl/beacon/blocks/index.js +14 -40
  2. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  3. package/lib/chain/archiveStore/archiveStore.d.ts +1 -1
  4. package/lib/chain/archiveStore/archiveStore.js +2 -2
  5. package/lib/chain/archiveStore/interface.d.ts +1 -1
  6. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +1 -1
  7. package/lib/chain/archiveStore/utils/archiveBlocks.js +23 -88
  8. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  9. package/lib/chain/beaconProposerCache.d.ts +0 -1
  10. package/lib/chain/beaconProposerCache.js +0 -3
  11. package/lib/chain/beaconProposerCache.js.map +1 -1
  12. package/lib/chain/blocks/importBlock.js +15 -56
  13. package/lib/chain/blocks/importBlock.js.map +1 -1
  14. package/lib/chain/blocks/types.d.ts +24 -65
  15. package/lib/chain/blocks/types.js +6 -39
  16. package/lib/chain/blocks/types.js.map +1 -1
  17. package/lib/chain/blocks/verifyBlocksDataAvailability.js +10 -21
  18. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  19. package/lib/chain/blocks/writeBlockInputToDb.js +15 -89
  20. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  21. package/lib/chain/chain.d.ts +4 -12
  22. package/lib/chain/chain.js +2 -20
  23. package/lib/chain/chain.js.map +1 -1
  24. package/lib/chain/emitter.d.ts +2 -18
  25. package/lib/chain/emitter.js +0 -13
  26. package/lib/chain/emitter.js.map +1 -1
  27. package/lib/chain/errors/index.d.ts +0 -1
  28. package/lib/chain/errors/index.js +0 -1
  29. package/lib/chain/errors/index.js.map +1 -1
  30. package/lib/chain/interface.d.ts +3 -9
  31. package/lib/chain/interface.js.map +1 -1
  32. package/lib/chain/options.d.ts +1 -4
  33. package/lib/chain/options.js +0 -4
  34. package/lib/chain/options.js.map +1 -1
  35. package/lib/chain/produceBlock/produceBlockBody.d.ts +2 -4
  36. package/lib/chain/produceBlock/produceBlockBody.js +2 -11
  37. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  38. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +2 -3
  39. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +2 -31
  40. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
  41. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +18 -61
  42. package/lib/chain/seenCache/seenGossipBlockInput.js +53 -254
  43. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  44. package/lib/db/beacon.d.ts +1 -3
  45. package/lib/db/beacon.js +1 -3
  46. package/lib/db/beacon.js.map +1 -1
  47. package/lib/db/buckets.d.ts +1 -3
  48. package/lib/db/buckets.js +0 -2
  49. package/lib/db/buckets.js.map +1 -1
  50. package/lib/db/interface.d.ts +1 -3
  51. package/lib/db/repositories/index.d.ts +0 -2
  52. package/lib/db/repositories/index.js +0 -2
  53. package/lib/db/repositories/index.js.map +1 -1
  54. package/lib/execution/engine/http.d.ts +3 -5
  55. package/lib/execution/engine/http.js +31 -68
  56. package/lib/execution/engine/http.js.map +1 -1
  57. package/lib/execution/engine/interface.d.ts +2 -4
  58. package/lib/execution/engine/interface.js +1 -1
  59. package/lib/execution/engine/interface.js.map +1 -1
  60. package/lib/execution/engine/mock.d.ts +0 -1
  61. package/lib/execution/engine/mock.js +0 -5
  62. package/lib/execution/engine/mock.js.map +1 -1
  63. package/lib/execution/engine/types.d.ts +0 -10
  64. package/lib/execution/engine/types.js +0 -6
  65. package/lib/execution/engine/types.js.map +1 -1
  66. package/lib/metrics/metrics/beacon.d.ts +0 -8
  67. package/lib/metrics/metrics/beacon.js +0 -27
  68. package/lib/metrics/metrics/beacon.js.map +1 -1
  69. package/lib/network/core/metrics.d.ts +3 -10
  70. package/lib/network/core/metrics.js +4 -22
  71. package/lib/network/core/metrics.js.map +1 -1
  72. package/lib/network/core/networkCore.d.ts +0 -6
  73. package/lib/network/core/networkCore.js +8 -20
  74. package/lib/network/core/networkCore.js.map +1 -1
  75. package/lib/network/core/networkCoreWorker.js +0 -2
  76. package/lib/network/core/networkCoreWorker.js.map +1 -1
  77. package/lib/network/core/networkCoreWorkerHandler.d.ts +0 -2
  78. package/lib/network/core/networkCoreWorkerHandler.js +0 -7
  79. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  80. package/lib/network/core/types.d.ts +0 -4
  81. package/lib/network/events.d.ts +1 -3
  82. package/lib/network/events.js.map +1 -1
  83. package/lib/network/gossip/interface.d.ts +1 -8
  84. package/lib/network/gossip/interface.js +0 -1
  85. package/lib/network/gossip/interface.js.map +1 -1
  86. package/lib/network/gossip/topic.d.ts +1497 -1513
  87. package/lib/network/gossip/topic.js +1 -20
  88. package/lib/network/gossip/topic.js.map +1 -1
  89. package/lib/network/interface.d.ts +1 -13
  90. package/lib/network/metadata.d.ts +6 -10
  91. package/lib/network/metadata.js +4 -23
  92. package/lib/network/metadata.js.map +1 -1
  93. package/lib/network/network.d.ts +1 -12
  94. package/lib/network/network.js +4 -57
  95. package/lib/network/network.js.map +1 -1
  96. package/lib/network/options.js +0 -2
  97. package/lib/network/options.js.map +1 -1
  98. package/lib/network/peers/discover.d.ts +3 -16
  99. package/lib/network/peers/discover.js +13 -139
  100. package/lib/network/peers/discover.js.map +1 -1
  101. package/lib/network/peers/peerManager.d.ts +2 -10
  102. package/lib/network/peers/peerManager.js +10 -96
  103. package/lib/network/peers/peerManager.js.map +1 -1
  104. package/lib/network/peers/peersData.d.ts +2 -8
  105. package/lib/network/peers/peersData.js.map +1 -1
  106. package/lib/network/peers/score/interface.d.ts +1 -1
  107. package/lib/network/peers/score/score.d.ts +2 -2
  108. package/lib/network/peers/score/score.js +1 -4
  109. package/lib/network/peers/score/score.js.map +1 -1
  110. package/lib/network/peers/score/store.d.ts +1 -3
  111. package/lib/network/peers/score/store.js +2 -6
  112. package/lib/network/peers/score/store.js.map +1 -1
  113. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -15
  114. package/lib/network/peers/utils/prioritizePeers.js +5 -30
  115. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  116. package/lib/network/processor/extractSlotRootFns.js +1 -8
  117. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  118. package/lib/network/processor/gossipHandlers.js +8 -154
  119. package/lib/network/processor/gossipHandlers.js.map +1 -1
  120. package/lib/network/processor/gossipQueues/index.js +0 -5
  121. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  122. package/lib/network/processor/index.js +0 -1
  123. package/lib/network/processor/index.js.map +1 -1
  124. package/lib/network/reqresp/ReqRespBeaconNode.js +3 -21
  125. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  126. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +5 -14
  127. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +14 -199
  128. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
  129. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +5 -32
  130. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +26 -280
  131. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
  132. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +1 -1
  133. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  134. package/lib/network/reqresp/handlers/index.js +0 -10
  135. package/lib/network/reqresp/handlers/index.js.map +1 -1
  136. package/lib/network/reqresp/protocols.d.ts +0 -3
  137. package/lib/network/reqresp/protocols.js +0 -15
  138. package/lib/network/reqresp/protocols.js.map +1 -1
  139. package/lib/network/reqresp/rateLimit.js +1 -11
  140. package/lib/network/reqresp/rateLimit.js.map +1 -1
  141. package/lib/network/reqresp/types.d.ts +6 -13
  142. package/lib/network/reqresp/types.js +2 -9
  143. package/lib/network/reqresp/types.js.map +1 -1
  144. package/lib/network/subnets/interface.d.ts +0 -3
  145. package/lib/network/subnets/interface.js +1 -14
  146. package/lib/network/subnets/interface.js.map +1 -1
  147. package/lib/network/subnets/syncnetsService.js +5 -4
  148. package/lib/network/subnets/syncnetsService.js.map +1 -1
  149. package/lib/node/nodejs.js +2 -3
  150. package/lib/node/nodejs.js.map +1 -1
  151. package/lib/sync/interface.d.ts +2 -2
  152. package/lib/sync/interface.js +1 -1
  153. package/lib/sync/interface.js.map +1 -1
  154. package/lib/sync/range/batch.d.ts +2 -8
  155. package/lib/sync/range/batch.js +7 -19
  156. package/lib/sync/range/batch.js.map +1 -1
  157. package/lib/sync/range/chain.d.ts +2 -7
  158. package/lib/sync/range/chain.js +21 -45
  159. package/lib/sync/range/chain.js.map +1 -1
  160. package/lib/sync/range/range.js +3 -3
  161. package/lib/sync/range/range.js.map +1 -1
  162. package/lib/sync/range/utils/peerBalancer.d.ts +1 -4
  163. package/lib/sync/range/utils/peerBalancer.js +2 -20
  164. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  165. package/lib/sync/unknownBlock.d.ts +1 -8
  166. package/lib/sync/unknownBlock.js +62 -222
  167. package/lib/sync/unknownBlock.js.map +1 -1
  168. package/lib/util/blobs.d.ts +1 -13
  169. package/lib/util/blobs.js +1 -44
  170. package/lib/util/blobs.js.map +1 -1
  171. package/lib/util/kzg.d.ts +21 -9
  172. package/lib/util/kzg.js +88 -12
  173. package/lib/util/kzg.js.map +1 -1
  174. package/lib/util/metadata.d.ts +0 -4
  175. package/lib/util/metadata.js +0 -7
  176. package/lib/util/metadata.js.map +1 -1
  177. package/lib/util/sszBytes.d.ts +0 -1
  178. package/lib/util/sszBytes.js +0 -17
  179. package/lib/util/sszBytes.js.map +1 -1
  180. package/package.json +15 -15
  181. package/lib/chain/errors/dataColumnSidecarError.d.ts +0 -69
  182. package/lib/chain/errors/dataColumnSidecarError.js +0 -21
  183. package/lib/chain/errors/dataColumnSidecarError.js.map +0 -1
  184. package/lib/chain/validation/dataColumnSidecar.d.ts +0 -28
  185. package/lib/chain/validation/dataColumnSidecar.js +0 -245
  186. package/lib/chain/validation/dataColumnSidecar.js.map +0 -1
  187. package/lib/db/repositories/dataColumnSidecars.d.ts +0 -47
  188. package/lib/db/repositories/dataColumnSidecars.js +0 -40
  189. package/lib/db/repositories/dataColumnSidecars.js.map +0 -1
  190. package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +0 -15
  191. package/lib/db/repositories/dataColumnSidecarsArchive.js +0 -23
  192. package/lib/db/repositories/dataColumnSidecarsArchive.js.map +0 -1
  193. package/lib/network/networkConfig.d.ts +0 -23
  194. package/lib/network/networkConfig.js +0 -32
  195. package/lib/network/networkConfig.js.map +0 -1
  196. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +0 -8
  197. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +0 -106
  198. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +0 -1
  199. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +0 -6
  200. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +0 -57
  201. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +0 -1
  202. package/lib/util/dataColumns.d.ts +0 -111
  203. package/lib/util/dataColumns.js +0 -277
  204. package/lib/util/dataColumns.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"dataColumnSidecarsByRange.js","sourceRoot":"","sources":["../../../../src/network/reqresp/handlers/dataColumnSidecarsByRange.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import { ResponseOutgoing } from "@lodestar/reqresp";
2
- import { fulu } from "@lodestar/types";
3
- import { IBeaconChain } from "../../../chain/index.js";
4
- import { IBeaconDb } from "../../../db/index.js";
5
- export declare function onDataColumnSidecarsByRoot(requestBody: fulu.DataColumnSidecarsByRootRequest, chain: IBeaconChain, db: IBeaconDb): AsyncIterable<ResponseOutgoing>;
6
- //# sourceMappingURL=dataColumnSidecarsByRoot.d.ts.map
@@ -1,57 +0,0 @@
1
- import { NUMBER_OF_COLUMNS } from "@lodestar/params";
2
- import { RespStatus, ResponseError } from "@lodestar/reqresp";
3
- import { computeEpochAtSlot } from "@lodestar/state-transition";
4
- import { ssz } from "@lodestar/types";
5
- import { fromHex, toHex } from "@lodestar/utils";
6
- import { COLUMN_SIZE_IN_WRAPPER_INDEX, CUSTODY_COLUMNS_IN_IN_WRAPPER_INDEX, DATA_COLUMN_SIDECARS_IN_WRAPPER_INDEX, NUM_COLUMNS_IN_WRAPPER_INDEX, } from "../../../db/repositories/dataColumnSidecars.js";
7
- export async function* onDataColumnSidecarsByRoot(requestBody, chain, db) {
8
- // SPEC: minimum_request_epoch = max(finalized_epoch, current_epoch - MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS, FULU_FORK_EPOCH)
9
- const finalizedEpoch = chain.forkChoice.getFinalizedCheckpoint().epoch;
10
- const currentEpoch = chain.clock.currentEpoch;
11
- const minimumRequestEpoch = Math.max(finalizedEpoch, currentEpoch - chain.config.MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS, chain.config.FULU_FORK_EPOCH);
12
- for (const dataColumnsByRootIdentifier of requestBody) {
13
- const { blockRoot, columns } = dataColumnsByRootIdentifier;
14
- const blockRootHex = toHex(blockRoot);
15
- const block = chain.forkChoice.getBlockHex(blockRootHex);
16
- // NOTE: Only support non-finalized blocks.
17
- // SPEC: Clients MUST support requesting sidecars since minimum_request_epoch.
18
- // If any root in the request content references a block earlier than minimum_request_epoch, peers MAY respond with
19
- // error code 3: ResourceUnavailable or not include the data column sidecar in the response.
20
- // https://github.com/ethereum/consensus-specs/blob/1937aff86b41b5171a9bc3972515986f1bbbf303/specs/fulu/p2p-interface.md#datacolumnsidecarsbyroot-v1
21
- if (!block || computeEpochAtSlot(block.slot) < minimumRequestEpoch) {
22
- continue;
23
- }
24
- const dataColumnSidecarsBytesWrapped = await db.dataColumnSidecars.getBinary(fromHex(block.blockRoot));
25
- if (!dataColumnSidecarsBytesWrapped) {
26
- // Handle the same to onBeaconBlocksByRange
27
- throw new ResponseError(RespStatus.SERVER_ERROR, `No item for root ${block.blockRoot} slot ${block.slot}`);
28
- }
29
- const retrivedColumnsLen = ssz.Uint8.deserialize(dataColumnSidecarsBytesWrapped.slice(NUM_COLUMNS_IN_WRAPPER_INDEX, COLUMN_SIZE_IN_WRAPPER_INDEX));
30
- const retrievedColumnsSizeBytes = dataColumnSidecarsBytesWrapped.slice(COLUMN_SIZE_IN_WRAPPER_INDEX, CUSTODY_COLUMNS_IN_IN_WRAPPER_INDEX);
31
- const columnsSize = ssz.UintNum64.deserialize(retrievedColumnsSizeBytes);
32
- const dataColumnSidecarsBytes = dataColumnSidecarsBytesWrapped.slice(DATA_COLUMN_SIDECARS_IN_WRAPPER_INDEX + 4 * retrivedColumnsLen);
33
- const dataColumnsIndex = dataColumnSidecarsBytesWrapped.slice(CUSTODY_COLUMNS_IN_IN_WRAPPER_INDEX, CUSTODY_COLUMNS_IN_IN_WRAPPER_INDEX + NUMBER_OF_COLUMNS);
34
- // const storedColumns = Array.from({length: NUMBER_OF_COLUMNS}, (_v, i) => i).filter(
35
- // (i) => dataColumnsIndex[i] > 0
36
- // );
37
- // const columnsLen = dataColumnSidecarsBytes.length / columnsSize;
38
- // console.log(
39
- // `onDataColumnSidecarsByRoot: slot=${block.slot} columnsSize=${columnsSize} storedColumnsLen=${columnsLen} retrivedColumnsLen=${retrivedColumnsLen} dataColumnSidecarsBytesWrapped=${dataColumnSidecarsBytesWrapped.length} storedColumns=${storedColumns.join(" ")}`
40
- // );
41
- for (const index of columns) {
42
- const dataIndex = (dataColumnsIndex[index] ?? 0) - 1;
43
- if (dataIndex < 0) {
44
- throw new ResponseError(RespStatus.SERVER_ERROR, `dataColumnSidecar index=${index} not custodied`);
45
- }
46
- const dataColumnSidecarBytes = dataColumnSidecarsBytes.slice(dataIndex * columnsSize, (dataIndex + 1) * columnsSize);
47
- if (dataColumnSidecarBytes.length !== columnsSize) {
48
- throw Error(`Inconsistent state, dataColumnSidecar blockRoot=${blockRootHex} index=${index} dataColumnSidecarBytes=${dataColumnSidecarBytes.length} expected=${columnsSize}`);
49
- }
50
- yield {
51
- data: dataColumnSidecarBytes,
52
- fork: chain.config.getForkName(block.slot),
53
- };
54
- }
55
- }
56
- }
57
- //# sourceMappingURL=dataColumnSidecarsByRoot.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dataColumnSidecarsByRoot.js","sourceRoot":"","sources":["../../../../src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts"],"names":[],"mappings":"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"}
@@ -1,111 +0,0 @@
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 { NodeId } from "../network/subnets/index.js";
9
- export declare class CustodyConfig {
10
- /**
11
- * The number of custody groups the node should subscribe to
12
- */
13
- targetCustodyGroupCount: number;
14
- /**
15
- * The custody columns the node should subscribe to
16
- */
17
- custodyColumns: ColumnIndex[];
18
- /**
19
- * Custody columns map which column maps to which index in the array of columns custodied
20
- * with zero representing it is not custodied
21
- */
22
- custodyColumnsIndex: Uint8Array;
23
- /**
24
- * The number of custody groups the node will advertise to the network
25
- */
26
- advertisedCustodyGroupCount: number;
27
- /**
28
- * The number of custody groups the node will sample
29
- */
30
- sampledGroupCount: number;
31
- /**
32
- * Custody groups sampled by the node as part of custody sampling
33
- */
34
- sampleGroups: CustodyIndex[];
35
- /**
36
- * Data columns sampled by the node as part of custody sampling
37
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#custody-sampling
38
- *
39
- * TODO: Consider race conditions if this updates during sync/backfill
40
- */
41
- sampledColumns: ColumnIndex[];
42
- /**
43
- * Subnets sampled by the node as part of custody sampling
44
- */
45
- sampledSubnets: number[];
46
- private config;
47
- private nodeId;
48
- constructor(nodeId: NodeId, config: ChainForkConfig);
49
- updateTargetCustodyGroupCount(targetCustodyGroupCount: number): void;
50
- updateAdvertisedCustodyGroupCount(advertisedCustodyGroupCount: number): void;
51
- private getCustodyColumnsIndex;
52
- }
53
- /**
54
- * Calculate the number of custody groups the node should subscribe to based on the node's effective balance
55
- *
56
- * SPEC FUNCTION
57
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#validator-custody
58
- */
59
- export declare function getValidatorsCustodyRequirement(state: CachedBeaconStateAllForks, validatorIndices: ValidatorIndex[], config: ChainForkConfig): number;
60
- /**
61
- * Converts a custody group to an array of column indices. Should be 1-1 as long there are 128
62
- * columns and 128 custody groups.
63
- *
64
- * SPEC FUNCTION
65
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_columns_for_custody_group
66
- */
67
- export declare function computeColumnsForCustodyGroup(custodyIndex: CustodyIndex): ColumnIndex[];
68
- /**
69
- * Converts nodeId and a the number of custody groups to an array of custody indices. Indexes must be
70
- * further converted to column indices
71
- *
72
- * SPEC FUNCTION
73
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#get_custody_groups
74
- */
75
- export declare function getCustodyGroups(nodeId: NodeId, custodyGroupCount: number): CustodyIndex[];
76
- export declare function getDataColumns(nodeId: NodeId, custodyGroupCount: number): ColumnIndex[];
77
- /**
78
- * Computes the cells for each blob and combines them with cell proofs.
79
- * Similar to the computeMatrix function described below.
80
- *
81
- * SPEC FUNCTION (note: spec currently computes proofs, but we already have them)
82
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_matrix
83
- */
84
- export declare function getCellsAndProofs(blobBundles: fulu.BlobAndProofV2[]): [Uint8Array[], Uint8Array[]][];
85
- /**
86
- * Given a signed block header and the commitments, inclusion proof, cells/proofs associated with
87
- * each blob in the block, assemble the sidecars which can be distributed to peers.
88
- *
89
- * SPEC FUNCTION
90
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars
91
- */
92
- export declare function getDataColumnSidecars(signedBlockHeader: SignedBeaconBlockHeader, kzgCommitments: deneb.KZGCommitment[], kzgCommitmentsInclusionProof: fulu.KzgCommitmentsInclusionProof, cellsAndKzgProofs: [Uint8Array[], Uint8Array[]][]): fulu.DataColumnSidecars;
93
- /**
94
- * Given a signed block and the cells/proofs associated with each blob in the
95
- * block, assemble the sidecars which can be distributed to peers.
96
- *
97
- * SPEC FUNCTION
98
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_block
99
- */
100
- export declare function getDataColumnSidecarsFromBlock(config: ChainForkConfig, signedBlock: fulu.SignedBeaconBlock, cellsAndKzgProofs: [Uint8Array[], Uint8Array[]][]): fulu.DataColumnSidecars;
101
- /**
102
- * Given a DataColumnSidecar and the cells/proofs associated with each blob corresponding
103
- * to the commitments it contains, assemble all sidecars for distribution to peers.
104
- *
105
- * SPEC FUNCTION
106
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_column_sidecar
107
- */
108
- export declare function getDataColumnSidecarsFromColumnSidecar(sidecar: fulu.DataColumnSidecar, cellsAndKzgProofs: [Uint8Array[], Uint8Array[]][]): fulu.DataColumnSidecars;
109
- export declare function hasSampledDataColumns(custodyConfig: CustodyConfig, dataColumnCache: DataColumnsCacheMap): boolean;
110
- export declare function getDataColumnsFromExecution(config: ChainForkConfig, custodyConfig: CustodyConfig, executionEngine: IExecutionEngine, emitter: ChainEventEmitter, blockCache: BlockInputCacheType): Promise<boolean>;
111
- //# sourceMappingURL=dataColumns.d.ts.map
@@ -1,277 +0,0 @@
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 { ckzg } from "./kzg.js";
10
- export class CustodyConfig {
11
- constructor(nodeId, config) {
12
- this.config = config;
13
- this.nodeId = nodeId;
14
- this.targetCustodyGroupCount = Math.max(config.CUSTODY_REQUIREMENT, config.NODE_CUSTODY_REQUIREMENT);
15
- this.custodyColumns = getDataColumns(this.nodeId, this.targetCustodyGroupCount);
16
- this.custodyColumnsIndex = this.getCustodyColumnsIndex(this.custodyColumns);
17
- this.advertisedCustodyGroupCount = this.targetCustodyGroupCount;
18
- this.sampledGroupCount = Math.max(this.targetCustodyGroupCount, this.config.SAMPLES_PER_SLOT);
19
- this.sampleGroups = getCustodyGroups(this.nodeId, this.sampledGroupCount);
20
- this.sampledColumns = getDataColumns(this.nodeId, this.sampledGroupCount);
21
- this.sampledSubnets = this.sampledColumns.map(computeSubnetForDataColumn);
22
- }
23
- updateTargetCustodyGroupCount(targetCustodyGroupCount) {
24
- this.targetCustodyGroupCount = targetCustodyGroupCount;
25
- this.custodyColumns = getDataColumns(this.nodeId, this.targetCustodyGroupCount);
26
- this.custodyColumnsIndex = this.getCustodyColumnsIndex(this.custodyColumns);
27
- // TODO: Porting this over to match current behavior, but I think this incorrectly mixes units:
28
- // SAMPLES_PER_SLOT is in columns, and CUSTODY_GROUP_COUNT is in groups
29
- this.sampledGroupCount = Math.max(this.targetCustodyGroupCount, this.config.SAMPLES_PER_SLOT);
30
- this.sampleGroups = getCustodyGroups(this.nodeId, this.sampledGroupCount);
31
- this.sampledColumns = getDataColumns(this.nodeId, this.sampledGroupCount);
32
- this.sampledSubnets = this.sampledColumns.map(computeSubnetForDataColumn);
33
- }
34
- updateAdvertisedCustodyGroupCount(advertisedCustodyGroupCount) {
35
- this.advertisedCustodyGroupCount = advertisedCustodyGroupCount;
36
- }
37
- getCustodyColumnsIndex(custodyColumns) {
38
- // custody columns map which column maps to which index in the array of columns custodied
39
- // with zero representing it is not custodied
40
- const custodyColumnsIndex = new Uint8Array(NUMBER_OF_COLUMNS);
41
- let custodyAtIndex = 1;
42
- for (const columnIndex of custodyColumns) {
43
- custodyColumnsIndex[columnIndex] = custodyAtIndex;
44
- custodyAtIndex++;
45
- }
46
- return custodyColumnsIndex;
47
- }
48
- }
49
- function computeSubnetForDataColumn(columnIndex) {
50
- return columnIndex % DATA_COLUMN_SIDECAR_SUBNET_COUNT;
51
- }
52
- /**
53
- * Calculate the number of custody groups the node should subscribe to based on the node's effective balance
54
- *
55
- * SPEC FUNCTION
56
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#validator-custody
57
- */
58
- export function getValidatorsCustodyRequirement(state, validatorIndices, config) {
59
- if (validatorIndices.length === 0) {
60
- return config.CUSTODY_REQUIREMENT;
61
- }
62
- const totalNodeEffectiveBalance = validatorIndices.reduce((total, validatorIndex) => {
63
- return total + state.epochCtx.effectiveBalanceIncrements[validatorIndex] * EFFECTIVE_BALANCE_INCREMENT;
64
- }, 0);
65
- // Must custody one group for every BALANCE_PER_ADDITIONAL_CUSTODY_GROUP of effective balance
66
- let validatorsCustodyRequirement = Math.floor(totalNodeEffectiveBalance / config.BALANCE_PER_ADDITIONAL_CUSTODY_GROUP);
67
- // Any node with at least 1 validator must custody at least VALIDATOR_CUSTODY_REQUIREMENT
68
- validatorsCustodyRequirement = Math.max(validatorsCustodyRequirement, config.VALIDATOR_CUSTODY_REQUIREMENT);
69
- // Cannot custody more than NUMBER_OF_CUSTODY_GROUPS
70
- validatorsCustodyRequirement = Math.min(validatorsCustodyRequirement, NUMBER_OF_CUSTODY_GROUPS);
71
- // Validators custody requirement must be at least configured node custody requirement
72
- return Math.max(validatorsCustodyRequirement, config.NODE_CUSTODY_REQUIREMENT);
73
- }
74
- /**
75
- * Converts a custody group to an array of column indices. Should be 1-1 as long there are 128
76
- * columns and 128 custody groups.
77
- *
78
- * SPEC FUNCTION
79
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_columns_for_custody_group
80
- */
81
- export function computeColumnsForCustodyGroup(custodyIndex) {
82
- if (custodyIndex > NUMBER_OF_CUSTODY_GROUPS) {
83
- custodyIndex = NUMBER_OF_CUSTODY_GROUPS;
84
- }
85
- const columnsPerCustodyGroup = Number(NUMBER_OF_COLUMNS / NUMBER_OF_CUSTODY_GROUPS);
86
- const columnIndexes = [];
87
- for (let i = 0; i < columnsPerCustodyGroup; i++) {
88
- columnIndexes.push(NUMBER_OF_CUSTODY_GROUPS * i + custodyIndex);
89
- }
90
- columnIndexes.sort((a, b) => a - b);
91
- return columnIndexes;
92
- }
93
- /**
94
- * Converts nodeId and a the number of custody groups to an array of custody indices. Indexes must be
95
- * further converted to column indices
96
- *
97
- * SPEC FUNCTION
98
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#get_custody_groups
99
- */
100
- export function getCustodyGroups(nodeId, custodyGroupCount) {
101
- if (custodyGroupCount > NUMBER_OF_CUSTODY_GROUPS) {
102
- custodyGroupCount = NUMBER_OF_CUSTODY_GROUPS;
103
- }
104
- const custodyGroups = [];
105
- // nodeId is in bigendian and all computes are in little endian
106
- let currentId = bytesToBigInt(nodeId, "be");
107
- while (custodyGroups.length < custodyGroupCount) {
108
- // could be optimized
109
- const currentIdBytes = ssz.UintBn256.serialize(currentId);
110
- const custodyGroup = Number(ssz.UintBn64.deserialize(digest(currentIdBytes).slice(0, 8)) % BigInt(NUMBER_OF_CUSTODY_GROUPS));
111
- if (!custodyGroups.includes(custodyGroup)) {
112
- custodyGroups.push(custodyGroup);
113
- }
114
- const willOverflow = currentIdBytes.reduce((acc, elem) => acc && elem === 0xff, true);
115
- if (willOverflow) {
116
- currentId = BigInt(0);
117
- }
118
- else {
119
- currentId++;
120
- }
121
- }
122
- custodyGroups.sort((a, b) => a - b);
123
- return custodyGroups;
124
- }
125
- export function getDataColumns(nodeId, custodyGroupCount) {
126
- return getCustodyGroups(nodeId, custodyGroupCount)
127
- .flatMap(computeColumnsForCustodyGroup)
128
- .sort((a, b) => a - b);
129
- }
130
- /**
131
- * Computes the cells for each blob and combines them with cell proofs.
132
- * Similar to the computeMatrix function described below.
133
- *
134
- * SPEC FUNCTION (note: spec currently computes proofs, but we already have them)
135
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_matrix
136
- */
137
- export function getCellsAndProofs(blobBundles) {
138
- return blobBundles.map(({ blob, proofs: cellProofs }) => {
139
- const cells = ckzg.computeCells(blob);
140
- return [cells, cellProofs];
141
- });
142
- }
143
- /**
144
- * Given a signed block header and the commitments, inclusion proof, cells/proofs associated with
145
- * each blob in the block, assemble the sidecars which can be distributed to peers.
146
- *
147
- * SPEC FUNCTION
148
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars
149
- */
150
- export function getDataColumnSidecars(signedBlockHeader, kzgCommitments, kzgCommitmentsInclusionProof, cellsAndKzgProofs) {
151
- if (cellsAndKzgProofs.length !== kzgCommitments.length) {
152
- throw Error("Invalid cellsAndKzgProofs length for getDataColumnSidecars");
153
- }
154
- const sidecars = [];
155
- for (let columnIndex = 0; columnIndex < NUMBER_OF_COLUMNS; columnIndex++) {
156
- const columnCells = [];
157
- const columnProofs = [];
158
- for (const [cells, proofs] of cellsAndKzgProofs) {
159
- columnCells.push(cells[columnIndex]);
160
- columnProofs.push(proofs[columnIndex]);
161
- }
162
- sidecars.push({
163
- index: columnIndex,
164
- column: columnCells,
165
- kzgCommitments,
166
- kzgProofs: columnProofs,
167
- signedBlockHeader,
168
- kzgCommitmentsInclusionProof,
169
- });
170
- }
171
- return sidecars;
172
- }
173
- /**
174
- * Given a signed block and the cells/proofs associated with each blob in the
175
- * block, assemble the sidecars which can be distributed to peers.
176
- *
177
- * SPEC FUNCTION
178
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_block
179
- */
180
- export function getDataColumnSidecarsFromBlock(config, signedBlock, cellsAndKzgProofs) {
181
- const blobKzgCommitments = signedBlock.message.body.blobKzgCommitments;
182
- const fork = config.getForkName(signedBlock.message.slot);
183
- const signedBlockHeader = signedBlockToSignedHeader(config, signedBlock);
184
- const kzgCommitmentsInclusionProof = computeKzgCommitmentsInclusionProof(fork, signedBlock.message.body);
185
- return getDataColumnSidecars(signedBlockHeader, blobKzgCommitments, kzgCommitmentsInclusionProof, cellsAndKzgProofs);
186
- }
187
- /**
188
- * Given a DataColumnSidecar and the cells/proofs associated with each blob corresponding
189
- * to the commitments it contains, assemble all sidecars for distribution to peers.
190
- *
191
- * SPEC FUNCTION
192
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_column_sidecar
193
- */
194
- export function getDataColumnSidecarsFromColumnSidecar(sidecar, cellsAndKzgProofs) {
195
- return getDataColumnSidecars(sidecar.signedBlockHeader, sidecar.kzgCommitments, sidecar.kzgCommitmentsInclusionProof, cellsAndKzgProofs);
196
- }
197
- export function hasSampledDataColumns(custodyConfig, dataColumnCache) {
198
- return (dataColumnCache.size >= custodyConfig.sampledColumns.length &&
199
- custodyConfig.sampledColumns.reduce((acc, columnIndex) => acc && dataColumnCache.has(columnIndex), true));
200
- }
201
- export async function getDataColumnsFromExecution(config, custodyConfig, executionEngine, emitter, blockCache) {
202
- if (blockCache.fork !== ForkName.fulu) {
203
- return false;
204
- }
205
- if (!blockCache.cachedData) {
206
- // this condition should never get hit... just a sanity check
207
- throw new Error("invalid blockCache");
208
- }
209
- if (blockCache.cachedData.fork !== ForkName.fulu) {
210
- return false;
211
- }
212
- // If already have all columns, exit
213
- if (hasSampledDataColumns(custodyConfig, blockCache.cachedData.dataColumnsCache)) {
214
- return true;
215
- }
216
- let commitments;
217
- if (blockCache.block) {
218
- const block = blockCache.block;
219
- commitments = block.message.body.blobKzgCommitments;
220
- }
221
- else {
222
- const firstSidecar = blockCache.cachedData.dataColumnsCache.values().next().value;
223
- commitments = firstSidecar?.dataColumn.kzgCommitments;
224
- }
225
- if (!commitments) {
226
- throw new Error("blockInputCache missing both block and cachedData");
227
- }
228
- // Return if block has no blobs
229
- if (commitments.length === 0) {
230
- return true;
231
- }
232
- // Process KZG commitments into versioned hashes
233
- const versionedHashes = commitments.map(kzgCommitmentToVersionedHash);
234
- // Get blobs from execution engine
235
- const blobs = await executionEngine.getBlobs(blockCache.fork, versionedHashes);
236
- // Execution engine was unable to find one or more blobs
237
- if (blobs === null) {
238
- return false;
239
- }
240
- // Return if we received all data columns while waiting for getBlobs
241
- if (hasSampledDataColumns(custodyConfig, blockCache.cachedData.dataColumnsCache)) {
242
- return true;
243
- }
244
- let dataColumnSidecars;
245
- const cellsAndProofs = getCellsAndProofs(blobs);
246
- if (blockCache.block) {
247
- dataColumnSidecars = getDataColumnSidecarsFromBlock(config, blockCache.block, cellsAndProofs);
248
- }
249
- else {
250
- const firstSidecar = blockCache.cachedData.dataColumnsCache.values().next().value;
251
- if (!firstSidecar) {
252
- throw new Error("blockInputCache missing both block and data column sidecar");
253
- }
254
- dataColumnSidecars = getDataColumnSidecarsFromColumnSidecar(firstSidecar.dataColumn, cellsAndProofs);
255
- }
256
- // Publish columns if and only if subscribed to them
257
- const sampledColumns = custodyConfig.sampledColumns.map((columnIndex) => dataColumnSidecars[columnIndex]);
258
- emitter.emit(ChainEvent.publishDataColumns, sampledColumns);
259
- for (const column of sampledColumns) {
260
- blockCache.cachedData.dataColumnsCache.set(column.index, { dataColumn: column, dataColumnBytes: null });
261
- }
262
- const allDataColumns = getBlockInputDataColumns(blockCache.cachedData.dataColumnsCache, custodyConfig.sampledColumns);
263
- // TODO: Add metrics
264
- // metrics?.syncUnknownBlock.resolveAvailabilitySource.inc({source: BlockInputAvailabilitySource.GOSSIP});
265
- const blockData = {
266
- fork: blockCache.cachedData.fork,
267
- ...allDataColumns,
268
- dataColumnsSource: DataColumnsSource.gossip,
269
- };
270
- blockCache.cachedData.resolveAvailability(blockData);
271
- if (blockCache.block !== undefined) {
272
- const blockInput = getBlockInput.availableData(config, blockCache.block, BlockSource.gossip, blockData);
273
- blockCache.resolveBlockInput(blockInput);
274
- }
275
- return true;
276
- }
277
- //# sourceMappingURL=dataColumns.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dataColumns.js","sourceRoot":"","sources":["../../src/util/dataColumns.ts"],"names":[],"mappings":"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"}