@lodestar/beacon-node 1.50.0-dev.fda8006fc3 → 1.50.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 (217) hide show
  1. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/state/index.js +26 -5
  3. package/lib/api/impl/beacon/state/index.js.map +1 -1
  4. package/lib/api/impl/validator/index.d.ts.map +1 -1
  5. package/lib/api/impl/validator/index.js +26 -0
  6. package/lib/api/impl/validator/index.js.map +1 -1
  7. package/lib/chain/archiveStore/archiveStore.d.ts +5 -0
  8. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  9. package/lib/chain/archiveStore/archiveStore.js +13 -23
  10. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  11. package/lib/chain/archiveStore/utils/pruneHistory.d.ts +1 -1
  12. package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +1 -1
  13. package/lib/chain/archiveStore/utils/pruneHistory.js +2 -1
  14. package/lib/chain/archiveStore/utils/pruneHistory.js.map +1 -1
  15. package/lib/chain/beaconProposerCache.d.ts +6 -0
  16. package/lib/chain/beaconProposerCache.d.ts.map +1 -1
  17. package/lib/chain/beaconProposerCache.js +16 -0
  18. package/lib/chain/beaconProposerCache.js.map +1 -1
  19. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  20. package/lib/chain/blocks/importBlock.js +14 -8
  21. package/lib/chain/blocks/importBlock.js.map +1 -1
  22. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  23. package/lib/chain/blocks/verifyBlock.js +6 -6
  24. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  25. package/lib/chain/chain.d.ts +3 -1
  26. package/lib/chain/chain.d.ts.map +1 -1
  27. package/lib/chain/chain.js +55 -19
  28. package/lib/chain/chain.js.map +1 -1
  29. package/lib/chain/interface.d.ts +2 -0
  30. package/lib/chain/interface.d.ts.map +1 -1
  31. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +4 -2
  32. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  33. package/lib/chain/opPools/aggregatedAttestationPool.js +30 -8
  34. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  35. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  36. package/lib/chain/opPools/opPool.js +1 -23
  37. package/lib/chain/opPools/opPool.js.map +1 -1
  38. package/lib/chain/opPools/proposerPreferencesPool.d.ts +4 -0
  39. package/lib/chain/opPools/proposerPreferencesPool.d.ts.map +1 -1
  40. package/lib/chain/opPools/proposerPreferencesPool.js +13 -1
  41. package/lib/chain/opPools/proposerPreferencesPool.js.map +1 -1
  42. package/lib/chain/opPools/utils.d.ts +11 -0
  43. package/lib/chain/opPools/utils.d.ts.map +1 -1
  44. package/lib/chain/opPools/utils.js +22 -0
  45. package/lib/chain/opPools/utils.js.map +1 -1
  46. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  47. package/lib/chain/prepareNextSlot.js +11 -3
  48. package/lib/chain/prepareNextSlot.js.map +1 -1
  49. package/lib/chain/produceBlock/produceBlockBody.d.ts +8 -0
  50. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  51. package/lib/chain/produceBlock/produceBlockBody.js +40 -28
  52. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  53. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -0
  54. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  55. package/lib/chain/seenCache/seenGossipBlockInput.js +21 -0
  56. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  57. package/lib/chain/shufflingCache.d.ts +18 -8
  58. package/lib/chain/shufflingCache.d.ts.map +1 -1
  59. package/lib/chain/shufflingCache.js +72 -18
  60. package/lib/chain/shufflingCache.js.map +1 -1
  61. package/lib/db/beacon.d.ts +4 -1
  62. package/lib/db/beacon.d.ts.map +1 -1
  63. package/lib/db/beacon.js +6 -1
  64. package/lib/db/beacon.js.map +1 -1
  65. package/lib/db/buckets.d.ts +3 -1
  66. package/lib/db/buckets.d.ts.map +1 -1
  67. package/lib/db/buckets.js +2 -0
  68. package/lib/db/buckets.js.map +1 -1
  69. package/lib/db/interface.d.ts +4 -1
  70. package/lib/db/interface.d.ts.map +1 -1
  71. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  72. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  73. package/lib/db/repositories/earliestAvailableSlot.d.ts +11 -0
  74. package/lib/db/repositories/earliestAvailableSlot.d.ts.map +1 -0
  75. package/lib/db/repositories/earliestAvailableSlot.js +19 -0
  76. package/lib/db/repositories/earliestAvailableSlot.js.map +1 -0
  77. package/lib/db/repositories/index.d.ts +1 -0
  78. package/lib/db/repositories/index.d.ts.map +1 -1
  79. package/lib/db/repositories/index.js +1 -0
  80. package/lib/db/repositories/index.js.map +1 -1
  81. package/lib/db/repositories/proposerPreferences.d.ts +14 -0
  82. package/lib/db/repositories/proposerPreferences.d.ts.map +1 -0
  83. package/lib/db/repositories/proposerPreferences.js +21 -0
  84. package/lib/db/repositories/proposerPreferences.js.map +1 -0
  85. package/lib/execution/engine/blobVersionedHashes.d.ts +9 -0
  86. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -0
  87. package/lib/execution/engine/blobVersionedHashes.js +74 -0
  88. package/lib/execution/engine/blobVersionedHashes.js.map +1 -0
  89. package/lib/execution/engine/http.d.ts +45 -13
  90. package/lib/execution/engine/http.d.ts.map +1 -1
  91. package/lib/execution/engine/http.js +236 -198
  92. package/lib/execution/engine/http.js.map +1 -1
  93. package/lib/execution/engine/index.d.ts +3 -2
  94. package/lib/execution/engine/index.d.ts.map +1 -1
  95. package/lib/execution/engine/index.js +33 -8
  96. package/lib/execution/engine/index.js.map +1 -1
  97. package/lib/execution/engine/interface.d.ts +1 -1
  98. package/lib/execution/engine/interface.d.ts.map +1 -1
  99. package/lib/execution/engine/jsonRpcTransport.d.ts +25 -0
  100. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -0
  101. package/lib/execution/engine/jsonRpcTransport.js +158 -0
  102. package/lib/execution/engine/jsonRpcTransport.js.map +1 -0
  103. package/lib/execution/engine/restHttpClient.d.ts +71 -0
  104. package/lib/execution/engine/restHttpClient.d.ts.map +1 -0
  105. package/lib/execution/engine/restHttpClient.js +201 -0
  106. package/lib/execution/engine/restHttpClient.js.map +1 -0
  107. package/lib/execution/engine/restTransport.d.ts +46 -0
  108. package/lib/execution/engine/restTransport.d.ts.map +1 -0
  109. package/lib/execution/engine/restTransport.js +399 -0
  110. package/lib/execution/engine/restTransport.js.map +1 -0
  111. package/lib/execution/engine/sszTypes.d.ts +1261 -0
  112. package/lib/execution/engine/sszTypes.d.ts.map +1 -0
  113. package/lib/execution/engine/sszTypes.js +216 -0
  114. package/lib/execution/engine/sszTypes.js.map +1 -0
  115. package/lib/execution/engine/transport.d.ts +39 -0
  116. package/lib/execution/engine/transport.d.ts.map +1 -0
  117. package/lib/execution/engine/transport.js +2 -0
  118. package/lib/execution/engine/transport.js.map +1 -0
  119. package/lib/execution/engine/types.d.ts +2 -0
  120. package/lib/execution/engine/types.d.ts.map +1 -1
  121. package/lib/execution/engine/types.js +24 -57
  122. package/lib/execution/engine/types.js.map +1 -1
  123. package/lib/execution/engine/utils.d.ts.map +1 -1
  124. package/lib/execution/engine/utils.js +9 -2
  125. package/lib/execution/engine/utils.js.map +1 -1
  126. package/lib/metrics/metrics/lodestar.d.ts +10 -0
  127. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  128. package/lib/metrics/metrics/lodestar.js +22 -0
  129. package/lib/metrics/metrics/lodestar.js.map +1 -1
  130. package/lib/network/core/events.d.ts +5 -1
  131. package/lib/network/core/events.d.ts.map +1 -1
  132. package/lib/network/core/events.js +8 -0
  133. package/lib/network/core/events.js.map +1 -1
  134. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  135. package/lib/network/processor/gossipHandlers.js +60 -64
  136. package/lib/network/processor/gossipHandlers.js.map +1 -1
  137. package/lib/node/nodejs.d.ts +3 -1
  138. package/lib/node/nodejs.d.ts.map +1 -1
  139. package/lib/node/nodejs.js +2 -1
  140. package/lib/node/nodejs.js.map +1 -1
  141. package/lib/node/options.d.ts +3 -2
  142. package/lib/node/options.d.ts.map +1 -1
  143. package/lib/node/options.js +2 -2
  144. package/lib/node/options.js.map +1 -1
  145. package/lib/sync/range/batch.d.ts +5 -5
  146. package/lib/sync/range/batch.d.ts.map +1 -1
  147. package/lib/sync/range/batch.js +11 -17
  148. package/lib/sync/range/batch.js.map +1 -1
  149. package/lib/sync/range/chain.d.ts +4 -4
  150. package/lib/sync/range/chain.d.ts.map +1 -1
  151. package/lib/sync/range/chain.js +7 -5
  152. package/lib/sync/range/chain.js.map +1 -1
  153. package/lib/sync/range/range.d.ts.map +1 -1
  154. package/lib/sync/range/range.js +25 -11
  155. package/lib/sync/range/range.js.map +1 -1
  156. package/lib/sync/unknownBlock.d.ts +5 -2
  157. package/lib/sync/unknownBlock.d.ts.map +1 -1
  158. package/lib/sync/unknownBlock.js +44 -20
  159. package/lib/sync/unknownBlock.js.map +1 -1
  160. package/lib/sync/utils/downloadByRange.d.ts +38 -14
  161. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  162. package/lib/sync/utils/downloadByRange.js +84 -39
  163. package/lib/sync/utils/downloadByRange.js.map +1 -1
  164. package/lib/util/asyncIterableToEvents.d.ts +10 -2
  165. package/lib/util/asyncIterableToEvents.d.ts.map +1 -1
  166. package/lib/util/asyncIterableToEvents.js +29 -3
  167. package/lib/util/asyncIterableToEvents.js.map +1 -1
  168. package/lib/util/metadata.d.ts.map +1 -1
  169. package/lib/util/metadata.js +2 -1
  170. package/lib/util/metadata.js.map +1 -1
  171. package/package.json +17 -16
  172. package/src/api/impl/beacon/state/index.ts +41 -5
  173. package/src/api/impl/validator/index.ts +37 -0
  174. package/src/chain/archiveStore/archiveStore.ts +18 -24
  175. package/src/chain/archiveStore/utils/pruneHistory.ts +4 -1
  176. package/src/chain/beaconProposerCache.ts +19 -1
  177. package/src/chain/blocks/importBlock.ts +17 -7
  178. package/src/chain/blocks/verifyBlock.ts +7 -6
  179. package/src/chain/chain.ts +68 -18
  180. package/src/chain/interface.ts +2 -0
  181. package/src/chain/opPools/aggregatedAttestationPool.ts +34 -10
  182. package/src/chain/opPools/opPool.ts +1 -31
  183. package/src/chain/opPools/proposerPreferencesPool.ts +20 -1
  184. package/src/chain/opPools/utils.ts +31 -0
  185. package/src/chain/prepareNextSlot.ts +15 -3
  186. package/src/chain/produceBlock/produceBlockBody.ts +68 -34
  187. package/src/chain/seenCache/seenGossipBlockInput.ts +23 -0
  188. package/src/chain/shufflingCache.ts +84 -22
  189. package/src/db/beacon.ts +6 -0
  190. package/src/db/buckets.ts +2 -0
  191. package/src/db/interface.ts +4 -0
  192. package/src/db/repositories/earliestAvailableSlot.ts +19 -0
  193. package/src/db/repositories/index.ts +1 -0
  194. package/src/db/repositories/proposerPreferences.ts +23 -0
  195. package/src/execution/engine/blobVersionedHashes.ts +72 -0
  196. package/src/execution/engine/http.ts +304 -271
  197. package/src/execution/engine/index.ts +41 -7
  198. package/src/execution/engine/interface.ts +1 -1
  199. package/src/execution/engine/jsonRpcTransport.ts +247 -0
  200. package/src/execution/engine/restHttpClient.ts +269 -0
  201. package/src/execution/engine/restTransport.ts +544 -0
  202. package/src/execution/engine/sszTypes.ts +354 -0
  203. package/src/execution/engine/transport.ts +61 -0
  204. package/src/execution/engine/types.ts +34 -74
  205. package/src/execution/engine/utils.ts +12 -2
  206. package/src/metrics/metrics/lodestar.ts +23 -0
  207. package/src/network/core/events.ts +16 -1
  208. package/src/network/processor/gossipHandlers.ts +91 -77
  209. package/src/node/nodejs.ts +4 -0
  210. package/src/node/options.ts +10 -1
  211. package/src/sync/range/batch.ts +14 -19
  212. package/src/sync/range/chain.ts +9 -7
  213. package/src/sync/range/range.ts +26 -12
  214. package/src/sync/unknownBlock.ts +57 -21
  215. package/src/sync/utils/downloadByRange.ts +123 -58
  216. package/src/util/asyncIterableToEvents.ts +44 -5
  217. package/src/util/metadata.ts +2 -1
package/src/db/buckets.ts CHANGED
@@ -72,6 +72,8 @@ export enum Bucket {
72
72
 
73
73
  gloas_executionPayloadEnvelope = 59, // GLOAS BeaconBlockRoot -> SignedExecutionPayloadEnvelope
74
74
  gloas_executionPayloadEnvelopeArchive = 60, // GLOAS Slot -> SignedExecutionPayloadEnvelope, or 0x00 + SignedExecutionPayloadHeaderEnvelope
75
+ earliestAvailableSlot = 61, // singleton -> Slot
76
+ gloas_proposerPreferences = 62, // Slot || DependentRoot -> SignedProposerPreferences
75
77
  }
76
78
 
77
79
  export function getBucketNameByValue<T extends Bucket>(enumValue: T): keyof typeof Bucket {
@@ -3,6 +3,7 @@ import {Slot} from "@lodestar/types";
3
3
  import type {IDataColumnStore} from "./dataColumnStore.js";
4
4
  import type {FlatFileStoreMetrics} from "./flatFileStore/metrics.js";
5
5
  import {CheckpointStateRepository} from "./repositories/checkpointState.js";
6
+ import {EarliestAvailableSlotRepository} from "./repositories/earliestAvailableSlot.js";
6
7
  import {
7
8
  AttesterSlashingRepository,
8
9
  BLSToExecutionChangeRepository,
@@ -16,6 +17,7 @@ import {
16
17
  DataColumnSidecarRepository,
17
18
  ExecutionPayloadEnvelopeArchiveRepository,
18
19
  ExecutionPayloadEnvelopeRepository,
20
+ ProposerPreferencesRepository,
19
21
  ProposerSlashingRepository,
20
22
  StateArchiveRepository,
21
23
  SyncCommitteeRepository,
@@ -46,10 +48,12 @@ export interface IBeaconDb {
46
48
  stateArchive: StateArchiveRepository;
47
49
  // checkpoint states
48
50
  checkpointState: CheckpointStateRepository;
51
+ earliestAvailableSlot: EarliestAvailableSlotRepository;
49
52
 
50
53
  // op pool
51
54
  voluntaryExit: VoluntaryExitRepository;
52
55
  proposerSlashing: ProposerSlashingRepository;
56
+ proposerPreferences: ProposerPreferencesRepository;
53
57
  attesterSlashing: AttesterSlashingRepository;
54
58
  blsToExecutionChange: BLSToExecutionChangeRepository;
55
59
 
@@ -0,0 +1,19 @@
1
+ import {Db, encodeKey} from "@lodestar/db";
2
+ import {Slot, ssz} from "@lodestar/types";
3
+ import {Bucket, getBucketNameByValue} from "../buckets.js";
4
+
5
+ export class EarliestAvailableSlotRepository {
6
+ private readonly key = encodeKey(Bucket.earliestAvailableSlot, 0);
7
+ private readonly opts = {bucketId: getBucketNameByValue(Bucket.earliestAvailableSlot)};
8
+
9
+ constructor(private readonly db: Db) {}
10
+
11
+ async get(): Promise<Slot | null> {
12
+ const bytes = await this.db.get(this.key, this.opts);
13
+ return bytes === null ? null : ssz.Slot.deserialize(bytes);
14
+ }
15
+
16
+ async set(slot: Slot): Promise<void> {
17
+ await this.db.put(this.key, ssz.Slot.serialize(slot), this.opts);
18
+ }
19
+ }
@@ -18,6 +18,7 @@ export {BestLightClientUpdateRepository} from "./lightclientBestUpdate.js";
18
18
  export {CheckpointHeaderRepository} from "./lightclientCheckpointHeader.js";
19
19
  export {SyncCommitteeRepository} from "./lightclientSyncCommittee.js";
20
20
  export {SyncCommitteeWitnessRepository} from "./lightclientSyncCommitteeWitness.js";
21
+ export {ProposerPreferencesRepository} from "./proposerPreferences.js";
21
22
  export {ProposerSlashingRepository} from "./proposerSlashing.js";
22
23
  export {StateArchiveRepository} from "./stateArchive.js";
23
24
  export {VoluntaryExitRepository} from "./voluntaryExit.js";
@@ -0,0 +1,23 @@
1
+ import {ChainForkConfig} from "@lodestar/config";
2
+ import {Db, Repository} from "@lodestar/db";
3
+ import {gloas, ssz} from "@lodestar/types";
4
+ import {intToBytes} from "@lodestar/utils";
5
+ import {Bucket, getBucketNameByValue} from "../buckets.js";
6
+
7
+ /**
8
+ * SignedProposerPreferences indexed by proposal slot and dependent root
9
+ *
10
+ * Added via gossip or api
11
+ * Removed once the proposal slot has passed
12
+ */
13
+ export class ProposerPreferencesRepository extends Repository<Uint8Array, gloas.SignedProposerPreferences> {
14
+ constructor(config: ChainForkConfig, db: Db) {
15
+ const bucket = Bucket.gloas_proposerPreferences;
16
+ super(config, db, bucket, ssz.gloas.SignedProposerPreferences, getBucketNameByValue(bucket));
17
+ }
18
+
19
+ getId(value: gloas.SignedProposerPreferences): Uint8Array {
20
+ const {proposalSlot, dependentRoot} = value.message;
21
+ return Buffer.concat([intToBytes(proposalSlot, 8, "be"), dependentRoot]);
22
+ }
23
+ }
@@ -0,0 +1,72 @@
1
+ import {byteArrayEquals} from "@lodestar/utils";
2
+ import {VersionedHashes} from "./interface.js";
3
+
4
+ /**
5
+ * Preserve Deneb's is_valid_versioned_hashes check when the REST envelope omits expected hashes.
6
+ * EIP-4844 encodes blob_versioned_hashes at index 10 of the signed type-3 transaction's RLP list.
7
+ * Skip unrelated fields without decoding or copying them, including untrusted nested access lists.
8
+ * The EL remains responsible for the other transaction validity checks.
9
+ */
10
+ export function isValidBlobVersionedHashes(transactions: Uint8Array[], expected: VersionedHashes): boolean {
11
+ let index = 0;
12
+ for (const transaction of transactions) {
13
+ if (transaction.length === 0) return false;
14
+ if (transaction[0] !== 0x03) continue;
15
+
16
+ const outer = readRlpItem(transaction, 1, transaction.length);
17
+ if (!outer?.isList || outer.end !== transaction.length) return false;
18
+
19
+ let offset = outer.start;
20
+ for (let fieldIndex = 0; fieldIndex < 14; fieldIndex++) {
21
+ const field = readRlpItem(transaction, offset, outer.end);
22
+ if (field === null) return false;
23
+ if (fieldIndex === 10) {
24
+ if (!field.isList) return false;
25
+ // A canonical RLP-encoded Bytes32 is exactly the 0xa0 prefix followed by 32 bytes.
26
+ const count = (field.end - field.start) / 33;
27
+ if (!Number.isInteger(count) || index + count > expected.length) return false;
28
+ for (let hashOffset = field.start; hashOffset < field.end; hashOffset += 33) {
29
+ if (
30
+ transaction[hashOffset] !== 0xa0 ||
31
+ !byteArrayEquals(transaction.subarray(hashOffset + 1, hashOffset + 33), expected[index])
32
+ ) {
33
+ return false;
34
+ }
35
+ index++;
36
+ }
37
+ }
38
+ offset = field.end;
39
+ }
40
+ if (offset !== outer.end) return false;
41
+ }
42
+ return index === expected.length;
43
+ }
44
+
45
+ /** Read one RLP item's boundaries without descending into lists. */
46
+ function readRlpItem(
47
+ bytes: Uint8Array,
48
+ offset: number,
49
+ limit: number
50
+ ): {start: number; end: number; isList: boolean} | null {
51
+ if (offset >= limit) return null;
52
+ const prefix = bytes[offset];
53
+ if (prefix < 0x80) return {start: offset, end: offset + 1, isList: false};
54
+
55
+ const isList = prefix >= 0xc0;
56
+ const lengthCode = prefix - (isList ? 0xc0 : 0x80);
57
+ let start = offset + 1;
58
+ let length = lengthCode;
59
+ if (lengthCode > 55) {
60
+ const lengthBytes = lengthCode - 55;
61
+ start += lengthBytes;
62
+ if (start > limit || bytes[offset + 1] === 0) return null;
63
+ length = 0;
64
+ for (let i = offset + 1; i < start; i++) {
65
+ length = length * 256 + bytes[i];
66
+ }
67
+ if (length <= 55) return null;
68
+ }
69
+ if (length > limit - start) return null;
70
+ if (!isList && length === 1 && bytes[start] < 0x80) return null;
71
+ return {start, end: start + length, isList};
72
+ }