@lodestar/beacon-node 1.33.0-peerDAS.e03bda542e → 1.33.0-rc.0

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 (233) hide show
  1. package/lib/api/impl/beacon/blocks/index.js +26 -66
  2. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  3. package/lib/api/impl/debug/index.d.ts +1 -1
  4. package/lib/api/impl/debug/index.js +1 -24
  5. package/lib/api/impl/debug/index.js.map +1 -1
  6. package/lib/chain/archiveStore/archiveStore.d.ts +1 -1
  7. package/lib/chain/archiveStore/archiveStore.js +2 -2
  8. package/lib/chain/archiveStore/interface.d.ts +1 -1
  9. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +1 -1
  10. package/lib/chain/archiveStore/utils/archiveBlocks.js +23 -88
  11. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  12. package/lib/chain/beaconProposerCache.d.ts +0 -1
  13. package/lib/chain/beaconProposerCache.js +0 -3
  14. package/lib/chain/beaconProposerCache.js.map +1 -1
  15. package/lib/chain/blocks/importBlock.js +3 -8
  16. package/lib/chain/blocks/importBlock.js.map +1 -1
  17. package/lib/chain/blocks/types.d.ts +24 -67
  18. package/lib/chain/blocks/types.js +6 -40
  19. package/lib/chain/blocks/types.js.map +1 -1
  20. package/lib/chain/blocks/verifyBlocksDataAvailability.js +10 -21
  21. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  22. package/lib/chain/blocks/writeBlockInputToDb.js +15 -89
  23. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  24. package/lib/chain/chain.d.ts +5 -16
  25. package/lib/chain/chain.js +6 -34
  26. package/lib/chain/chain.js.map +1 -1
  27. package/lib/chain/emitter.d.ts +2 -18
  28. package/lib/chain/emitter.js +0 -13
  29. package/lib/chain/emitter.js.map +1 -1
  30. package/lib/chain/errors/index.d.ts +0 -1
  31. package/lib/chain/errors/index.js +0 -1
  32. package/lib/chain/errors/index.js.map +1 -1
  33. package/lib/chain/interface.d.ts +4 -10
  34. package/lib/chain/interface.js.map +1 -1
  35. package/lib/chain/options.d.ts +1 -4
  36. package/lib/chain/options.js +1 -5
  37. package/lib/chain/options.js.map +1 -1
  38. package/lib/chain/prepareNextSlot.js +1 -1
  39. package/lib/chain/prepareNextSlot.js.map +1 -1
  40. package/lib/chain/produceBlock/produceBlockBody.d.ts +2 -4
  41. package/lib/chain/produceBlock/produceBlockBody.js +2 -7
  42. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  43. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +2 -3
  44. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +2 -25
  45. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
  46. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +18 -64
  47. package/lib/chain/seenCache/seenGossipBlockInput.js +53 -321
  48. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  49. package/lib/constants/network.d.ts +1 -0
  50. package/lib/constants/network.js +2 -0
  51. package/lib/constants/network.js.map +1 -1
  52. package/lib/db/beacon.d.ts +1 -3
  53. package/lib/db/beacon.js +1 -3
  54. package/lib/db/beacon.js.map +1 -1
  55. package/lib/db/buckets.d.ts +1 -3
  56. package/lib/db/buckets.js +0 -2
  57. package/lib/db/buckets.js.map +1 -1
  58. package/lib/db/interface.d.ts +1 -3
  59. package/lib/db/repositories/index.d.ts +0 -2
  60. package/lib/db/repositories/index.js +0 -2
  61. package/lib/db/repositories/index.js.map +1 -1
  62. package/lib/execution/engine/http.d.ts +3 -5
  63. package/lib/execution/engine/http.js +31 -70
  64. package/lib/execution/engine/http.js.map +1 -1
  65. package/lib/execution/engine/interface.d.ts +2 -4
  66. package/lib/execution/engine/interface.js +1 -1
  67. package/lib/execution/engine/interface.js.map +1 -1
  68. package/lib/execution/engine/mock.d.ts +0 -1
  69. package/lib/execution/engine/mock.js +0 -5
  70. package/lib/execution/engine/mock.js.map +1 -1
  71. package/lib/execution/engine/types.d.ts +0 -10
  72. package/lib/execution/engine/types.js +0 -6
  73. package/lib/execution/engine/types.js.map +1 -1
  74. package/lib/metrics/metrics/beacon.d.ts +1 -15
  75. package/lib/metrics/metrics/beacon.js +1 -58
  76. package/lib/metrics/metrics/beacon.js.map +1 -1
  77. package/lib/metrics/metrics/lodestar.d.ts +1 -23
  78. package/lib/metrics/metrics/lodestar.js +0 -39
  79. package/lib/metrics/metrics/lodestar.js.map +1 -1
  80. package/lib/network/core/metrics.d.ts +3 -10
  81. package/lib/network/core/metrics.js +4 -22
  82. package/lib/network/core/metrics.js.map +1 -1
  83. package/lib/network/core/networkCore.d.ts +3 -8
  84. package/lib/network/core/networkCore.js +10 -24
  85. package/lib/network/core/networkCore.js.map +1 -1
  86. package/lib/network/core/networkCoreWorker.js +0 -1
  87. package/lib/network/core/networkCoreWorker.js.map +1 -1
  88. package/lib/network/core/networkCoreWorkerHandler.d.ts +3 -4
  89. package/lib/network/core/networkCoreWorkerHandler.js +0 -4
  90. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  91. package/lib/network/core/types.d.ts +4 -6
  92. package/lib/network/events.d.ts +2 -4
  93. package/lib/network/events.js.map +1 -1
  94. package/lib/network/gossip/interface.d.ts +1 -8
  95. package/lib/network/gossip/interface.js +0 -1
  96. package/lib/network/gossip/interface.js.map +1 -1
  97. package/lib/network/gossip/topic.d.ts +1497 -1513
  98. package/lib/network/gossip/topic.js +1 -20
  99. package/lib/network/gossip/topic.js.map +1 -1
  100. package/lib/network/interface.d.ts +1 -13
  101. package/lib/network/metadata.d.ts +5 -9
  102. package/lib/network/metadata.js +5 -25
  103. package/lib/network/metadata.js.map +1 -1
  104. package/lib/network/network.d.ts +2 -12
  105. package/lib/network/network.js +8 -59
  106. package/lib/network/network.js.map +1 -1
  107. package/lib/network/options.js +0 -5
  108. package/lib/network/options.js.map +1 -1
  109. package/lib/network/peers/discover.d.ts +5 -9
  110. package/lib/network/peers/discover.js +23 -108
  111. package/lib/network/peers/discover.js.map +1 -1
  112. package/lib/network/peers/peerManager.d.ts +4 -10
  113. package/lib/network/peers/peerManager.js +46 -101
  114. package/lib/network/peers/peerManager.js.map +1 -1
  115. package/lib/network/peers/peersData.d.ts +3 -17
  116. package/lib/network/peers/peersData.js.map +1 -1
  117. package/lib/network/peers/score/constants.d.ts +3 -1
  118. package/lib/network/peers/score/constants.js +3 -1
  119. package/lib/network/peers/score/constants.js.map +1 -1
  120. package/lib/network/peers/score/interface.d.ts +6 -1
  121. package/lib/network/peers/score/interface.js.map +1 -1
  122. package/lib/network/peers/score/score.d.ts +7 -2
  123. package/lib/network/peers/score/score.js +35 -5
  124. package/lib/network/peers/score/score.js.map +1 -1
  125. package/lib/network/peers/score/store.d.ts +10 -3
  126. package/lib/network/peers/score/store.js +15 -6
  127. package/lib/network/peers/score/store.js.map +1 -1
  128. package/lib/network/peers/utils/assertPeerRelevance.d.ts +3 -7
  129. package/lib/network/peers/utils/assertPeerRelevance.js +1 -10
  130. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  131. package/lib/network/peers/utils/prioritizePeers.d.ts +7 -18
  132. package/lib/network/peers/utils/prioritizePeers.js +7 -43
  133. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  134. package/lib/network/processor/extractSlotRootFns.js +1 -8
  135. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  136. package/lib/network/processor/gossipHandlers.js +9 -156
  137. package/lib/network/processor/gossipHandlers.js.map +1 -1
  138. package/lib/network/processor/gossipQueues/index.js +0 -5
  139. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  140. package/lib/network/processor/index.js +0 -1
  141. package/lib/network/processor/index.js.map +1 -1
  142. package/lib/network/reqresp/ReqRespBeaconNode.d.ts +2 -2
  143. package/lib/network/reqresp/ReqRespBeaconNode.js +10 -33
  144. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  145. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +5 -16
  146. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +14 -204
  147. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
  148. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +6 -32
  149. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +28 -283
  150. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
  151. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +1 -1
  152. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  153. package/lib/network/reqresp/handlers/index.js +0 -10
  154. package/lib/network/reqresp/handlers/index.js.map +1 -1
  155. package/lib/network/reqresp/handlers/status.js +2 -3
  156. package/lib/network/reqresp/handlers/status.js.map +1 -1
  157. package/lib/network/reqresp/protocols.d.ts +0 -4
  158. package/lib/network/reqresp/protocols.js +0 -20
  159. package/lib/network/reqresp/protocols.js.map +1 -1
  160. package/lib/network/reqresp/rateLimit.js +1 -11
  161. package/lib/network/reqresp/rateLimit.js.map +1 -1
  162. package/lib/network/reqresp/types.d.ts +8 -15
  163. package/lib/network/reqresp/types.js +3 -10
  164. package/lib/network/reqresp/types.js.map +1 -1
  165. package/lib/network/statusCache.d.ts +5 -5
  166. package/lib/network/statusCache.js.map +1 -1
  167. package/lib/network/subnets/interface.d.ts +0 -3
  168. package/lib/network/subnets/interface.js +1 -14
  169. package/lib/network/subnets/interface.js.map +1 -1
  170. package/lib/network/subnets/syncnetsService.js +5 -4
  171. package/lib/network/subnets/syncnetsService.js.map +1 -1
  172. package/lib/node/nodejs.js +0 -1
  173. package/lib/node/nodejs.js.map +1 -1
  174. package/lib/sync/constants.d.ts +1 -1
  175. package/lib/sync/constants.js +1 -4
  176. package/lib/sync/constants.js.map +1 -1
  177. package/lib/sync/interface.d.ts +2 -2
  178. package/lib/sync/interface.js +1 -1
  179. package/lib/sync/interface.js.map +1 -1
  180. package/lib/sync/range/batch.d.ts +2 -16
  181. package/lib/sync/range/batch.js +7 -38
  182. package/lib/sync/range/batch.js.map +1 -1
  183. package/lib/sync/range/chain.d.ts +1 -16
  184. package/lib/sync/range/chain.js +30 -110
  185. package/lib/sync/range/chain.js.map +1 -1
  186. package/lib/sync/range/range.d.ts +2 -3
  187. package/lib/sync/range/range.js +3 -9
  188. package/lib/sync/range/range.js.map +1 -1
  189. package/lib/sync/range/utils/chainTarget.d.ts +1 -5
  190. package/lib/sync/range/utils/chainTarget.js +1 -26
  191. package/lib/sync/range/utils/chainTarget.js.map +1 -1
  192. package/lib/sync/range/utils/peerBalancer.d.ts +5 -12
  193. package/lib/sync/range/utils/peerBalancer.js +10 -69
  194. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  195. package/lib/sync/unknownBlock.d.ts +1 -8
  196. package/lib/sync/unknownBlock.js +69 -226
  197. package/lib/sync/unknownBlock.js.map +1 -1
  198. package/lib/sync/utils/remoteSyncType.d.ts +4 -4
  199. package/lib/sync/utils/remoteSyncType.js.map +1 -1
  200. package/lib/util/blobs.d.ts +1 -18
  201. package/lib/util/blobs.js +1 -104
  202. package/lib/util/blobs.js.map +1 -1
  203. package/lib/util/metadata.d.ts +0 -4
  204. package/lib/util/metadata.js +0 -7
  205. package/lib/util/metadata.js.map +1 -1
  206. package/lib/util/sszBytes.d.ts +0 -1
  207. package/lib/util/sszBytes.js +0 -17
  208. package/lib/util/sszBytes.js.map +1 -1
  209. package/package.json +14 -14
  210. package/lib/chain/errors/dataColumnSidecarError.d.ts +0 -69
  211. package/lib/chain/errors/dataColumnSidecarError.js +0 -21
  212. package/lib/chain/errors/dataColumnSidecarError.js.map +0 -1
  213. package/lib/chain/validation/dataColumnSidecar.d.ts +0 -28
  214. package/lib/chain/validation/dataColumnSidecar.js +0 -248
  215. package/lib/chain/validation/dataColumnSidecar.js.map +0 -1
  216. package/lib/db/repositories/dataColumnSidecars.d.ts +0 -47
  217. package/lib/db/repositories/dataColumnSidecars.js +0 -40
  218. package/lib/db/repositories/dataColumnSidecars.js.map +0 -1
  219. package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +0 -15
  220. package/lib/db/repositories/dataColumnSidecarsArchive.js +0 -23
  221. package/lib/db/repositories/dataColumnSidecarsArchive.js.map +0 -1
  222. package/lib/network/networkConfig.d.ts +0 -22
  223. package/lib/network/networkConfig.js +0 -29
  224. package/lib/network/networkConfig.js.map +0 -1
  225. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +0 -8
  226. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +0 -106
  227. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +0 -1
  228. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +0 -6
  229. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +0 -57
  230. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +0 -1
  231. package/lib/util/dataColumns.d.ts +0 -132
  232. package/lib/util/dataColumns.js +0 -353
  233. package/lib/util/dataColumns.js.map +0 -1
@@ -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
- boundary: chain.config.getForkBoundaryAtEpoch(computeEpochAtSlot(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,132 +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 { Metrics } from "../metrics/metrics.js";
9
- import { NodeId } from "../network/subnets/index.js";
10
- import { IClock } from "./clock.js";
11
- export declare enum RecoverResult {
12
- NotAttemptedLessThanHalf = "not_attempted_less_than_half",
13
- NotAttemptedFull = "not_attempted_full",
14
- SuccessResolved = "success_resolved",
15
- SuccessLate = "success_late",
16
- Failed = "failed"
17
- }
18
- export declare class CustodyConfig {
19
- /**
20
- * The number of custody groups the node should subscribe to
21
- */
22
- targetCustodyGroupCount: number;
23
- /**
24
- * The custody columns the node should subscribe to
25
- */
26
- custodyColumns: ColumnIndex[];
27
- /**
28
- * Custody columns map which column maps to which index in the array of columns custodied
29
- * with zero representing it is not custodied
30
- */
31
- custodyColumnsIndex: Uint8Array;
32
- /**
33
- * The number of custody groups the node will sample
34
- */
35
- sampledGroupCount: number;
36
- /**
37
- * Custody groups sampled by the node as part of custody sampling
38
- */
39
- sampleGroups: CustodyIndex[];
40
- /**
41
- * Data columns sampled by the node as part of custody sampling
42
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#custody-sampling
43
- *
44
- * TODO: Consider race conditions if this updates during sync/backfill
45
- */
46
- sampledColumns: ColumnIndex[];
47
- /**
48
- * Subnets sampled by the node as part of custody sampling
49
- */
50
- sampledSubnets: number[];
51
- private config;
52
- private nodeId;
53
- private readonly metrics;
54
- constructor(nodeId: NodeId, config: ChainForkConfig, metrics: Metrics | null);
55
- updateTargetCustodyGroupCount(targetCustodyGroupCount: number): void;
56
- private getCustodyColumnsIndex;
57
- }
58
- /**
59
- * Calculate the number of custody groups the node should subscribe to based on the node's effective balance
60
- *
61
- * SPEC FUNCTION
62
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#validator-custody
63
- */
64
- export declare function getValidatorsCustodyRequirement(state: CachedBeaconStateAllForks, validatorIndices: ValidatorIndex[], config: ChainForkConfig): number;
65
- /**
66
- * Converts a custody group to an array of column indices. Should be 1-1 as long there are 128
67
- * columns and 128 custody groups.
68
- *
69
- * SPEC FUNCTION
70
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_columns_for_custody_group
71
- */
72
- export declare function computeColumnsForCustodyGroup(custodyIndex: CustodyIndex): ColumnIndex[];
73
- /**
74
- * Converts nodeId and a the number of custody groups to an array of custody indices. Indexes must be
75
- * further converted to column indices
76
- *
77
- * SPEC FUNCTION
78
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#get_custody_groups
79
- */
80
- export declare function getCustodyGroups(nodeId: NodeId, custodyGroupCount: number): CustodyIndex[];
81
- export declare function getDataColumns(nodeId: NodeId, custodyGroupCount: number): ColumnIndex[];
82
- /**
83
- * Computes the cells for each blob and combines them with cell proofs.
84
- * Similar to the computeMatrix function described below.
85
- *
86
- * SPEC FUNCTION (note: spec currently computes proofs, but we already have them)
87
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_matrix
88
- */
89
- export declare function getCellsAndProofs(blobBundles: fulu.BlobAndProofV2[]): {
90
- cells: Uint8Array[];
91
- proofs: Uint8Array[];
92
- }[];
93
- /**
94
- * Given a signed block header and the commitments, inclusion proof, cells/proofs associated with
95
- * each blob in the 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
99
- */
100
- export declare function getDataColumnSidecars(signedBlockHeader: SignedBeaconBlockHeader, kzgCommitments: deneb.KZGCommitment[], kzgCommitmentsInclusionProof: fulu.KzgCommitmentsInclusionProof, cellsAndKzgProofs: {
101
- cells: Uint8Array[];
102
- proofs: Uint8Array[];
103
- }[]): fulu.DataColumnSidecars;
104
- /**
105
- * Given a signed block and the cells/proofs associated with each blob in the
106
- * block, assemble the sidecars which can be distributed to peers.
107
- *
108
- * SPEC FUNCTION
109
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_block
110
- */
111
- export declare function getDataColumnSidecarsFromBlock(config: ChainForkConfig, signedBlock: fulu.SignedBeaconBlock, cellsAndKzgProofs: {
112
- cells: Uint8Array[];
113
- proofs: Uint8Array[];
114
- }[]): fulu.DataColumnSidecars;
115
- /**
116
- * Given a DataColumnSidecar and the cells/proofs associated with each blob corresponding
117
- * to the commitments it contains, assemble all sidecars for distribution to peers.
118
- *
119
- * SPEC FUNCTION
120
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_column_sidecar
121
- */
122
- export declare function getDataColumnSidecarsFromColumnSidecar(sidecar: fulu.DataColumnSidecar, cellsAndKzgProofs: {
123
- cells: Uint8Array[];
124
- proofs: Uint8Array[];
125
- }[]): fulu.DataColumnSidecars;
126
- /**
127
- * If we receive more than half of NUMBER_OF_COLUMNS (64) we should recover all remaining columns
128
- */
129
- export declare function recoverDataColumnSidecars(dataColumnCache: DataColumnsCacheMap, clock: IClock, metrics: Metrics | null): Promise<RecoverResult>;
130
- export declare function hasSampledDataColumns(custodyConfig: CustodyConfig, dataColumnCache: DataColumnsCacheMap): boolean;
131
- export declare function getDataColumnsFromExecution(config: ChainForkConfig, custodyConfig: CustodyConfig, executionEngine: IExecutionEngine, emitter: ChainEventEmitter, blockCache: BlockInputCacheType, metrics: Metrics | null): Promise<boolean>;
132
- //# sourceMappingURL=dataColumns.d.ts.map
@@ -1,353 +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, recoverDataColumnSidecars as recover, } from "./blobs.js";
9
- import { kzg } from "./kzg.js";
10
- export var RecoverResult;
11
- (function (RecoverResult) {
12
- // the recover is not attempted because we have less than `NUMBER_OF_COLUMNS / 2` columns
13
- RecoverResult["NotAttemptedLessThanHalf"] = "not_attempted_less_than_half";
14
- // the recover is not attempted because it has full data columns
15
- RecoverResult["NotAttemptedFull"] = "not_attempted_full";
16
- // the recover is a success and it helps resolve availability
17
- RecoverResult["SuccessResolved"] = "success_resolved";
18
- // the redover is a success but it's late, availability is already resolved by either gossip or getBlobsV2
19
- RecoverResult["SuccessLate"] = "success_late";
20
- // the recover failed
21
- RecoverResult["Failed"] = "failed";
22
- })(RecoverResult || (RecoverResult = {}));
23
- export class CustodyConfig {
24
- constructor(nodeId, config, metrics) {
25
- this.config = config;
26
- this.nodeId = nodeId;
27
- this.metrics = metrics;
28
- this.targetCustodyGroupCount = Math.max(config.CUSTODY_REQUIREMENT, config.NODE_CUSTODY_REQUIREMENT);
29
- this.custodyColumns = getDataColumns(this.nodeId, this.targetCustodyGroupCount);
30
- this.custodyColumnsIndex = this.getCustodyColumnsIndex(this.custodyColumns);
31
- this.metrics?.peerDas.custodyGroupCount.set(this.targetCustodyGroupCount);
32
- this.sampledGroupCount = Math.max(this.targetCustodyGroupCount, this.config.SAMPLES_PER_SLOT);
33
- this.sampleGroups = getCustodyGroups(this.nodeId, this.sampledGroupCount);
34
- this.sampledColumns = getDataColumns(this.nodeId, this.sampledGroupCount);
35
- this.sampledSubnets = this.sampledColumns.map(computeSubnetForDataColumn);
36
- }
37
- updateTargetCustodyGroupCount(targetCustodyGroupCount) {
38
- this.targetCustodyGroupCount = targetCustodyGroupCount;
39
- this.custodyColumns = getDataColumns(this.nodeId, this.targetCustodyGroupCount);
40
- this.custodyColumnsIndex = this.getCustodyColumnsIndex(this.custodyColumns);
41
- // TODO: Porting this over to match current behavior, but I think this incorrectly mixes units:
42
- // SAMPLES_PER_SLOT is in columns, and CUSTODY_GROUP_COUNT is in groups
43
- this.sampledGroupCount = Math.max(this.targetCustodyGroupCount, this.config.SAMPLES_PER_SLOT);
44
- this.sampleGroups = getCustodyGroups(this.nodeId, this.sampledGroupCount);
45
- this.sampledColumns = getDataColumns(this.nodeId, this.sampledGroupCount);
46
- this.sampledSubnets = this.sampledColumns.map(computeSubnetForDataColumn);
47
- this.metrics?.peerDas.custodyGroupCount.set(this.targetCustodyGroupCount);
48
- }
49
- getCustodyColumnsIndex(custodyColumns) {
50
- // custody columns map which column maps to which index in the array of columns custodied
51
- // with zero representing it is not custodied
52
- const custodyColumnsIndex = new Uint8Array(NUMBER_OF_COLUMNS);
53
- let custodyAtIndex = 1;
54
- for (const columnIndex of custodyColumns) {
55
- custodyColumnsIndex[columnIndex] = custodyAtIndex;
56
- custodyAtIndex++;
57
- }
58
- return custodyColumnsIndex;
59
- }
60
- }
61
- function computeSubnetForDataColumn(columnIndex) {
62
- return columnIndex % DATA_COLUMN_SIDECAR_SUBNET_COUNT;
63
- }
64
- /**
65
- * Calculate the number of custody groups the node should subscribe to based on the node's effective balance
66
- *
67
- * SPEC FUNCTION
68
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#validator-custody
69
- */
70
- export function getValidatorsCustodyRequirement(state, validatorIndices, config) {
71
- if (validatorIndices.length === 0) {
72
- return config.CUSTODY_REQUIREMENT;
73
- }
74
- const totalNodeEffectiveBalance = validatorIndices.reduce((total, validatorIndex) => {
75
- return total + state.epochCtx.effectiveBalanceIncrements[validatorIndex] * EFFECTIVE_BALANCE_INCREMENT;
76
- }, 0);
77
- // Must custody one group for every BALANCE_PER_ADDITIONAL_CUSTODY_GROUP of effective balance
78
- let validatorsCustodyRequirement = Math.floor(totalNodeEffectiveBalance / config.BALANCE_PER_ADDITIONAL_CUSTODY_GROUP);
79
- // Any node with at least 1 validator must custody at least VALIDATOR_CUSTODY_REQUIREMENT
80
- validatorsCustodyRequirement = Math.max(validatorsCustodyRequirement, config.VALIDATOR_CUSTODY_REQUIREMENT);
81
- // Cannot custody more than NUMBER_OF_CUSTODY_GROUPS
82
- validatorsCustodyRequirement = Math.min(validatorsCustodyRequirement, NUMBER_OF_CUSTODY_GROUPS);
83
- // Validators custody requirement must be at least configured node custody requirement
84
- return Math.max(validatorsCustodyRequirement, config.NODE_CUSTODY_REQUIREMENT);
85
- }
86
- /**
87
- * Converts a custody group to an array of column indices. Should be 1-1 as long there are 128
88
- * columns and 128 custody groups.
89
- *
90
- * SPEC FUNCTION
91
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_columns_for_custody_group
92
- */
93
- export function computeColumnsForCustodyGroup(custodyIndex) {
94
- if (custodyIndex > NUMBER_OF_CUSTODY_GROUPS) {
95
- custodyIndex = NUMBER_OF_CUSTODY_GROUPS;
96
- }
97
- const columnsPerCustodyGroup = Number(NUMBER_OF_COLUMNS / NUMBER_OF_CUSTODY_GROUPS);
98
- const columnIndexes = [];
99
- for (let i = 0; i < columnsPerCustodyGroup; i++) {
100
- columnIndexes.push(NUMBER_OF_CUSTODY_GROUPS * i + custodyIndex);
101
- }
102
- columnIndexes.sort((a, b) => a - b);
103
- return columnIndexes;
104
- }
105
- /**
106
- * Converts nodeId and a the number of custody groups to an array of custody indices. Indexes must be
107
- * further converted to column indices
108
- *
109
- * SPEC FUNCTION
110
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#get_custody_groups
111
- */
112
- export function getCustodyGroups(nodeId, custodyGroupCount) {
113
- if (custodyGroupCount > NUMBER_OF_CUSTODY_GROUPS) {
114
- custodyGroupCount = NUMBER_OF_CUSTODY_GROUPS;
115
- }
116
- const custodyGroups = [];
117
- // nodeId is in bigendian and all computes are in little endian
118
- let currentId = bytesToBigInt(nodeId, "be");
119
- while (custodyGroups.length < custodyGroupCount) {
120
- // could be optimized
121
- const currentIdBytes = ssz.UintBn256.serialize(currentId);
122
- const custodyGroup = Number(ssz.UintBn64.deserialize(digest(currentIdBytes).slice(0, 8)) % BigInt(NUMBER_OF_CUSTODY_GROUPS));
123
- if (!custodyGroups.includes(custodyGroup)) {
124
- custodyGroups.push(custodyGroup);
125
- }
126
- const willOverflow = currentIdBytes.reduce((acc, elem) => acc && elem === 0xff, true);
127
- if (willOverflow) {
128
- currentId = BigInt(0);
129
- }
130
- else {
131
- currentId++;
132
- }
133
- }
134
- custodyGroups.sort((a, b) => a - b);
135
- return custodyGroups;
136
- }
137
- export function getDataColumns(nodeId, custodyGroupCount) {
138
- return getCustodyGroups(nodeId, custodyGroupCount)
139
- .flatMap(computeColumnsForCustodyGroup)
140
- .sort((a, b) => a - b);
141
- }
142
- /**
143
- * Computes the cells for each blob and combines them with cell proofs.
144
- * Similar to the computeMatrix function described below.
145
- *
146
- * SPEC FUNCTION (note: spec currently computes proofs, but we already have them)
147
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md#compute_matrix
148
- */
149
- export function getCellsAndProofs(blobBundles) {
150
- return blobBundles.map(({ blob, proofs }) => {
151
- const cells = kzg.computeCells(blob);
152
- return { cells, proofs };
153
- });
154
- }
155
- /**
156
- * Given a signed block header and the commitments, inclusion proof, cells/proofs associated with
157
- * each blob in the block, assemble the sidecars which can be distributed to peers.
158
- *
159
- * SPEC FUNCTION
160
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars
161
- */
162
- export function getDataColumnSidecars(signedBlockHeader, kzgCommitments, kzgCommitmentsInclusionProof, cellsAndKzgProofs) {
163
- if (cellsAndKzgProofs.length !== kzgCommitments.length) {
164
- throw Error("Invalid cellsAndKzgProofs length for getDataColumnSidecars");
165
- }
166
- const sidecars = [];
167
- for (let columnIndex = 0; columnIndex < NUMBER_OF_COLUMNS; columnIndex++) {
168
- const columnCells = [];
169
- const columnProofs = [];
170
- for (const { cells, proofs } of cellsAndKzgProofs) {
171
- columnCells.push(cells[columnIndex]);
172
- columnProofs.push(proofs[columnIndex]);
173
- }
174
- sidecars.push({
175
- index: columnIndex,
176
- column: columnCells,
177
- kzgCommitments,
178
- kzgProofs: columnProofs,
179
- signedBlockHeader,
180
- kzgCommitmentsInclusionProof,
181
- });
182
- }
183
- return sidecars;
184
- }
185
- /**
186
- * Given a signed block and the cells/proofs associated with each blob in the
187
- * block, assemble the sidecars which can be distributed to peers.
188
- *
189
- * SPEC FUNCTION
190
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_block
191
- */
192
- export function getDataColumnSidecarsFromBlock(config, signedBlock, cellsAndKzgProofs) {
193
- const blobKzgCommitments = signedBlock.message.body.blobKzgCommitments;
194
- const fork = config.getForkName(signedBlock.message.slot);
195
- const signedBlockHeader = signedBlockToSignedHeader(config, signedBlock);
196
- const kzgCommitmentsInclusionProof = computeKzgCommitmentsInclusionProof(fork, signedBlock.message.body);
197
- return getDataColumnSidecars(signedBlockHeader, blobKzgCommitments, kzgCommitmentsInclusionProof, cellsAndKzgProofs);
198
- }
199
- /**
200
- * Given a DataColumnSidecar and the cells/proofs associated with each blob corresponding
201
- * to the commitments it contains, assemble all sidecars for distribution to peers.
202
- *
203
- * SPEC FUNCTION
204
- * https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/validator.md#get_data_column_sidecars_from_column_sidecar
205
- */
206
- export function getDataColumnSidecarsFromColumnSidecar(sidecar, cellsAndKzgProofs) {
207
- return getDataColumnSidecars(sidecar.signedBlockHeader, sidecar.kzgCommitments, sidecar.kzgCommitmentsInclusionProof, cellsAndKzgProofs);
208
- }
209
- /**
210
- * If we receive more than half of NUMBER_OF_COLUMNS (64) we should recover all remaining columns
211
- */
212
- export async function recoverDataColumnSidecars(dataColumnCache, clock, metrics) {
213
- const columnCount = dataColumnCache.size;
214
- if (columnCount >= NUMBER_OF_COLUMNS) {
215
- // We have all columns
216
- return RecoverResult.NotAttemptedFull;
217
- }
218
- if (columnCount < NUMBER_OF_COLUMNS / 2) {
219
- // We don't have enough columns to recover
220
- return RecoverResult.NotAttemptedLessThanHalf;
221
- }
222
- const partialColumns = dataColumnCache.size;
223
- metrics?.recoverDataColumnSidecars.custodyBeforeReconstruction.set(partialColumns);
224
- const partialSidecars = new Map();
225
- for (const [columnIndex, { dataColumn }] of dataColumnCache.entries()) {
226
- // the more columns we put, the slower the recover
227
- if (partialSidecars.size >= NUMBER_OF_COLUMNS / 2) {
228
- break;
229
- }
230
- partialSidecars.set(columnIndex, dataColumn);
231
- }
232
- const timer = metrics?.peerDas.dataColumnsReconstructionTime.startTimer();
233
- // if this function throws, we catch at the consumer side
234
- const fullSidecars = await recover(partialSidecars);
235
- timer?.();
236
- if (fullSidecars == null) {
237
- return RecoverResult.Failed;
238
- }
239
- const firstDataColumn = dataColumnCache.values().next().value?.dataColumn;
240
- if (firstDataColumn == null) {
241
- // should not happen because we checked the size of the cache before this
242
- throw new Error("No data column found in cache to recover from");
243
- }
244
- const slot = firstDataColumn.signedBlockHeader.message.slot;
245
- const secFromSlot = clock.secFromSlot(slot);
246
- metrics?.recoverDataColumnSidecars.elapsedTimeTillReconstructed.observe(secFromSlot);
247
- if (dataColumnCache.size === NUMBER_OF_COLUMNS) {
248
- // either gossip or getBlobsV2 resolved availability while we were recovering
249
- return RecoverResult.SuccessLate;
250
- }
251
- // We successfully recovered the data columns, update the cache
252
- for (let columnIndex = 0; columnIndex < NUMBER_OF_COLUMNS; columnIndex++) {
253
- if (dataColumnCache.has(columnIndex)) {
254
- // We already have this column
255
- continue;
256
- }
257
- const sidecar = fullSidecars[columnIndex];
258
- if (sidecar === undefined) {
259
- throw new Error(`full sidecars is undefined at index ${columnIndex}`);
260
- }
261
- dataColumnCache.set(columnIndex, { dataColumn: sidecar, dataColumnBytes: null });
262
- metrics?.peerDas.reconstructedColumns.inc(NUMBER_OF_COLUMNS - partialColumns);
263
- }
264
- return RecoverResult.SuccessResolved;
265
- }
266
- export function hasSampledDataColumns(custodyConfig, dataColumnCache) {
267
- return (dataColumnCache.size >= custodyConfig.sampledColumns.length &&
268
- custodyConfig.sampledColumns.reduce((acc, columnIndex) => acc && dataColumnCache.has(columnIndex), true));
269
- }
270
- export async function getDataColumnsFromExecution(config, custodyConfig, executionEngine, emitter, blockCache, metrics) {
271
- if (blockCache.fork !== ForkName.fulu) {
272
- return false;
273
- }
274
- if (!blockCache.cachedData) {
275
- // this condition should never get hit... just a sanity check
276
- throw new Error("invalid blockCache");
277
- }
278
- if (blockCache.cachedData.fork !== ForkName.fulu) {
279
- return false;
280
- }
281
- // If already have all columns, exit
282
- if (hasSampledDataColumns(custodyConfig, blockCache.cachedData.dataColumnsCache)) {
283
- return true;
284
- }
285
- let commitments;
286
- if (blockCache.block) {
287
- const block = blockCache.block;
288
- commitments = block.message.body.blobKzgCommitments;
289
- }
290
- else {
291
- const firstSidecar = blockCache.cachedData.dataColumnsCache.values().next().value;
292
- commitments = firstSidecar?.dataColumn.kzgCommitments;
293
- }
294
- if (!commitments) {
295
- throw new Error("blockInputCache missing both block and cachedData");
296
- }
297
- // Return if block has no blobs
298
- if (commitments.length === 0) {
299
- return true;
300
- }
301
- // Process KZG commitments into versioned hashes
302
- const versionedHashes = commitments.map(kzgCommitmentToVersionedHash);
303
- // Get blobs from execution engine
304
- metrics?.peerDas.getBlobsV2Requests.inc();
305
- const timer = metrics?.peerDas.getBlobsV2RequestDuration.startTimer();
306
- const blobs = await executionEngine.getBlobs(blockCache.fork, versionedHashes);
307
- timer?.();
308
- // Execution engine was unable to find one or more blobs
309
- if (blobs === null) {
310
- return false;
311
- }
312
- metrics?.peerDas.getBlobsV2Responses.inc();
313
- // Return if we received all data columns while waiting for getBlobs
314
- if (hasSampledDataColumns(custodyConfig, blockCache.cachedData.dataColumnsCache)) {
315
- return true;
316
- }
317
- let dataColumnSidecars;
318
- const cellsAndProofs = getCellsAndProofs(blobs);
319
- if (blockCache.block) {
320
- dataColumnSidecars = getDataColumnSidecarsFromBlock(config, blockCache.block, cellsAndProofs);
321
- }
322
- else {
323
- const firstSidecar = blockCache.cachedData.dataColumnsCache.values().next().value;
324
- if (!firstSidecar) {
325
- throw new Error("blockInputCache missing both block and data column sidecar");
326
- }
327
- dataColumnSidecars = getDataColumnSidecarsFromColumnSidecar(firstSidecar.dataColumn, cellsAndProofs);
328
- }
329
- // Publish columns if and only if subscribed to them
330
- const sampledColumns = custodyConfig.sampledColumns.map((columnIndex) => dataColumnSidecars[columnIndex]);
331
- // for columns that we already seen, it will be ignored through `ignoreDuplicatePublishError` gossip option
332
- emitter.emit(ChainEvent.publishDataColumns, sampledColumns);
333
- for (const column of sampledColumns) {
334
- blockCache.cachedData.dataColumnsCache.set(column.index, { dataColumn: column, dataColumnBytes: null });
335
- }
336
- const allDataColumns = getBlockInputDataColumns(blockCache.cachedData.dataColumnsCache, custodyConfig.sampledColumns);
337
- // TODO: Add metrics
338
- // metrics?.syncUnknownBlock.resolveAvailabilitySource.inc({source: BlockInputAvailabilitySource.GOSSIP});
339
- const blockData = {
340
- fork: blockCache.cachedData.fork,
341
- ...allDataColumns,
342
- dataColumnsSource: DataColumnsSource.engine,
343
- };
344
- const partialColumns = blockCache.cachedData.dataColumnsCache.size;
345
- blockCache.cachedData.resolveAvailability(blockData);
346
- metrics?.dataColumns.bySource.inc({ source: DataColumnsSource.engine }, NUMBER_OF_COLUMNS - partialColumns);
347
- if (blockCache.block !== undefined) {
348
- const blockInput = getBlockInput.availableData(config, blockCache.block, BlockSource.gossip, blockData);
349
- blockCache.resolveBlockInput(blockInput);
350
- }
351
- return true;
352
- }
353
- //# 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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"}