@lodestar/beacon-node 1.50.0 → 1.51.0-dev.15ecdb3b27
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.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +7 -2
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/index.js +8 -2
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +2 -1
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js +17 -9
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts.map +1 -1
- package/lib/api/impl/debug/index.js +3 -0
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +133 -27
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/ColumnReconstructionTracker.d.ts +11 -13
- package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
- package/lib/chain/ColumnReconstructionTracker.js +49 -44
- package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +4 -5
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/blockInput/utils.js +2 -2
- package/lib/chain/blocks/blockInput/utils.js.map +1 -1
- package/lib/chain/blocks/importBlock.js +10 -6
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +49 -2
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +4 -0
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js +5 -0
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/chain.d.ts +2 -1
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +8 -3
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/errors/executionPayloadBid.d.ts +11 -1
- package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadBid.js +2 -0
- package/lib/chain/errors/executionPayloadBid.js.map +1 -1
- package/lib/chain/errors/inclusionList.d.ts +60 -0
- package/lib/chain/errors/inclusionList.d.ts.map +1 -0
- package/lib/chain/errors/inclusionList.js +19 -0
- package/lib/chain/errors/inclusionList.js.map +1 -0
- package/lib/chain/errors/index.d.ts +1 -0
- package/lib/chain/errors/index.d.ts.map +1 -1
- package/lib/chain/errors/index.js +1 -0
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/interface.d.ts +3 -2
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/inclusionListStore.d.ts +63 -0
- package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -0
- package/lib/chain/opPools/inclusionListStore.js +171 -0
- package/lib/chain/opPools/inclusionListStore.js.map +1 -0
- package/lib/chain/opPools/index.d.ts +1 -0
- package/lib/chain/opPools/index.d.ts.map +1 -1
- package/lib/chain/opPools/index.js +1 -0
- package/lib/chain/opPools/index.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +4 -3
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +37 -14
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +1 -0
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +1 -0
- package/lib/chain/regen/interface.js.map +1 -1
- package/lib/chain/reprocess.d.ts +2 -1
- package/lib/chain/reprocess.d.ts.map +1 -1
- package/lib/chain/reprocess.js +2 -1
- package/lib/chain/reprocess.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +33 -1
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/inclusionList.d.ts +14 -0
- package/lib/chain/validation/inclusionList.d.ts.map +1 -0
- package/lib/chain/validation/inclusionList.js +141 -0
- package/lib/chain/validation/inclusionList.js.map +1 -0
- package/lib/chain/validation/index.d.ts +1 -0
- package/lib/chain/validation/index.d.ts.map +1 -1
- package/lib/chain/validation/index.js +1 -0
- package/lib/chain/validation/index.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +6 -4
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/constants/constants.d.ts +1 -0
- package/lib/constants/constants.d.ts.map +1 -1
- package/lib/constants/constants.js +1 -0
- package/lib/constants/constants.js.map +1 -1
- package/lib/db/repositories/blockArchive.js +2 -2
- package/lib/db/repositories/blockArchive.js.map +1 -1
- package/lib/db/repositories/blockArchiveIndex.d.ts +1 -1
- package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
- package/lib/db/repositories/blockArchiveIndex.js +1 -2
- package/lib/db/repositories/blockArchiveIndex.js.map +1 -1
- package/lib/execution/builder/validateBid.d.ts.map +1 -1
- package/lib/execution/builder/validateBid.js +14 -1
- package/lib/execution/builder/validateBid.js.map +1 -1
- package/lib/execution/engine/disabled.d.ts +1 -0
- package/lib/execution/engine/disabled.d.ts.map +1 -1
- package/lib/execution/engine/disabled.js +3 -0
- package/lib/execution/engine/disabled.js.map +1 -1
- package/lib/execution/engine/http.d.ts +8 -2
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +28 -4
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/index.d.ts.map +1 -1
- package/lib/execution/engine/index.js +1 -1
- package/lib/execution/engine/index.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +11 -2
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/jsonRpcHttpClient.d.ts.map +1 -1
- package/lib/execution/engine/jsonRpcHttpClient.js +14 -4
- package/lib/execution/engine/jsonRpcHttpClient.js.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.d.ts +3 -2
- package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.js +33 -9
- package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +1 -0
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +25 -3
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts +4 -1
- package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
- package/lib/execution/engine/payloadIdCache.js +13 -2
- package/lib/execution/engine/payloadIdCache.js.map +1 -1
- package/lib/execution/engine/restTransport.d.ts +5 -2
- package/lib/execution/engine/restTransport.d.ts.map +1 -1
- package/lib/execution/engine/restTransport.js +36 -21
- package/lib/execution/engine/restTransport.js.map +1 -1
- package/lib/execution/engine/transport.d.ts +5 -2
- package/lib/execution/engine/transport.d.ts.map +1 -1
- package/lib/execution/engine/transportMetrics.d.ts +5 -1
- package/lib/execution/engine/transportMetrics.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +24 -0
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +24 -11
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +16 -0
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +35 -0
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +20 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +51 -1
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +3 -1
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +8 -2
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/interface.js +1 -0
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +8 -14
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +13 -1
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +2 -1
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/network.d.ts +2 -1
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +5 -0
- package/lib/network/network.js.map +1 -1
- package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -1
- package/lib/network/peers/utils/enrSubnetsDeserialize.js +5 -2
- package/lib/network/peers/utils/enrSubnetsDeserialize.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +40 -1
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
- package/lib/network/processor/gossipQueues/index.js +6 -0
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
- package/lib/network/processor/gossipValidatorFn.js +5 -1
- package/lib/network/processor/gossipValidatorFn.js.map +1 -1
- package/lib/network/processor/index.d.ts +5 -0
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +40 -29
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +6 -0
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +4 -4
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +3 -3
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts +10 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.js +30 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.js.map +1 -0
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +5 -0
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +1 -0
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +5 -0
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
- package/lib/network/reqresp/rateLimit.js +6 -2
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +5 -2
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +3 -0
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/subnets/attnetsService.d.ts.map +1 -1
- package/lib/network/subnets/attnetsService.js +3 -1
- package/lib/network/subnets/attnetsService.js.map +1 -1
- package/lib/node/notifier.d.ts.map +1 -1
- package/lib/node/notifier.js +12 -13
- package/lib/node/notifier.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +3 -2
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/util/clock.d.ts.map +1 -1
- package/lib/util/clock.js +3 -4
- package/lib/util/clock.js.map +1 -1
- package/lib/util/sszBytes.d.ts +2 -2
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +22 -14
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +15 -15
- package/src/api/impl/beacon/blocks/index.ts +10 -3
- package/src/api/impl/beacon/state/index.ts +10 -1
- package/src/api/impl/beacon/state/utils.ts +19 -9
- package/src/api/impl/debug/index.ts +4 -0
- package/src/api/impl/validator/index.ts +173 -29
- package/src/chain/ColumnReconstructionTracker.ts +63 -46
- package/src/chain/archiveStore/utils/archiveBlocks.ts +6 -7
- package/src/chain/blocks/blockInput/blockInput.ts +1 -1
- package/src/chain/blocks/blockInput/utils.ts +2 -2
- package/src/chain/blocks/importBlock.ts +11 -11
- package/src/chain/blocks/importExecutionPayload.ts +67 -2
- package/src/chain/blocks/types.ts +5 -0
- package/src/chain/chain.ts +8 -2
- package/src/chain/errors/executionPayloadBid.ts +12 -0
- package/src/chain/errors/inclusionList.ts +38 -0
- package/src/chain/errors/index.ts +1 -0
- package/src/chain/interface.ts +4 -1
- package/src/chain/opPools/inclusionListStore.ts +208 -0
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/prepareNextSlot.ts +7 -3
- package/src/chain/produceBlock/computeNewStateRoot.ts +9 -2
- package/src/chain/produceBlock/produceBlockBody.ts +70 -23
- package/src/chain/regen/interface.ts +1 -0
- package/src/chain/reprocess.ts +2 -1
- package/src/chain/seenCache/seenGossipBlockInput.ts +2 -1
- package/src/chain/stateCache/persistentCheckpointsCache.ts +4 -1
- package/src/chain/validation/executionPayloadBid.ts +52 -2
- package/src/chain/validation/inclusionList.ts +183 -0
- package/src/chain/validation/index.ts +1 -0
- package/src/chain/validatorMonitor.ts +7 -4
- package/src/constants/constants.ts +1 -0
- package/src/db/repositories/blockArchive.ts +2 -2
- package/src/db/repositories/blockArchiveIndex.ts +2 -3
- package/src/execution/builder/validateBid.ts +23 -2
- package/src/execution/engine/disabled.ts +4 -0
- package/src/execution/engine/http.ts +41 -5
- package/src/execution/engine/index.ts +2 -1
- package/src/execution/engine/interface.ts +27 -3
- package/src/execution/engine/jsonRpcHttpClient.ts +12 -5
- package/src/execution/engine/jsonRpcTransport.ts +46 -9
- package/src/execution/engine/mock.ts +26 -3
- package/src/execution/engine/payloadIdCache.ts +23 -4
- package/src/execution/engine/restTransport.ts +68 -23
- package/src/execution/engine/transport.ts +7 -2
- package/src/execution/engine/transportMetrics.ts +2 -1
- package/src/execution/engine/types.ts +48 -11
- package/src/metrics/metrics/beacon.ts +37 -0
- package/src/metrics/metrics/lodestar.ts +53 -1
- package/src/network/gossip/gossipsub.ts +3 -1
- package/src/network/gossip/interface.ts +5 -0
- package/src/network/gossip/topic.ts +14 -0
- package/src/network/interface.ts +2 -0
- package/src/network/network.ts +11 -0
- package/src/network/peers/utils/enrSubnetsDeserialize.ts +5 -2
- package/src/network/processor/gossipHandlers.ts +52 -1
- package/src/network/processor/gossipQueues/index.ts +6 -0
- package/src/network/processor/gossipValidatorFn.ts +5 -0
- package/src/network/processor/index.ts +36 -27
- package/src/network/processor/types.ts +1 -1
- package/src/network/reqresp/ReqRespBeaconNode.ts +7 -0
- package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +4 -10
- package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +3 -3
- package/src/network/reqresp/handlers/inclusionListsByIndices.ts +44 -0
- package/src/network/reqresp/handlers/index.ts +5 -0
- package/src/network/reqresp/protocols.ts +6 -0
- package/src/network/reqresp/rateLimit.ts +6 -2
- package/src/network/reqresp/types.ts +6 -0
- package/src/network/subnets/attnetsService.ts +8 -3
- package/src/node/notifier.ts +14 -13
- package/src/sync/unknownBlock.ts +3 -2
- package/src/util/clock.ts +3 -4
- package/src/util/sszBytes.ts +25 -12
|
@@ -137,10 +137,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
137
137
|
engine_newPayloadV3: this.notifyNewPayload.bind(this),
|
|
138
138
|
engine_newPayloadV4: this.notifyNewPayload.bind(this),
|
|
139
139
|
engine_newPayloadV5: this.notifyNewPayload.bind(this),
|
|
140
|
+
engine_newPayloadV6: this.notifyNewPayload.bind(this),
|
|
140
141
|
engine_forkchoiceUpdatedV1: this.notifyForkchoiceUpdate.bind(this),
|
|
141
142
|
engine_forkchoiceUpdatedV2: this.notifyForkchoiceUpdate.bind(this),
|
|
142
143
|
engine_forkchoiceUpdatedV3: this.notifyForkchoiceUpdate.bind(this),
|
|
143
144
|
engine_forkchoiceUpdatedV4: this.notifyForkchoiceUpdate.bind(this),
|
|
145
|
+
engine_forkchoiceUpdatedV5: this.notifyForkchoiceUpdate.bind(this),
|
|
144
146
|
engine_getPayloadV1: this.getPayloadV1.bind(this),
|
|
145
147
|
engine_getPayloadV2: this.getPayloadV5.bind(this),
|
|
146
148
|
engine_getPayloadV3: this.getPayloadV5.bind(this),
|
|
@@ -151,6 +153,7 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
151
153
|
engine_getClientVersionV1: this.getClientVersionV1.bind(this),
|
|
152
154
|
engine_getBlobsV1: this.getBlobs.bind(this),
|
|
153
155
|
engine_getBlobsV2: this.getBlobsV2.bind(this),
|
|
156
|
+
engine_getInclusionListV1: this.getInclusionList.bind(this),
|
|
154
157
|
};
|
|
155
158
|
}
|
|
156
159
|
|
|
@@ -234,7 +237,13 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
234
237
|
// IF the payload has been fully validated while processing the call
|
|
235
238
|
// RETURN payload status from the Payload validation process
|
|
236
239
|
// If validation succeeds, the response MUST contain {status: VALID, latestValidHash: payload.blockHash}
|
|
237
|
-
|
|
240
|
+
// The mock does not check inclusion list constraints, so every payload satisfies them (PayloadStatusV2)
|
|
241
|
+
return {
|
|
242
|
+
status: ExecutionPayloadStatus.VALID,
|
|
243
|
+
latestValidHash: blockHash,
|
|
244
|
+
validationError: null,
|
|
245
|
+
inclusionListSatisfied: true,
|
|
246
|
+
};
|
|
238
247
|
}
|
|
239
248
|
|
|
240
249
|
/**
|
|
@@ -409,7 +418,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
409
418
|
// IF the payload is deemed VALID and the build process has begun
|
|
410
419
|
// {payloadStatus: {status: VALID, latestValidHash: forkchoiceState.headBlockHash, validationError: null}, payloadId: buildProcessId}
|
|
411
420
|
return {
|
|
412
|
-
payloadStatus: {
|
|
421
|
+
payloadStatus: {
|
|
422
|
+
status: ExecutionPayloadStatus.VALID,
|
|
423
|
+
latestValidHash: null,
|
|
424
|
+
validationError: null,
|
|
425
|
+
inclusionListSatisfied: true,
|
|
426
|
+
},
|
|
413
427
|
payloadId: String(payloadId as number),
|
|
414
428
|
};
|
|
415
429
|
}
|
|
@@ -418,7 +432,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
418
432
|
// IF the payload is deemed VALID and a build process hasn't been started
|
|
419
433
|
// {payloadStatus: {status: VALID, latestValidHash: forkchoiceState.headBlockHash, validationError: null}, payloadId: null}
|
|
420
434
|
return {
|
|
421
|
-
payloadStatus: {
|
|
435
|
+
payloadStatus: {
|
|
436
|
+
status: ExecutionPayloadStatus.VALID,
|
|
437
|
+
latestValidHash: null,
|
|
438
|
+
validationError: null,
|
|
439
|
+
inclusionListSatisfied: true,
|
|
440
|
+
},
|
|
422
441
|
payloadId: null,
|
|
423
442
|
};
|
|
424
443
|
}
|
|
@@ -487,6 +506,10 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
487
506
|
return null;
|
|
488
507
|
}
|
|
489
508
|
|
|
509
|
+
private getInclusionList(): EngineApiRpcReturnTypes["engine_getInclusionListV1"] {
|
|
510
|
+
return [];
|
|
511
|
+
}
|
|
512
|
+
|
|
490
513
|
private timestampToFork(timestamp: number): ForkPostBellatrix {
|
|
491
514
|
if (timestamp >= this.gloasForkTimestamp) return ForkName.gloas;
|
|
492
515
|
if (timestamp >= this.fuluForkTimestamp) return ForkName.fulu;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import {byteArrayEquals} from "@chainsafe/ssz";
|
|
1
2
|
import {SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
3
|
+
import {bellatrix} from "@lodestar/types";
|
|
2
4
|
import {pruneSetToMax} from "@lodestar/utils";
|
|
3
5
|
import {PayloadAttributesRpc} from "./types.js";
|
|
4
6
|
import {DATA, QUANTITY} from "./utils.js";
|
|
@@ -17,10 +19,16 @@ export type WithdrawalV1 = {
|
|
|
17
19
|
amount: QUANTITY;
|
|
18
20
|
};
|
|
19
21
|
|
|
20
|
-
type FcuAttributes = {headBlockHash: DATA; finalizedBlockHash: DATA} & Omit<
|
|
22
|
+
type FcuAttributes = {headBlockHash: DATA; finalizedBlockHash: DATA} & Omit<
|
|
23
|
+
PayloadAttributesRpc,
|
|
24
|
+
"withdrawals" | "inclusionListTransactions"
|
|
25
|
+
> & {inclusionListTransactions?: bellatrix.Transactions};
|
|
21
26
|
|
|
22
27
|
export class PayloadIdCache {
|
|
23
|
-
private readonly payloadIdByFcuAttributes = new Map<
|
|
28
|
+
private readonly payloadIdByFcuAttributes = new Map<
|
|
29
|
+
string,
|
|
30
|
+
{payloadId: PayloadId; fullKey: string; inclusionListTransactions?: bellatrix.Transactions}
|
|
31
|
+
>();
|
|
24
32
|
|
|
25
33
|
getFullKey({headBlockHash, finalizedBlockHash, timestamp, prevRandao, suggestedFeeRecipient}: FcuAttributes): string {
|
|
26
34
|
return `${headBlockHash}-${finalizedBlockHash}-${timestamp}-${prevRandao}-${suggestedFeeRecipient}`;
|
|
@@ -37,7 +45,8 @@ export class PayloadIdCache {
|
|
|
37
45
|
add(fcuAttributes: FcuAttributes, payloadId: PayloadId): void {
|
|
38
46
|
const key = this.getKey(fcuAttributes);
|
|
39
47
|
const fullKey = this.getFullKey(fcuAttributes);
|
|
40
|
-
|
|
48
|
+
const {inclusionListTransactions} = fcuAttributes;
|
|
49
|
+
this.payloadIdByFcuAttributes.set(key, {payloadId, fullKey, inclusionListTransactions});
|
|
41
50
|
}
|
|
42
51
|
|
|
43
52
|
prune(): void {
|
|
@@ -49,6 +58,16 @@ export class PayloadIdCache {
|
|
|
49
58
|
const key = this.getKey(fcuAttributes);
|
|
50
59
|
const fullKey = this.getFullKey(fcuAttributes);
|
|
51
60
|
const payloadInfo = this.payloadIdByFcuAttributes.get(key);
|
|
52
|
-
return payloadInfo?.fullKey === fullKey
|
|
61
|
+
return payloadInfo?.fullKey === fullKey &&
|
|
62
|
+
isSameInclusionList(payloadInfo.inclusionListTransactions, fcuAttributes.inclusionListTransactions)
|
|
63
|
+
? payloadInfo.payloadId
|
|
64
|
+
: undefined;
|
|
53
65
|
}
|
|
54
66
|
}
|
|
67
|
+
|
|
68
|
+
function isSameInclusionList(a?: bellatrix.Transactions, b?: bellatrix.Transactions): boolean {
|
|
69
|
+
if (a === undefined || b === undefined) {
|
|
70
|
+
return a === b;
|
|
71
|
+
}
|
|
72
|
+
return a.length === b.length && a.every((transaction, i) => byteArrayEquals(transaction, b[i]));
|
|
73
|
+
}
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
import {Type} from "@chainsafe/ssz";
|
|
2
2
|
import {CELLS_PER_EXT_BLOB, ForkName, ForkSeq, isForkPostBellatrix} from "@lodestar/params";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
ExecutionPayload,
|
|
5
|
+
ExecutionRequests,
|
|
6
|
+
Root,
|
|
7
|
+
RootHex,
|
|
8
|
+
bellatrix,
|
|
9
|
+
capella,
|
|
10
|
+
deneb,
|
|
11
|
+
electra,
|
|
12
|
+
gloas,
|
|
13
|
+
} from "@lodestar/types";
|
|
4
14
|
import {BlobAndProof} from "@lodestar/types/deneb";
|
|
5
15
|
import {BlobAndProofV2} from "@lodestar/types/fulu";
|
|
6
|
-
import {LodestarError, fromHex, strip0xPrefix, toHex, toRootHex} from "@lodestar/utils";
|
|
16
|
+
import {EndTimer, LodestarError, fromHex, strip0xPrefix, toHex, toRootHex} from "@lodestar/utils";
|
|
7
17
|
import {isValidBlobVersionedHashes} from "./blobVersionedHashes.js";
|
|
8
18
|
import {
|
|
9
19
|
ClientCode,
|
|
@@ -48,6 +58,7 @@ import {
|
|
|
48
58
|
executionForkName,
|
|
49
59
|
} from "./sszTypes.js";
|
|
50
60
|
import {ForkchoiceUpdatedResult, GetPayloadResult, IEngineTransport, PayloadStatusResult} from "./transport.js";
|
|
61
|
+
import {EngineTransportMetrics} from "./transportMetrics.js";
|
|
51
62
|
import {
|
|
52
63
|
ExecutionPayloadBodyV2,
|
|
53
64
|
assertReqSizeLimit,
|
|
@@ -102,7 +113,10 @@ export function formatClientVersionHeader(clientVersion: ClientVersion): string
|
|
|
102
113
|
export class RestEngineTransport implements IEngineTransport {
|
|
103
114
|
private limits = DEFAULT_LIMITS;
|
|
104
115
|
|
|
105
|
-
constructor(
|
|
116
|
+
constructor(
|
|
117
|
+
private readonly client: EngineRestHttpClient,
|
|
118
|
+
private readonly metrics?: EngineTransportMetrics | null
|
|
119
|
+
) {}
|
|
106
120
|
|
|
107
121
|
get emitter(): JsonRpcHttpClientEventEmitter {
|
|
108
122
|
return this.client.emitter;
|
|
@@ -114,7 +128,7 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
114
128
|
{method: "GET", path: "/capabilities", responseType: "json"},
|
|
115
129
|
getCapabilitiesOpts
|
|
116
130
|
);
|
|
117
|
-
const capabilities = parseJson(body, "getCapabilities");
|
|
131
|
+
const capabilities = parseJson(body, "getCapabilities", this.metrics);
|
|
118
132
|
if (
|
|
119
133
|
!isRecord(capabilities) ||
|
|
120
134
|
!Array.isArray(capabilities.supported_forks) ||
|
|
@@ -220,7 +234,7 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
220
234
|
{method: "POST", path: "/payloads", executionFork: toExecutionForkName(fork), body, responseType: "ssz"},
|
|
221
235
|
notifyNewPayloadOpts
|
|
222
236
|
);
|
|
223
|
-
return toPayloadStatusResult(deserializeResponse(PayloadStatus, res.body, "notifyNewPayload"));
|
|
237
|
+
return toPayloadStatusResult(deserializeResponse(PayloadStatus, res.body, "notifyNewPayload", this.metrics));
|
|
224
238
|
}
|
|
225
239
|
|
|
226
240
|
async forkchoiceUpdated(
|
|
@@ -268,7 +282,12 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
268
282
|
{method: "POST", path: "/forkchoice", executionFork: toExecutionForkName(fork), body, responseType: "ssz"},
|
|
269
283
|
fcUReqOpts
|
|
270
284
|
);
|
|
271
|
-
const {payloadStatus, payloadId} = deserializeResponse(
|
|
285
|
+
const {payloadStatus, payloadId} = deserializeResponse(
|
|
286
|
+
ForkchoiceUpdateResponse,
|
|
287
|
+
res.body,
|
|
288
|
+
"forkchoiceUpdated",
|
|
289
|
+
this.metrics
|
|
290
|
+
);
|
|
272
291
|
return {
|
|
273
292
|
payloadStatus: toPayloadStatusResult(payloadStatus),
|
|
274
293
|
payloadId: payloadId.length > 0 ? toHex(payloadId[0]) : null,
|
|
@@ -289,7 +308,8 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
289
308
|
const {payload, blockValue, blobsBundle, executionRequests, shouldOverrideBuilder} = deserializeResponse(
|
|
290
309
|
BuiltPayloadGloas,
|
|
291
310
|
res.body,
|
|
292
|
-
"getPayload"
|
|
311
|
+
"getPayload",
|
|
312
|
+
this.metrics
|
|
293
313
|
);
|
|
294
314
|
return {
|
|
295
315
|
executionPayload: payload,
|
|
@@ -303,7 +323,8 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
303
323
|
const {payload, blockValue, blobsBundle, executionRequests, shouldOverrideBuilder} = deserializeResponse(
|
|
304
324
|
BuiltPayloadFulu,
|
|
305
325
|
res.body,
|
|
306
|
-
"getPayload"
|
|
326
|
+
"getPayload",
|
|
327
|
+
this.metrics
|
|
307
328
|
);
|
|
308
329
|
return {
|
|
309
330
|
executionPayload: payload,
|
|
@@ -317,7 +338,8 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
317
338
|
const {payload, blockValue, blobsBundle, executionRequests, shouldOverrideBuilder} = deserializeResponse(
|
|
318
339
|
BuiltPayloadElectra,
|
|
319
340
|
res.body,
|
|
320
|
-
"getPayload"
|
|
341
|
+
"getPayload",
|
|
342
|
+
this.metrics
|
|
321
343
|
);
|
|
322
344
|
return {
|
|
323
345
|
executionPayload: payload,
|
|
@@ -331,15 +353,16 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
331
353
|
const {payload, blockValue, blobsBundle, shouldOverrideBuilder} = deserializeResponse(
|
|
332
354
|
BuiltPayloadDeneb,
|
|
333
355
|
res.body,
|
|
334
|
-
"getPayload"
|
|
356
|
+
"getPayload",
|
|
357
|
+
this.metrics
|
|
335
358
|
);
|
|
336
359
|
return {executionPayload: payload, executionPayloadValue: blockValue, blobsBundle, shouldOverrideBuilder};
|
|
337
360
|
}
|
|
338
361
|
if (ForkSeq[fork] >= ForkSeq.capella) {
|
|
339
|
-
const {payload, blockValue} = deserializeResponse(BuiltPayloadCapella, res.body, "getPayload");
|
|
362
|
+
const {payload, blockValue} = deserializeResponse(BuiltPayloadCapella, res.body, "getPayload", this.metrics);
|
|
340
363
|
return {executionPayload: payload, executionPayloadValue: blockValue, shouldOverrideBuilder: false};
|
|
341
364
|
}
|
|
342
|
-
const {payload, blockValue} = deserializeResponse(BuiltPayloadBellatrix, res.body, "getPayload");
|
|
365
|
+
const {payload, blockValue} = deserializeResponse(BuiltPayloadBellatrix, res.body, "getPayload", this.metrics);
|
|
343
366
|
return {executionPayload: payload, executionPayloadValue: blockValue, shouldOverrideBuilder: false};
|
|
344
367
|
}
|
|
345
368
|
|
|
@@ -356,7 +379,7 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
356
379
|
},
|
|
357
380
|
getPayloadBodiesByHashOpts
|
|
358
381
|
);
|
|
359
|
-
const bodies = deserializeBodiesResponse(ForkName.gloas, res.body);
|
|
382
|
+
const bodies = deserializeBodiesResponse(ForkName.gloas, res.body, this.metrics);
|
|
360
383
|
if (bodies.length !== blockHashes.length) {
|
|
361
384
|
throw Error(`Invalid bodies response length=${bodies.length} blockHashes=${blockHashes.length}`);
|
|
362
385
|
}
|
|
@@ -374,7 +397,7 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
374
397
|
return versionedHashes.map(() => null);
|
|
375
398
|
}
|
|
376
399
|
|
|
377
|
-
const {entries} = deserializeResponse(BlobsV1Response, res.body, "getBlobsV1");
|
|
400
|
+
const {entries} = deserializeResponse(BlobsV1Response, res.body, "getBlobsV1", this.metrics);
|
|
378
401
|
if (entries.length !== versionedHashes.length) {
|
|
379
402
|
throw Error(`Invalid blobs/v1 response length=${entries.length} versionedHashes=${versionedHashes.length}`);
|
|
380
403
|
}
|
|
@@ -397,7 +420,7 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
397
420
|
return null;
|
|
398
421
|
}
|
|
399
422
|
|
|
400
|
-
const {entries} = deserializeResponse(BlobsV2Response, res.body, "getBlobsV2", {reuseBytes: true});
|
|
423
|
+
const {entries} = deserializeResponse(BlobsV2Response, res.body, "getBlobsV2", this.metrics, {reuseBytes: true});
|
|
401
424
|
if (entries.length !== versionedHashes.length) {
|
|
402
425
|
throw Error(`Invalid blobs/v2 response length=${entries.length} versionedHashes=${versionedHashes.length}`);
|
|
403
426
|
}
|
|
@@ -418,7 +441,7 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
418
441
|
{method: "GET", path: "/identity", responseType: "json"},
|
|
419
442
|
getClientVersionOpts
|
|
420
443
|
);
|
|
421
|
-
const versions = parseJson(body, "getClientVersion");
|
|
444
|
+
const versions = parseJson(body, "getClientVersion", this.metrics);
|
|
422
445
|
if (!Array.isArray(versions)) {
|
|
423
446
|
throw new EngineRestResponseError("getClientVersion", "Expected an array of client versions");
|
|
424
447
|
}
|
|
@@ -441,6 +464,10 @@ export class RestEngineTransport implements IEngineTransport {
|
|
|
441
464
|
};
|
|
442
465
|
});
|
|
443
466
|
}
|
|
467
|
+
|
|
468
|
+
getInclusionList(): Promise<bellatrix.Transactions> {
|
|
469
|
+
throw Error("engine_getInclusionListV1 is not available over the REST engine API");
|
|
470
|
+
}
|
|
444
471
|
}
|
|
445
472
|
|
|
446
473
|
function toPayloadAttributesBellatrix(attributes: PayloadAttributes) {
|
|
@@ -502,36 +529,54 @@ function toPayloadStatusResult(payloadStatus: PayloadStatusSsz): PayloadStatusRe
|
|
|
502
529
|
}
|
|
503
530
|
}
|
|
504
531
|
|
|
505
|
-
function deserializeBodiesResponse(
|
|
532
|
+
function deserializeBodiesResponse(
|
|
533
|
+
fork: ForkName,
|
|
534
|
+
data: Uint8Array,
|
|
535
|
+
metrics?: EngineTransportMetrics | null
|
|
536
|
+
): (ExecutionPayloadBodyV2 | null)[] {
|
|
506
537
|
if (ForkSeq[fork] >= ForkSeq.gloas) {
|
|
507
|
-
return deserializeResponse(BodiesResponseGloas, data, "getPayloadBodiesByHash").entries.map((entry) =>
|
|
538
|
+
return deserializeResponse(BodiesResponseGloas, data, "getPayloadBodiesByHash", metrics).entries.map((entry) =>
|
|
508
539
|
entry.available ? entry.body : null
|
|
509
540
|
);
|
|
510
541
|
}
|
|
511
542
|
if (ForkSeq[fork] >= ForkSeq.capella) {
|
|
512
|
-
return deserializeResponse(BodiesResponseCapella, data, "getPayloadBodiesByHash").entries.map((entry) =>
|
|
543
|
+
return deserializeResponse(BodiesResponseCapella, data, "getPayloadBodiesByHash", metrics).entries.map((entry) =>
|
|
513
544
|
entry.available ? {...entry.body, blockAccessList: null} : null
|
|
514
545
|
);
|
|
515
546
|
}
|
|
516
|
-
return deserializeResponse(BodiesResponseBellatrix, data, "getPayloadBodiesByHash").entries.map((entry) =>
|
|
547
|
+
return deserializeResponse(BodiesResponseBellatrix, data, "getPayloadBodiesByHash", metrics).entries.map((entry) =>
|
|
517
548
|
entry.available ? {transactions: entry.body.transactions, withdrawals: null, blockAccessList: null} : null
|
|
518
549
|
);
|
|
519
550
|
}
|
|
520
551
|
|
|
521
552
|
/** A 2xx response that does not decode is an execution client error, not an unreachable client */
|
|
522
|
-
function deserializeResponse<T>(
|
|
553
|
+
function deserializeResponse<T>(
|
|
554
|
+
type: Type<T>,
|
|
555
|
+
body: Uint8Array,
|
|
556
|
+
routeId: string,
|
|
557
|
+
metrics?: EngineTransportMetrics | null,
|
|
558
|
+
opts?: {reuseBytes?: boolean}
|
|
559
|
+
): T {
|
|
560
|
+
const timer = metrics?.responseParseTime.startTimer({routeId, encoding: "ssz"});
|
|
523
561
|
try {
|
|
524
562
|
return type.deserialize(body, opts);
|
|
525
563
|
} catch (e) {
|
|
526
564
|
throw new EngineRestResponseError(routeId, `Invalid SSZ: ${(e as Error).message}`);
|
|
565
|
+
} finally {
|
|
566
|
+
timer?.();
|
|
527
567
|
}
|
|
528
568
|
}
|
|
529
569
|
|
|
530
|
-
function parseJson(body: Uint8Array, routeId: string): unknown {
|
|
570
|
+
function parseJson(body: Uint8Array, routeId: string, metrics?: EngineTransportMetrics | null): unknown {
|
|
571
|
+
let timer: EndTimer | undefined;
|
|
531
572
|
try {
|
|
532
|
-
|
|
573
|
+
const text = textDecoder.decode(body);
|
|
574
|
+
timer = metrics?.responseParseTime.startTimer({routeId, encoding: "json"});
|
|
575
|
+
return JSON.parse(text);
|
|
533
576
|
} catch (e) {
|
|
534
577
|
throw new EngineRestResponseError(routeId, `Invalid JSON: ${(e as Error).message}`);
|
|
578
|
+
} finally {
|
|
579
|
+
timer?.();
|
|
535
580
|
}
|
|
536
581
|
}
|
|
537
582
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {ForkName} from "@lodestar/params";
|
|
2
|
-
import {BlobsBundle, ExecutionPayload, ExecutionRequests, Root, RootHex, Wei} from "@lodestar/types";
|
|
2
|
+
import {BlobsBundle, ExecutionPayload, ExecutionRequests, Root, RootHex, Wei, bellatrix} from "@lodestar/types";
|
|
3
3
|
import {BlobAndProof} from "@lodestar/types/deneb";
|
|
4
4
|
import {BlobAndProofV2} from "@lodestar/types/fulu";
|
|
5
5
|
import {ClientVersion, ExecutionPayloadStatus, PayloadAttributes, PayloadId, VersionedHashes} from "./interface.js";
|
|
@@ -10,6 +10,8 @@ export type PayloadStatusResult = {
|
|
|
10
10
|
status: ExecutionPayloadStatus;
|
|
11
11
|
latestValidHash: RootHex | null;
|
|
12
12
|
validationError: string | null;
|
|
13
|
+
/** PayloadStatusV2: whether a VALID payload satisfied the inclusion list constraints, null otherwise */
|
|
14
|
+
inclusionListSatisfied?: boolean | null;
|
|
13
15
|
};
|
|
14
16
|
|
|
15
17
|
export type ForkchoiceUpdatedResult = {
|
|
@@ -38,7 +40,8 @@ export interface IEngineTransport {
|
|
|
38
40
|
executionPayload: ExecutionPayload,
|
|
39
41
|
versionedHashes?: VersionedHashes,
|
|
40
42
|
parentBeaconBlockRoot?: Root,
|
|
41
|
-
executionRequests?: ExecutionRequests
|
|
43
|
+
executionRequests?: ExecutionRequests,
|
|
44
|
+
inclusionListTransactions?: bellatrix.Transactions
|
|
42
45
|
): Promise<PayloadStatusResult>;
|
|
43
46
|
|
|
44
47
|
forkchoiceUpdated(
|
|
@@ -58,4 +61,6 @@ export interface IEngineTransport {
|
|
|
58
61
|
getBlobsV2(versionedHashes: VersionedHashes, buffers?: Uint8Array[]): Promise<BlobAndProofV2[] | null>;
|
|
59
62
|
|
|
60
63
|
getClientVersion(clientVersion: ClientVersion): Promise<ClientVersion[]>;
|
|
64
|
+
|
|
65
|
+
getInclusionList(): Promise<bellatrix.Transactions>;
|
|
61
66
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {Counter} from "@lodestar/utils";
|
|
1
|
+
import {Counter, Histogram} from "@lodestar/utils";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Common metrics type for both json rpc and ssz transport.
|
|
@@ -6,4 +6,5 @@ import {Counter} from "@lodestar/utils";
|
|
|
6
6
|
export type EngineTransportMetrics = {
|
|
7
7
|
requestBytes: Counter<{routeId: string}>;
|
|
8
8
|
responseBytes: Counter<{routeId: string}>;
|
|
9
|
+
responseParseTime: Histogram<{routeId: string; encoding: "json" | "ssz"}>;
|
|
9
10
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import {Type} from "@chainsafe/ssz";
|
|
1
2
|
import {
|
|
2
3
|
BUILDER_DEPOSIT_REQUEST_TYPE,
|
|
3
4
|
BUILDER_EXIT_REQUEST_TYPE,
|
|
@@ -53,6 +54,7 @@ export type EngineApiRpcParamTypes = {
|
|
|
53
54
|
engine_newPayloadV3: [ExecutionPayloadRpc, VersionedHashesRpc, DATA];
|
|
54
55
|
engine_newPayloadV4: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc];
|
|
55
56
|
engine_newPayloadV5: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc];
|
|
57
|
+
engine_newPayloadV6: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc, InclusionListRpc];
|
|
56
58
|
/**
|
|
57
59
|
* 1. Object - Payload validity status with respect to the consensus rules:
|
|
58
60
|
* - blockHash: DATA, 32 Bytes - block hash value of the payload
|
|
@@ -74,6 +76,10 @@ export type EngineApiRpcParamTypes = {
|
|
|
74
76
|
forkChoiceData: {headBlockHash: DATA; safeBlockHash: DATA; finalizedBlockHash: DATA},
|
|
75
77
|
payloadAttributes?: PayloadAttributesRpc,
|
|
76
78
|
];
|
|
79
|
+
engine_forkchoiceUpdatedV5: [
|
|
80
|
+
forkChoiceData: {headBlockHash: DATA; safeBlockHash: DATA; finalizedBlockHash: DATA},
|
|
81
|
+
payloadAttributes?: PayloadAttributesRpc,
|
|
82
|
+
];
|
|
77
83
|
/**
|
|
78
84
|
* 1. payloadId: QUANTITY, 64 Bits - Identifier of the payload building process
|
|
79
85
|
*/
|
|
@@ -96,12 +102,16 @@ export type EngineApiRpcParamTypes = {
|
|
|
96
102
|
|
|
97
103
|
engine_getBlobsV1: [DATA[]];
|
|
98
104
|
engine_getBlobsV2: [DATA[]];
|
|
105
|
+
|
|
106
|
+
engine_getInclusionListV1: [];
|
|
99
107
|
};
|
|
100
108
|
|
|
101
109
|
export type PayloadStatus = {
|
|
102
110
|
status: ExecutionPayloadStatus;
|
|
103
111
|
latestValidHash: DATA | null;
|
|
104
112
|
validationError: string | null;
|
|
113
|
+
/** PayloadStatusV2: whether a VALID payload satisfied the inclusion list constraints, null otherwise */
|
|
114
|
+
inclusionListSatisfied?: boolean | null;
|
|
105
115
|
};
|
|
106
116
|
|
|
107
117
|
export type EngineApiRpcReturnTypes = {
|
|
@@ -114,6 +124,7 @@ export type EngineApiRpcReturnTypes = {
|
|
|
114
124
|
engine_newPayloadV3: PayloadStatus;
|
|
115
125
|
engine_newPayloadV4: PayloadStatus;
|
|
116
126
|
engine_newPayloadV5: PayloadStatus;
|
|
127
|
+
engine_newPayloadV6: PayloadStatus;
|
|
117
128
|
engine_forkchoiceUpdatedV1: {
|
|
118
129
|
payloadStatus: PayloadStatus;
|
|
119
130
|
payloadId: QUANTITY | null;
|
|
@@ -130,6 +141,10 @@ export type EngineApiRpcReturnTypes = {
|
|
|
130
141
|
payloadStatus: PayloadStatus;
|
|
131
142
|
payloadId: QUANTITY | null;
|
|
132
143
|
};
|
|
144
|
+
engine_forkchoiceUpdatedV5: {
|
|
145
|
+
payloadStatus: PayloadStatus;
|
|
146
|
+
payloadId: QUANTITY | null;
|
|
147
|
+
};
|
|
133
148
|
/**
|
|
134
149
|
* payloadId | Error: QUANTITY, 64 Bits - Identifier of the payload building process
|
|
135
150
|
*/
|
|
@@ -146,6 +161,8 @@ export type EngineApiRpcReturnTypes = {
|
|
|
146
161
|
|
|
147
162
|
engine_getBlobsV1: (BlobAndProofRpc | null)[];
|
|
148
163
|
engine_getBlobsV2: BlobAndProofV2Rpc[] | null;
|
|
164
|
+
|
|
165
|
+
engine_getInclusionListV1: InclusionListRpc;
|
|
149
166
|
};
|
|
150
167
|
|
|
151
168
|
type ExecutionPayloadRpcWithValue = {
|
|
@@ -260,8 +277,13 @@ export type PayloadAttributesRpc = {
|
|
|
260
277
|
slotNumber?: QUANTITY;
|
|
261
278
|
/** QUANTITY, 64 Bits - target value for the gasLimit field of the new payload (GLOAS, execution-apis#796) */
|
|
262
279
|
targetGasLimit?: QUANTITY;
|
|
280
|
+
/** Array of DATA - transactions that the built payload must include (PayloadAttributesV5, HEZE) */
|
|
281
|
+
inclusionListTransactions?: InclusionListRpc;
|
|
263
282
|
};
|
|
264
283
|
|
|
284
|
+
/** Array of DATA - array of transaction objects */
|
|
285
|
+
export type InclusionListRpc = DATA[];
|
|
286
|
+
|
|
265
287
|
export type ClientVersionRpc = {
|
|
266
288
|
/** ClientCode */
|
|
267
289
|
code: string;
|
|
@@ -441,6 +463,9 @@ export function serializePayloadAttributes(data: PayloadAttributes): PayloadAttr
|
|
|
441
463
|
parentBeaconBlockRoot: data.parentBeaconBlockRoot ? bytesToData(data.parentBeaconBlockRoot) : undefined,
|
|
442
464
|
slotNumber: data.slotNumber !== undefined ? numToQuantity(data.slotNumber) : undefined,
|
|
443
465
|
targetGasLimit: data.targetGasLimit !== undefined ? numToQuantity(data.targetGasLimit) : undefined,
|
|
466
|
+
inclusionListTransactions: data.inclusionListTransactions
|
|
467
|
+
? serializeInclusionList(data.inclusionListTransactions)
|
|
468
|
+
: undefined,
|
|
444
469
|
};
|
|
445
470
|
}
|
|
446
471
|
|
|
@@ -448,6 +473,14 @@ export function serializeBeaconBlockRoot(data: Root): DATA {
|
|
|
448
473
|
return bytesToData(data);
|
|
449
474
|
}
|
|
450
475
|
|
|
476
|
+
export function serializeInclusionList(data: bellatrix.Transactions): InclusionListRpc {
|
|
477
|
+
return data.map((transaction) => bytesToData(transaction));
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export function deserializeInclusionList(data: InclusionListRpc): bellatrix.Transactions {
|
|
481
|
+
return data.map((transaction) => dataToBytes(transaction, null));
|
|
482
|
+
}
|
|
483
|
+
|
|
451
484
|
export function deserializePayloadAttributes(data: PayloadAttributesRpc): PayloadAttributes {
|
|
452
485
|
return {
|
|
453
486
|
timestamp: quantityToNum(data.timestamp),
|
|
@@ -459,6 +492,9 @@ export function deserializePayloadAttributes(data: PayloadAttributesRpc): Payloa
|
|
|
459
492
|
parentBeaconBlockRoot: data.parentBeaconBlockRoot ? dataToBytes(data.parentBeaconBlockRoot, 32) : undefined,
|
|
460
493
|
slotNumber: data.slotNumber !== undefined ? quantityToNum(data.slotNumber) : undefined,
|
|
461
494
|
targetGasLimit: data.targetGasLimit !== undefined ? quantityToBigint(data.targetGasLimit) : undefined,
|
|
495
|
+
inclusionListTransactions: data.inclusionListTransactions
|
|
496
|
+
? deserializeInclusionList(data.inclusionListTransactions)
|
|
497
|
+
: undefined,
|
|
462
498
|
};
|
|
463
499
|
}
|
|
464
500
|
|
|
@@ -500,14 +536,15 @@ export function deserializeWithdrawal(serialized: WithdrawalRpc): capella.Withdr
|
|
|
500
536
|
}
|
|
501
537
|
|
|
502
538
|
/**
|
|
503
|
-
*
|
|
539
|
+
* Serialize requests prefixed with a single-byte requestType in one allocation
|
|
504
540
|
*/
|
|
505
|
-
function
|
|
506
|
-
const
|
|
507
|
-
|
|
508
|
-
|
|
541
|
+
function serializePrefixedRequests<T>(type: Type<T>, requests: T, requestType: ExecutionRequestType): Uint8Array {
|
|
542
|
+
const uint8Array = new Uint8Array(1 + type.value_serializedSize(requests));
|
|
543
|
+
const dataView = new DataView(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength);
|
|
544
|
+
uint8Array[0] = requestType;
|
|
545
|
+
type.value_serializeToBytes({uint8Array, dataView}, 1, requests);
|
|
509
546
|
|
|
510
|
-
return
|
|
547
|
+
return uint8Array;
|
|
511
548
|
}
|
|
512
549
|
|
|
513
550
|
/**
|
|
@@ -522,16 +559,16 @@ export function serializeExecutionRequestsToBytes(fork: ForkName, executionReque
|
|
|
522
559
|
const result: Uint8Array[] = [];
|
|
523
560
|
|
|
524
561
|
if (deposits.length !== 0) {
|
|
525
|
-
result.push(
|
|
562
|
+
result.push(serializePrefixedRequests(ssz.electra.DepositRequests, deposits, DEPOSIT_REQUEST_TYPE));
|
|
526
563
|
}
|
|
527
564
|
|
|
528
565
|
if (withdrawals.length !== 0) {
|
|
529
|
-
result.push(
|
|
566
|
+
result.push(serializePrefixedRequests(ssz.electra.WithdrawalRequests, withdrawals, WITHDRAWAL_REQUEST_TYPE));
|
|
530
567
|
}
|
|
531
568
|
|
|
532
569
|
if (consolidations.length !== 0) {
|
|
533
570
|
result.push(
|
|
534
|
-
|
|
571
|
+
serializePrefixedRequests(ssz.electra.ConsolidationRequests, consolidations, CONSOLIDATION_REQUEST_TYPE)
|
|
535
572
|
);
|
|
536
573
|
}
|
|
537
574
|
|
|
@@ -540,12 +577,12 @@ export function serializeExecutionRequestsToBytes(fork: ForkName, executionReque
|
|
|
540
577
|
|
|
541
578
|
if (builderDeposits.length !== 0) {
|
|
542
579
|
result.push(
|
|
543
|
-
|
|
580
|
+
serializePrefixedRequests(ssz.gloas.BuilderDepositRequests, builderDeposits, BUILDER_DEPOSIT_REQUEST_TYPE)
|
|
544
581
|
);
|
|
545
582
|
}
|
|
546
583
|
|
|
547
584
|
if (builderExits.length !== 0) {
|
|
548
|
-
result.push(
|
|
585
|
+
result.push(serializePrefixedRequests(ssz.gloas.BuilderExitRequests, builderExits, BUILDER_EXIT_REQUEST_TYPE));
|
|
549
586
|
}
|
|
550
587
|
}
|
|
551
588
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {ProducedBlockSource} from "@lodestar/types";
|
|
2
2
|
import {BlockSelectionResult} from "../../api/impl/validator/index.js";
|
|
3
|
+
import {InclusionListSource} from "../../chain/blocks/types.js";
|
|
3
4
|
import {BlockProductionStep, PayloadPreparationType} from "../../chain/produceBlock/index.js";
|
|
4
5
|
import {RegistryMetricCreator} from "../utils/registryMetricCreator.js";
|
|
5
6
|
|
|
@@ -432,5 +433,41 @@ export function createBeaconMetrics(register: RegistryMetricCreator) {
|
|
|
432
433
|
name: "beacon_weak_head_detected_total",
|
|
433
434
|
help: "Detected current head block is weak. May reorg it out when proposing next slot. See proposer boost reorg for more",
|
|
434
435
|
}),
|
|
436
|
+
|
|
437
|
+
// HEZE:EIP-7805
|
|
438
|
+
inclusionListsReceived: register.counter<{source: InclusionListSource}>({
|
|
439
|
+
name: "beacon_inclusion_lists_received_total",
|
|
440
|
+
help: "Total number of received inclusion lists",
|
|
441
|
+
labelNames: ["source"],
|
|
442
|
+
}),
|
|
443
|
+
inclusionListsValid: register.counter<{source: InclusionListSource}>({
|
|
444
|
+
name: "beacon_inclusion_lists_valid_total",
|
|
445
|
+
help: "Total number of valid inclusion lists",
|
|
446
|
+
labelNames: ["source"],
|
|
447
|
+
}),
|
|
448
|
+
inclusionListsValidSize: register.counter({
|
|
449
|
+
name: "beacon_inclusion_lists_valid_size_bytes_total",
|
|
450
|
+
help: "Total size of valid inclusion lists in bytes",
|
|
451
|
+
}),
|
|
452
|
+
inclusionListTransactionsReceived: register.counter<{source: InclusionListSource}>({
|
|
453
|
+
name: "beacon_inclusion_list_transactions_received_total",
|
|
454
|
+
help: "Total number of transactions in received inclusion lists",
|
|
455
|
+
labelNames: ["source"],
|
|
456
|
+
}),
|
|
457
|
+
inclusionListsPublished: register.counter({
|
|
458
|
+
name: "beacon_inclusion_lists_published_total",
|
|
459
|
+
help: "Total number of published inclusion lists",
|
|
460
|
+
}),
|
|
461
|
+
inclusionListsValidationTime: register.histogram<{source: InclusionListSource}>({
|
|
462
|
+
name: "beacon_inclusion_lists_validation_time_seconds",
|
|
463
|
+
help: "Time taken to validate inclusion lists",
|
|
464
|
+
buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5],
|
|
465
|
+
labelNames: ["source"],
|
|
466
|
+
}),
|
|
467
|
+
inclusionListArrivalTime: register.histogram({
|
|
468
|
+
name: "beacon_inclusion_lists_arrival_time_seconds",
|
|
469
|
+
help: "Inclusion list arrival time since the beginning of slot",
|
|
470
|
+
buckets: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
|
|
471
|
+
}),
|
|
435
472
|
};
|
|
436
473
|
}
|