@lodestar/beacon-node 1.34.0-dev.b85c316da3 → 1.34.0-dev.bb10d2b5ea
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.
- package/lib/api/impl/beacon/blocks/index.js +77 -42
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +5 -5
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.js +24 -17
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/debug/index.js +4 -4
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/events/index.js +1 -1
- package/lib/api/impl/events/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +66 -49
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/impl/validator/utils.d.ts +3 -3
- package/lib/api/impl/validator/utils.js +2 -2
- package/lib/api/impl/validator/utils.js.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +26 -24
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/blocks/utils/blowfishBanner.js +1 -0
- package/lib/chain/blocks/utils/blowfishBanner.js.map +1 -1
- package/lib/chain/blocks/utils/giraffeBanner.js +1 -0
- package/lib/chain/blocks/utils/giraffeBanner.js.map +1 -1
- package/lib/chain/blocks/utils/zebraBanner.d.ts +2 -0
- package/lib/chain/blocks/utils/zebraBanner.js +46 -0
- package/lib/chain/blocks/utils/zebraBanner.js.map +1 -0
- package/lib/chain/blocks/verifyBlock.js +18 -5
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +8 -35
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/multithread/index.js +2 -2
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/chain.d.ts +8 -80
- package/lib/chain/chain.js +52 -84
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts +2 -1
- package/lib/chain/forkChoice/index.js +2 -2
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/interface.d.ts +3 -10
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +13 -3
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +1 -1
- package/lib/chain/opPools/attestationPool.js +7 -7
- package/lib/chain/prepareNextSlot.js +4 -2
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +30 -18
- package/lib/chain/produceBlock/produceBlockBody.js +27 -32
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +6 -4
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +22 -21
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
- package/lib/chain/rewards/syncCommitteeRewards.js +4 -4
- package/lib/chain/rewards/syncCommitteeRewards.js.map +1 -1
- package/lib/chain/validation/aggregateAndProof.d.ts +1 -1
- package/lib/chain/validation/aggregateAndProof.js +8 -8
- package/lib/chain/validation/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/attestation.d.ts +3 -3
- package/lib/chain/validation/attestation.js +10 -10
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts +2 -1
- package/lib/chain/validation/dataColumnSidecar.js +17 -8
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js +2 -2
- package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
- package/lib/db/beacon.d.ts +3 -3
- package/lib/db/beacon.js +3 -3
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/interface.d.ts +3 -3
- package/lib/db/repositories/dataColumnSidecar.d.ts +26 -0
- package/lib/db/repositories/dataColumnSidecar.js +39 -0
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -0
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts +24 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js +39 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -0
- package/lib/db/repositories/index.d.ts +2 -2
- package/lib/db/repositories/index.js +2 -2
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/db/repositories/stateArchive.js +1 -1
- package/lib/db/repositories/stateArchive.js.map +1 -1
- package/lib/execution/builder/http.d.ts +20 -4
- package/lib/execution/builder/http.js +30 -11
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/builder/interface.d.ts +5 -4
- package/lib/execution/engine/http.d.ts +4 -3
- package/lib/execution/engine/http.js +34 -54
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +2 -11
- package/lib/execution/engine/mock.d.ts +4 -1
- package/lib/execution/engine/mock.js +54 -16
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/types.d.ts +5 -5
- package/lib/execution/engine/types.js +2 -2
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/execution/engine/utils.js +1 -1
- package/lib/execution/engine/utils.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +2 -28
- package/lib/metrics/metrics/beacon.js +9 -75
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +8 -0
- package/lib/metrics/metrics/lodestar.js +24 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/metrics.d.ts +2 -1
- package/lib/metrics/metrics.js +3 -0
- package/lib/metrics/metrics.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +5 -0
- package/lib/network/core/networkCore.js +44 -15
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +2 -2
- package/lib/network/gossip/gossipsub.js +8 -6
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/scoringParameters.d.ts +6 -2
- package/lib/network/gossip/scoringParameters.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +627 -94
- package/lib/network/gossip/topic.js +15 -6
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +3 -3
- package/lib/network/network.d.ts +3 -3
- package/lib/network/network.js +6 -1
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.js +2 -2
- package/lib/network/peers/discover.js +1 -1
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/network/peers/peerManager.js +24 -12
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +2 -1
- package/lib/network/peers/utils/prioritizePeers.js +5 -5
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/processor/gossipHandlers.js +44 -35
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +6 -3
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +53 -23
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +7 -2
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +7 -7
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js +3 -3
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts +2 -2
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +2 -2
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js +2 -3
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +3 -3
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +67 -46
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +2 -2
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +48 -34
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/index.js +4 -3
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/rateLimit.js +11 -5
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +3 -3
- package/lib/network/reqresp/types.js +3 -3
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts +16 -0
- package/lib/network/reqresp/utils/dataColumnResponseValidation.js +59 -0
- package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -0
- package/lib/network/subnets/interface.js +2 -2
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/sync/backfill/backfill.js +1 -1
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/range/chain.d.ts +1 -1
- package/lib/sync/range/chain.js +2 -2
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.js +2 -2
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/range/utils/peerBalancer.d.ts +3 -1
- package/lib/sync/range/utils/peerBalancer.js +20 -1
- package/lib/sync/range/utils/peerBalancer.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +46 -4
- package/lib/sync/unknownBlock.js +306 -203
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/util/blobs.d.ts +3 -13
- package/lib/util/blobs.js +9 -47
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/dataColumns.d.ts +7 -5
- package/lib/util/dataColumns.js +37 -28
- package/lib/util/dataColumns.js.map +1 -1
- package/lib/util/queue/fnQueue.js +1 -1
- package/lib/util/queue/fnQueue.js.map +1 -1
- package/lib/util/queue/itemQueue.js +1 -1
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/sszBytes.d.ts +2 -0
- package/lib/util/sszBytes.js +23 -0
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/types.d.ts +7 -0
- package/lib/util/types.js +3 -0
- package/lib/util/types.js.map +1 -1
- package/package.json +19 -20
- package/lib/db/repositories/dataColumnSidecars.d.ts +0 -47
- package/lib/db/repositories/dataColumnSidecars.js +0 -40
- package/lib/db/repositories/dataColumnSidecars.js.map +0 -1
- package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +0 -15
- package/lib/db/repositories/dataColumnSidecarsArchive.js +0 -23
- package/lib/db/repositories/dataColumnSidecarsArchive.js.map +0 -1
package/lib/db/beacon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beacon.js","sourceRoot":"","sources":["../../src/db/beacon.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,yBAAyB,EAAC,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,gBAAgB,EAChB,+BAA+B,EAC/B,6BAA6B,EAC7B,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,0BAA0B,EAC1B,
|
|
1
|
+
{"version":3,"file":"beacon.js","sourceRoot":"","sources":["../../src/db/beacon.ts"],"names":[],"mappings":"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"}
|
package/lib/db/interface.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LevelDbControllerMetrics } from "@lodestar/db";
|
|
2
2
|
import { CheckpointStateRepository } from "./repositories/checkpointState.js";
|
|
3
|
-
import { AttesterSlashingRepository, BLSToExecutionChangeRepository, BackfilledRanges, BestLightClientUpdateRepository, BlobSidecarsArchiveRepository, BlobSidecarsRepository, BlockArchiveRepository, BlockRepository, CheckpointHeaderRepository,
|
|
3
|
+
import { AttesterSlashingRepository, BLSToExecutionChangeRepository, BackfilledRanges, BestLightClientUpdateRepository, BlobSidecarsArchiveRepository, BlobSidecarsRepository, BlockArchiveRepository, BlockRepository, CheckpointHeaderRepository, DataColumnSidecarArchiveRepository, DataColumnSidecarRepository, DepositDataRootRepository, DepositEventRepository, Eth1DataRepository, ProposerSlashingRepository, StateArchiveRepository, SyncCommitteeRepository, SyncCommitteeWitnessRepository, VoluntaryExitRepository } from "./repositories/index.js";
|
|
4
4
|
import { PreGenesisState, PreGenesisStateLastProcessedBlock } from "./single/index.js";
|
|
5
5
|
/**
|
|
6
6
|
* The DB service manages the data layer of the beacon chain
|
|
@@ -12,8 +12,8 @@ export interface IBeaconDb {
|
|
|
12
12
|
blockArchive: BlockArchiveRepository;
|
|
13
13
|
blobSidecars: BlobSidecarsRepository;
|
|
14
14
|
blobSidecarsArchive: BlobSidecarsArchiveRepository;
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
dataColumnSidecar: DataColumnSidecarRepository;
|
|
16
|
+
dataColumnSidecarArchive: DataColumnSidecarArchiveRepository;
|
|
17
17
|
stateArchive: StateArchiveRepository;
|
|
18
18
|
checkpointState: CheckpointStateRepository;
|
|
19
19
|
voluntaryExit: VoluntaryExitRepository;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ChainForkConfig } from "@lodestar/config";
|
|
2
|
+
import { Db, PrefixedRepository } from "@lodestar/db";
|
|
3
|
+
import { ColumnIndex, Root, fulu } from "@lodestar/types";
|
|
4
|
+
type BlockRoot = Root;
|
|
5
|
+
/**
|
|
6
|
+
* DataColumnSidecarsRepository
|
|
7
|
+
* Used to store `unfinalized` DataColumnSidecars
|
|
8
|
+
*
|
|
9
|
+
* Indexed data by `blockRoot` + `columnIndex`
|
|
10
|
+
*/
|
|
11
|
+
export declare class DataColumnSidecarRepository extends PrefixedRepository<BlockRoot, ColumnIndex, fulu.DataColumnSidecar> {
|
|
12
|
+
constructor(config: ChainForkConfig, db: Db);
|
|
13
|
+
/**
|
|
14
|
+
* Id is hashTreeRoot of unsigned BeaconBlock
|
|
15
|
+
*/
|
|
16
|
+
getId(value: fulu.DataColumnSidecar): ColumnIndex;
|
|
17
|
+
encodeKeyRaw(prefix: BlockRoot, id: ColumnIndex): Uint8Array;
|
|
18
|
+
decodeKeyRaw(raw: Uint8Array): {
|
|
19
|
+
prefix: BlockRoot;
|
|
20
|
+
id: ColumnIndex;
|
|
21
|
+
};
|
|
22
|
+
getMaxKeyRaw(prefix: BlockRoot): Uint8Array;
|
|
23
|
+
getMinKeyRaw(prefix: BlockRoot): Uint8Array;
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=dataColumnSidecar.d.ts.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { PrefixedRepository } from "@lodestar/db";
|
|
2
|
+
import { NUMBER_OF_COLUMNS } from "@lodestar/params";
|
|
3
|
+
import { ssz } from "@lodestar/types";
|
|
4
|
+
import { bytesToInt, intToBytes } from "@lodestar/utils";
|
|
5
|
+
import { Bucket, getBucketNameByValue } from "../buckets.js";
|
|
6
|
+
/**
|
|
7
|
+
* DataColumnSidecarsRepository
|
|
8
|
+
* Used to store `unfinalized` DataColumnSidecars
|
|
9
|
+
*
|
|
10
|
+
* Indexed data by `blockRoot` + `columnIndex`
|
|
11
|
+
*/
|
|
12
|
+
export class DataColumnSidecarRepository extends PrefixedRepository {
|
|
13
|
+
constructor(config, db) {
|
|
14
|
+
const bucket = Bucket.allForks_dataColumnSidecars;
|
|
15
|
+
super(config, db, bucket, ssz.fulu.DataColumnSidecar, getBucketNameByValue(bucket));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Id is hashTreeRoot of unsigned BeaconBlock
|
|
19
|
+
*/
|
|
20
|
+
getId(value) {
|
|
21
|
+
return value.index;
|
|
22
|
+
}
|
|
23
|
+
encodeKeyRaw(prefix, id) {
|
|
24
|
+
return Buffer.concat([prefix, intToBytes(id, 4)]);
|
|
25
|
+
}
|
|
26
|
+
decodeKeyRaw(raw) {
|
|
27
|
+
return {
|
|
28
|
+
prefix: raw.slice(0, 32),
|
|
29
|
+
id: bytesToInt(raw.slice(32, 36)),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
getMaxKeyRaw(prefix) {
|
|
33
|
+
return Buffer.concat([prefix, intToBytes(NUMBER_OF_COLUMNS, 4)]);
|
|
34
|
+
}
|
|
35
|
+
getMinKeyRaw(prefix) {
|
|
36
|
+
return Buffer.concat([prefix, intToBytes(0, 4)]);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=dataColumnSidecar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataColumnSidecar.js","sourceRoot":"","sources":["../../../src/db/repositories/dataColumnSidecar.ts"],"names":[],"mappings":"AACA,OAAO,EAAK,kBAAkB,EAAC,MAAM,cAAc,CAAC;AACpD,OAAO,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAA0B,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAC,UAAU,EAAE,UAAU,EAAC,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAC,MAAM,EAAE,oBAAoB,EAAC,MAAM,eAAe,CAAC;AAI3D;;;;;GAKG;AACH,MAAM,OAAO,2BAA4B,SAAQ,kBAAkE;IACjH,YAAY,MAAuB,EAAE,EAAM;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,2BAA2B,CAAC;QAClD,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAA6B;QACjC,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,MAAiB,EAAE,EAAe;QAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,YAAY,CAAC,GAAe;QAC1B,OAAO;YACL,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAc;YACrC,EAAE,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAgB;SACjD,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,MAAiB;QAC5B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,YAAY,CAAC,MAAiB;QAC5B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ChainForkConfig } from "@lodestar/config";
|
|
2
|
+
import { Db, PrefixedRepository } from "@lodestar/db";
|
|
3
|
+
import { ColumnIndex, Slot, fulu } from "@lodestar/types";
|
|
4
|
+
/**
|
|
5
|
+
* DataColumnSidecarsRepository
|
|
6
|
+
* Used to store `finalized` DataColumnSidecars
|
|
7
|
+
*
|
|
8
|
+
* Indexed data by `slot` + `columnIndex`
|
|
9
|
+
*/
|
|
10
|
+
export declare class DataColumnSidecarArchiveRepository extends PrefixedRepository<Slot, ColumnIndex, fulu.DataColumnSidecar> {
|
|
11
|
+
constructor(config: ChainForkConfig, db: Db);
|
|
12
|
+
/**
|
|
13
|
+
* Id is hashTreeRoot of unsigned BeaconBlock
|
|
14
|
+
*/
|
|
15
|
+
getId(value: fulu.DataColumnSidecar): ColumnIndex;
|
|
16
|
+
encodeKeyRaw(prefix: Slot, id: ColumnIndex): Uint8Array;
|
|
17
|
+
decodeKeyRaw(raw: Uint8Array): {
|
|
18
|
+
prefix: Slot;
|
|
19
|
+
id: ColumnIndex;
|
|
20
|
+
};
|
|
21
|
+
getMaxKeyRaw(prefix: Slot): Uint8Array;
|
|
22
|
+
getMinKeyRaw(prefix: Slot): Uint8Array;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=dataColumnSidecarArchive.d.ts.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { PrefixedRepository } from "@lodestar/db";
|
|
2
|
+
import { NUMBER_OF_COLUMNS } from "@lodestar/params";
|
|
3
|
+
import { ssz } from "@lodestar/types";
|
|
4
|
+
import { bytesToInt, intToBytes } from "@lodestar/utils";
|
|
5
|
+
import { Bucket, getBucketNameByValue } from "../buckets.js";
|
|
6
|
+
/**
|
|
7
|
+
* DataColumnSidecarsRepository
|
|
8
|
+
* Used to store `finalized` DataColumnSidecars
|
|
9
|
+
*
|
|
10
|
+
* Indexed data by `slot` + `columnIndex`
|
|
11
|
+
*/
|
|
12
|
+
export class DataColumnSidecarArchiveRepository extends PrefixedRepository {
|
|
13
|
+
constructor(config, db) {
|
|
14
|
+
const bucket = Bucket.allForks_dataColumnSidecarsArchive;
|
|
15
|
+
super(config, db, bucket, ssz.fulu.DataColumnSidecar, getBucketNameByValue(bucket));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Id is hashTreeRoot of unsigned BeaconBlock
|
|
19
|
+
*/
|
|
20
|
+
getId(value) {
|
|
21
|
+
return value.index;
|
|
22
|
+
}
|
|
23
|
+
encodeKeyRaw(prefix, id) {
|
|
24
|
+
return Buffer.concat([intToBytes(prefix, 4), intToBytes(id, 4)]);
|
|
25
|
+
}
|
|
26
|
+
decodeKeyRaw(raw) {
|
|
27
|
+
return {
|
|
28
|
+
prefix: bytesToInt(raw.slice(0, 4)),
|
|
29
|
+
id: bytesToInt(raw.slice(4, 8)),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
getMaxKeyRaw(prefix) {
|
|
33
|
+
return Buffer.concat([intToBytes(prefix, 4), intToBytes(NUMBER_OF_COLUMNS, 4)]);
|
|
34
|
+
}
|
|
35
|
+
getMinKeyRaw(prefix) {
|
|
36
|
+
return Buffer.concat([intToBytes(prefix, 4), intToBytes(0, 4)]);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=dataColumnSidecarArchive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataColumnSidecarArchive.js","sourceRoot":"","sources":["../../../src/db/repositories/dataColumnSidecarArchive.ts"],"names":[],"mappings":"AACA,OAAO,EAAK,kBAAkB,EAAC,MAAM,cAAc,CAAC;AACpD,OAAO,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAA0B,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAC,UAAU,EAAE,UAAU,EAAC,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAC,MAAM,EAAE,oBAAoB,EAAC,MAAM,eAAe,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,OAAO,kCAAmC,SAAQ,kBAA6D;IACnH,YAAY,MAAuB,EAAE,EAAM;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,kCAAkC,CAAC;QACzD,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAA6B;QACjC,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,MAAY,EAAE,EAAe;QACxC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,YAAY,CAAC,GAAe;QAC1B,OAAO;YACL,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAS;YAC3C,EAAE,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB;SAC/C,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,MAAY;QACvB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,YAAY,CAAC,MAAY;QACvB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;CACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { BlobSidecarsRepository } from "./blobSidecars.js";
|
|
2
2
|
export { BlobSidecarsArchiveRepository } from "./blobSidecarsArchive.js";
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
3
|
+
export { DataColumnSidecarRepository } from "./dataColumnSidecar.js";
|
|
4
|
+
export { DataColumnSidecarArchiveRepository } from "./dataColumnSidecarArchive.js";
|
|
5
5
|
export { BlockRepository } from "./block.js";
|
|
6
6
|
export { BlockArchiveRepository } from "./blockArchive.js";
|
|
7
7
|
export type { BlockArchiveBatchPutBinaryItem, BlockFilterOptions } from "./blockArchive.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { BlobSidecarsRepository } from "./blobSidecars.js";
|
|
2
2
|
export { BlobSidecarsArchiveRepository } from "./blobSidecarsArchive.js";
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
3
|
+
export { DataColumnSidecarRepository } from "./dataColumnSidecar.js";
|
|
4
|
+
export { DataColumnSidecarArchiveRepository } from "./dataColumnSidecarArchive.js";
|
|
5
5
|
export { BlockRepository } from "./block.js";
|
|
6
6
|
export { BlockArchiveRepository } from "./blockArchive.js";
|
|
7
7
|
export { StateArchiveRepository } from "./stateArchive.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/repositories/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAC,6BAA6B,EAAC,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/repositories/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAC,6BAA6B,EAAC,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAC,2BAA2B,EAAC,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAC,kCAAkC,EAAC,MAAM,+BAA+B,CAAC;AAEjF,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAC,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAC,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAC,0BAA0B,EAAC,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAC,0BAA0B,EAAC,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAC,uBAAuB,EAAC,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAC,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAC,yBAAyB,EAAC,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAC,+BAA+B,EAAC,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAC,0BAA0B,EAAC,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAC,uBAAuB,EAAC,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAC,8BAA8B,EAAC,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,8BAA8B,EAAC,MAAM,2BAA2B,CAAC"}
|
|
@@ -7,7 +7,7 @@ import { getRootIndexKey, storeRootIndex } from "./stateArchiveIndex.js";
|
|
|
7
7
|
export class StateArchiveRepository extends Repository {
|
|
8
8
|
constructor(config, db) {
|
|
9
9
|
// Pick some type but won't be used. Casted to any because no type can match `BeaconStateAllForks`
|
|
10
|
-
// biome-ignore lint/suspicious/noExplicitAny:
|
|
10
|
+
// biome-ignore lint/suspicious/noExplicitAny: We need to use `any` type here
|
|
11
11
|
const type = ssz.phase0.BeaconState;
|
|
12
12
|
const bucket = Bucket.allForks_stateArchive;
|
|
13
13
|
super(config, db, bucket, type, getBucketNameByValue(bucket));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stateArchive.js","sourceRoot":"","sources":["../../../src/db/repositories/stateArchive.ts"],"names":[],"mappings":"AACA,OAAO,EAAK,UAAU,EAAC,MAAM,cAAc,CAAC;AAE5C,OAAO,EAA6B,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAC,UAAU,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAC,MAAM,EAAE,oBAAoB,EAAC,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAE,cAAc,EAAC,MAAM,wBAAwB,CAAC;AAEvE,MAAM,OAAO,sBAAuB,SAAQ,UAAqC;IAC/E,YAAY,MAAuB,EAAE,EAAM;QACzC,kGAAkG;QAClG,
|
|
1
|
+
{"version":3,"file":"stateArchive.js","sourceRoot":"","sources":["../../../src/db/repositories/stateArchive.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { ApiClient as BuilderApi } from "@lodestar/api/builder";
|
|
|
2
2
|
import { ChainForkConfig } from "@lodestar/config";
|
|
3
3
|
import { Logger } from "@lodestar/logger";
|
|
4
4
|
import { ForkPostBellatrix } from "@lodestar/params";
|
|
5
|
-
import { BLSPubkey, Epoch, ExecutionPayloadHeader, Root,
|
|
5
|
+
import { BLSPubkey, Epoch, ExecutionPayloadHeader, Root, SignedBlindedBeaconBlock, SignedBlockContents, Slot, Wei, WithOptionalBytes, bellatrix, deneb, electra } from "@lodestar/types";
|
|
6
6
|
import { Metrics } from "../../metrics/metrics.js";
|
|
7
7
|
import { ValidatorRegistration, ValidatorRegistrationCache } from "./cache.js";
|
|
8
8
|
import { IExecutionBuilder } from "./interface.js";
|
|
@@ -16,6 +16,22 @@ export type ExecutionBuilderHttpOpts = {
|
|
|
16
16
|
userAgent?: string;
|
|
17
17
|
};
|
|
18
18
|
export declare const defaultExecutionBuilderHttpOpts: ExecutionBuilderHttpOpts;
|
|
19
|
+
export declare enum BuilderStatus {
|
|
20
|
+
/**
|
|
21
|
+
* Builder is enabled and operational
|
|
22
|
+
*/
|
|
23
|
+
enabled = "enabled",
|
|
24
|
+
/**
|
|
25
|
+
* Builder is disabled due to failed status check
|
|
26
|
+
*/
|
|
27
|
+
disabled = "disabled",
|
|
28
|
+
/**
|
|
29
|
+
* Circuit breaker condition that is triggered when the node determines the chain is unhealthy.
|
|
30
|
+
* When the circuit breaker is fired, proposers **MUST** not utilize the external builder
|
|
31
|
+
* network and exclusively build locally.
|
|
32
|
+
*/
|
|
33
|
+
circuitBreaker = "circuit_breaker"
|
|
34
|
+
}
|
|
19
35
|
/**
|
|
20
36
|
* Expected error if builder does not provide a bid. Most of the time, this
|
|
21
37
|
* is due to `min-bid` setting on the mev-boost side but in rare cases could
|
|
@@ -29,7 +45,7 @@ export declare class ExecutionBuilderHttp implements IExecutionBuilder {
|
|
|
29
45
|
readonly config: ChainForkConfig;
|
|
30
46
|
readonly registrations: ValidatorRegistrationCache;
|
|
31
47
|
readonly issueLocalFcUWithFeeRecipient?: string;
|
|
32
|
-
status:
|
|
48
|
+
status: BuilderStatus;
|
|
33
49
|
faultInspectionWindow: number;
|
|
34
50
|
allowedFaults: number;
|
|
35
51
|
/**
|
|
@@ -39,7 +55,7 @@ export declare class ExecutionBuilderHttp implements IExecutionBuilder {
|
|
|
39
55
|
*/
|
|
40
56
|
private sszSupported;
|
|
41
57
|
constructor(opts: ExecutionBuilderHttpOpts, config: ChainForkConfig, metrics?: Metrics | null, logger?: Logger);
|
|
42
|
-
updateStatus(
|
|
58
|
+
updateStatus(status: BuilderStatus): void;
|
|
43
59
|
checkStatus(): Promise<void>;
|
|
44
60
|
registerValidator(epoch: Epoch, registrations: bellatrix.SignedValidatorRegistrationV1[]): Promise<void>;
|
|
45
61
|
getValidatorRegistration(pubkey: BLSPubkey): ValidatorRegistration | undefined;
|
|
@@ -49,7 +65,7 @@ export declare class ExecutionBuilderHttp implements IExecutionBuilder {
|
|
|
49
65
|
blobKzgCommitments?: deneb.BlobKzgCommitments;
|
|
50
66
|
executionRequests?: electra.ExecutionRequests;
|
|
51
67
|
}>;
|
|
52
|
-
submitBlindedBlock(signedBlindedBlock: WithOptionalBytes<SignedBlindedBeaconBlock>): Promise<
|
|
68
|
+
submitBlindedBlock(signedBlindedBlock: WithOptionalBytes<SignedBlindedBeaconBlock>): Promise<SignedBlockContents>;
|
|
53
69
|
submitBlindedBlockNoResponse(signedBlindedBlock: WithOptionalBytes<SignedBlindedBeaconBlock>): Promise<void>;
|
|
54
70
|
}
|
|
55
71
|
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { WireFormat } from "@lodestar/api";
|
|
2
2
|
import { getClient } from "@lodestar/api/builder";
|
|
3
3
|
import { SLOTS_PER_EPOCH } from "@lodestar/params";
|
|
4
|
-
import { parseExecutionPayloadAndBlobsBundle,
|
|
4
|
+
import { parseExecutionPayloadAndBlobsBundle, reconstructSignedBlockContents } from "@lodestar/state-transition";
|
|
5
5
|
import { toPrintableUrl } from "@lodestar/utils";
|
|
6
6
|
import { ValidatorRegistrationCache } from "./cache.js";
|
|
7
7
|
export const defaultExecutionBuilderHttpOpts = {
|
|
@@ -9,6 +9,23 @@ export const defaultExecutionBuilderHttpOpts = {
|
|
|
9
9
|
url: "http://localhost:8661",
|
|
10
10
|
timeout: 12000,
|
|
11
11
|
};
|
|
12
|
+
export var BuilderStatus;
|
|
13
|
+
(function (BuilderStatus) {
|
|
14
|
+
/**
|
|
15
|
+
* Builder is enabled and operational
|
|
16
|
+
*/
|
|
17
|
+
BuilderStatus["enabled"] = "enabled";
|
|
18
|
+
/**
|
|
19
|
+
* Builder is disabled due to failed status check
|
|
20
|
+
*/
|
|
21
|
+
BuilderStatus["disabled"] = "disabled";
|
|
22
|
+
/**
|
|
23
|
+
* Circuit breaker condition that is triggered when the node determines the chain is unhealthy.
|
|
24
|
+
* When the circuit breaker is fired, proposers **MUST** not utilize the external builder
|
|
25
|
+
* network and exclusively build locally.
|
|
26
|
+
*/
|
|
27
|
+
BuilderStatus["circuitBreaker"] = "circuit_breaker";
|
|
28
|
+
})(BuilderStatus || (BuilderStatus = {}));
|
|
12
29
|
/**
|
|
13
30
|
* Expected error if builder does not provide a bid. Most of the time, this
|
|
14
31
|
* is due to `min-bid` setting on the mev-boost side but in rare cases could
|
|
@@ -32,7 +49,7 @@ const BUILDER_PROPOSAL_DELAY_TOLERANCE = 1000 + EVENT_LOOP_LAG_BUFFER;
|
|
|
32
49
|
export class ExecutionBuilderHttp {
|
|
33
50
|
constructor(opts, config, metrics = null, logger) {
|
|
34
51
|
// Builder needs to be explicity enabled using updateStatus
|
|
35
|
-
this.status =
|
|
52
|
+
this.status = BuilderStatus.disabled;
|
|
36
53
|
/**
|
|
37
54
|
* Determine if SSZ is supported by requesting an SSZ encoded response in the `getHeader` request.
|
|
38
55
|
* The builder responding with a SSZ serialized `SignedBuilderBid` indicates support to handle the
|
|
@@ -57,24 +74,26 @@ export class ExecutionBuilderHttp {
|
|
|
57
74
|
* Beacon clients select randomized values from the following ranges when initializing
|
|
58
75
|
* the circuit breaker (so at boot time and once for each unique boot).
|
|
59
76
|
*
|
|
60
|
-
* ALLOWED_FAULTS: between 1 and SLOTS_PER_EPOCH //
|
|
77
|
+
* ALLOWED_FAULTS: between 1 and SLOTS_PER_EPOCH // 4
|
|
61
78
|
* FAULT_INSPECTION_WINDOW: between SLOTS_PER_EPOCH and 2 * SLOTS_PER_EPOCH
|
|
62
79
|
*
|
|
63
80
|
*/
|
|
64
81
|
this.faultInspectionWindow = Math.max(opts.faultInspectionWindow ?? SLOTS_PER_EPOCH + Math.floor(Math.random() * SLOTS_PER_EPOCH), SLOTS_PER_EPOCH);
|
|
65
|
-
// allowedFaults should be < faultInspectionWindow, limiting them to faultInspectionWindow/
|
|
66
|
-
this.allowedFaults = Math.min(opts.allowedFaults ?? Math.floor(this.faultInspectionWindow /
|
|
82
|
+
// allowedFaults should be < faultInspectionWindow, limiting them to faultInspectionWindow/4
|
|
83
|
+
this.allowedFaults = Math.min(opts.allowedFaults ?? Math.floor(this.faultInspectionWindow / 4), Math.floor(this.faultInspectionWindow / 4));
|
|
67
84
|
}
|
|
68
|
-
updateStatus(
|
|
69
|
-
this.status =
|
|
85
|
+
updateStatus(status) {
|
|
86
|
+
this.status = status;
|
|
70
87
|
}
|
|
71
88
|
async checkStatus() {
|
|
72
89
|
try {
|
|
73
90
|
(await this.api.status()).assertOk();
|
|
74
91
|
}
|
|
75
92
|
catch (e) {
|
|
76
|
-
|
|
77
|
-
|
|
93
|
+
if (this.status === BuilderStatus.enabled) {
|
|
94
|
+
// Disable if the status was enabled
|
|
95
|
+
this.status = BuilderStatus.disabled;
|
|
96
|
+
}
|
|
78
97
|
throw e;
|
|
79
98
|
}
|
|
80
99
|
}
|
|
@@ -108,8 +127,8 @@ export class ExecutionBuilderHttp {
|
|
|
108
127
|
// invalid signature, but there is no recourse to this anyway so lets just proceed and will
|
|
109
128
|
// probably need diagonis if this block turns out to be invalid because of some bug
|
|
110
129
|
//
|
|
111
|
-
const
|
|
112
|
-
return
|
|
130
|
+
const fork = this.config.getForkName(signedBlindedBlock.data.message.slot);
|
|
131
|
+
return reconstructSignedBlockContents(fork, signedBlindedBlock.data, executionPayload, blobsBundle);
|
|
113
132
|
}
|
|
114
133
|
async submitBlindedBlockNoResponse(signedBlindedBlock) {
|
|
115
134
|
(await this.api.submitBlindedBlockV2({ signedBlindedBlock }, { retries: 2, requestWireFormat: this.sszSupported ? WireFormat.ssz : WireFormat.json })).assertOk();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/execution/builder/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AACzC,OAAO,EAA0B,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAGzE,OAAO,EAAoB,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAC,mCAAmC,EAAE,8BAA8B,EAAC,MAAM,4BAA4B,CAAC;AAe/G,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAwB,0BAA0B,EAAC,MAAM,YAAY,CAAC;AAgB7E,MAAM,CAAC,MAAM,+BAA+B,GAA6B;IACvE,OAAO,EAAE,KAAK;IACd,GAAG,EAAE,uBAAuB;IAC5B,OAAO,EAAE,KAAK;CACf,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC;QACE,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC3B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC;;;GAGG;AACH,MAAM,gCAAgC,GAAG,IAAI,GAAG,qBAAqB,CAAC;AAEtE,MAAM,OAAO,oBAAoB;IAiB/B,YACE,IAA8B,EAC9B,MAAuB,EACvB,UAA0B,IAAI,EAC9B,MAAe;QAhBjB,2DAA2D;QAC3D,WAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/execution/builder/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ForkPostBellatrix } from "@lodestar/params";
|
|
2
|
-
import { BLSPubkey, Epoch, ExecutionPayloadHeader, Root,
|
|
2
|
+
import { BLSPubkey, Epoch, ExecutionPayloadHeader, Root, SignedBlindedBeaconBlock, SignedBlockContents, Slot, Wei, WithOptionalBytes, bellatrix, deneb, electra } from "@lodestar/types";
|
|
3
3
|
import { ValidatorRegistration } from "./cache.js";
|
|
4
|
+
import { BuilderStatus } from "./http.js";
|
|
4
5
|
export interface IExecutionBuilder {
|
|
5
6
|
/**
|
|
6
7
|
* This param is only to for testing scripts using merge-mock which need
|
|
@@ -8,12 +9,12 @@ export interface IExecutionBuilder {
|
|
|
8
9
|
* fetch
|
|
9
10
|
*/
|
|
10
11
|
readonly issueLocalFcUWithFeeRecipient?: string;
|
|
11
|
-
status:
|
|
12
|
+
status: BuilderStatus;
|
|
12
13
|
/** Window to inspect missed slots for enabling/disabling builder circuit breaker */
|
|
13
14
|
faultInspectionWindow: number;
|
|
14
15
|
/** Number of missed slots allowed in the faultInspectionWindow for builder circuit*/
|
|
15
16
|
allowedFaults: number;
|
|
16
|
-
updateStatus(
|
|
17
|
+
updateStatus(status: BuilderStatus): void;
|
|
17
18
|
checkStatus(): Promise<void>;
|
|
18
19
|
registerValidator(epoch: Epoch, registrations: bellatrix.SignedValidatorRegistrationV1[]): Promise<void>;
|
|
19
20
|
getValidatorRegistration(pubkey: BLSPubkey): ValidatorRegistration | undefined;
|
|
@@ -23,7 +24,7 @@ export interface IExecutionBuilder {
|
|
|
23
24
|
blobKzgCommitments?: deneb.BlobKzgCommitments;
|
|
24
25
|
executionRequests?: electra.ExecutionRequests;
|
|
25
26
|
}>;
|
|
26
|
-
submitBlindedBlock(signedBlindedBlock: WithOptionalBytes<SignedBlindedBeaconBlock>): Promise<
|
|
27
|
+
submitBlindedBlock(signedBlindedBlock: WithOptionalBytes<SignedBlindedBeaconBlock>): Promise<SignedBlockContents>;
|
|
27
28
|
submitBlindedBlockNoResponse(signedBlindedBlock: WithOptionalBytes<SignedBlindedBeaconBlock>): Promise<void>;
|
|
28
29
|
}
|
|
29
30
|
//# sourceMappingURL=interface.d.ts.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Logger } from "@lodestar/logger";
|
|
2
2
|
import { ForkName, ForkPostFulu, ForkPreFulu } from "@lodestar/params";
|
|
3
|
-
import { ExecutionPayload, ExecutionRequests, Root, RootHex, Wei } from "@lodestar/types";
|
|
3
|
+
import { BlobsBundle, ExecutionPayload, ExecutionRequests, Root, RootHex, Wei } from "@lodestar/types";
|
|
4
4
|
import { BlobAndProof } from "@lodestar/types/deneb";
|
|
5
5
|
import { BlobAndProofV2 } from "@lodestar/types/fulu";
|
|
6
6
|
import { IJsonRpcHttpClient } from "../../eth1/provider/jsonRpcHttpClient.js";
|
|
7
7
|
import { Metrics } from "../../metrics/index.js";
|
|
8
|
-
import {
|
|
8
|
+
import { ClientVersion, ExecutePayloadResponse, ExecutionEngineState, IExecutionEngine, PayloadAttributes, PayloadId, VersionedHashes } from "./interface.js";
|
|
9
9
|
import { PayloadIdCache } from "./payloadIdCache.js";
|
|
10
10
|
import { ExecutionPayloadBody } from "./types.js";
|
|
11
11
|
export type ExecutionEngineModules = {
|
|
@@ -56,7 +56,6 @@ export declare class ExecutionEngineHttp implements IExecutionEngine {
|
|
|
56
56
|
private readonly rpc;
|
|
57
57
|
private readonly opts?;
|
|
58
58
|
private logger;
|
|
59
|
-
private lastGetBlobsV1ErrorTime;
|
|
60
59
|
state: ExecutionEngineState;
|
|
61
60
|
/** Cached EL client version from the latest getClientVersion call */
|
|
62
61
|
clientVersion?: ClientVersion | null;
|
|
@@ -149,6 +148,8 @@ export declare class ExecutionEngineHttp implements IExecutionEngine {
|
|
|
149
148
|
getPayloadBodiesByRange(_fork: ForkName, startBlockNumber: number, blockCount: number): Promise<(ExecutionPayloadBody | null)[]>;
|
|
150
149
|
getBlobs(fork: ForkPostFulu, versionedHashes: VersionedHashes): Promise<BlobAndProofV2[] | null>;
|
|
151
150
|
getBlobs(fork: ForkPreFulu, versionedHashes: VersionedHashes): Promise<(BlobAndProof | null)[]>;
|
|
151
|
+
private getBlobsV1;
|
|
152
|
+
private getBlobsV2;
|
|
152
153
|
private getClientVersion;
|
|
153
154
|
private updateEngineState;
|
|
154
155
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ForkName, ForkSeq, SLOTS_PER_EPOCH, isForkPostFulu } from "@lodestar/params";
|
|
2
2
|
import { strip0xPrefix } from "@lodestar/utils";
|
|
3
|
-
import { ErrorJsonRpcResponse, HttpRpcError, JsonRpcHttpClientEvent,
|
|
3
|
+
import { ErrorJsonRpcResponse, HttpRpcError, JsonRpcHttpClientEvent, } from "../../eth1/provider/jsonRpcHttpClient.js";
|
|
4
4
|
import { bytesToData, numToQuantity } from "../../eth1/provider/utils.js";
|
|
5
5
|
import { EPOCHS_PER_BATCH } from "../../sync/constants.js";
|
|
6
6
|
import { getLodestarClientVersion } from "../../util/metadata.js";
|
|
@@ -35,6 +35,11 @@ const MAX_VERSIONED_HASHES = 128;
|
|
|
35
35
|
const notifyNewPayloadOpts = { routeId: "notifyNewPayload" };
|
|
36
36
|
const forkchoiceUpdatedV1Opts = { routeId: "forkchoiceUpdated" };
|
|
37
37
|
const getPayloadOpts = { routeId: "getPayload" };
|
|
38
|
+
const getPayloadBodiesByHashOpts = { routeId: "getPayloadBodiesByHash" };
|
|
39
|
+
const getPayloadBodiesByRangeOpts = { routeId: "getPayloadBodiesByRange" };
|
|
40
|
+
const getBlobsV1Opts = { routeId: "getBlobsV1" };
|
|
41
|
+
const getBlobsV2Opts = { routeId: "getBlobsV2" };
|
|
42
|
+
const getClientVersionOpts = { routeId: "getClientVersion" };
|
|
38
43
|
/**
|
|
39
44
|
* based on Ethereum JSON-RPC API and inherits the following properties of this standard:
|
|
40
45
|
* - Supported communication protocols (HTTP and WebSocket)
|
|
@@ -48,7 +53,6 @@ export class ExecutionEngineHttp {
|
|
|
48
53
|
constructor(rpc, { metrics, signal, logger }, opts) {
|
|
49
54
|
this.rpc = rpc;
|
|
50
55
|
this.opts = opts;
|
|
51
|
-
this.lastGetBlobsV1ErrorTime = 0;
|
|
52
56
|
// The default state is ONLINE, it will be updated to SYNCING once we receive the first payload
|
|
53
57
|
// This assumption is better than the OFFLINE state, since we can't be sure if the EL is offline and being offline may trigger some notifications
|
|
54
58
|
// It's safer to to avoid false positives and assume that the EL is syncing until we receive the first payload
|
|
@@ -295,7 +299,7 @@ export class ExecutionEngineHttp {
|
|
|
295
299
|
async getPayloadBodiesByHash(_fork, blockHashes) {
|
|
296
300
|
const method = "engine_getPayloadBodiesByHashV1";
|
|
297
301
|
assertReqSizeLimit(blockHashes.length, 32);
|
|
298
|
-
const response = await this.rpc.fetchWithRetries({ method, params: [blockHashes] });
|
|
302
|
+
const response = await this.rpc.fetchWithRetries({ method, params: [blockHashes] }, getPayloadBodiesByHashOpts);
|
|
299
303
|
return response.map(deserializeExecutionPayloadBody);
|
|
300
304
|
}
|
|
301
305
|
async getPayloadBodiesByRange(_fork, startBlockNumber, blockCount) {
|
|
@@ -303,71 +307,47 @@ export class ExecutionEngineHttp {
|
|
|
303
307
|
assertReqSizeLimit(blockCount, 32);
|
|
304
308
|
const start = numToQuantity(startBlockNumber);
|
|
305
309
|
const count = numToQuantity(blockCount);
|
|
306
|
-
const response = await this.rpc.fetchWithRetries({ method, params: [start, count] });
|
|
310
|
+
const response = await this.rpc.fetchWithRetries({ method, params: [start, count] }, getPayloadBodiesByRangeOpts);
|
|
307
311
|
return response.map(deserializeExecutionPayloadBody);
|
|
308
312
|
}
|
|
309
313
|
async getBlobs(fork, versionedHashes) {
|
|
310
|
-
const method = isForkPostFulu(fork) ? "engine_getBlobsV2" : "engine_getBlobsV1";
|
|
311
|
-
// engine_getBlobsV2 is mandatory, but engine_getBlobsV1 is optional
|
|
312
|
-
const timeNow = Date.now() / 1000;
|
|
313
|
-
// retry only after a day may be
|
|
314
|
-
const GETBLOBS_RETRY_TIMEOUT = 256 * 32 * 12;
|
|
315
|
-
if (method === "engine_getBlobsV1") {
|
|
316
|
-
const timeSinceLastFail = timeNow - this.lastGetBlobsV1ErrorTime;
|
|
317
|
-
if (timeSinceLastFail < GETBLOBS_RETRY_TIMEOUT) {
|
|
318
|
-
// do not try getblobs since it might not be available
|
|
319
|
-
this.logger.debug(`disabled ${method} api call since last failed < GETBLOBS_RETRY_TIMEOUT=${GETBLOBS_RETRY_TIMEOUT}`, timeSinceLastFail);
|
|
320
|
-
throw Error(`${method} call recently failed timeSinceLastFail=${timeSinceLastFail} < GETBLOBS_RETRY_TIMEOUT=${GETBLOBS_RETRY_TIMEOUT}`);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
314
|
assertReqSizeLimit(versionedHashes.length, MAX_VERSIONED_HASHES);
|
|
324
315
|
const versionedHashesHex = versionedHashes.map(bytesToData);
|
|
325
|
-
|
|
326
|
-
.
|
|
327
|
-
|
|
316
|
+
if (isForkPostFulu(fork)) {
|
|
317
|
+
return await this.getBlobsV2(versionedHashesHex);
|
|
318
|
+
}
|
|
319
|
+
return await this.getBlobsV1(versionedHashesHex);
|
|
320
|
+
}
|
|
321
|
+
async getBlobsV1(versionedHashesHex) {
|
|
322
|
+
const response = await this.rpc.fetchWithRetries({
|
|
323
|
+
method: "engine_getBlobsV1",
|
|
328
324
|
params: [versionedHashesHex],
|
|
329
|
-
})
|
|
330
|
-
|
|
331
|
-
if (method === "engine_getBlobsV1" &&
|
|
332
|
-
e instanceof ErrorJsonRpcResponse &&
|
|
333
|
-
parseJsonRpcErrorCode(e.response.error.code) === "Method not found") {
|
|
334
|
-
if (method === "engine_getBlobsV1") {
|
|
335
|
-
this.lastGetBlobsV1ErrorTime = timeNow;
|
|
336
|
-
}
|
|
337
|
-
this.logger.debug(`disabling ${method} api call since engine responded with method not available`, {
|
|
338
|
-
retryTimeout: GETBLOBS_RETRY_TIMEOUT,
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
throw e;
|
|
342
|
-
});
|
|
343
|
-
// engine_getBlobsV2 does not return partial responses. It returns an empty array if any blob is not found
|
|
344
|
-
// TODO: Spec says to return null if any blob is not found, but reth and nethermind return empty arrays as of peerdas-devnet-6
|
|
345
|
-
const invalidLength = method === "engine_getBlobsV2"
|
|
346
|
-
? response && response.length !== 0 && response.length !== versionedHashes.length
|
|
347
|
-
: !response || response.length !== versionedHashes.length;
|
|
325
|
+
}, getBlobsV1Opts);
|
|
326
|
+
const invalidLength = response.length !== versionedHashesHex.length;
|
|
348
327
|
if (invalidLength) {
|
|
349
|
-
const error = `Invalid
|
|
328
|
+
const error = `Invalid engine_getBlobsV1 response length=${response.length} versionedHashes=${versionedHashesHex.length}`;
|
|
350
329
|
this.logger.error(error);
|
|
351
330
|
throw Error(error);
|
|
352
331
|
}
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
332
|
+
return response.map(deserializeBlobAndProofs);
|
|
333
|
+
}
|
|
334
|
+
async getBlobsV2(versionedHashesHex) {
|
|
335
|
+
const response = await this.rpc.fetchWithRetries({
|
|
336
|
+
method: "engine_getBlobsV2",
|
|
337
|
+
params: [versionedHashesHex],
|
|
338
|
+
}, getBlobsV2Opts);
|
|
339
|
+
// engine_getBlobsV2 does not return partial responses. It returns null if any blob is not found
|
|
340
|
+
const invalidLength = !!response && response.length !== versionedHashesHex.length;
|
|
341
|
+
if (invalidLength) {
|
|
342
|
+
const error = `Invalid engine_getBlobsV2 response length=${response?.length ?? "null"} versionedHashes=${versionedHashesHex.length}`;
|
|
343
|
+
this.logger.error(error);
|
|
344
|
+
throw Error(error);
|
|
366
345
|
}
|
|
346
|
+
return !response ? null : response.map(deserializeBlobAndProofsV2);
|
|
367
347
|
}
|
|
368
348
|
async getClientVersion(clientVersion) {
|
|
369
349
|
const method = "engine_getClientVersionV1";
|
|
370
|
-
const response = await this.rpc.fetchWithRetries({ method, params: [{ ...clientVersion, commit: `0x${clientVersion.commit}` }] });
|
|
350
|
+
const response = await this.rpc.fetchWithRetries({ method, params: [{ ...clientVersion, commit: `0x${clientVersion.commit}` }] }, getClientVersionOpts);
|
|
371
351
|
const clientVersions = response.map((cv) => {
|
|
372
352
|
const code = cv.code in ClientCode ? ClientCode[cv.code] : ClientCode.XX;
|
|
373
353
|
return { code, name: cv.name, version: cv.version, commit: strip0xPrefix(cv.commit) };
|