@lodestar/state-transition 1.47.0 → 1.48.0-dev.02b355c4db
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/index.d.ts.map +1 -1
- package/lib/block/index.js +44 -13
- package/lib/block/index.js.map +1 -1
- package/lib/block/processExecutionPayloadBid.d.ts +2 -2
- package/lib/block/processExecutionPayloadBid.d.ts.map +1 -1
- package/lib/block/processExecutionPayloadBid.js +3 -2
- package/lib/block/processExecutionPayloadBid.js.map +1 -1
- package/lib/block/processOperations.d.ts.map +1 -1
- package/lib/block/processOperations.js +62 -33
- package/lib/block/processOperations.js.map +1 -1
- package/lib/block/processParentExecutionPayload.d.ts.map +1 -1
- package/lib/block/processParentExecutionPayload.js +2 -16
- package/lib/block/processParentExecutionPayload.js.map +1 -1
- package/lib/block/processPayloadAttestation.d.ts +1 -1
- package/lib/block/processPayloadAttestation.d.ts.map +1 -1
- package/lib/block/processPayloadAttestation.js +2 -2
- package/lib/block/processPayloadAttestation.js.map +1 -1
- package/lib/block/processWithdrawals.d.ts.map +1 -1
- package/lib/block/processWithdrawals.js +8 -2
- package/lib/block/processWithdrawals.js.map +1 -1
- package/lib/block/types.d.ts +30 -0
- package/lib/block/types.d.ts.map +1 -1
- package/lib/block/types.js +32 -0
- package/lib/block/types.js.map +1 -1
- package/lib/epoch/processInactivityUpdates.d.ts.map +1 -1
- package/lib/epoch/processInactivityUpdates.js +7 -1
- package/lib/epoch/processInactivityUpdates.js.map +1 -1
- package/lib/epoch/processPtcWindow.d.ts.map +1 -1
- package/lib/epoch/processPtcWindow.js +12 -9
- package/lib/epoch/processPtcWindow.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/lightClient/spec/index.d.ts +1 -1
- package/lib/lightClient/spec/index.d.ts.map +1 -1
- package/lib/lightClient/spec/index.js +1 -1
- package/lib/lightClient/spec/index.js.map +1 -1
- package/lib/lightClient/spec/utils.d.ts +13 -3
- package/lib/lightClient/spec/utils.d.ts.map +1 -1
- package/lib/lightClient/spec/utils.js +108 -34
- package/lib/lightClient/spec/utils.js.map +1 -1
- package/lib/metrics.d.ts +7 -1
- package/lib/metrics.d.ts.map +1 -1
- package/lib/metrics.js +12 -1
- package/lib/metrics.js.map +1 -1
- package/lib/rewards/blockRewards.d.ts.map +1 -1
- package/lib/rewards/blockRewards.js +1 -3
- package/lib/rewards/blockRewards.js.map +1 -1
- package/lib/signatureSets/index.d.ts.map +1 -1
- package/lib/signatureSets/index.js +8 -0
- package/lib/signatureSets/index.js.map +1 -1
- package/lib/slot/upgradeStateToGloas.js +1 -1
- package/lib/slot/upgradeStateToGloas.js.map +1 -1
- package/lib/stateView/beaconStateView.d.ts +8 -2
- package/lib/stateView/beaconStateView.d.ts.map +1 -1
- package/lib/stateView/beaconStateView.js +18 -1
- package/lib/stateView/beaconStateView.js.map +1 -1
- package/lib/stateView/computeNewStateRoot.d.ts +6 -0
- package/lib/stateView/computeNewStateRoot.d.ts.map +1 -0
- package/lib/stateView/computeNewStateRoot.js +28 -0
- package/lib/stateView/computeNewStateRoot.js.map +1 -0
- package/lib/stateView/interface.d.ts +20 -3
- package/lib/stateView/interface.d.ts.map +1 -1
- package/lib/stateView/interface.js.map +1 -1
- package/lib/stateView/nativeBeaconStateView.d.ts +6 -2
- package/lib/stateView/nativeBeaconStateView.d.ts.map +1 -1
- package/lib/stateView/nativeBeaconStateView.js +15 -0
- package/lib/stateView/nativeBeaconStateView.js.map +1 -1
- package/lib/util/gloas.d.ts.map +1 -1
- package/lib/util/gloas.js +1 -1
- package/lib/util/gloas.js.map +1 -1
- package/lib/util/seed.d.ts +1 -1
- package/lib/util/seed.d.ts.map +1 -1
- package/lib/util/seed.js +14 -11
- package/lib/util/seed.js.map +1 -1
- package/package.json +8 -8
- package/src/block/index.ts +53 -17
- package/src/block/processExecutionPayloadBid.ts +6 -5
- package/src/block/processOperations.ts +63 -45
- package/src/block/processParentExecutionPayload.ts +2 -27
- package/src/block/processPayloadAttestation.ts +3 -2
- package/src/block/processWithdrawals.ts +12 -2
- package/src/block/types.ts +32 -0
- package/src/epoch/processInactivityUpdates.ts +8 -1
- package/src/epoch/processPtcWindow.ts +15 -8
- package/src/index.ts +3 -1
- package/src/lightClient/spec/index.ts +2 -0
- package/src/lightClient/spec/utils.ts +142 -48
- package/src/metrics.ts +13 -2
- package/src/rewards/blockRewards.ts +1 -3
- package/src/signatureSets/index.ts +17 -3
- package/src/slot/upgradeStateToGloas.ts +1 -1
- package/src/stateView/beaconStateView.ts +32 -1
- package/src/stateView/computeNewStateRoot.ts +35 -0
- package/src/stateView/interface.ts +27 -1
- package/src/stateView/nativeBeaconStateView.ts +23 -1
- package/src/util/gloas.ts +1 -0
- package/src/util/seed.ts +25 -13
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
PAYLOAD_BUILDER_VERSION,
|
|
6
6
|
SLOTS_PER_EPOCH,
|
|
7
7
|
} from "@lodestar/params";
|
|
8
|
-
import {
|
|
8
|
+
import {gloas, heze, ssz} from "@lodestar/types";
|
|
9
9
|
import {byteArrayEquals, toHex, toRootHex} from "@lodestar/utils";
|
|
10
10
|
import {G2_POINT_AT_INFINITY} from "../constants/constants.js";
|
|
11
11
|
import {getExecutionPayloadBidSigningRoot} from "../signatureSets/executionPayloadBid.js";
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
export function processExecutionPayloadBid(
|
|
23
23
|
state: CachedBeaconStateGloas | CachedBeaconStateHeze,
|
|
24
24
|
signedBid: gloas.SignedExecutionPayloadBid
|
|
25
|
-
):
|
|
25
|
+
): void {
|
|
26
26
|
const bid = signedBid.message;
|
|
27
27
|
const {builderIndex, value: amount} = bid;
|
|
28
28
|
|
|
@@ -76,6 +76,10 @@ export function processExecutionPayloadBid(
|
|
|
76
76
|
);
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
if (byteArrayEquals(bid.blockHash, bid.parentBlockHash)) {
|
|
80
|
+
throw Error(`Block hash ${toRootHex(bid.blockHash)} of bid must not equal its parent block hash`);
|
|
81
|
+
}
|
|
82
|
+
|
|
79
83
|
const parentBlockRoot = getBlockRootAtSlot(state, state.slot - 1);
|
|
80
84
|
if (!byteArrayEquals(bid.parentBlockRoot, parentBlockRoot)) {
|
|
81
85
|
throw Error(
|
|
@@ -110,14 +114,11 @@ export function processExecutionPayloadBid(
|
|
|
110
114
|
state.builderPendingPayments.set(SLOTS_PER_EPOCH + (bid.slot % SLOTS_PER_EPOCH), pendingPaymentView);
|
|
111
115
|
}
|
|
112
116
|
|
|
113
|
-
const parentSlot = state.latestExecutionPayloadBid.slot;
|
|
114
117
|
if (state.config.getForkSeq(state.slot) >= ForkSeq.heze) {
|
|
115
118
|
state.latestExecutionPayloadBid = ssz.heze.ExecutionPayloadBid.toViewDU(bid as heze.ExecutionPayloadBid);
|
|
116
119
|
} else {
|
|
117
120
|
state.latestExecutionPayloadBid = ssz.gloas.ExecutionPayloadBid.toViewDU(bid);
|
|
118
121
|
}
|
|
119
|
-
|
|
120
|
-
return parentSlot;
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
function verifyExecutionPayloadBidSignature(
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ForkSeq,
|
|
3
|
-
MAX_ATTESTATIONS_ELECTRA,
|
|
4
|
-
MAX_ATTESTER_SLASHINGS_ELECTRA,
|
|
5
|
-
MAX_BLS_TO_EXECUTION_CHANGES,
|
|
6
|
-
MAX_PAYLOAD_ATTESTATIONS,
|
|
7
|
-
MAX_PROPOSER_SLASHINGS,
|
|
8
|
-
MAX_VOLUNTARY_EXITS,
|
|
9
|
-
} from "@lodestar/params";
|
|
1
|
+
import {ForkSeq} from "@lodestar/params";
|
|
10
2
|
import {BeaconBlockBody, Slot, capella, electra, gloas} from "@lodestar/types";
|
|
11
3
|
import {BeaconStateTransitionMetrics} from "../metrics.js";
|
|
12
4
|
import {
|
|
@@ -26,7 +18,7 @@ import {processPayloadAttestation} from "./processPayloadAttestation.js";
|
|
|
26
18
|
import {processProposerSlashing} from "./processProposerSlashing.js";
|
|
27
19
|
import {processVoluntaryExit} from "./processVoluntaryExit.js";
|
|
28
20
|
import {processWithdrawalRequest} from "./processWithdrawalRequest.js";
|
|
29
|
-
import {ProcessBlockOpts} from "./types.js";
|
|
21
|
+
import {ProcessBlockOpts, ProcessOperationsStep} from "./types.js";
|
|
30
22
|
|
|
31
23
|
export {
|
|
32
24
|
processProposerSlashing,
|
|
@@ -48,10 +40,6 @@ export function processOperations(
|
|
|
48
40
|
opts: ProcessBlockOpts = {verifySignatures: true},
|
|
49
41
|
metrics?: BeaconStateTransitionMetrics | null
|
|
50
42
|
): void {
|
|
51
|
-
if (fork >= ForkSeq.gloas) {
|
|
52
|
-
assertGloasOperationLimits(body as gloas.BeaconBlockBody);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
43
|
// verify that outstanding deposits are processed up to the maximum number of deposits.
|
|
56
44
|
// From Fulu the eth1 bridge deposit mechanism was removed, so blocks must not contain any deposits.
|
|
57
45
|
const maxDeposits = fork >= ForkSeq.fulu ? 0 : getEth1DepositCount(state);
|
|
@@ -61,64 +49,94 @@ export function processOperations(
|
|
|
61
49
|
);
|
|
62
50
|
}
|
|
63
51
|
|
|
64
|
-
|
|
65
|
-
|
|
52
|
+
{
|
|
53
|
+
const timer = metrics?.processOperationsStepTime.startTimer({step: ProcessOperationsStep.processProposerSlashing});
|
|
54
|
+
for (const proposerSlashing of body.proposerSlashings) {
|
|
55
|
+
processProposerSlashing(fork, state, proposerSlashing, opts.verifySignatures);
|
|
56
|
+
}
|
|
57
|
+
timer?.();
|
|
66
58
|
}
|
|
67
|
-
|
|
68
|
-
|
|
59
|
+
|
|
60
|
+
{
|
|
61
|
+
const timer = metrics?.processOperationsStepTime.startTimer({step: ProcessOperationsStep.processAttesterSlashing});
|
|
62
|
+
for (const attesterSlashing of body.attesterSlashings) {
|
|
63
|
+
processAttesterSlashing(fork, state, attesterSlashing, opts.verifySignatures);
|
|
64
|
+
}
|
|
65
|
+
timer?.();
|
|
69
66
|
}
|
|
70
67
|
|
|
71
|
-
|
|
68
|
+
{
|
|
69
|
+
const timer = metrics?.processOperationsStepTime.startTimer({step: ProcessOperationsStep.processAttestations});
|
|
70
|
+
processAttestations(fork, state, body.attestations, parentSlot, opts.verifySignatures, metrics);
|
|
71
|
+
timer?.();
|
|
72
|
+
}
|
|
72
73
|
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
{
|
|
75
|
+
const timer = metrics?.processOperationsStepTime.startTimer({step: ProcessOperationsStep.processDeposit});
|
|
76
|
+
for (const deposit of body.deposits) {
|
|
77
|
+
processDeposit(fork, state, deposit);
|
|
78
|
+
}
|
|
79
|
+
timer?.();
|
|
75
80
|
}
|
|
76
81
|
|
|
77
|
-
|
|
78
|
-
|
|
82
|
+
{
|
|
83
|
+
const timer = metrics?.processOperationsStepTime.startTimer({step: ProcessOperationsStep.processVoluntaryExit});
|
|
84
|
+
for (const voluntaryExit of body.voluntaryExits) {
|
|
85
|
+
processVoluntaryExit(fork, state, voluntaryExit, opts.verifySignatures);
|
|
86
|
+
}
|
|
87
|
+
timer?.();
|
|
79
88
|
}
|
|
80
89
|
|
|
81
90
|
if (fork >= ForkSeq.capella) {
|
|
91
|
+
const timer = metrics?.processOperationsStepTime.startTimer({
|
|
92
|
+
step: ProcessOperationsStep.processBlsToExecutionChange,
|
|
93
|
+
});
|
|
82
94
|
for (const blsToExecutionChange of (body as capella.BeaconBlockBody).blsToExecutionChanges) {
|
|
83
95
|
processBlsToExecutionChange(state as CachedBeaconStateCapella, blsToExecutionChange);
|
|
84
96
|
}
|
|
97
|
+
timer?.();
|
|
85
98
|
}
|
|
86
99
|
|
|
87
100
|
if (fork >= ForkSeq.electra && fork < ForkSeq.gloas) {
|
|
88
101
|
const stateElectra = state as CachedBeaconStateElectra;
|
|
89
102
|
const bodyElectra = body as electra.BeaconBlockBody;
|
|
90
103
|
|
|
91
|
-
|
|
92
|
-
|
|
104
|
+
{
|
|
105
|
+
const timer = metrics?.processOperationsStepTime.startTimer({step: ProcessOperationsStep.processDepositRequest});
|
|
106
|
+
for (const depositRequest of bodyElectra.executionRequests.deposits) {
|
|
107
|
+
processDepositRequest(fork, stateElectra, depositRequest);
|
|
108
|
+
}
|
|
109
|
+
timer?.();
|
|
93
110
|
}
|
|
94
111
|
|
|
95
|
-
|
|
96
|
-
|
|
112
|
+
{
|
|
113
|
+
const timer = metrics?.processOperationsStepTime.startTimer({
|
|
114
|
+
step: ProcessOperationsStep.processWithdrawalRequest,
|
|
115
|
+
});
|
|
116
|
+
for (const elWithdrawalRequest of bodyElectra.executionRequests.withdrawals) {
|
|
117
|
+
processWithdrawalRequest(fork, stateElectra, elWithdrawalRequest);
|
|
118
|
+
}
|
|
119
|
+
timer?.();
|
|
97
120
|
}
|
|
98
121
|
|
|
99
|
-
|
|
100
|
-
|
|
122
|
+
{
|
|
123
|
+
const timer = metrics?.processOperationsStepTime.startTimer({
|
|
124
|
+
step: ProcessOperationsStep.processConsolidationRequest,
|
|
125
|
+
});
|
|
126
|
+
for (const elConsolidationRequest of bodyElectra.executionRequests.consolidations) {
|
|
127
|
+
processConsolidationRequest(stateElectra, elConsolidationRequest);
|
|
128
|
+
}
|
|
129
|
+
timer?.();
|
|
101
130
|
}
|
|
102
131
|
}
|
|
103
132
|
|
|
104
133
|
if (fork >= ForkSeq.gloas) {
|
|
134
|
+
const timer = metrics?.processOperationsStepTime.startTimer({
|
|
135
|
+
step: ProcessOperationsStep.processPayloadAttestation,
|
|
136
|
+
});
|
|
105
137
|
for (const payloadAttestation of (body as gloas.BeaconBlockBody).payloadAttestations) {
|
|
106
|
-
processPayloadAttestation(state as CachedBeaconStateGloas, payloadAttestation);
|
|
138
|
+
processPayloadAttestation(state as CachedBeaconStateGloas, payloadAttestation, opts.verifySignatures);
|
|
107
139
|
}
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function assertGloasOperationLimits(body: gloas.BeaconBlockBody): void {
|
|
112
|
-
assertMaxLength("proposerSlashings", body.proposerSlashings.length, MAX_PROPOSER_SLASHINGS);
|
|
113
|
-
assertMaxLength("attesterSlashings", body.attesterSlashings.length, MAX_ATTESTER_SLASHINGS_ELECTRA);
|
|
114
|
-
assertMaxLength("attestations", body.attestations.length, MAX_ATTESTATIONS_ELECTRA);
|
|
115
|
-
assertMaxLength("voluntaryExits", body.voluntaryExits.length, MAX_VOLUNTARY_EXITS);
|
|
116
|
-
assertMaxLength("blsToExecutionChanges", body.blsToExecutionChanges.length, MAX_BLS_TO_EXECUTION_CHANGES);
|
|
117
|
-
assertMaxLength("payloadAttestations", body.payloadAttestations.length, MAX_PAYLOAD_ATTESTATIONS);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function assertMaxLength(name: string, length: number, limit: number): void {
|
|
121
|
-
if (length > limit) {
|
|
122
|
-
throw new Error(`Block contains too many ${name}: count=${length} limit=${limit}`);
|
|
140
|
+
timer?.();
|
|
123
141
|
}
|
|
124
142
|
}
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ForkPostGloas,
|
|
3
|
-
MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD,
|
|
4
|
-
MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD,
|
|
5
|
-
MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD,
|
|
6
|
-
MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD,
|
|
7
|
-
SLOTS_PER_EPOCH,
|
|
8
|
-
SLOTS_PER_HISTORICAL_ROOT,
|
|
9
|
-
} from "@lodestar/params";
|
|
1
|
+
import {ForkPostGloas, SLOTS_PER_EPOCH, SLOTS_PER_HISTORICAL_ROOT} from "@lodestar/params";
|
|
10
2
|
import {BeaconBlock, gloas, ssz} from "@lodestar/types";
|
|
11
3
|
import {byteArrayEquals, toRootHex} from "@lodestar/utils";
|
|
12
4
|
import {CachedBeaconStateGloas} from "../types.js";
|
|
@@ -55,11 +47,9 @@ export function processParentExecutionPayload(state: CachedBeaconStateGloas, blo
|
|
|
55
47
|
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.6/specs/gloas/beacon-chain.md#new-apply_parent_execution_payload
|
|
56
48
|
*/
|
|
57
49
|
export function applyParentExecutionPayload(state: CachedBeaconStateGloas, requests: gloas.ExecutionRequests): void {
|
|
58
|
-
assertExecutionRequestsWithinLimits(requests);
|
|
59
|
-
|
|
60
50
|
const fork = state.config.getForkSeq(state.slot);
|
|
61
51
|
const parentBid = state.latestExecutionPayloadBid;
|
|
62
|
-
const parentSlot =
|
|
52
|
+
const parentSlot = state.latestBlockHeader.slot;
|
|
63
53
|
const parentEpoch = computeEpochAtSlot(parentSlot);
|
|
64
54
|
const currentEpoch = computeEpochAtSlot(state.slot);
|
|
65
55
|
|
|
@@ -126,21 +116,6 @@ function settleBuilderPayment(state: CachedBeaconStateGloas, paymentIndex: numbe
|
|
|
126
116
|
state.builderPendingPayments.set(paymentIndex, ssz.gloas.BuilderPendingPayment.defaultViewDU());
|
|
127
117
|
}
|
|
128
118
|
|
|
129
|
-
function assertExecutionRequestsWithinLimits(requests: gloas.ExecutionRequests): void {
|
|
130
|
-
assertMaxLength("withdrawals", requests.withdrawals.length, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD);
|
|
131
|
-
assertMaxLength("consolidations", requests.consolidations.length, MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD);
|
|
132
|
-
// New in GLOAS:EIP8282
|
|
133
|
-
assertMaxLength("builderDeposits", requests.builderDeposits.length, MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD);
|
|
134
|
-
// New in GLOAS:EIP8282
|
|
135
|
-
assertMaxLength("builderExits", requests.builderExits.length, MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
function assertMaxLength(name: string, length: number, limit: number): void {
|
|
139
|
-
if (length > limit) {
|
|
140
|
-
throw new Error(`Too many parent execution request ${name} count=${length} limit=${limit}`);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
119
|
function assertEmptyExecutionRequests(requests: gloas.ExecutionRequests): void {
|
|
145
120
|
if (
|
|
146
121
|
requests.deposits.length !== 0 ||
|
|
@@ -5,7 +5,8 @@ import {isValidIndexedPayloadAttestation} from "./isValidIndexedPayloadAttestati
|
|
|
5
5
|
|
|
6
6
|
export function processPayloadAttestation(
|
|
7
7
|
state: CachedBeaconStateGloas,
|
|
8
|
-
payloadAttestation: gloas.PayloadAttestation
|
|
8
|
+
payloadAttestation: gloas.PayloadAttestation,
|
|
9
|
+
verifySignature = true
|
|
9
10
|
): void {
|
|
10
11
|
const data = payloadAttestation.data;
|
|
11
12
|
|
|
@@ -19,7 +20,7 @@ export function processPayloadAttestation(
|
|
|
19
20
|
|
|
20
21
|
const indexedPayloadAttestation = state.epochCtx.getIndexedPayloadAttestation(data.slot, payloadAttestation);
|
|
21
22
|
|
|
22
|
-
if (!isValidIndexedPayloadAttestation(state, indexedPayloadAttestation,
|
|
23
|
+
if (!isValidIndexedPayloadAttestation(state, indexedPayloadAttestation, verifySignature)) {
|
|
23
24
|
throw Error("Invalid payload attestation");
|
|
24
25
|
}
|
|
25
26
|
}
|
|
@@ -212,7 +212,12 @@ function getBuildersSweepWithdrawals(
|
|
|
212
212
|
break;
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
-
// Get next builder in turn
|
|
215
|
+
// Get next builder in turn, the spec does not wrap around an out of bounds start index
|
|
216
|
+
if (n === 0 && state.nextWithdrawalBuilderIndex >= builders.length) {
|
|
217
|
+
throw Error(
|
|
218
|
+
`Next withdrawal builder index ${state.nextWithdrawalBuilderIndex} out of bounds, builders count ${builders.length}`
|
|
219
|
+
);
|
|
220
|
+
}
|
|
216
221
|
const builderIndex = (state.nextWithdrawalBuilderIndex + n) % builders.length;
|
|
217
222
|
const builder = builders.getReadonly(builderIndex);
|
|
218
223
|
|
|
@@ -340,7 +345,12 @@ function getValidatorsSweepWithdrawals(
|
|
|
340
345
|
break;
|
|
341
346
|
}
|
|
342
347
|
|
|
343
|
-
// Get next validator in turn
|
|
348
|
+
// Get next validator in turn, the spec does not wrap around an out of bounds start index
|
|
349
|
+
if (n === 0 && nextWithdrawalValidatorIndex >= validators.length) {
|
|
350
|
+
throw Error(
|
|
351
|
+
`Next withdrawal validator index ${nextWithdrawalValidatorIndex} out of bounds, validators count ${validators.length}`
|
|
352
|
+
);
|
|
353
|
+
}
|
|
344
354
|
const validatorIndex = (nextWithdrawalValidatorIndex + n) % validators.length;
|
|
345
355
|
|
|
346
356
|
const validator = validators.getReadonly(validatorIndex);
|
package/src/block/types.ts
CHANGED
|
@@ -7,3 +7,35 @@ export enum ProposerRewardType {
|
|
|
7
7
|
syncAggregate = "sync_aggregate",
|
|
8
8
|
slashing = "slashing",
|
|
9
9
|
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Steps of `processBlock()` tracked in metrics
|
|
13
|
+
*/
|
|
14
|
+
export enum BlockProcessStep {
|
|
15
|
+
processParentExecutionPayload = "processParentExecutionPayload",
|
|
16
|
+
processBlockHeader = "processBlockHeader",
|
|
17
|
+
processWithdrawals = "processWithdrawals",
|
|
18
|
+
processExecutionPayload = "processExecutionPayload",
|
|
19
|
+
processExecutionPayloadBid = "processExecutionPayloadBid",
|
|
20
|
+
processRandao = "processRandao",
|
|
21
|
+
processEth1Data = "processEth1Data",
|
|
22
|
+
processOperations = "processOperations",
|
|
23
|
+
processSyncAggregate = "processSyncAggregate",
|
|
24
|
+
processBlobKzgCommitments = "processBlobKzgCommitments",
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Steps of `processOperations()` tracked in metrics
|
|
29
|
+
*/
|
|
30
|
+
export enum ProcessOperationsStep {
|
|
31
|
+
processProposerSlashing = "processProposerSlashing",
|
|
32
|
+
processAttesterSlashing = "processAttesterSlashing",
|
|
33
|
+
processAttestations = "processAttestations",
|
|
34
|
+
processDeposit = "processDeposit",
|
|
35
|
+
processVoluntaryExit = "processVoluntaryExit",
|
|
36
|
+
processBlsToExecutionChange = "processBlsToExecutionChange",
|
|
37
|
+
processDepositRequest = "processDepositRequest",
|
|
38
|
+
processWithdrawalRequest = "processWithdrawalRequest",
|
|
39
|
+
processConsolidationRequest = "processConsolidationRequest",
|
|
40
|
+
processPayloadAttestation = "processPayloadAttestation",
|
|
41
|
+
}
|
|
@@ -37,6 +37,7 @@ export function processInactivityUpdates(state: CachedBeaconStateAltair, cache:
|
|
|
37
37
|
|
|
38
38
|
inactivityScoresArr.length = state.validators.length;
|
|
39
39
|
inactivityScores.getAll(inactivityScoresArr);
|
|
40
|
+
let shouldSetInactivityScores = false;
|
|
40
41
|
|
|
41
42
|
for (let i = 0; i < flags.length; i++) {
|
|
42
43
|
const flag = flags[i];
|
|
@@ -53,8 +54,14 @@ export function processInactivityUpdates(state: CachedBeaconStateAltair, cache:
|
|
|
53
54
|
inactivityScore -= Math.min(INACTIVITY_SCORE_RECOVERY_RATE, inactivityScore);
|
|
54
55
|
}
|
|
55
56
|
if (inactivityScore !== prevInactivityScore) {
|
|
56
|
-
|
|
57
|
+
inactivityScoresArr[i] = inactivityScore;
|
|
58
|
+
shouldSetInactivityScores = true;
|
|
57
59
|
}
|
|
58
60
|
}
|
|
59
61
|
}
|
|
62
|
+
|
|
63
|
+
if (shouldSetInactivityScores) {
|
|
64
|
+
// Rebuilding the full view is slightly slower than individual sets only when very few scores change.
|
|
65
|
+
state.inactivityScores = state.type.fields.inactivityScores.toViewDU(inactivityScoresArr);
|
|
66
|
+
}
|
|
60
67
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {MIN_SEED_LOOKAHEAD} from "@lodestar/params";
|
|
1
|
+
import {MIN_SEED_LOOKAHEAD, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
2
2
|
import {ssz} from "@lodestar/types";
|
|
3
3
|
import {CachedBeaconStateGloas, EpochTransitionCache} from "../types.js";
|
|
4
4
|
import {computeEpochShuffling} from "../util/epochShuffling.js";
|
|
@@ -22,17 +22,24 @@ export function processPtcWindow(state: CachedBeaconStateGloas, cache: EpochTran
|
|
|
22
22
|
state,
|
|
23
23
|
nextEpoch,
|
|
24
24
|
nextEpochShuffling.committees,
|
|
25
|
+
nextEpochShuffling.shuffling,
|
|
25
26
|
state.epochCtx.effectiveBalanceIncrements
|
|
26
27
|
);
|
|
27
28
|
|
|
28
29
|
// Stash for finalProcessEpoch to shift into epoch cache
|
|
29
30
|
cache.nextEpochPayloadTimelinessCommittees = newNextPayloadTimelinessCommittees;
|
|
30
31
|
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
// Shift the current and next epochs forward by reusing their SSZ subtrees and cached hashes.
|
|
33
|
+
// Only the newly computed epoch needs new subtrees.
|
|
34
|
+
const ptcWindow = state.ptcWindow;
|
|
35
|
+
const retainedLength = ptcWindow.length - SLOTS_PER_EPOCH;
|
|
36
|
+
for (let i = 0; i < retainedLength; i++) {
|
|
37
|
+
ptcWindow.set(i, ptcWindow.getReadonly(i + SLOTS_PER_EPOCH));
|
|
38
|
+
}
|
|
39
|
+
for (let i = 0; i < SLOTS_PER_EPOCH; i++) {
|
|
40
|
+
ptcWindow.set(
|
|
41
|
+
retainedLength + i,
|
|
42
|
+
ssz.gloas.PayloadTimelinessCommittee.toViewDU(newNextPayloadTimelinessCommittees[i])
|
|
43
|
+
);
|
|
44
|
+
}
|
|
38
45
|
}
|
package/src/index.ts
CHANGED
|
@@ -13,7 +13,7 @@ export {
|
|
|
13
13
|
} from "./block/processVoluntaryExit.js";
|
|
14
14
|
// Withdrawals for new blocks
|
|
15
15
|
export {getExpectedWithdrawals} from "./block/processWithdrawals.js";
|
|
16
|
-
export {ProposerRewardType} from "./block/types.js";
|
|
16
|
+
export {BlockProcessStep, ProcessOperationsStep, ProposerRewardType} from "./block/types.js";
|
|
17
17
|
export {
|
|
18
18
|
type EffectiveBalanceIncrements,
|
|
19
19
|
getEffectiveBalanceIncrementsWithLen,
|
|
@@ -43,6 +43,8 @@ export * from "./signatureSets/index.js";
|
|
|
43
43
|
export * from "./stateTransition.js";
|
|
44
44
|
export {BeaconStateView} from "./stateView/beaconStateView.js";
|
|
45
45
|
export {
|
|
46
|
+
type ComputeNewStateRootInput,
|
|
47
|
+
type ComputeNewStateRootResult,
|
|
46
48
|
type IBeaconStateView,
|
|
47
49
|
type IBeaconStateViewAltair,
|
|
48
50
|
type IBeaconStateViewBellatrix,
|
|
@@ -32,11 +32,13 @@ export {
|
|
|
32
32
|
type SyncCommitteeFast,
|
|
33
33
|
} from "./store.js";
|
|
34
34
|
export {
|
|
35
|
+
getLightClientExecutionRoot,
|
|
35
36
|
getSafetyThreshold,
|
|
36
37
|
isFinalityUpdate,
|
|
37
38
|
isSyncCommitteeUpdate,
|
|
38
39
|
isValidLightClientHeader,
|
|
39
40
|
normalizeMerkleBranch,
|
|
41
|
+
upgradeLightClientBootstrap,
|
|
40
42
|
upgradeLightClientFinalityUpdate,
|
|
41
43
|
upgradeLightClientHeader,
|
|
42
44
|
upgradeLightClientOptimisticUpdate,
|