@lodestar/state-transition 1.41.0-dev.2074a31ba7 → 1.41.0-dev.21d4a81d4e
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/block/externalData.d.ts +2 -1
- package/lib/block/externalData.d.ts.map +1 -1
- package/lib/block/externalData.js +6 -2
- package/lib/block/externalData.js.map +1 -1
- package/lib/block/index.d.ts +3 -3
- package/lib/block/index.js.map +1 -1
- package/lib/block/initiateValidatorExit.js.map +1 -1
- package/lib/block/isValidIndexedAttestation.d.ts +3 -3
- package/lib/block/isValidIndexedAttestation.d.ts.map +1 -1
- package/lib/block/isValidIndexedAttestation.js +4 -4
- package/lib/block/isValidIndexedAttestation.js.map +1 -1
- package/lib/block/isValidIndexedPayloadAttestation.js +1 -1
- package/lib/block/isValidIndexedPayloadAttestation.js.map +1 -1
- package/lib/block/processAttestationPhase0.js +1 -1
- package/lib/block/processAttestationPhase0.js.map +1 -1
- package/lib/block/processAttestations.js.map +1 -1
- package/lib/block/processAttestationsAltair.js +1 -1
- package/lib/block/processAttestationsAltair.js.map +1 -1
- package/lib/block/processAttesterSlashing.d.ts +2 -2
- package/lib/block/processAttesterSlashing.d.ts.map +1 -1
- package/lib/block/processAttesterSlashing.js +3 -3
- package/lib/block/processAttesterSlashing.js.map +1 -1
- package/lib/block/processBlobKzgCommitments.js.map +1 -1
- package/lib/block/processBlockHeader.js.map +1 -1
- package/lib/block/processBlsToExecutionChange.js.map +1 -1
- package/lib/block/processConsolidationRequest.js.map +1 -1
- package/lib/block/processDeposit.js.map +1 -1
- package/lib/block/processDepositRequest.js.map +1 -1
- package/lib/block/processEth1Data.js.map +1 -1
- package/lib/block/processExecutionPayload.js.map +1 -1
- package/lib/block/processExecutionPayloadBid.d.ts +1 -1
- package/lib/block/processExecutionPayloadBid.js.map +1 -1
- package/lib/block/processExecutionPayloadEnvelope.d.ts +5 -2
- package/lib/block/processExecutionPayloadEnvelope.d.ts.map +1 -1
- package/lib/block/processExecutionPayloadEnvelope.js +25 -15
- package/lib/block/processExecutionPayloadEnvelope.js.map +1 -1
- package/lib/block/processOperations.js.map +1 -1
- package/lib/block/processPayloadAttestation.d.ts +1 -1
- package/lib/block/processPayloadAttestation.js.map +1 -1
- package/lib/block/processProposerSlashing.d.ts +2 -2
- package/lib/block/processProposerSlashing.d.ts.map +1 -1
- package/lib/block/processProposerSlashing.js +3 -3
- package/lib/block/processProposerSlashing.js.map +1 -1
- package/lib/block/processRandao.js +1 -1
- package/lib/block/processRandao.js.map +1 -1
- package/lib/block/processSyncCommittee.js +1 -1
- package/lib/block/processSyncCommittee.js.map +1 -1
- package/lib/block/processVoluntaryExit.js +3 -2
- package/lib/block/processVoluntaryExit.js.map +1 -1
- package/lib/block/processWithdrawalRequest.js +2 -2
- package/lib/block/processWithdrawalRequest.js.map +1 -1
- package/lib/block/processWithdrawals.js.map +1 -1
- package/lib/block/slashValidator.js.map +1 -1
- package/lib/block/types.js +2 -1
- package/lib/block/types.js.map +1 -1
- package/lib/cache/effectiveBalanceIncrements.js.map +1 -1
- package/lib/cache/epochCache.d.ts +8 -15
- package/lib/cache/epochCache.d.ts.map +1 -1
- package/lib/cache/epochCache.js +36 -34
- package/lib/cache/epochCache.js.map +1 -1
- package/lib/cache/epochTransitionCache.js.map +1 -1
- package/lib/cache/pubkeyCache.d.ts +21 -6
- package/lib/cache/pubkeyCache.d.ts.map +1 -1
- package/lib/cache/pubkeyCache.js +39 -14
- package/lib/cache/pubkeyCache.js.map +1 -1
- package/lib/cache/rewardCache.js.map +1 -1
- package/lib/cache/stateCache.d.ts +1 -1
- package/lib/cache/stateCache.d.ts.map +1 -1
- package/lib/cache/stateCache.js +3 -7
- package/lib/cache/stateCache.js.map +1 -1
- package/lib/cache/syncCommitteeCache.d.ts +3 -2
- package/lib/cache/syncCommitteeCache.d.ts.map +1 -1
- package/lib/cache/syncCommitteeCache.js +4 -4
- package/lib/cache/syncCommitteeCache.js.map +1 -1
- package/lib/epoch/computeUnrealizedCheckpoints.js.map +1 -1
- package/lib/epoch/getAttestationDeltas.js.map +1 -1
- package/lib/epoch/getRewardsAndPenalties.js.map +1 -1
- package/lib/epoch/index.d.ts +1 -1
- package/lib/epoch/index.js +2 -1
- package/lib/epoch/index.js.map +1 -1
- package/lib/epoch/processBuilderPendingPayments.d.ts +1 -1
- package/lib/epoch/processBuilderPendingPayments.js.map +1 -1
- package/lib/epoch/processEffectiveBalanceUpdates.js.map +1 -1
- package/lib/epoch/processEth1DataReset.js.map +1 -1
- package/lib/epoch/processHistoricalRootsUpdate.js.map +1 -1
- package/lib/epoch/processHistoricalSummariesUpdate.js.map +1 -1
- package/lib/epoch/processInactivityUpdates.js.map +1 -1
- package/lib/epoch/processJustificationAndFinalization.js.map +1 -1
- package/lib/epoch/processParticipationFlagUpdates.js.map +1 -1
- package/lib/epoch/processParticipationRecordUpdates.js.map +1 -1
- package/lib/epoch/processPendingAttestations.js.map +1 -1
- package/lib/epoch/processPendingConsolidations.js.map +1 -1
- package/lib/epoch/processPendingDeposits.js.map +1 -1
- package/lib/epoch/processProposerLookahead.js.map +1 -1
- package/lib/epoch/processRandaoMixesReset.js.map +1 -1
- package/lib/epoch/processRegistryUpdates.js.map +1 -1
- package/lib/epoch/processRewardsAndPenalties.js.map +1 -1
- package/lib/epoch/processSlashings.js.map +1 -1
- package/lib/epoch/processSlashingsReset.js.map +1 -1
- package/lib/epoch/processSyncCommitteeUpdates.js.map +1 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/lightClient/proofs.d.ts +10 -0
- package/lib/lightClient/proofs.d.ts.map +1 -0
- package/lib/lightClient/proofs.js +63 -0
- package/lib/lightClient/proofs.js.map +1 -0
- package/lib/lightClient/types.d.ts +34 -0
- package/lib/lightClient/types.d.ts.map +1 -0
- package/lib/lightClient/types.js +2 -0
- package/lib/lightClient/types.js.map +1 -0
- package/lib/metrics.d.ts.map +1 -1
- package/lib/metrics.js.map +1 -1
- package/lib/rewards/attestationsRewards.d.ts +2 -2
- package/lib/rewards/attestationsRewards.d.ts.map +1 -1
- package/lib/rewards/attestationsRewards.js +4 -4
- package/lib/rewards/attestationsRewards.js.map +1 -1
- package/lib/rewards/blockRewards.js.map +1 -1
- package/lib/rewards/syncCommitteeRewards.d.ts +2 -2
- package/lib/rewards/syncCommitteeRewards.d.ts.map +1 -1
- package/lib/rewards/syncCommitteeRewards.js +5 -2
- package/lib/rewards/syncCommitteeRewards.js.map +1 -1
- package/lib/signatureSets/attesterSlashings.js.map +1 -1
- package/lib/signatureSets/blsToExecutionChange.js.map +1 -1
- package/lib/signatureSets/executionPayloadBid.js.map +1 -1
- package/lib/signatureSets/executionPayloadEnvelope.js.map +1 -1
- package/lib/signatureSets/index.js.map +1 -1
- package/lib/signatureSets/indexedAttestation.js.map +1 -1
- package/lib/signatureSets/indexedPayloadAttestation.js.map +1 -1
- package/lib/signatureSets/proposer.d.ts +2 -2
- package/lib/signatureSets/proposer.d.ts.map +1 -1
- package/lib/signatureSets/proposer.js +2 -2
- package/lib/signatureSets/proposer.js.map +1 -1
- package/lib/signatureSets/proposerSlashings.js.map +1 -1
- package/lib/signatureSets/randao.d.ts +2 -2
- package/lib/signatureSets/randao.d.ts.map +1 -1
- package/lib/signatureSets/randao.js +2 -2
- package/lib/signatureSets/randao.js.map +1 -1
- package/lib/signatureSets/voluntaryExits.d.ts +2 -2
- package/lib/signatureSets/voluntaryExits.d.ts.map +1 -1
- package/lib/signatureSets/voluntaryExits.js +2 -2
- package/lib/signatureSets/voluntaryExits.js.map +1 -1
- package/lib/slot/index.js.map +1 -1
- package/lib/slot/upgradeStateToAltair.js.map +1 -1
- package/lib/slot/upgradeStateToBellatrix.js.map +1 -1
- package/lib/slot/upgradeStateToCapella.js.map +1 -1
- package/lib/slot/upgradeStateToDeneb.js.map +1 -1
- package/lib/slot/upgradeStateToElectra.js.map +1 -1
- package/lib/slot/upgradeStateToFulu.js.map +1 -1
- package/lib/slot/upgradeStateToGloas.js.map +1 -1
- package/lib/stateTransition.d.ts +2 -1
- package/lib/stateTransition.d.ts.map +1 -1
- package/lib/stateTransition.js +6 -3
- package/lib/stateTransition.js.map +1 -1
- package/lib/stateView/beaconStateView.d.ts +160 -0
- package/lib/stateView/beaconStateView.d.ts.map +1 -0
- package/lib/stateView/beaconStateView.js +553 -0
- package/lib/stateView/beaconStateView.js.map +1 -0
- package/lib/stateView/index.d.ts +3 -0
- package/lib/stateView/index.d.ts.map +1 -0
- package/lib/stateView/index.js +3 -0
- package/lib/stateView/index.js.map +1 -0
- package/lib/stateView/interface.d.ts +135 -0
- package/lib/stateView/interface.d.ts.map +1 -0
- package/lib/stateView/interface.js +2 -0
- package/lib/stateView/interface.js.map +1 -0
- package/lib/testUtils/cache.d.ts +2 -0
- package/lib/testUtils/cache.d.ts.map +1 -0
- package/lib/testUtils/cache.js +7 -0
- package/lib/testUtils/cache.js.map +1 -0
- package/lib/testUtils/index.d.ts +6 -0
- package/lib/testUtils/index.d.ts.map +1 -0
- package/lib/testUtils/index.js +6 -0
- package/lib/testUtils/index.js.map +1 -0
- package/lib/testUtils/infura.d.ts +3 -0
- package/lib/testUtils/infura.d.ts.map +1 -0
- package/lib/testUtils/infura.js +8 -0
- package/lib/testUtils/infura.js.map +1 -0
- package/lib/testUtils/interop.d.ts +2 -0
- package/lib/testUtils/interop.d.ts.map +1 -0
- package/lib/testUtils/interop.js +24 -0
- package/lib/testUtils/interop.js.map +1 -0
- package/lib/testUtils/params.d.ts +18 -0
- package/lib/testUtils/params.d.ts.map +1 -0
- package/lib/testUtils/params.js +20 -0
- package/lib/testUtils/params.js.map +1 -0
- package/lib/testUtils/state.d.ts +20 -0
- package/lib/testUtils/state.d.ts.map +1 -0
- package/lib/testUtils/state.js +78 -0
- package/lib/testUtils/state.js.map +1 -0
- package/lib/testUtils/testFileCache.d.ts +17 -0
- package/lib/testUtils/testFileCache.d.ts.map +1 -0
- package/lib/testUtils/testFileCache.js +96 -0
- package/lib/testUtils/testFileCache.js.map +1 -0
- package/lib/testUtils/util.d.ts +50 -0
- package/lib/testUtils/util.d.ts.map +1 -0
- package/lib/testUtils/util.js +329 -0
- package/lib/testUtils/util.js.map +1 -0
- package/lib/util/aggregator.js.map +1 -1
- package/lib/util/altair.js.map +1 -1
- package/lib/util/array.js.map +1 -1
- package/lib/util/attestation.js.map +1 -1
- package/lib/util/attesterStatus.js.map +1 -1
- package/lib/util/balance.js.map +1 -1
- package/lib/util/blindedBlock.js.map +1 -1
- package/lib/util/blockRoot.js.map +1 -1
- package/lib/util/capella.js.map +1 -1
- package/lib/util/computeAnchorCheckpoint.js.map +1 -1
- package/lib/util/deposit.js.map +1 -1
- package/lib/util/domain.js.map +1 -1
- package/lib/util/electra.js.map +1 -1
- package/lib/util/epoch.js.map +1 -1
- package/lib/util/epochShuffling.js.map +1 -1
- package/lib/util/execution.js.map +1 -1
- package/lib/util/finality.js.map +1 -1
- package/lib/util/fulu.js.map +1 -1
- package/lib/util/genesis.js.map +1 -1
- package/lib/util/gloas.js.map +1 -1
- package/lib/util/interop.js.map +1 -1
- package/lib/util/loadState/findModifiedInactivityScores.js.map +1 -1
- package/lib/util/loadState/findModifiedValidators.js.map +1 -1
- package/lib/util/loadState/loadState.js.map +1 -1
- package/lib/util/loadState/loadValidator.js.map +1 -1
- package/lib/util/rootCache.d.ts.map +1 -1
- package/lib/util/rootCache.js.map +1 -1
- package/lib/util/seed.d.ts +0 -8
- package/lib/util/seed.d.ts.map +1 -1
- package/lib/util/seed.js +0 -64
- package/lib/util/seed.js.map +1 -1
- package/lib/util/shuffling.js +2 -1
- package/lib/util/shuffling.js.map +1 -1
- package/lib/util/signatureSets.d.ts +7 -7
- package/lib/util/signatureSets.d.ts.map +1 -1
- package/lib/util/signatureSets.js +20 -13
- package/lib/util/signatureSets.js.map +1 -1
- package/lib/util/signingRoot.js.map +1 -1
- package/lib/util/slot.js.map +1 -1
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/syncCommittee.js.map +1 -1
- package/lib/util/targetUnslashedBalance.js.map +1 -1
- package/lib/util/validator.js.map +1 -1
- package/lib/util/weakSubjectivity.js +1 -1
- package/lib/util/weakSubjectivity.js.map +1 -1
- package/package.json +14 -9
- package/src/block/externalData.ts +2 -0
- package/src/block/index.ts +3 -3
- package/src/block/isValidIndexedAttestation.ts +5 -5
- package/src/block/isValidIndexedPayloadAttestation.ts +3 -3
- package/src/block/processAttestationPhase0.ts +1 -1
- package/src/block/processAttestationsAltair.ts +2 -2
- package/src/block/processAttesterSlashing.ts +4 -4
- package/src/block/processExecutionPayloadBid.ts +4 -4
- package/src/block/processExecutionPayloadEnvelope.ts +40 -22
- package/src/block/processOperations.ts +1 -1
- package/src/block/processPayloadAttestation.ts +2 -2
- package/src/block/processProposerSlashing.ts +4 -4
- package/src/block/processRandao.ts +1 -1
- package/src/block/processSyncCommittee.ts +1 -1
- package/src/block/processVoluntaryExit.ts +1 -1
- package/src/block/processWithdrawalRequest.ts +2 -2
- package/src/block/processWithdrawals.ts +1 -1
- package/src/cache/epochCache.ts +44 -36
- package/src/cache/pubkeyCache.ts +62 -21
- package/src/cache/stateCache.ts +4 -8
- package/src/cache/syncCommitteeCache.ts +4 -5
- package/src/epoch/index.ts +1 -1
- package/src/epoch/processBuilderPendingPayments.ts +2 -2
- package/src/index.ts +3 -1
- package/src/lightClient/proofs.ts +83 -0
- package/src/lightClient/types.ts +33 -0
- package/src/rewards/attestationsRewards.ts +5 -5
- package/src/rewards/syncCommitteeRewards.ts +6 -5
- package/src/signatureSets/proposer.ts +3 -3
- package/src/signatureSets/randao.ts +3 -7
- package/src/signatureSets/voluntaryExits.ts +3 -3
- package/src/stateTransition.ts +2 -1
- package/src/stateView/beaconStateView.ts +809 -0
- package/src/stateView/index.ts +2 -0
- package/src/stateView/interface.ts +213 -0
- package/src/testUtils/cache.ts +8 -0
- package/src/testUtils/index.ts +5 -0
- package/src/testUtils/infura.ts +10 -0
- package/src/testUtils/interop.ts +29 -0
- package/src/testUtils/params.ts +23 -0
- package/src/testUtils/state.ts +110 -0
- package/src/testUtils/testFileCache.ts +127 -0
- package/src/testUtils/util.ts +429 -0
- package/src/util/seed.ts +0 -71
- package/src/util/signatureSets.ts +23 -17
- package/src/util/weakSubjectivity.ts +1 -1
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.41.0-dev.
|
|
14
|
+
"version": "1.41.0-dev.21d4a81d4e",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -33,6 +33,11 @@
|
|
|
33
33
|
"bun": "./src/slot/index.ts",
|
|
34
34
|
"types": "./lib/slot/index.d.ts",
|
|
35
35
|
"import": "./lib/slot/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./test-utils": {
|
|
38
|
+
"bun": "./src/testUtils/index.ts",
|
|
39
|
+
"types": "./lib/testUtils/index.d.ts",
|
|
40
|
+
"import": "./lib/testUtils/index.js"
|
|
36
41
|
}
|
|
37
42
|
},
|
|
38
43
|
"files": [
|
|
@@ -42,11 +47,11 @@
|
|
|
42
47
|
],
|
|
43
48
|
"scripts": {
|
|
44
49
|
"clean": "rm -rf lib && rm -f *.tsbuildinfo",
|
|
45
|
-
"build": "
|
|
50
|
+
"build": "tsgo -p tsconfig.build.json",
|
|
46
51
|
"build:watch": "pnpm run build --watch",
|
|
47
52
|
"build:release": "pnpm clean && pnpm build",
|
|
48
53
|
"check-build": "node -e \"(async function() { await import('./lib/index.js') })()\"",
|
|
49
|
-
"check-types": "
|
|
54
|
+
"check-types": "tsgo",
|
|
50
55
|
"lint": "biome check src/ test/",
|
|
51
56
|
"lint:fix": "pnpm run lint --write",
|
|
52
57
|
"test": "pnpm test:unit",
|
|
@@ -62,14 +67,14 @@
|
|
|
62
67
|
"@chainsafe/pubkey-index-map": "^3.0.0",
|
|
63
68
|
"@chainsafe/ssz": "^1.2.2",
|
|
64
69
|
"@chainsafe/swap-or-not-shuffle": "^1.2.1",
|
|
65
|
-
"@lodestar/config": "^1.41.0-dev.
|
|
66
|
-
"@lodestar/params": "^1.41.0-dev.
|
|
67
|
-
"@lodestar/types": "^1.41.0-dev.
|
|
68
|
-
"@lodestar/utils": "^1.41.0-dev.
|
|
70
|
+
"@lodestar/config": "^1.41.0-dev.21d4a81d4e",
|
|
71
|
+
"@lodestar/params": "^1.41.0-dev.21d4a81d4e",
|
|
72
|
+
"@lodestar/types": "^1.41.0-dev.21d4a81d4e",
|
|
73
|
+
"@lodestar/utils": "^1.41.0-dev.21d4a81d4e",
|
|
69
74
|
"@vekexasia/bigint-buffer2": "^1.1.0"
|
|
70
75
|
},
|
|
71
76
|
"devDependencies": {
|
|
72
|
-
"@lodestar/api": "^1.41.0-dev.
|
|
77
|
+
"@lodestar/api": "^1.41.0-dev.21d4a81d4e"
|
|
73
78
|
},
|
|
74
79
|
"keywords": [
|
|
75
80
|
"ethereum",
|
|
@@ -77,5 +82,5 @@
|
|
|
77
82
|
"beacon",
|
|
78
83
|
"blockchain"
|
|
79
84
|
],
|
|
80
|
-
"gitHead": "
|
|
85
|
+
"gitHead": "1571069b4651a37ebd05728e78e4d83da4597105"
|
|
81
86
|
}
|
|
@@ -18,6 +18,8 @@ export enum DataAvailabilityStatus {
|
|
|
18
18
|
/* validator activities can't be performed on out of range data */
|
|
19
19
|
OutOfRange = "OutOfRange",
|
|
20
20
|
Available = "Available",
|
|
21
|
+
/* Gloas: beacon blocks have no DA requirement, execution payload is separate */
|
|
22
|
+
NotRequired = "NotRequired",
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
export interface BlockExternalData {
|
package/src/block/index.ts
CHANGED
|
@@ -13,10 +13,10 @@ import {processBlobKzgCommitments} from "./processBlobKzgCommitments.js";
|
|
|
13
13
|
import {processBlockHeader} from "./processBlockHeader.js";
|
|
14
14
|
import {processEth1Data} from "./processEth1Data.js";
|
|
15
15
|
import {processExecutionPayload} from "./processExecutionPayload.js";
|
|
16
|
-
import {processExecutionPayloadBid} from "./processExecutionPayloadBid.
|
|
17
|
-
import {processExecutionPayloadEnvelope} from "./processExecutionPayloadEnvelope.
|
|
16
|
+
import {processExecutionPayloadBid} from "./processExecutionPayloadBid.js";
|
|
17
|
+
import {processExecutionPayloadEnvelope} from "./processExecutionPayloadEnvelope.js";
|
|
18
18
|
import {processOperations} from "./processOperations.js";
|
|
19
|
-
import {processPayloadAttestation} from "./processPayloadAttestation.
|
|
19
|
+
import {processPayloadAttestation} from "./processPayloadAttestation.js";
|
|
20
20
|
import {processRandao} from "./processRandao.js";
|
|
21
21
|
import {processSyncAggregate} from "./processSyncCommittee.js";
|
|
22
22
|
import {processWithdrawals} from "./processWithdrawals.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {BeaconConfig} from "@lodestar/config";
|
|
2
2
|
import {ForkSeq, MAX_COMMITTEES_PER_SLOT, MAX_VALIDATORS_PER_COMMITTEE} from "@lodestar/params";
|
|
3
3
|
import {IndexedAttestation, IndexedAttestationBigint, Slot} from "@lodestar/types";
|
|
4
|
-
import {
|
|
4
|
+
import {PubkeyCache} from "../cache/pubkeyCache.js";
|
|
5
5
|
import {getIndexedAttestationBigintSignatureSet, getIndexedAttestationSignatureSet} from "../signatureSets/index.js";
|
|
6
6
|
import {verifySignatureSet} from "../util/index.js";
|
|
7
7
|
|
|
@@ -10,7 +10,7 @@ import {verifySignatureSet} from "../util/index.js";
|
|
|
10
10
|
*/
|
|
11
11
|
export function isValidIndexedAttestation(
|
|
12
12
|
config: BeaconConfig,
|
|
13
|
-
|
|
13
|
+
pubkeyCache: PubkeyCache,
|
|
14
14
|
stateSlot: Slot,
|
|
15
15
|
validatorsLen: number,
|
|
16
16
|
indexedAttestation: IndexedAttestation,
|
|
@@ -21,14 +21,14 @@ export function isValidIndexedAttestation(
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
if (verifySignature) {
|
|
24
|
-
return verifySignatureSet(getIndexedAttestationSignatureSet(config, stateSlot, indexedAttestation),
|
|
24
|
+
return verifySignatureSet(getIndexedAttestationSignatureSet(config, stateSlot, indexedAttestation), pubkeyCache);
|
|
25
25
|
}
|
|
26
26
|
return true;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export function isValidIndexedAttestationBigint(
|
|
30
30
|
config: BeaconConfig,
|
|
31
|
-
|
|
31
|
+
pubkeyCache: PubkeyCache,
|
|
32
32
|
stateSlot: Slot,
|
|
33
33
|
validatorsLen: number,
|
|
34
34
|
indexedAttestation: IndexedAttestationBigint,
|
|
@@ -41,7 +41,7 @@ export function isValidIndexedAttestationBigint(
|
|
|
41
41
|
if (verifySignature) {
|
|
42
42
|
return verifySignatureSet(
|
|
43
43
|
getIndexedAttestationBigintSignatureSet(config, stateSlot, indexedAttestation),
|
|
44
|
-
|
|
44
|
+
pubkeyCache
|
|
45
45
|
);
|
|
46
46
|
}
|
|
47
47
|
return true;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {gloas} from "@lodestar/types";
|
|
2
|
-
import {getIndexedPayloadAttestationSignatureSet} from "../signatureSets/index.
|
|
2
|
+
import {getIndexedPayloadAttestationSignatureSet} from "../signatureSets/index.js";
|
|
3
3
|
import {CachedBeaconStateGloas} from "../types.js";
|
|
4
|
-
import {verifySignatureSet} from "../util/index.
|
|
4
|
+
import {verifySignatureSet} from "../util/index.js";
|
|
5
5
|
|
|
6
6
|
export function isValidIndexedPayloadAttestation(
|
|
7
7
|
state: CachedBeaconStateGloas,
|
|
@@ -18,7 +18,7 @@ export function isValidIndexedPayloadAttestation(
|
|
|
18
18
|
if (verifySignature) {
|
|
19
19
|
return verifySignatureSet(
|
|
20
20
|
getIndexedPayloadAttestationSignatureSet(state.config, indexedPayloadAttestation),
|
|
21
|
-
state.epochCtx.
|
|
21
|
+
state.epochCtx.pubkeyCache
|
|
22
22
|
);
|
|
23
23
|
}
|
|
24
24
|
|
|
@@ -18,7 +18,7 @@ import {byteArrayEquals, intSqrt} from "@lodestar/utils";
|
|
|
18
18
|
import {BeaconStateTransitionMetrics} from "../metrics.js";
|
|
19
19
|
import {getAttestationWithIndicesSignatureSet} from "../signatureSets/indexedAttestation.js";
|
|
20
20
|
import {CachedBeaconStateAltair, CachedBeaconStateGloas} from "../types.js";
|
|
21
|
-
import {isAttestationSameSlot, isAttestationSameSlotRootCache} from "../util/gloas.
|
|
21
|
+
import {isAttestationSameSlot, isAttestationSameSlotRootCache} from "../util/gloas.js";
|
|
22
22
|
import {increaseBalance, verifySignatureSet} from "../util/index.js";
|
|
23
23
|
import {RootCache} from "../util/rootCache.js";
|
|
24
24
|
import {checkpointToStr, isTimelyTarget, validateAttestation} from "./processAttestationPhase0.js";
|
|
@@ -64,7 +64,7 @@ export function processAttestationsAltair(
|
|
|
64
64
|
// we can verify only that and nothing else.
|
|
65
65
|
if (verifySignature) {
|
|
66
66
|
const sigSet = getAttestationWithIndicesSignatureSet(state.config, state.slot, attestation, attestingIndices);
|
|
67
|
-
if (!verifySignatureSet(sigSet, state.epochCtx.
|
|
67
|
+
if (!verifySignatureSet(sigSet, state.epochCtx.pubkeyCache)) {
|
|
68
68
|
throw new Error("Attestation signature is not valid");
|
|
69
69
|
}
|
|
70
70
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {BeaconConfig} from "@lodestar/config";
|
|
2
2
|
import {ForkSeq} from "@lodestar/params";
|
|
3
3
|
import {AttesterSlashing, Slot} from "@lodestar/types";
|
|
4
|
-
import {
|
|
4
|
+
import {PubkeyCache} from "../cache/pubkeyCache.js";
|
|
5
5
|
import {CachedBeaconStateAllForks} from "../types.js";
|
|
6
6
|
import {getAttesterSlashableIndices, isSlashableAttestationData, isSlashableValidator} from "../util/index.js";
|
|
7
7
|
import {isValidIndexedAttestationBigint} from "./isValidIndexedAttestation.js";
|
|
@@ -22,7 +22,7 @@ export function processAttesterSlashing(
|
|
|
22
22
|
const {epochCtx} = state;
|
|
23
23
|
assertValidAttesterSlashing(
|
|
24
24
|
state.config,
|
|
25
|
-
epochCtx.
|
|
25
|
+
epochCtx.pubkeyCache,
|
|
26
26
|
state.slot,
|
|
27
27
|
state.validators.length,
|
|
28
28
|
attesterSlashing,
|
|
@@ -48,7 +48,7 @@ export function processAttesterSlashing(
|
|
|
48
48
|
|
|
49
49
|
export function assertValidAttesterSlashing(
|
|
50
50
|
config: BeaconConfig,
|
|
51
|
-
|
|
51
|
+
pubkeyCache: PubkeyCache,
|
|
52
52
|
stateSlot: Slot,
|
|
53
53
|
validatorsLen: number,
|
|
54
54
|
attesterSlashing: AttesterSlashing,
|
|
@@ -66,7 +66,7 @@ export function assertValidAttesterSlashing(
|
|
|
66
66
|
// can be any arbitrary value. Must use bigint variants to hash correctly to all possible values
|
|
67
67
|
for (const [i, attestation] of [attestation1, attestation2].entries()) {
|
|
68
68
|
if (
|
|
69
|
-
!isValidIndexedAttestationBigint(config,
|
|
69
|
+
!isValidIndexedAttestationBigint(config, pubkeyCache, stateSlot, validatorsLen, attestation, verifySignatures)
|
|
70
70
|
) {
|
|
71
71
|
throw new Error(`AttesterSlashing attestation${i} is invalid`);
|
|
72
72
|
}
|
|
@@ -2,11 +2,11 @@ import {PublicKey, Signature, verify} from "@chainsafe/blst";
|
|
|
2
2
|
import {BUILDER_INDEX_SELF_BUILD, ForkPostGloas, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
3
3
|
import {BeaconBlock, gloas, ssz} from "@lodestar/types";
|
|
4
4
|
import {byteArrayEquals, toHex, toRootHex} from "@lodestar/utils";
|
|
5
|
-
import {G2_POINT_AT_INFINITY} from "../constants/constants.
|
|
5
|
+
import {G2_POINT_AT_INFINITY} from "../constants/constants.js";
|
|
6
6
|
import {getExecutionPayloadBidSigningRoot} from "../signatureSets/executionPayloadBid.js";
|
|
7
|
-
import {CachedBeaconStateGloas} from "../types.
|
|
8
|
-
import {canBuilderCoverBid, isActiveBuilder} from "../util/gloas.
|
|
9
|
-
import {getCurrentEpoch, getRandaoMix} from "../util/index.
|
|
7
|
+
import {CachedBeaconStateGloas} from "../types.js";
|
|
8
|
+
import {canBuilderCoverBid, isActiveBuilder} from "../util/gloas.js";
|
|
9
|
+
import {getCurrentEpoch, getRandaoMix} from "../util/index.js";
|
|
10
10
|
|
|
11
11
|
export function processExecutionPayloadBid(state: CachedBeaconStateGloas, block: BeaconBlock<ForkPostGloas>): void {
|
|
12
12
|
const signedBid = block.body.signedExecutionPayloadBid;
|
|
@@ -7,18 +7,25 @@ import {
|
|
|
7
7
|
} from "@lodestar/params";
|
|
8
8
|
import {gloas, ssz} from "@lodestar/types";
|
|
9
9
|
import {byteArrayEquals, toHex, toRootHex} from "@lodestar/utils";
|
|
10
|
-
import {CachedBeaconStateGloas} from "../types.
|
|
11
|
-
import {computeSigningRoot, computeTimeAtSlot} from "../util/index.
|
|
12
|
-
import {processConsolidationRequest} from "./processConsolidationRequest.
|
|
13
|
-
import {processDepositRequest} from "./processDepositRequest.
|
|
14
|
-
import {processWithdrawalRequest} from "./processWithdrawalRequest.
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
import {CachedBeaconStateGloas} from "../types.js";
|
|
11
|
+
import {computeSigningRoot, computeTimeAtSlot} from "../util/index.js";
|
|
12
|
+
import {processConsolidationRequest} from "./processConsolidationRequest.js";
|
|
13
|
+
import {processDepositRequest} from "./processDepositRequest.js";
|
|
14
|
+
import {processWithdrawalRequest} from "./processWithdrawalRequest.js";
|
|
15
|
+
|
|
16
|
+
export type ProcessExecutionPayloadEnvelopeOpts = {
|
|
17
|
+
dontTransferCache?: boolean;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Unlike other block processing functions which mutate state in-place, this function
|
|
21
|
+
// clones the state and returns the post-state, similar to stateTransition().
|
|
22
|
+
// This function does not call execution engine to verify payload. Need to call it from other place.
|
|
17
23
|
export function processExecutionPayloadEnvelope(
|
|
18
24
|
state: CachedBeaconStateGloas,
|
|
19
25
|
signedEnvelope: gloas.SignedExecutionPayloadEnvelope,
|
|
20
|
-
verify: boolean
|
|
21
|
-
|
|
26
|
+
verify: boolean,
|
|
27
|
+
opts?: ProcessExecutionPayloadEnvelopeOpts
|
|
28
|
+
): CachedBeaconStateGloas {
|
|
22
29
|
const envelope = signedEnvelope.message;
|
|
23
30
|
const payload = envelope.payload;
|
|
24
31
|
const fork = state.config.getForkSeq(envelope.slot);
|
|
@@ -27,42 +34,49 @@ export function processExecutionPayloadEnvelope(
|
|
|
27
34
|
throw Error(`Execution payload envelope has invalid signature builderIndex=${envelope.builderIndex}`);
|
|
28
35
|
}
|
|
29
36
|
|
|
30
|
-
|
|
37
|
+
// .clone() before mutating state, similar to stateTransition()
|
|
38
|
+
const postState = state.clone(opts?.dontTransferCache) as CachedBeaconStateGloas;
|
|
39
|
+
|
|
40
|
+
validateExecutionPayloadEnvelope(postState, envelope);
|
|
31
41
|
|
|
32
42
|
const requests = envelope.executionRequests;
|
|
33
43
|
|
|
34
44
|
for (const deposit of requests.deposits) {
|
|
35
|
-
processDepositRequest(fork,
|
|
45
|
+
processDepositRequest(fork, postState, deposit);
|
|
36
46
|
}
|
|
37
47
|
|
|
38
48
|
for (const withdrawal of requests.withdrawals) {
|
|
39
|
-
processWithdrawalRequest(fork,
|
|
49
|
+
processWithdrawalRequest(fork, postState, withdrawal);
|
|
40
50
|
}
|
|
41
51
|
|
|
42
52
|
for (const consolidation of requests.consolidations) {
|
|
43
|
-
processConsolidationRequest(
|
|
53
|
+
processConsolidationRequest(postState, consolidation);
|
|
44
54
|
}
|
|
45
55
|
|
|
46
56
|
// Queue the builder payment
|
|
47
|
-
const paymentIndex = SLOTS_PER_EPOCH + (
|
|
48
|
-
const payment =
|
|
57
|
+
const paymentIndex = SLOTS_PER_EPOCH + (postState.slot % SLOTS_PER_EPOCH);
|
|
58
|
+
const payment = postState.builderPendingPayments.get(paymentIndex).clone();
|
|
49
59
|
const amount = payment.withdrawal.amount;
|
|
50
60
|
|
|
51
61
|
if (amount > 0) {
|
|
52
|
-
|
|
62
|
+
postState.builderPendingWithdrawals.push(payment.withdrawal);
|
|
53
63
|
}
|
|
54
64
|
|
|
55
|
-
|
|
65
|
+
postState.builderPendingPayments.set(paymentIndex, ssz.gloas.BuilderPendingPayment.defaultViewDU());
|
|
56
66
|
|
|
57
67
|
// Cache the execution payload hash
|
|
58
|
-
|
|
59
|
-
|
|
68
|
+
postState.executionPayloadAvailability.set(postState.slot % SLOTS_PER_HISTORICAL_ROOT, true);
|
|
69
|
+
postState.latestBlockHash = payload.blockHash;
|
|
60
70
|
|
|
61
|
-
|
|
71
|
+
postState.commit();
|
|
72
|
+
|
|
73
|
+
if (verify && !byteArrayEquals(envelope.stateRoot, postState.hashTreeRoot())) {
|
|
62
74
|
throw new Error(
|
|
63
|
-
`Envelope's state root does not match state envelope=${toRootHex(envelope.stateRoot)} state=${toRootHex(
|
|
75
|
+
`Envelope's state root does not match state envelope=${toRootHex(envelope.stateRoot)} state=${toRootHex(postState.hashTreeRoot())}`
|
|
64
76
|
);
|
|
65
77
|
}
|
|
78
|
+
|
|
79
|
+
return postState;
|
|
66
80
|
}
|
|
67
81
|
|
|
68
82
|
function validateExecutionPayloadEnvelope(
|
|
@@ -156,7 +170,11 @@ function verifyExecutionPayloadEnvelopeSignature(
|
|
|
156
170
|
|
|
157
171
|
if (builderIndex === BUILDER_INDEX_SELF_BUILD) {
|
|
158
172
|
const validatorIndex = state.latestBlockHeader.proposerIndex;
|
|
159
|
-
|
|
173
|
+
const proposerPubkey = state.epochCtx.pubkeyCache.get(validatorIndex);
|
|
174
|
+
if (!proposerPubkey) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
publicKey = proposerPubkey;
|
|
160
178
|
} else {
|
|
161
179
|
publicKey = PublicKey.fromBytes(state.builders.getReadonly(builderIndex).pubkey);
|
|
162
180
|
}
|
|
@@ -14,7 +14,7 @@ import {processBlsToExecutionChange} from "./processBlsToExecutionChange.js";
|
|
|
14
14
|
import {processConsolidationRequest} from "./processConsolidationRequest.js";
|
|
15
15
|
import {processDeposit} from "./processDeposit.js";
|
|
16
16
|
import {processDepositRequest} from "./processDepositRequest.js";
|
|
17
|
-
import {processPayloadAttestation} from "./processPayloadAttestation.
|
|
17
|
+
import {processPayloadAttestation} from "./processPayloadAttestation.js";
|
|
18
18
|
import {processProposerSlashing} from "./processProposerSlashing.js";
|
|
19
19
|
import {processVoluntaryExit} from "./processVoluntaryExit.js";
|
|
20
20
|
import {processWithdrawalRequest} from "./processWithdrawalRequest.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {gloas} from "@lodestar/types";
|
|
2
2
|
import {byteArrayEquals} from "@lodestar/utils";
|
|
3
|
-
import {CachedBeaconStateGloas} from "../types.
|
|
4
|
-
import {isValidIndexedPayloadAttestation} from "./isValidIndexedPayloadAttestation.
|
|
3
|
+
import {CachedBeaconStateGloas} from "../types.js";
|
|
4
|
+
import {isValidIndexedPayloadAttestation} from "./isValidIndexedPayloadAttestation.js";
|
|
5
5
|
|
|
6
6
|
export function processPayloadAttestation(
|
|
7
7
|
state: CachedBeaconStateGloas,
|
|
@@ -2,7 +2,7 @@ import {BeaconConfig} from "@lodestar/config";
|
|
|
2
2
|
import {ForkSeq, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
3
3
|
import {Slot, phase0, ssz} from "@lodestar/types";
|
|
4
4
|
import {Validator} from "@lodestar/types/phase0";
|
|
5
|
-
import {
|
|
5
|
+
import {PubkeyCache} from "../cache/pubkeyCache.js";
|
|
6
6
|
import {getProposerSlashingSignatureSets} from "../signatureSets/index.js";
|
|
7
7
|
import {CachedBeaconStateAllForks, CachedBeaconStateGloas} from "../types.js";
|
|
8
8
|
import {computeEpochAtSlot, isSlashableValidator} from "../util/index.js";
|
|
@@ -24,7 +24,7 @@ export function processProposerSlashing(
|
|
|
24
24
|
const proposer = state.validators.getReadonly(proposerSlashing.signedHeader1.message.proposerIndex);
|
|
25
25
|
assertValidProposerSlashing(
|
|
26
26
|
state.config,
|
|
27
|
-
state.epochCtx.
|
|
27
|
+
state.epochCtx.pubkeyCache,
|
|
28
28
|
state.slot,
|
|
29
29
|
proposerSlashing,
|
|
30
30
|
proposer,
|
|
@@ -57,7 +57,7 @@ export function processProposerSlashing(
|
|
|
57
57
|
|
|
58
58
|
export function assertValidProposerSlashing(
|
|
59
59
|
config: BeaconConfig,
|
|
60
|
-
|
|
60
|
+
pubkeyCache: PubkeyCache,
|
|
61
61
|
stateSlot: Slot,
|
|
62
62
|
proposerSlashing: phase0.ProposerSlashing,
|
|
63
63
|
proposer: Validator,
|
|
@@ -94,7 +94,7 @@ export function assertValidProposerSlashing(
|
|
|
94
94
|
if (verifySignatures) {
|
|
95
95
|
const signatureSets = getProposerSlashingSignatureSets(config, stateSlot, proposerSlashing);
|
|
96
96
|
for (let i = 0; i < signatureSets.length; i++) {
|
|
97
|
-
if (!verifySignatureSet(signatureSets[i],
|
|
97
|
+
if (!verifySignatureSet(signatureSets[i], pubkeyCache)) {
|
|
98
98
|
throw new Error(`ProposerSlashing header${i + 1} signature invalid`);
|
|
99
99
|
}
|
|
100
100
|
}
|
|
@@ -17,7 +17,7 @@ export function processRandao(state: CachedBeaconStateAllForks, block: BeaconBlo
|
|
|
17
17
|
const randaoReveal = block.body.randaoReveal;
|
|
18
18
|
|
|
19
19
|
// verify RANDAO reveal
|
|
20
|
-
if (verifySignature && !verifyRandaoSignature(config, epochCtx.
|
|
20
|
+
if (verifySignature && !verifyRandaoSignature(config, epochCtx.pubkeyCache, block)) {
|
|
21
21
|
throw new Error("RANDAO reveal is an invalid signature");
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -32,7 +32,7 @@ export function processSyncAggregate(
|
|
|
32
32
|
participantIndices
|
|
33
33
|
);
|
|
34
34
|
// When there's no participation we consider the signature valid and just ignore it
|
|
35
|
-
if (signatureSet !== null && !verifySignatureSet(signatureSet, state.epochCtx.
|
|
35
|
+
if (signatureSet !== null && !verifySignatureSet(signatureSet, state.epochCtx.pubkeyCache)) {
|
|
36
36
|
throw Error("Sync committee signature invalid");
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -131,7 +131,7 @@ export function getVoluntaryExitValidity(
|
|
|
131
131
|
|
|
132
132
|
if (
|
|
133
133
|
verifySignature &&
|
|
134
|
-
!verifyVoluntaryExitSignature(state.config, epochCtx.
|
|
134
|
+
!verifyVoluntaryExitSignature(state.config, epochCtx.pubkeyCache, state.slot, signedVoluntaryExit)
|
|
135
135
|
) {
|
|
136
136
|
return VoluntaryExitValidity.invalidSignature;
|
|
137
137
|
}
|
|
@@ -21,7 +21,7 @@ export function processWithdrawalRequest(
|
|
|
21
21
|
const amount = Number(withdrawalRequest.amount);
|
|
22
22
|
const {pendingPartialWithdrawals, validators, epochCtx} = state;
|
|
23
23
|
// no need to use unfinalized pubkey cache from 6110 as validator won't be active anyway
|
|
24
|
-
const {
|
|
24
|
+
const {pubkeyCache, config} = epochCtx;
|
|
25
25
|
const isFullExitRequest = amount === FULL_EXIT_REQUEST_AMOUNT;
|
|
26
26
|
|
|
27
27
|
// If partial withdrawal queue is full, only full exits are processed
|
|
@@ -31,7 +31,7 @@ export function processWithdrawalRequest(
|
|
|
31
31
|
|
|
32
32
|
// bail out if validator is not in beacon state
|
|
33
33
|
// note that we don't need to check for 6110 unfinalized vals as they won't be eligible for withdraw/exit anyway
|
|
34
|
-
const validatorIndex =
|
|
34
|
+
const validatorIndex = pubkeyCache.getIndex(withdrawalRequest.validatorPubkey);
|
|
35
35
|
if (validatorIndex === null) {
|
|
36
36
|
return;
|
|
37
37
|
}
|