@lodestar/beacon-node 1.50.0 → 1.51.0-dev.02c5a19f35
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 +50 -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 -15
- 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 +150 -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/blobVersionedHashes.d.ts +1 -1
- package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
- package/lib/execution/engine/blobVersionedHashes.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 +27 -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 +31 -7
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts +5 -3
- package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
- package/lib/execution/engine/payloadIdCache.js +15 -4
- 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/sszTypes.d.ts +38 -38
- 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 +25 -1
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +29 -15
- 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 +13 -19
- 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 +63 -17
- 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 +45 -20
- 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 +30 -30
- 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 +68 -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 -24
- 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 +192 -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/blobVersionedHashes.ts +1 -1
- package/src/execution/engine/disabled.ts +4 -0
- package/src/execution/engine/http.ts +40 -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 +32 -7
- package/src/execution/engine/payloadIdCache.ts +24 -6
- 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 +53 -16
- 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 +80 -20
- 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 +50 -30
- package/src/util/clock.ts +3 -4
- package/src/util/sszBytes.ts +25 -12
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import crypto from "node:crypto";
|
|
2
|
+
import {SerializedList} from "@chainsafe/ssz";
|
|
2
3
|
import {ChainConfig} from "@lodestar/config";
|
|
3
4
|
import {
|
|
4
5
|
BLOB_TX_TYPE,
|
|
@@ -137,10 +138,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
137
138
|
engine_newPayloadV3: this.notifyNewPayload.bind(this),
|
|
138
139
|
engine_newPayloadV4: this.notifyNewPayload.bind(this),
|
|
139
140
|
engine_newPayloadV5: this.notifyNewPayload.bind(this),
|
|
141
|
+
engine_newPayloadV6: this.notifyNewPayload.bind(this),
|
|
140
142
|
engine_forkchoiceUpdatedV1: this.notifyForkchoiceUpdate.bind(this),
|
|
141
143
|
engine_forkchoiceUpdatedV2: this.notifyForkchoiceUpdate.bind(this),
|
|
142
144
|
engine_forkchoiceUpdatedV3: this.notifyForkchoiceUpdate.bind(this),
|
|
143
145
|
engine_forkchoiceUpdatedV4: this.notifyForkchoiceUpdate.bind(this),
|
|
146
|
+
engine_forkchoiceUpdatedV5: this.notifyForkchoiceUpdate.bind(this),
|
|
144
147
|
engine_getPayloadV1: this.getPayloadV1.bind(this),
|
|
145
148
|
engine_getPayloadV2: this.getPayloadV5.bind(this),
|
|
146
149
|
engine_getPayloadV3: this.getPayloadV5.bind(this),
|
|
@@ -151,6 +154,7 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
151
154
|
engine_getClientVersionV1: this.getClientVersionV1.bind(this),
|
|
152
155
|
engine_getBlobsV1: this.getBlobs.bind(this),
|
|
153
156
|
engine_getBlobsV2: this.getBlobsV2.bind(this),
|
|
157
|
+
engine_getInclusionListV1: this.getInclusionList.bind(this),
|
|
154
158
|
};
|
|
155
159
|
}
|
|
156
160
|
|
|
@@ -234,7 +238,13 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
234
238
|
// IF the payload has been fully validated while processing the call
|
|
235
239
|
// RETURN payload status from the Payload validation process
|
|
236
240
|
// If validation succeeds, the response MUST contain {status: VALID, latestValidHash: payload.blockHash}
|
|
237
|
-
|
|
241
|
+
// The mock does not check inclusion list constraints, so every payload satisfies them (PayloadStatusV2)
|
|
242
|
+
return {
|
|
243
|
+
status: ExecutionPayloadStatus.VALID,
|
|
244
|
+
latestValidHash: blockHash,
|
|
245
|
+
validationError: null,
|
|
246
|
+
inclusionListSatisfied: true,
|
|
247
|
+
};
|
|
238
248
|
}
|
|
239
249
|
|
|
240
250
|
/**
|
|
@@ -343,14 +353,14 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
343
353
|
executionPayload.gasUsed = Math.floor(0.5 * INTEROP_GAS_LIMIT);
|
|
344
354
|
executionPayload.timestamp = payloadAttributes.timestamp;
|
|
345
355
|
executionPayload.blockHash = crypto.randomBytes(32);
|
|
346
|
-
|
|
356
|
+
const transactions: Uint8Array[] = [];
|
|
347
357
|
|
|
348
358
|
// Between 0 and 4 transactions for all forks
|
|
349
359
|
const eip1559TxCount = Math.round(4 * Math.random());
|
|
350
360
|
for (let i = 0; i < eip1559TxCount; i++) {
|
|
351
361
|
const tx = crypto.randomBytes(512);
|
|
352
362
|
tx[0] = TX_TYPE_EIP1559;
|
|
353
|
-
|
|
363
|
+
transactions.push(tx);
|
|
354
364
|
}
|
|
355
365
|
|
|
356
366
|
const commitments: deneb.KZGCommitment[] = [];
|
|
@@ -364,7 +374,7 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
364
374
|
const blob = generateRandomBlob();
|
|
365
375
|
const commitment = kzg.blobToKzgCommitment(blob);
|
|
366
376
|
const {proofs: cellProofs} = kzg.computeCellsAndKzgProofs(blob);
|
|
367
|
-
|
|
377
|
+
transactions.push(transactionForKzgCommitment(commitment));
|
|
368
378
|
commitments.push(commitment);
|
|
369
379
|
blobs.push(blob);
|
|
370
380
|
proofs.push(...cellProofs);
|
|
@@ -376,12 +386,13 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
376
386
|
const blob = generateRandomBlob();
|
|
377
387
|
const commitment = kzg.blobToKzgCommitment(blob);
|
|
378
388
|
const proof = kzg.computeBlobKzgProof(blob, commitment);
|
|
379
|
-
|
|
389
|
+
transactions.push(transactionForKzgCommitment(commitment));
|
|
380
390
|
commitments.push(commitment);
|
|
381
391
|
blobs.push(blob);
|
|
382
392
|
proofs.push(proof);
|
|
383
393
|
}
|
|
384
394
|
}
|
|
395
|
+
executionPayload.transactions = SerializedList.fromArray(transactions);
|
|
385
396
|
|
|
386
397
|
if (ForkSeq[fork] >= ForkSeq.capella) {
|
|
387
398
|
(executionPayload as ExecutionPayload<ForkPostCapella>).withdrawals = ssz.capella.Withdrawals.defaultValue();
|
|
@@ -409,7 +420,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
409
420
|
// IF the payload is deemed VALID and the build process has begun
|
|
410
421
|
// {payloadStatus: {status: VALID, latestValidHash: forkchoiceState.headBlockHash, validationError: null}, payloadId: buildProcessId}
|
|
411
422
|
return {
|
|
412
|
-
payloadStatus: {
|
|
423
|
+
payloadStatus: {
|
|
424
|
+
status: ExecutionPayloadStatus.VALID,
|
|
425
|
+
latestValidHash: null,
|
|
426
|
+
validationError: null,
|
|
427
|
+
inclusionListSatisfied: true,
|
|
428
|
+
},
|
|
413
429
|
payloadId: String(payloadId as number),
|
|
414
430
|
};
|
|
415
431
|
}
|
|
@@ -418,7 +434,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
418
434
|
// IF the payload is deemed VALID and a build process hasn't been started
|
|
419
435
|
// {payloadStatus: {status: VALID, latestValidHash: forkchoiceState.headBlockHash, validationError: null}, payloadId: null}
|
|
420
436
|
return {
|
|
421
|
-
payloadStatus: {
|
|
437
|
+
payloadStatus: {
|
|
438
|
+
status: ExecutionPayloadStatus.VALID,
|
|
439
|
+
latestValidHash: null,
|
|
440
|
+
validationError: null,
|
|
441
|
+
inclusionListSatisfied: true,
|
|
442
|
+
},
|
|
422
443
|
payloadId: null,
|
|
423
444
|
};
|
|
424
445
|
}
|
|
@@ -487,6 +508,10 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
|
|
|
487
508
|
return null;
|
|
488
509
|
}
|
|
489
510
|
|
|
511
|
+
private getInclusionList(): EngineApiRpcReturnTypes["engine_getInclusionListV1"] {
|
|
512
|
+
return [];
|
|
513
|
+
}
|
|
514
|
+
|
|
490
515
|
private timestampToFork(timestamp: number): ForkPostBellatrix {
|
|
491
516
|
if (timestamp >= this.gloasForkTimestamp) return ForkName.gloas;
|
|
492
517
|
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,13 +19,18 @@ export type WithdrawalV1 = {
|
|
|
17
19
|
amount: QUANTITY;
|
|
18
20
|
};
|
|
19
21
|
|
|
20
|
-
type FcuAttributes = {headBlockHash: DATA
|
|
22
|
+
type FcuAttributes = {headBlockHash: DATA} & Omit<PayloadAttributesRpc, "withdrawals" | "inclusionListTransactions"> & {
|
|
23
|
+
inclusionListTransactions?: bellatrix.Transactions;
|
|
24
|
+
};
|
|
21
25
|
|
|
22
26
|
export class PayloadIdCache {
|
|
23
|
-
private readonly payloadIdByFcuAttributes = new Map<
|
|
27
|
+
private readonly payloadIdByFcuAttributes = new Map<
|
|
28
|
+
string,
|
|
29
|
+
{payloadId: PayloadId; fullKey: string; inclusionListTransactions?: bellatrix.Transactions}
|
|
30
|
+
>();
|
|
24
31
|
|
|
25
|
-
getFullKey({headBlockHash,
|
|
26
|
-
return `${headBlockHash}-${
|
|
32
|
+
getFullKey({headBlockHash, timestamp, prevRandao, suggestedFeeRecipient}: FcuAttributes): string {
|
|
33
|
+
return `${headBlockHash}-${timestamp}-${prevRandao}-${suggestedFeeRecipient}`;
|
|
27
34
|
}
|
|
28
35
|
getKey({timestamp}: Pick<FcuAttributes, "timestamp">): string {
|
|
29
36
|
return timestamp;
|
|
@@ -37,7 +44,8 @@ export class PayloadIdCache {
|
|
|
37
44
|
add(fcuAttributes: FcuAttributes, payloadId: PayloadId): void {
|
|
38
45
|
const key = this.getKey(fcuAttributes);
|
|
39
46
|
const fullKey = this.getFullKey(fcuAttributes);
|
|
40
|
-
|
|
47
|
+
const {inclusionListTransactions} = fcuAttributes;
|
|
48
|
+
this.payloadIdByFcuAttributes.set(key, {payloadId, fullKey, inclusionListTransactions});
|
|
41
49
|
}
|
|
42
50
|
|
|
43
51
|
prune(): void {
|
|
@@ -49,6 +57,16 @@ export class PayloadIdCache {
|
|
|
49
57
|
const key = this.getKey(fcuAttributes);
|
|
50
58
|
const fullKey = this.getFullKey(fcuAttributes);
|
|
51
59
|
const payloadInfo = this.payloadIdByFcuAttributes.get(key);
|
|
52
|
-
return payloadInfo?.fullKey === fullKey
|
|
60
|
+
return payloadInfo?.fullKey === fullKey &&
|
|
61
|
+
isSameInclusionList(payloadInfo.inclusionListTransactions, fcuAttributes.inclusionListTransactions)
|
|
62
|
+
? payloadInfo.payloadId
|
|
63
|
+
: undefined;
|
|
53
64
|
}
|
|
54
65
|
}
|
|
66
|
+
|
|
67
|
+
function isSameInclusionList(a?: bellatrix.Transactions, b?: bellatrix.Transactions): boolean {
|
|
68
|
+
if (a === undefined || b === undefined) {
|
|
69
|
+
return a === b;
|
|
70
|
+
}
|
|
71
|
+
return byteArrayEquals(a.bytes, b.bytes);
|
|
72
|
+
}
|
|
@@ -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 {SerializedList, 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 = {
|
|
@@ -164,7 +181,7 @@ export type ExecutionPayloadBodyRpc = {
|
|
|
164
181
|
};
|
|
165
182
|
|
|
166
183
|
export type ExecutionPayloadBody = {
|
|
167
|
-
transactions: bellatrix.
|
|
184
|
+
transactions: bellatrix.Transactions;
|
|
168
185
|
withdrawals: capella.Withdrawals | null;
|
|
169
186
|
};
|
|
170
187
|
|
|
@@ -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;
|
|
@@ -294,7 +316,7 @@ export function serializeExecutionPayload(fork: ForkName, data: ExecutionPayload
|
|
|
294
316
|
extraData: bytesToData(data.extraData),
|
|
295
317
|
baseFeePerGas: numToQuantity(data.baseFeePerGas),
|
|
296
318
|
blockHash: bytesToData(data.blockHash),
|
|
297
|
-
transactions: data.transactions
|
|
319
|
+
transactions: Array.from(data.transactions, (tran) => bytesToData(tran)),
|
|
298
320
|
};
|
|
299
321
|
|
|
300
322
|
// Capella adds withdrawals to the ExecutionPayload
|
|
@@ -378,7 +400,7 @@ export function parseExecutionPayload(
|
|
|
378
400
|
extraData: dataToBytes(data.extraData, null),
|
|
379
401
|
baseFeePerGas: quantityToBigint(data.baseFeePerGas),
|
|
380
402
|
blockHash: dataToBytes(data.blockHash, 32),
|
|
381
|
-
transactions: data.transactions.map((tran) => dataToBytes(tran, null)),
|
|
403
|
+
transactions: SerializedList.fromArray(data.transactions.map((tran) => dataToBytes(tran, null))),
|
|
382
404
|
};
|
|
383
405
|
|
|
384
406
|
if (ForkSeq[fork] >= ForkSeq.capella) {
|
|
@@ -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 Array.from(data, (transaction) => bytesToData(transaction));
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export function deserializeInclusionList(data: InclusionListRpc): bellatrix.Transactions {
|
|
481
|
+
return SerializedList.fromArray(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
|
|
|
@@ -633,7 +670,7 @@ export function deserializeExecutionRequests(fork: ForkName, serialized: Executi
|
|
|
633
670
|
export function deserializeExecutionPayloadBody(data: ExecutionPayloadBodyRpc | null): ExecutionPayloadBody | null {
|
|
634
671
|
return data
|
|
635
672
|
? {
|
|
636
|
-
transactions: data.transactions.map((tran) => dataToBytes(tran, null)),
|
|
673
|
+
transactions: SerializedList.fromArray(data.transactions.map((tran) => dataToBytes(tran, null))),
|
|
637
674
|
withdrawals: data.withdrawals ? data.withdrawals.map(deserializeWithdrawal) : null,
|
|
638
675
|
}
|
|
639
676
|
: null;
|
|
@@ -656,7 +693,7 @@ export function serializeExecutionPayloadBodyV2(data: ExecutionPayloadBodyV2 | n
|
|
|
656
693
|
export function serializeExecutionPayloadBody(data: ExecutionPayloadBody | null): ExecutionPayloadBodyRpc | null {
|
|
657
694
|
return data
|
|
658
695
|
? {
|
|
659
|
-
transactions: data.transactions
|
|
696
|
+
transactions: Array.from(data.transactions, (tran) => bytesToData(tran)),
|
|
660
697
|
withdrawals: data.withdrawals ? data.withdrawals.map(serializeWithdrawal) : null,
|
|
661
698
|
}
|
|
662
699
|
: null;
|