@lodestar/beacon-node 1.43.0-rc.5 → 1.44.0-dev.00facd40a8
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 +30 -0
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +46 -5
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts.map +1 -1
- package/lib/api/impl/debug/index.js +69 -12
- 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 +119 -53
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +5 -2
- 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 +5 -3
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/chain.d.ts +3 -2
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +5 -2
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/errors/executionPayloadBid.d.ts +29 -1
- package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadBid.js +5 -0
- package/lib/chain/errors/executionPayloadBid.js.map +1 -1
- package/lib/chain/errors/payloadAttestation.d.ts +6 -0
- package/lib/chain/errors/payloadAttestation.d.ts.map +1 -1
- package/lib/chain/errors/payloadAttestation.js +1 -0
- package/lib/chain/errors/payloadAttestation.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +14 -4
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/interface.d.ts +2 -1
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/lightClient/index.d.ts.map +1 -1
- package/lib/chain/lightClient/index.js +1 -1
- package/lib/chain/lightClient/index.js.map +1 -1
- package/lib/chain/opPools/executionPayloadBidPool.d.ts +4 -4
- package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -1
- package/lib/chain/opPools/executionPayloadBidPool.js +6 -4
- package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -1
- 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/opPools/payloadAttestationPool.d.ts +1 -1
- package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.js +30 -10
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/proposerPreferencesPool.d.ts +29 -0
- package/lib/chain/opPools/proposerPreferencesPool.d.ts.map +1 -0
- package/lib/chain/opPools/proposerPreferencesPool.js +56 -0
- package/lib/chain/opPools/proposerPreferencesPool.js.map +1 -0
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +2 -1
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +7 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +107 -18
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +2 -0
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +2 -0
- package/lib/chain/regen/interface.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts +7 -3
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +119 -28
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.d.ts +1 -1
- package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js +29 -7
- package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +1 -0
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +16 -0
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/execution/builder/index.d.ts +1 -2
- package/lib/execution/builder/index.d.ts.map +1 -1
- package/lib/execution/builder/index.js +0 -1
- package/lib/execution/builder/index.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +1 -0
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +2 -0
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +2 -0
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +1 -1
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +4 -3
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +1 -1
- package/lib/network/interface.d.ts +2 -0
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/network.d.ts +2 -0
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +10 -0
- package/lib/network/network.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +19 -6
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +5 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +3 -3
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +2 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +15 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/index.js +2 -2
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +1 -1
- package/lib/network/reqresp/utils/dataColumnResponseValidation.js +8 -0
- package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
- package/lib/util/dependentRoot.d.ts +6 -2
- package/lib/util/dependentRoot.d.ts.map +1 -1
- package/lib/util/dependentRoot.js +20 -16
- package/lib/util/dependentRoot.js.map +1 -1
- package/package.json +14 -15
- package/src/api/impl/beacon/blocks/index.ts +36 -0
- package/src/api/impl/beacon/pool/index.ts +59 -4
- package/src/api/impl/debug/index.ts +73 -12
- package/src/api/impl/validator/index.ts +131 -54
- package/src/chain/blocks/importBlock.ts +10 -2
- package/src/chain/blocks/importExecutionPayload.ts +8 -2
- package/src/chain/chain.ts +5 -0
- package/src/chain/errors/executionPayloadBid.ts +27 -1
- package/src/chain/errors/payloadAttestation.ts +2 -0
- package/src/chain/forkChoice/index.ts +14 -4
- package/src/chain/interface.ts +2 -0
- package/src/chain/lightClient/index.ts +6 -6
- package/src/chain/opPools/executionPayloadBidPool.ts +10 -9
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/opPools/payloadAttestationPool.ts +34 -10
- package/src/chain/opPools/proposerPreferencesPool.ts +59 -0
- package/src/chain/prepareNextSlot.ts +2 -1
- package/src/chain/produceBlock/produceBlockBody.ts +158 -25
- package/src/chain/regen/interface.ts +2 -0
- package/src/chain/validation/executionPayloadBid.ts +130 -33
- package/src/chain/validation/payloadAttestationMessage.ts +32 -8
- package/src/chain/validatorMonitor.ts +18 -0
- package/src/execution/builder/index.ts +1 -4
- package/src/execution/engine/interface.ts +1 -0
- package/src/execution/engine/types.ts +4 -0
- package/src/metrics/metrics/lodestar.ts +4 -3
- package/src/network/interface.ts +2 -0
- package/src/network/network.ts +22 -0
- package/src/network/processor/gossipHandlers.ts +25 -6
- package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +6 -0
- package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +1 -1
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +3 -3
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +20 -1
- package/src/network/reqresp/handlers/index.ts +2 -2
- package/src/network/reqresp/utils/dataColumnResponseValidation.ts +8 -0
- package/src/util/dependentRoot.ts +22 -18
- package/lib/execution/builder/utils.d.ts +0 -5
- package/lib/execution/builder/utils.d.ts.map +0 -1
- package/lib/execution/builder/utils.js +0 -17
- package/lib/execution/builder/utils.js.map +0 -1
- package/src/execution/builder/utils.ts +0 -19
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ForkSeq } from "@lodestar/params";
|
|
1
2
|
import { RespStatus, ResponseError } from "@lodestar/reqresp";
|
|
2
3
|
import { prettyBytes, prettyPrintIndices, toRootHex } from "@lodestar/utils";
|
|
3
4
|
import { getBlobKzgCommitmentsCountFromSignedBeaconBlockSerialized } from "../../../util/sszBytes.js";
|
|
@@ -12,6 +13,13 @@ export async function handleColumnSidecarUnavailability({ chain, db, metrics, un
|
|
|
12
13
|
logData.blockRoot = prettyBytes(blockRoot);
|
|
13
14
|
}
|
|
14
15
|
chain.logger.debug("dataColumnSidecar requested unavailable", logData);
|
|
16
|
+
// Post-gloas, columns exist only for FULL blocks; a finalized block is FULL if its envelope was
|
|
17
|
+
// archived. Bid blobsCount is unreliable here since an EMPTY block's bid may still commit to blobs
|
|
18
|
+
if (blockRoot === undefined && chain.config.getForkSeq(slot) >= ForkSeq.gloas) {
|
|
19
|
+
const envelopeBytes = await db.executionPayloadEnvelopeArchive.getBinary(slot);
|
|
20
|
+
if (!envelopeBytes)
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
15
23
|
const blockBytes = blockRoot ? await db.block.getBinary(blockRoot) : await db.blockArchive.getBinary(slot);
|
|
16
24
|
if (!blockBytes) {
|
|
17
25
|
chain.logger.verbose(`Expected ${blockRoot ? "unfinalized" : "finalized"} block not found while handling unavailable dataColumnSidecar`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataColumnResponseValidation.js","sourceRoot":"","sources":["../../../../src/network/reqresp/utils/dataColumnResponseValidation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dataColumnResponseValidation.js","sourceRoot":"","sources":["../../../../src/network/reqresp/utils/dataColumnResponseValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { IForkChoice, ProtoBlock } from "@lodestar/fork-choice";
|
|
2
2
|
import { Epoch, RootHex } from "@lodestar/types";
|
|
3
3
|
/**
|
|
4
|
-
* Get dependent root of a shuffling given
|
|
4
|
+
* Get dependent root of a shuffling given a message epoch and a proto block.
|
|
5
|
+
*
|
|
6
|
+
* Pre-gloas, this is used for attestation validation
|
|
7
|
+
* Post-gloas, this is also used for execution_payload_bid validation because post-fulu,
|
|
8
|
+
* a dependent root of a proposal duties is 1-epoch look ahead (instead of 0 as of pre-fulu)
|
|
5
9
|
*/
|
|
6
|
-
export declare function getShufflingDependentRoot(forkChoice: IForkChoice,
|
|
10
|
+
export declare function getShufflingDependentRoot(forkChoice: IForkChoice, msgEpoch: Epoch, protoBlockEpoch: Epoch, protoBlock: ProtoBlock): RootHex;
|
|
7
11
|
//# sourceMappingURL=dependentRoot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependentRoot.d.ts","sourceRoot":"","sources":["../../src/util/dependentRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAE,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAC,KAAK,EAAE,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAE/C
|
|
1
|
+
{"version":3,"file":"dependentRoot.d.ts","sourceRoot":"","sources":["../../src/util/dependentRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAE,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAC,KAAK,EAAE,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,WAAW,EACvB,QAAQ,EAAE,KAAK,EACf,eAAe,EAAE,KAAK,EACtB,UAAU,EAAE,UAAU,GACrB,OAAO,CAmCT"}
|
|
@@ -1,42 +1,46 @@
|
|
|
1
1
|
import { EpochDifference } from "@lodestar/fork-choice";
|
|
2
2
|
/**
|
|
3
|
-
* Get dependent root of a shuffling given
|
|
3
|
+
* Get dependent root of a shuffling given a message epoch and a proto block.
|
|
4
|
+
*
|
|
5
|
+
* Pre-gloas, this is used for attestation validation
|
|
6
|
+
* Post-gloas, this is also used for execution_payload_bid validation because post-fulu,
|
|
7
|
+
* a dependent root of a proposal duties is 1-epoch look ahead (instead of 0 as of pre-fulu)
|
|
4
8
|
*/
|
|
5
|
-
export function getShufflingDependentRoot(forkChoice,
|
|
9
|
+
export function getShufflingDependentRoot(forkChoice, msgEpoch, protoBlockEpoch, protoBlock) {
|
|
6
10
|
let shufflingDependentRoot;
|
|
7
|
-
if (
|
|
11
|
+
if (protoBlockEpoch === msgEpoch) {
|
|
8
12
|
// current shuffling, this is equivalent to `headState.currentShuffling`
|
|
9
|
-
// given
|
|
13
|
+
// given protoBlockEpoch = msgEpoch = n
|
|
10
14
|
// epoch: (n-2) (n-1) n (n+1)
|
|
11
15
|
// |-------|-------|-------|-------|
|
|
12
|
-
//
|
|
16
|
+
// protoBlock ------------------------^
|
|
13
17
|
// shufflingDependentRoot ------^
|
|
14
|
-
shufflingDependentRoot = forkChoice.getDependentRoot(
|
|
18
|
+
shufflingDependentRoot = forkChoice.getDependentRoot(protoBlock, EpochDifference.previous);
|
|
15
19
|
}
|
|
16
|
-
else if (
|
|
20
|
+
else if (protoBlockEpoch === msgEpoch - 1) {
|
|
17
21
|
// next shuffling, this is equivalent to `headState.nextShuffling`
|
|
18
|
-
// given
|
|
22
|
+
// given protoBlockEpoch = n-1, msgEpoch = n
|
|
19
23
|
// epoch: (n-2) (n-1) n (n+1)
|
|
20
24
|
// |-------|-------|-------|-------|
|
|
21
|
-
//
|
|
25
|
+
// protoBlock -------------------^
|
|
22
26
|
// shufflingDependentRoot ------^
|
|
23
|
-
shufflingDependentRoot = forkChoice.getDependentRoot(
|
|
27
|
+
shufflingDependentRoot = forkChoice.getDependentRoot(protoBlock, EpochDifference.current);
|
|
24
28
|
}
|
|
25
|
-
else if (
|
|
29
|
+
else if (protoBlockEpoch < msgEpoch - 1) {
|
|
26
30
|
// this never happens with default chain option of maxSkipSlots = 32, however we still need to handle it
|
|
27
31
|
// check the verifyHeadBlockAndTargetRoot() function above
|
|
28
|
-
// given
|
|
32
|
+
// given protoBlockEpoch = n-2, msgEpoch = n
|
|
29
33
|
// epoch: (n-2) (n-1) n (n+1)
|
|
30
34
|
// |-------|-------|-------|-------|
|
|
31
|
-
//
|
|
35
|
+
// protoBlock -----------^
|
|
32
36
|
// shufflingDependentRoot -----^
|
|
33
|
-
shufflingDependentRoot =
|
|
37
|
+
shufflingDependentRoot = protoBlock.blockRoot;
|
|
34
38
|
// use lodestar_gossip_attestation_head_slot_to_attestation_slot metric to track this case
|
|
35
39
|
}
|
|
36
40
|
else {
|
|
37
|
-
//
|
|
41
|
+
// protoBlockEpoch > msgEpoch
|
|
38
42
|
// should not happen, handled in verifyAttestationTargetRoot
|
|
39
|
-
throw Error(`
|
|
43
|
+
throw Error(`message epoch ${msgEpoch} is before proto block epoch ${protoBlockEpoch}`);
|
|
40
44
|
}
|
|
41
45
|
return shufflingDependentRoot;
|
|
42
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependentRoot.js","sourceRoot":"","sources":["../../src/util/dependentRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAA0B,MAAM,uBAAuB,CAAC;AAG/E
|
|
1
|
+
{"version":3,"file":"dependentRoot.js","sourceRoot":"","sources":["../../src/util/dependentRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAA0B,MAAM,uBAAuB,CAAC;AAG/E;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CACvC,UAAuB,EACvB,QAAe,EACf,eAAsB,EACtB,UAAsB,EACb;IACT,IAAI,sBAA+B,CAAC;IACpC,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;QACjC,wEAAwE;QACxE,uCAAuC;QACvC,oDAAoD;QACpD,kDAAkD;QAClD,6CAA6C;QAC7C,iCAAiC;QACjC,sBAAsB,GAAG,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC7F,CAAC;SAAM,IAAI,eAAe,KAAK,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC5C,kEAAkE;QAClE,4CAA4C;QAC5C,oDAAoD;QACpD,kDAAkD;QAClD,wCAAwC;QACxC,iCAAiC;QACjC,sBAAsB,GAAG,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5F,CAAC;SAAM,IAAI,eAAe,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC1C,wGAAwG;QACxG,0DAA0D;QAC1D,4CAA4C;QAC5C,oDAAoD;QACpD,kDAAkD;QAClD,gCAAgC;QAChC,gCAAgC;QAChC,sBAAsB,GAAG,UAAU,CAAC,SAAS,CAAC;QAC9C,0FAA0F;IAC5F,CAAC;SAAM,CAAC;QACN,6BAA6B;QAC7B,4DAA4D;QAC5D,MAAM,KAAK,CAAC,iBAAiB,QAAQ,gCAAgC,eAAe,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,sBAAsB,CAAC;AAAA,CAC/B"}
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"bugs": {
|
|
12
12
|
"url": "https://github.com/ChainSafe/lodestar/issues"
|
|
13
13
|
},
|
|
14
|
-
"version": "1.
|
|
14
|
+
"version": "1.44.0-dev.00facd40a8",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -135,18 +135,17 @@
|
|
|
135
135
|
"@libp2p/peer-id": "^6.0.4",
|
|
136
136
|
"@libp2p/prometheus-metrics": "^5.0.14",
|
|
137
137
|
"@libp2p/tcp": "^11.0.13",
|
|
138
|
-
"@lodestar/api": "^1.
|
|
139
|
-
"@lodestar/config": "^1.
|
|
140
|
-
"@lodestar/db": "^1.
|
|
141
|
-
"@lodestar/fork-choice": "^1.
|
|
142
|
-
"@lodestar/
|
|
143
|
-
"@lodestar/
|
|
144
|
-
"@lodestar/
|
|
145
|
-
"@lodestar/
|
|
146
|
-
"@lodestar/
|
|
147
|
-
"@lodestar/
|
|
148
|
-
"@lodestar/
|
|
149
|
-
"@lodestar/validator": "^1.43.0-rc.5",
|
|
138
|
+
"@lodestar/api": "^1.44.0-dev.00facd40a8",
|
|
139
|
+
"@lodestar/config": "^1.44.0-dev.00facd40a8",
|
|
140
|
+
"@lodestar/db": "^1.44.0-dev.00facd40a8",
|
|
141
|
+
"@lodestar/fork-choice": "^1.44.0-dev.00facd40a8",
|
|
142
|
+
"@lodestar/logger": "^1.44.0-dev.00facd40a8",
|
|
143
|
+
"@lodestar/params": "^1.44.0-dev.00facd40a8",
|
|
144
|
+
"@lodestar/reqresp": "^1.44.0-dev.00facd40a8",
|
|
145
|
+
"@lodestar/state-transition": "^1.44.0-dev.00facd40a8",
|
|
146
|
+
"@lodestar/types": "^1.44.0-dev.00facd40a8",
|
|
147
|
+
"@lodestar/utils": "^1.44.0-dev.00facd40a8",
|
|
148
|
+
"@lodestar/validator": "^1.44.0-dev.00facd40a8",
|
|
150
149
|
"@multiformats/multiaddr": "^13.0.1",
|
|
151
150
|
"datastore-core": "^11.0.2",
|
|
152
151
|
"datastore-fs": "^11.0.2",
|
|
@@ -169,7 +168,7 @@
|
|
|
169
168
|
"@libp2p/interface-internal": "^3.0.13",
|
|
170
169
|
"@libp2p/logger": "^6.2.2",
|
|
171
170
|
"@libp2p/utils": "^7.0.13",
|
|
172
|
-
"@lodestar/spec-test-util": "^1.
|
|
171
|
+
"@lodestar/spec-test-util": "^1.44.0-dev.00facd40a8",
|
|
173
172
|
"@types/js-yaml": "^4.0.5",
|
|
174
173
|
"@types/qs": "^6.9.7",
|
|
175
174
|
"@types/tmp": "^0.2.3",
|
|
@@ -187,5 +186,5 @@
|
|
|
187
186
|
"beacon",
|
|
188
187
|
"blockchain"
|
|
189
188
|
],
|
|
190
|
-
"gitHead": "
|
|
189
|
+
"gitHead": "62bc70996cb95d7ff64f264cf62c956ba28223aa"
|
|
191
190
|
}
|
|
@@ -50,6 +50,7 @@ import {
|
|
|
50
50
|
ProduceFullGloas,
|
|
51
51
|
} from "../../../../chain/produceBlock/index.js";
|
|
52
52
|
import {validateGossipBlock} from "../../../../chain/validation/block.js";
|
|
53
|
+
import {validateApiExecutionPayloadBid} from "../../../../chain/validation/executionPayloadBid.js";
|
|
53
54
|
import {validateApiExecutionPayloadEnvelope} from "../../../../chain/validation/executionPayloadEnvelope.js";
|
|
54
55
|
import {OpSource} from "../../../../chain/validatorMonitor.js";
|
|
55
56
|
import {
|
|
@@ -825,6 +826,41 @@ export function getBeaconBlockApi({
|
|
|
825
826
|
});
|
|
826
827
|
},
|
|
827
828
|
|
|
829
|
+
async publishExecutionPayloadBid({signedExecutionPayloadBid}) {
|
|
830
|
+
const bid = signedExecutionPayloadBid.message;
|
|
831
|
+
const slot = bid.slot;
|
|
832
|
+
const fork = config.getForkName(slot);
|
|
833
|
+
|
|
834
|
+
if (!isForkPostGloas(fork)) {
|
|
835
|
+
throw new ApiError(400, `publishExecutionPayloadBid not supported for pre-gloas fork=${fork}`);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
await validateApiExecutionPayloadBid(chain, signedExecutionPayloadBid);
|
|
839
|
+
|
|
840
|
+
try {
|
|
841
|
+
const insertOutcome = chain.executionPayloadBidPool.add(signedExecutionPayloadBid);
|
|
842
|
+
metrics?.opPool.executionPayloadBidPool.apiInsertOutcome.inc({insertOutcome});
|
|
843
|
+
} catch (e) {
|
|
844
|
+
chain.logger.error("Error adding to executionPayloadBid pool", {}, e as Error);
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
const sentPeers = await network.publishSignedExecutionPayloadBid(signedExecutionPayloadBid);
|
|
848
|
+
|
|
849
|
+
chain.emitter.emit(routes.events.EventType.executionPayloadBid, {
|
|
850
|
+
version: fork,
|
|
851
|
+
data: signedExecutionPayloadBid,
|
|
852
|
+
});
|
|
853
|
+
|
|
854
|
+
chain.logger.info("Published execution payload bid", {
|
|
855
|
+
slot,
|
|
856
|
+
builderIndex: bid.builderIndex,
|
|
857
|
+
blockHash: toRootHex(bid.blockHash),
|
|
858
|
+
parentBlockHash: toRootHex(bid.parentBlockHash),
|
|
859
|
+
value: bid.value,
|
|
860
|
+
sentPeers,
|
|
861
|
+
});
|
|
862
|
+
},
|
|
863
|
+
|
|
828
864
|
async getSignedExecutionPayloadEnvelope({blockId}, context) {
|
|
829
865
|
const {block, executionOptimistic, finalized} = await getBlockResponse(chain, blockId);
|
|
830
866
|
const slot = block.message.slot;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
2
|
import {ApplicationMethods} from "@lodestar/api/server";
|
|
3
3
|
import {
|
|
4
|
+
ForkName,
|
|
4
5
|
ForkPostElectra,
|
|
5
6
|
ForkPreElectra,
|
|
6
7
|
SYNC_COMMITTEE_SUBNET_SIZE,
|
|
@@ -16,12 +17,15 @@ import {
|
|
|
16
17
|
GossipAction,
|
|
17
18
|
PayloadAttestationError,
|
|
18
19
|
PayloadAttestationErrorCode,
|
|
20
|
+
ProposerPreferencesError,
|
|
21
|
+
ProposerPreferencesErrorCode,
|
|
19
22
|
SyncCommitteeError,
|
|
20
23
|
} from "../../../../chain/errors/index.js";
|
|
21
24
|
import {validateApiAttesterSlashing} from "../../../../chain/validation/attesterSlashing.js";
|
|
22
25
|
import {validateApiBlsToExecutionChange} from "../../../../chain/validation/blsToExecutionChange.js";
|
|
23
26
|
import {toElectraSingleAttestation, validateApiAttestation} from "../../../../chain/validation/index.js";
|
|
24
27
|
import {validateApiPayloadAttestationMessage} from "../../../../chain/validation/payloadAttestationMessage.js";
|
|
28
|
+
import {validateGossipProposerPreferences} from "../../../../chain/validation/proposerPreferences.js";
|
|
25
29
|
import {validateApiProposerSlashing} from "../../../../chain/validation/proposerSlashing.js";
|
|
26
30
|
import {validateApiSyncCommittee} from "../../../../chain/validation/syncCommittee.js";
|
|
27
31
|
import {validateApiVoluntaryExit} from "../../../../chain/validation/voluntaryExit.js";
|
|
@@ -81,6 +85,55 @@ export function getBeaconPoolApi({
|
|
|
81
85
|
return {data: chain.payloadAttestationPool.getAll(slot), meta: {version: fork}};
|
|
82
86
|
},
|
|
83
87
|
|
|
88
|
+
async getPoolProposerPreferences({slot}) {
|
|
89
|
+
const fork = chain.config.getForkName(slot ?? chain.clock.currentSlot);
|
|
90
|
+
if (!isForkPostGloas(fork)) {
|
|
91
|
+
throw new ApiError(400, `Proposer preferences pool is not supported before Gloas fork=${fork}`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {data: chain.proposerPreferencesPool.getAll(slot), meta: {version: fork}};
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
async submitSignedProposerPreferences({signedProposerPreferences}) {
|
|
98
|
+
const failures: FailureList = [];
|
|
99
|
+
|
|
100
|
+
await Promise.all(
|
|
101
|
+
signedProposerPreferences.map(async (signed, i) => {
|
|
102
|
+
try {
|
|
103
|
+
await validateGossipProposerPreferences(chain, signed);
|
|
104
|
+
|
|
105
|
+
chain.proposerPreferencesPool.add(signed);
|
|
106
|
+
await network.publishProposerPreferences(signed);
|
|
107
|
+
chain.emitter.emit(routes.events.EventType.proposerPreferences, {
|
|
108
|
+
version: ForkName.gloas,
|
|
109
|
+
data: signed,
|
|
110
|
+
});
|
|
111
|
+
} catch (e) {
|
|
112
|
+
const logCtx = {
|
|
113
|
+
slot: signed.message.proposalSlot,
|
|
114
|
+
validatorIndex: signed.message.validatorIndex,
|
|
115
|
+
dependentRoot: toRootHex(signed.message.dependentRoot),
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
if (e instanceof ProposerPreferencesError && e.type.code === ProposerPreferencesErrorCode.ALREADY_KNOWN) {
|
|
119
|
+
logger.debug("Ignoring known signed proposer preferences", logCtx);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
failures.push({index: i, message: (e as Error).message});
|
|
124
|
+
logger.verbose(`Error on submitSignedProposerPreferences [${i}]`, logCtx, e as Error);
|
|
125
|
+
if (e instanceof ProposerPreferencesError && e.action === GossipAction.REJECT) {
|
|
126
|
+
chain.persistInvalidSszValue(ssz.gloas.SignedProposerPreferences, signed, "api_reject");
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
})
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
if (failures.length > 0) {
|
|
133
|
+
throw new IndexedError("Error processing signed proposer preferences", failures);
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
|
|
84
137
|
async getPoolAttesterSlashings() {
|
|
85
138
|
const fork = chain.config.getForkName(chain.clock.currentSlot);
|
|
86
139
|
|
|
@@ -258,7 +311,7 @@ export function getBeaconPoolApi({
|
|
|
258
311
|
try {
|
|
259
312
|
const validateFn = () => validateApiPayloadAttestationMessage(chain, payloadAttestationMessage);
|
|
260
313
|
const {slot, beaconBlockRoot} = payloadAttestationMessage.data;
|
|
261
|
-
const {attDataRootHex,
|
|
314
|
+
const {attDataRootHex, validatorCommitteeIndices} = await validateGossipFnRetryUnknownRoot(
|
|
262
315
|
validateFn,
|
|
263
316
|
network,
|
|
264
317
|
chain,
|
|
@@ -269,14 +322,16 @@ export function getBeaconPoolApi({
|
|
|
269
322
|
const insertOutcome = chain.payloadAttestationPool.add(
|
|
270
323
|
payloadAttestationMessage,
|
|
271
324
|
attDataRootHex,
|
|
272
|
-
|
|
325
|
+
validatorCommitteeIndices
|
|
273
326
|
);
|
|
274
327
|
metrics?.opPool.payloadAttestationPool.apiInsertOutcome.inc({insertOutcome});
|
|
275
328
|
|
|
276
329
|
chain.forkChoice.notifyPtcMessages(
|
|
277
330
|
toRootHex(payloadAttestationMessage.data.beaconBlockRoot),
|
|
278
|
-
|
|
279
|
-
|
|
331
|
+
payloadAttestationMessage.data.slot,
|
|
332
|
+
validatorCommitteeIndices,
|
|
333
|
+
payloadAttestationMessage.data.payloadPresent,
|
|
334
|
+
payloadAttestationMessage.data.blobDataAvailable
|
|
280
335
|
);
|
|
281
336
|
|
|
282
337
|
await network.publishPayloadAttestationMessage(payloadAttestationMessage);
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
2
|
import {ApplicationMethods} from "@lodestar/api/server";
|
|
3
|
-
import {ExecutionStatus} from "@lodestar/fork-choice";
|
|
3
|
+
import {ExecutionStatus, PayloadStatus} from "@lodestar/fork-choice";
|
|
4
4
|
import {ForkPostDeneb, ZERO_HASH_HEX, isForkPostDeneb, isForkPostFulu} from "@lodestar/params";
|
|
5
|
+
import {computeTimeAtSlot} from "@lodestar/state-transition";
|
|
5
6
|
import {BeaconState, DataColumnSidecar, DataColumnSidecars, type SignedBeaconBlock, sszTypesFor} from "@lodestar/types";
|
|
6
7
|
import {toRootHex} from "@lodestar/utils";
|
|
7
8
|
import {getBlobKzgCommitments} from "../../../util/dataColumns.js";
|
|
@@ -12,6 +13,29 @@ import {getStateResponseWithRegen} from "../beacon/state/utils.js";
|
|
|
12
13
|
import {ApiModules} from "../types.js";
|
|
13
14
|
import {assertUniqueItems} from "../utils.js";
|
|
14
15
|
|
|
16
|
+
function toForkChoiceValidity(status: ExecutionStatus): "valid" | "invalid" | "optimistic" {
|
|
17
|
+
switch (status) {
|
|
18
|
+
case ExecutionStatus.Valid:
|
|
19
|
+
return "valid";
|
|
20
|
+
case ExecutionStatus.Invalid:
|
|
21
|
+
return "invalid";
|
|
22
|
+
case ExecutionStatus.Syncing:
|
|
23
|
+
case ExecutionStatus.PreMerge:
|
|
24
|
+
return "optimistic";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function toPayloadStatusName(status: PayloadStatus): "pending" | "empty" | "full" {
|
|
29
|
+
switch (status) {
|
|
30
|
+
case PayloadStatus.PENDING:
|
|
31
|
+
return "pending";
|
|
32
|
+
case PayloadStatus.EMPTY:
|
|
33
|
+
return "empty";
|
|
34
|
+
case PayloadStatus.FULL:
|
|
35
|
+
return "full";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
15
39
|
export function getDebugApi({
|
|
16
40
|
chain,
|
|
17
41
|
config,
|
|
@@ -40,23 +64,60 @@ export function getDebugApi({
|
|
|
40
64
|
justifiedEpoch: node.justifiedEpoch,
|
|
41
65
|
finalizedEpoch: node.finalizedEpoch,
|
|
42
66
|
weight: node.weight,
|
|
43
|
-
validity: (
|
|
44
|
-
switch (node.executionStatus) {
|
|
45
|
-
case ExecutionStatus.Valid:
|
|
46
|
-
return "valid";
|
|
47
|
-
case ExecutionStatus.Invalid:
|
|
48
|
-
return "invalid";
|
|
49
|
-
case ExecutionStatus.Syncing:
|
|
50
|
-
case ExecutionStatus.PreMerge:
|
|
51
|
-
return "optimistic";
|
|
52
|
-
}
|
|
53
|
-
})(),
|
|
67
|
+
validity: toForkChoiceValidity(node.executionStatus),
|
|
54
68
|
executionBlockHash: node.executionPayloadBlockHash ?? ZERO_HASH_HEX,
|
|
55
69
|
})),
|
|
56
70
|
},
|
|
57
71
|
};
|
|
58
72
|
},
|
|
59
73
|
|
|
74
|
+
async getDebugForkChoiceV2() {
|
|
75
|
+
const {forkChoice} = chain;
|
|
76
|
+
return {
|
|
77
|
+
data: {
|
|
78
|
+
justifiedCheckpoint: forkChoice.getJustifiedCheckpoint(),
|
|
79
|
+
finalizedCheckpoint: forkChoice.getFinalizedCheckpoint(),
|
|
80
|
+
forkChoiceNodes: forkChoice.getAllNodes().map((node) => {
|
|
81
|
+
// Payload-specific fields apply only to a revealed Gloas payload = the FULL variant of a
|
|
82
|
+
// Gloas block
|
|
83
|
+
const ptc = node.payloadStatus === PayloadStatus.FULL ? forkChoice.getPTCVoteCounts(node.blockRoot) : null;
|
|
84
|
+
return {
|
|
85
|
+
payloadStatus: toPayloadStatusName(node.payloadStatus),
|
|
86
|
+
slot: node.slot,
|
|
87
|
+
blockRoot: node.blockRoot,
|
|
88
|
+
parentRoot: node.parentRoot,
|
|
89
|
+
weight: node.weight,
|
|
90
|
+
validity: toForkChoiceValidity(node.executionStatus),
|
|
91
|
+
executionBlockHash: node.executionPayloadBlockHash ?? ZERO_HASH_HEX,
|
|
92
|
+
extraData: {
|
|
93
|
+
executionOptimistic: isOptimisticBlock(node),
|
|
94
|
+
timestamp: computeTimeAtSlot(config, node.slot, chain.genesisTime),
|
|
95
|
+
target: node.targetRoot,
|
|
96
|
+
justifiedEpoch: node.justifiedEpoch,
|
|
97
|
+
finalizedEpoch: node.finalizedEpoch,
|
|
98
|
+
unrealizedJustifiedEpoch: node.unrealizedJustifiedEpoch,
|
|
99
|
+
unrealizedFinalizedEpoch: node.unrealizedFinalizedEpoch,
|
|
100
|
+
payloadAttesterCount: ptc?.attesterCount ?? null,
|
|
101
|
+
payloadAvailabilityYesCount: ptc?.payloadPresentCount ?? null,
|
|
102
|
+
payloadDataAvailabilityYesCount: ptc?.dataAvailableCount ?? null,
|
|
103
|
+
gasLimit:
|
|
104
|
+
node.payloadStatus === PayloadStatus.FULL && "executionPayloadGasLimit" in node
|
|
105
|
+
? node.executionPayloadGasLimit
|
|
106
|
+
: null,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}),
|
|
110
|
+
extraData: {
|
|
111
|
+
unrealizedJustifiedCheckpoint: forkChoice.getUnrealizedJustifiedCheckpoint(),
|
|
112
|
+
unrealizedFinalizedCheckpoint: forkChoice.getUnrealizedFinalizedCheckpoint(),
|
|
113
|
+
proposerBoostRoot: forkChoice.getProposerBoostRoot(),
|
|
114
|
+
previousProposerBoostRoot: forkChoice.getPreviousProposerBoostRoot(),
|
|
115
|
+
headRoot: forkChoice.getHeadRoot(),
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
|
|
60
121
|
async getProtoArrayNodes() {
|
|
61
122
|
const nodes = chain.forkChoice.getAllNodes().map((node) => ({
|
|
62
123
|
// if node has executionPayloadNumber, it will overwrite the below default
|