@lodestar/beacon-node 1.50.0-dev.072bf98853 → 1.50.0-dev.0837ebd402

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 (52) hide show
  1. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/state/index.js +6 -4
  3. package/lib/api/impl/beacon/state/index.js.map +1 -1
  4. package/lib/chain/chain.d.ts.map +1 -1
  5. package/lib/chain/chain.js +2 -0
  6. package/lib/chain/chain.js.map +1 -1
  7. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  8. package/lib/chain/opPools/opPool.js +1 -23
  9. package/lib/chain/opPools/opPool.js.map +1 -1
  10. package/lib/chain/opPools/proposerPreferencesPool.d.ts +4 -0
  11. package/lib/chain/opPools/proposerPreferencesPool.d.ts.map +1 -1
  12. package/lib/chain/opPools/proposerPreferencesPool.js +13 -1
  13. package/lib/chain/opPools/proposerPreferencesPool.js.map +1 -1
  14. package/lib/chain/opPools/utils.d.ts +11 -0
  15. package/lib/chain/opPools/utils.d.ts.map +1 -1
  16. package/lib/chain/opPools/utils.js +22 -0
  17. package/lib/chain/opPools/utils.js.map +1 -1
  18. package/lib/db/beacon.d.ts +2 -1
  19. package/lib/db/beacon.d.ts.map +1 -1
  20. package/lib/db/beacon.js +3 -1
  21. package/lib/db/beacon.js.map +1 -1
  22. package/lib/db/buckets.d.ts +2 -1
  23. package/lib/db/buckets.d.ts.map +1 -1
  24. package/lib/db/buckets.js +1 -0
  25. package/lib/db/buckets.js.map +1 -1
  26. package/lib/db/interface.d.ts +2 -1
  27. package/lib/db/interface.d.ts.map +1 -1
  28. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  29. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  30. package/lib/db/repositories/index.d.ts +1 -0
  31. package/lib/db/repositories/index.d.ts.map +1 -1
  32. package/lib/db/repositories/index.js +1 -0
  33. package/lib/db/repositories/index.js.map +1 -1
  34. package/lib/db/repositories/proposerPreferences.d.ts +14 -0
  35. package/lib/db/repositories/proposerPreferences.d.ts.map +1 -0
  36. package/lib/db/repositories/proposerPreferences.js +21 -0
  37. package/lib/db/repositories/proposerPreferences.js.map +1 -0
  38. package/lib/util/metadata.d.ts.map +1 -1
  39. package/lib/util/metadata.js +2 -1
  40. package/lib/util/metadata.js.map +1 -1
  41. package/package.json +15 -15
  42. package/src/api/impl/beacon/state/index.ts +13 -4
  43. package/src/chain/chain.ts +2 -0
  44. package/src/chain/opPools/opPool.ts +1 -31
  45. package/src/chain/opPools/proposerPreferencesPool.ts +20 -1
  46. package/src/chain/opPools/utils.ts +31 -0
  47. package/src/db/beacon.ts +3 -0
  48. package/src/db/buckets.ts +1 -0
  49. package/src/db/interface.ts +2 -0
  50. package/src/db/repositories/index.ts +1 -0
  51. package/src/db/repositories/proposerPreferences.ts +23 -0
  52. package/src/util/metadata.ts +2 -1
@@ -1,5 +1,7 @@
1
1
  import {RootHex, Slot, ValidatorIndex, gloas} from "@lodestar/types";
2
- import {toRootHex} from "@lodestar/utils";
2
+ import {toHex, toRootHex} from "@lodestar/utils";
3
+ import {IBeaconDb} from "../../db/index.js";
4
+ import {persistDiff} from "./utils.js";
3
5
 
4
6
  /**
5
7
  * Pool of validated `SignedProposerPreferences` indexed by `(slot, dependent_root)`.
@@ -64,4 +66,21 @@ export class ProposerPreferencesPool {
64
66
  if (slot < currentSlot) this.bySlot.delete(slot);
65
67
  }
66
68
  }
69
+
70
+ /** Restore the preferences of upcoming slots, they were validated before they were persisted */
71
+ async fromPersisted(db: IBeaconDb, currentSlot: Slot): Promise<void> {
72
+ for (const signed of await db.proposerPreferences.values()) {
73
+ if (signed.message.proposalSlot >= currentSlot) {
74
+ this.add(signed);
75
+ }
76
+ }
77
+ }
78
+
79
+ async toPersisted(db: IBeaconDb): Promise<void> {
80
+ await persistDiff(
81
+ db.proposerPreferences,
82
+ this.getAll().map((signed) => ({key: db.proposerPreferences.getId(signed), value: signed})),
83
+ toHex
84
+ );
85
+ }
67
86
  }
@@ -1,5 +1,6 @@
1
1
  import {Signature} from "@chainsafe/lodestar-z/blst";
2
2
  import {BeaconConfig} from "@lodestar/config";
3
+ import {DbBatch, Id, Repository} from "@lodestar/db";
3
4
  import {BLS_WITHDRAWAL_PREFIX, DOMAIN_BEACON_ATTESTER, DOMAIN_BEACON_PROPOSER} from "@lodestar/params";
4
5
  import {IBeaconStateView, computeStartSlotAtEpoch} from "@lodestar/state-transition";
5
6
  import {AttesterSlashing, Domain, Slot, capella, phase0} from "@lodestar/types";
@@ -91,3 +92,33 @@ export function isValidBlsToExecutionChangeForBlockInclusion(
91
92
  export function isElectraAggregate(aggregate: AggregateFast): aggregate is AggregateFastElectra {
92
93
  return (aggregate as AggregateFastElectra).committeeBits !== undefined;
93
94
  }
95
+
96
+ /**
97
+ * Persist target items `items` in `dbRepo` doing minimum put and delete writes.
98
+ * Reads all keys in repository to compute the diff between current persisted data and target data.
99
+ */
100
+ export async function persistDiff<K extends Id, V>(
101
+ dbRepo: Repository<K, V>,
102
+ items: {key: K; value: V}[],
103
+ serializeKey: (key: K) => number | string,
104
+ opts: {updateExisting?: boolean} = {}
105
+ ): Promise<void> {
106
+ const persistedKeys = await dbRepo.keys();
107
+ const batch: DbBatch<K, V> = [];
108
+
109
+ const persistedKeysSerialized = new Set(persistedKeys.map(serializeKey));
110
+ for (const item of items) {
111
+ if (opts.updateExisting || !persistedKeysSerialized.has(serializeKey(item.key))) {
112
+ batch.push({type: "put", key: item.key, value: item.value});
113
+ }
114
+ }
115
+
116
+ const targetKeysSerialized = new Set(items.map((item) => serializeKey(item.key)));
117
+ for (const persistedKey of persistedKeys) {
118
+ if (!targetKeysSerialized.has(serializeKey(persistedKey))) {
119
+ batch.push({type: "del", key: persistedKey});
120
+ }
121
+ }
122
+
123
+ if (batch.length > 0) await dbRepo.batch(batch);
124
+ }
package/src/db/beacon.ts CHANGED
@@ -22,6 +22,7 @@ import {
22
22
  DataColumnSidecarRepository,
23
23
  ExecutionPayloadEnvelopeArchiveRepository,
24
24
  ExecutionPayloadEnvelopeRepository,
25
+ ProposerPreferencesRepository,
25
26
  ProposerSlashingRepository,
26
27
  StateArchiveRepository,
27
28
  SyncCommitteeRepository,
@@ -53,6 +54,7 @@ export class BeaconDb implements IBeaconDb {
53
54
 
54
55
  voluntaryExit: VoluntaryExitRepository;
55
56
  proposerSlashing: ProposerSlashingRepository;
57
+ proposerPreferences: ProposerPreferencesRepository;
56
58
  attesterSlashing: AttesterSlashingRepository;
57
59
  blsToExecutionChange: BLSToExecutionChangeRepository;
58
60
 
@@ -89,6 +91,7 @@ export class BeaconDb implements IBeaconDb {
89
91
  this.voluntaryExit = new VoluntaryExitRepository(config, db);
90
92
  this.blsToExecutionChange = new BLSToExecutionChangeRepository(config, db);
91
93
  this.proposerSlashing = new ProposerSlashingRepository(config, db);
94
+ this.proposerPreferences = new ProposerPreferencesRepository(config, db);
92
95
  this.attesterSlashing = new AttesterSlashingRepository(config, db);
93
96
 
94
97
  // lightclient
package/src/db/buckets.ts CHANGED
@@ -73,6 +73,7 @@ export enum Bucket {
73
73
  gloas_executionPayloadEnvelope = 59, // GLOAS BeaconBlockRoot -> SignedExecutionPayloadEnvelope
74
74
  gloas_executionPayloadEnvelopeArchive = 60, // GLOAS Slot -> SignedExecutionPayloadEnvelope, or 0x00 + SignedExecutionPayloadHeaderEnvelope
75
75
  earliestAvailableSlot = 61, // singleton -> Slot
76
+ gloas_proposerPreferences = 62, // Slot || DependentRoot -> SignedProposerPreferences
76
77
  }
77
78
 
78
79
  export function getBucketNameByValue<T extends Bucket>(enumValue: T): keyof typeof Bucket {
@@ -17,6 +17,7 @@ import {
17
17
  DataColumnSidecarRepository,
18
18
  ExecutionPayloadEnvelopeArchiveRepository,
19
19
  ExecutionPayloadEnvelopeRepository,
20
+ ProposerPreferencesRepository,
20
21
  ProposerSlashingRepository,
21
22
  StateArchiveRepository,
22
23
  SyncCommitteeRepository,
@@ -52,6 +53,7 @@ export interface IBeaconDb {
52
53
  // op pool
53
54
  voluntaryExit: VoluntaryExitRepository;
54
55
  proposerSlashing: ProposerSlashingRepository;
56
+ proposerPreferences: ProposerPreferencesRepository;
55
57
  attesterSlashing: AttesterSlashingRepository;
56
58
  blsToExecutionChange: BLSToExecutionChangeRepository;
57
59
 
@@ -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
+ }
@@ -6,7 +6,8 @@ export function getLodestarClientVersion(info?: {version?: string; commit?: stri
6
6
  code: ClientCode.LS,
7
7
  name: "Lodestar",
8
8
  version: info?.version ?? "",
9
- commit: info?.commit?.slice(0, 8) ?? "",
9
+ // engine_getClientVersionV1 defines commit as 4 bytes, so builds without git data must not send an empty one
10
+ commit: info?.commit ? info.commit.slice(0, 8) : "00000000",
10
11
  };
11
12
  }
12
13