@lodestar/beacon-node 1.51.0-dev.a1ecd6c34f → 1.51.0-dev.ab56d90f0c

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 (31) hide show
  1. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  2. package/lib/chain/blocks/importExecutionPayload.js +2 -1
  3. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  4. package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -1
  5. package/lib/chain/opPools/inclusionListStore.js +2 -2
  6. package/lib/chain/opPools/inclusionListStore.js.map +1 -1
  7. package/lib/chain/validation/inclusionList.d.ts.map +1 -1
  8. package/lib/chain/validation/inclusionList.js +11 -2
  9. package/lib/chain/validation/inclusionList.js.map +1 -1
  10. package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
  11. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
  12. package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
  13. package/lib/execution/engine/mock.d.ts.map +1 -1
  14. package/lib/execution/engine/mock.js +6 -4
  15. package/lib/execution/engine/mock.js.map +1 -1
  16. package/lib/execution/engine/payloadIdCache.js +1 -1
  17. package/lib/execution/engine/payloadIdCache.js.map +1 -1
  18. package/lib/execution/engine/sszTypes.d.ts +38 -38
  19. package/lib/execution/engine/types.d.ts +1 -1
  20. package/lib/execution/engine/types.d.ts.map +1 -1
  21. package/lib/execution/engine/types.js +7 -6
  22. package/lib/execution/engine/types.js.map +1 -1
  23. package/lib/network/gossip/topic.d.ts +6 -6
  24. package/package.json +16 -16
  25. package/src/chain/blocks/importExecutionPayload.ts +2 -1
  26. package/src/chain/opPools/inclusionListStore.ts +3 -3
  27. package/src/chain/validation/inclusionList.ts +11 -2
  28. package/src/execution/engine/blobVersionedHashes.ts +1 -1
  29. package/src/execution/engine/mock.ts +6 -4
  30. package/src/execution/engine/payloadIdCache.ts +1 -1
  31. package/src/execution/engine/types.ts +8 -8
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/ChainSafe/lodestar/issues"
13
13
  },
14
- "version": "1.51.0-dev.a1ecd6c34f",
14
+ "version": "1.51.0-dev.ab56d90f0c",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -109,7 +109,7 @@
109
109
  "@chainsafe/persistent-merkle-tree": "^1.3.1",
110
110
  "@chainsafe/prometheus-gc-stats": "^1.0.0",
111
111
  "@chainsafe/snappy-wasm": "^0.5.2",
112
- "@chainsafe/ssz": "^1.8.1",
112
+ "@chainsafe/ssz": "^1.9.0",
113
113
  "@chainsafe/threads": "^1.11.3",
114
114
  "@crate-crypto/node-eth-kzg": "0.9.1",
115
115
  "@fastify/bearer-auth": "^10.0.1",
@@ -127,17 +127,17 @@
127
127
  "@libp2p/prometheus-metrics": "^5.0.31",
128
128
  "@libp2p/tcp": "^11.0.30",
129
129
  "@libp2p/utils": "^7.4.3",
130
- "@lodestar/api": "^1.51.0-dev.a1ecd6c34f",
131
- "@lodestar/config": "^1.51.0-dev.a1ecd6c34f",
132
- "@lodestar/db": "^1.51.0-dev.a1ecd6c34f",
133
- "@lodestar/fork-choice": "^1.51.0-dev.a1ecd6c34f",
134
- "@lodestar/logger": "^1.51.0-dev.a1ecd6c34f",
135
- "@lodestar/params": "^1.51.0-dev.a1ecd6c34f",
136
- "@lodestar/reqresp": "^1.51.0-dev.a1ecd6c34f",
137
- "@lodestar/state-transition": "^1.51.0-dev.a1ecd6c34f",
138
- "@lodestar/types": "^1.51.0-dev.a1ecd6c34f",
139
- "@lodestar/utils": "^1.51.0-dev.a1ecd6c34f",
140
- "@lodestar/validator": "^1.51.0-dev.a1ecd6c34f",
130
+ "@lodestar/api": "^1.51.0-dev.ab56d90f0c",
131
+ "@lodestar/config": "^1.51.0-dev.ab56d90f0c",
132
+ "@lodestar/db": "^1.51.0-dev.ab56d90f0c",
133
+ "@lodestar/fork-choice": "^1.51.0-dev.ab56d90f0c",
134
+ "@lodestar/logger": "^1.51.0-dev.ab56d90f0c",
135
+ "@lodestar/params": "^1.51.0-dev.ab56d90f0c",
136
+ "@lodestar/reqresp": "^1.51.0-dev.ab56d90f0c",
137
+ "@lodestar/state-transition": "^1.51.0-dev.ab56d90f0c",
138
+ "@lodestar/types": "^1.51.0-dev.ab56d90f0c",
139
+ "@lodestar/utils": "^1.51.0-dev.ab56d90f0c",
140
+ "@lodestar/validator": "^1.51.0-dev.ab56d90f0c",
141
141
  "@multiformats/multiaddr": "^13.0.1",
142
142
  "datastore-core": "^12.0.1",
143
143
  "datastore-level": "^13.0.1",
@@ -159,8 +159,8 @@
159
159
  "@ethereumjs/rlp": "^4.0.1",
160
160
  "@libp2p/interface-internal": "^3.2.0",
161
161
  "@libp2p/logger": "^6.2.15",
162
- "@lodestar/spec-test-util": "^1.51.0-dev.a1ecd6c34f",
163
- "@lodestar/test-utils": "^1.51.0-dev.a1ecd6c34f",
162
+ "@lodestar/spec-test-util": "^1.51.0-dev.ab56d90f0c",
163
+ "@lodestar/test-utils": "^1.51.0-dev.ab56d90f0c",
164
164
  "@types/js-yaml": "^4.0.5",
165
165
  "@types/qs": "^6.9.7",
166
166
  "@types/tmp": "^0.2.3",
@@ -175,5 +175,5 @@
175
175
  "beacon",
176
176
  "blockchain"
177
177
  ],
178
- "gitHead": "42cc5a38cbffc5d4d9c25418c3189f58571e7e9c"
178
+ "gitHead": "71af3f2028477f4b683c9d8d2ed522a3bb53427d"
179
179
  }
@@ -1,3 +1,4 @@
1
+ import {SerializedList} from "@chainsafe/ssz";
1
2
  import {routes} from "@lodestar/api";
2
3
  import {
3
4
  ExecutionStatus,
@@ -206,7 +207,7 @@ export async function importExecutionPayload(
206
207
  }
207
208
  inclusionListTransactions =
208
209
  dependentRoot === null
209
- ? []
210
+ ? SerializedList.empty()
210
211
  : this.inclusionListStore.getInclusionListTransactions(inclusionListSlot, dependentRoot, true);
211
212
  }
212
213
 
@@ -1,4 +1,4 @@
1
- import {BitArray} from "@chainsafe/ssz";
1
+ import {BitArray, SerializedList} from "@chainsafe/ssz";
2
2
  import {BeaconConfig} from "@lodestar/config";
3
3
  import {INCLUSION_LIST_COMMITTEE_SIZE} from "@lodestar/params";
4
4
  import {RootHex, Slot, ValidatorIndex, bellatrix, heze, ssz} from "@lodestar/types";
@@ -108,7 +108,7 @@ export class InclusionListStore {
108
108
 
109
109
  /** Deduplicated transactions from valid, non-equivocating inclusion lists at `(slot, dependentRoot)`. */
110
110
  getInclusionListTransactions(slot: Slot, dependentRoot: RootHex, onlyTimely = true): bellatrix.Transactions {
111
- const transactions: bellatrix.Transactions = [];
111
+ const transactions: Uint8Array[] = [];
112
112
  const seen = new Set<string>();
113
113
 
114
114
  for (const {signedInclusionList} of this.getEligible(slot, dependentRoot, onlyTimely)) {
@@ -121,7 +121,7 @@ export class InclusionListStore {
121
121
  }
122
122
  }
123
123
 
124
- return transactions;
124
+ return SerializedList.fromArray(transactions);
125
125
  }
126
126
 
127
127
  /** Bit `i` is set when committee member `i` submitted a valid, non-equivocating inclusion list */
@@ -31,7 +31,10 @@ export async function validateGossipInclusionList(
31
31
  signedInclusionList: heze.SignedInclusionList
32
32
  ): Promise<InclusionListValidationResult> {
33
33
  const {slot, validatorIndex, transactions, dependentRoot} = signedInclusionList.message;
34
- const totalBytes = transactions.reduce((total, transaction) => total + transaction.byteLength, 0);
34
+ let totalBytes = 0;
35
+ for (let i = 0; i < transactions.length; i++) {
36
+ totalBytes += transactions.getSize(i);
37
+ }
35
38
 
36
39
  // A pre-heze slot has no inclusion list committee to validate against
37
40
  if (!isForkPostHeze(chain.config.getForkName(slot))) {
@@ -75,7 +78,13 @@ export async function validateGossipInclusionList(
75
78
  }
76
79
 
77
80
  // [REJECT] Every transaction in message.transactions is non-empty
78
- const emptyTransactionIndex = transactions.findIndex((transaction) => transaction.byteLength === 0);
81
+ let emptyTransactionIndex = -1;
82
+ for (let i = 0; i < transactions.length; i++) {
83
+ if (transactions.getSize(i) === 0) {
84
+ emptyTransactionIndex = i;
85
+ break;
86
+ }
87
+ }
79
88
  if (emptyTransactionIndex !== -1) {
80
89
  throw new InclusionListError(GossipAction.REJECT, {
81
90
  code: InclusionListErrorCode.EMPTY_TRANSACTION,
@@ -7,7 +7,7 @@ import {VersionedHashes} from "./interface.js";
7
7
  * Skip unrelated fields without decoding or copying them, including untrusted nested access lists.
8
8
  * The EL remains responsible for the other transaction validity checks.
9
9
  */
10
- export function isValidBlobVersionedHashes(transactions: Uint8Array[], expected: VersionedHashes): boolean {
10
+ export function isValidBlobVersionedHashes(transactions: Iterable<Uint8Array>, expected: VersionedHashes): boolean {
11
11
  let index = 0;
12
12
  for (const transaction of transactions) {
13
13
  if (transaction.length === 0) return false;
@@ -1,4 +1,5 @@
1
1
  import crypto from "node:crypto";
2
+ import {SerializedList} from "@chainsafe/ssz";
2
3
  import {ChainConfig} from "@lodestar/config";
3
4
  import {
4
5
  BLOB_TX_TYPE,
@@ -352,14 +353,14 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
352
353
  executionPayload.gasUsed = Math.floor(0.5 * INTEROP_GAS_LIMIT);
353
354
  executionPayload.timestamp = payloadAttributes.timestamp;
354
355
  executionPayload.blockHash = crypto.randomBytes(32);
355
- executionPayload.transactions = [];
356
+ const transactions: Uint8Array[] = [];
356
357
 
357
358
  // Between 0 and 4 transactions for all forks
358
359
  const eip1559TxCount = Math.round(4 * Math.random());
359
360
  for (let i = 0; i < eip1559TxCount; i++) {
360
361
  const tx = crypto.randomBytes(512);
361
362
  tx[0] = TX_TYPE_EIP1559;
362
- executionPayload.transactions.push(tx);
363
+ transactions.push(tx);
363
364
  }
364
365
 
365
366
  const commitments: deneb.KZGCommitment[] = [];
@@ -373,7 +374,7 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
373
374
  const blob = generateRandomBlob();
374
375
  const commitment = kzg.blobToKzgCommitment(blob);
375
376
  const {proofs: cellProofs} = kzg.computeCellsAndKzgProofs(blob);
376
- executionPayload.transactions.push(transactionForKzgCommitment(commitment));
377
+ transactions.push(transactionForKzgCommitment(commitment));
377
378
  commitments.push(commitment);
378
379
  blobs.push(blob);
379
380
  proofs.push(...cellProofs);
@@ -385,12 +386,13 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
385
386
  const blob = generateRandomBlob();
386
387
  const commitment = kzg.blobToKzgCommitment(blob);
387
388
  const proof = kzg.computeBlobKzgProof(blob, commitment);
388
- executionPayload.transactions.push(transactionForKzgCommitment(commitment));
389
+ transactions.push(transactionForKzgCommitment(commitment));
389
390
  commitments.push(commitment);
390
391
  blobs.push(blob);
391
392
  proofs.push(proof);
392
393
  }
393
394
  }
395
+ executionPayload.transactions = SerializedList.fromArray(transactions);
394
396
 
395
397
  if (ForkSeq[fork] >= ForkSeq.capella) {
396
398
  (executionPayload as ExecutionPayload<ForkPostCapella>).withdrawals = ssz.capella.Withdrawals.defaultValue();
@@ -68,5 +68,5 @@ function isSameInclusionList(a?: bellatrix.Transactions, b?: bellatrix.Transacti
68
68
  if (a === undefined || b === undefined) {
69
69
  return a === b;
70
70
  }
71
- return a.length === b.length && a.every((transaction, i) => byteArrayEquals(transaction, b[i]));
71
+ return byteArrayEquals(a.bytes, b.bytes);
72
72
  }
@@ -1,4 +1,4 @@
1
- import {Type} from "@chainsafe/ssz";
1
+ import {SerializedList, Type} from "@chainsafe/ssz";
2
2
  import {
3
3
  BUILDER_DEPOSIT_REQUEST_TYPE,
4
4
  BUILDER_EXIT_REQUEST_TYPE,
@@ -181,7 +181,7 @@ export type ExecutionPayloadBodyRpc = {
181
181
  };
182
182
 
183
183
  export type ExecutionPayloadBody = {
184
- transactions: bellatrix.Transaction[];
184
+ transactions: bellatrix.Transactions;
185
185
  withdrawals: capella.Withdrawals | null;
186
186
  };
187
187
 
@@ -316,7 +316,7 @@ export function serializeExecutionPayload(fork: ForkName, data: ExecutionPayload
316
316
  extraData: bytesToData(data.extraData),
317
317
  baseFeePerGas: numToQuantity(data.baseFeePerGas),
318
318
  blockHash: bytesToData(data.blockHash),
319
- transactions: data.transactions.map((tran) => bytesToData(tran)),
319
+ transactions: Array.from(data.transactions, (tran) => bytesToData(tran)),
320
320
  };
321
321
 
322
322
  // Capella adds withdrawals to the ExecutionPayload
@@ -400,7 +400,7 @@ export function parseExecutionPayload(
400
400
  extraData: dataToBytes(data.extraData, null),
401
401
  baseFeePerGas: quantityToBigint(data.baseFeePerGas),
402
402
  blockHash: dataToBytes(data.blockHash, 32),
403
- transactions: data.transactions.map((tran) => dataToBytes(tran, null)),
403
+ transactions: SerializedList.fromArray(data.transactions.map((tran) => dataToBytes(tran, null))),
404
404
  };
405
405
 
406
406
  if (ForkSeq[fork] >= ForkSeq.capella) {
@@ -474,11 +474,11 @@ export function serializeBeaconBlockRoot(data: Root): DATA {
474
474
  }
475
475
 
476
476
  export function serializeInclusionList(data: bellatrix.Transactions): InclusionListRpc {
477
- return data.map((transaction) => bytesToData(transaction));
477
+ return Array.from(data, (transaction) => bytesToData(transaction));
478
478
  }
479
479
 
480
480
  export function deserializeInclusionList(data: InclusionListRpc): bellatrix.Transactions {
481
- return data.map((transaction) => dataToBytes(transaction, null));
481
+ return SerializedList.fromArray(data.map((transaction) => dataToBytes(transaction, null)));
482
482
  }
483
483
 
484
484
  export function deserializePayloadAttributes(data: PayloadAttributesRpc): PayloadAttributes {
@@ -670,7 +670,7 @@ export function deserializeExecutionRequests(fork: ForkName, serialized: Executi
670
670
  export function deserializeExecutionPayloadBody(data: ExecutionPayloadBodyRpc | null): ExecutionPayloadBody | null {
671
671
  return data
672
672
  ? {
673
- transactions: data.transactions.map((tran) => dataToBytes(tran, null)),
673
+ transactions: SerializedList.fromArray(data.transactions.map((tran) => dataToBytes(tran, null))),
674
674
  withdrawals: data.withdrawals ? data.withdrawals.map(deserializeWithdrawal) : null,
675
675
  }
676
676
  : null;
@@ -693,7 +693,7 @@ export function serializeExecutionPayloadBodyV2(data: ExecutionPayloadBodyV2 | n
693
693
  export function serializeExecutionPayloadBody(data: ExecutionPayloadBody | null): ExecutionPayloadBodyRpc | null {
694
694
  return data
695
695
  ? {
696
- transactions: data.transactions.map((tran) => bytesToData(tran)),
696
+ transactions: Array.from(data.transactions, (tran) => bytesToData(tran)),
697
697
  withdrawals: data.withdrawals ? data.withdrawals.map(serializeWithdrawal) : null,
698
698
  }
699
699
  : null;