@lodestar/state-transition 1.47.0-dev.404f68958c → 1.47.0-dev.6325e4e1fe
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/metrics.d.ts +11 -0
- package/lib/metrics.d.ts.map +1 -1
- package/lib/metrics.js +22 -0
- package/lib/metrics.js.map +1 -1
- package/lib/slot/upgradeStateToGloas.d.ts +2 -1
- package/lib/slot/upgradeStateToGloas.d.ts.map +1 -1
- package/lib/slot/upgradeStateToGloas.js +38 -3
- package/lib/slot/upgradeStateToGloas.js.map +1 -1
- package/lib/stateTransition.js +7 -2
- package/lib/stateTransition.js.map +1 -1
- package/lib/util/pendingDepositsLookup.d.ts +12 -0
- package/lib/util/pendingDepositsLookup.d.ts.map +1 -1
- package/lib/util/pendingDepositsLookup.js +19 -1
- package/lib/util/pendingDepositsLookup.js.map +1 -1
- package/package.json +7 -7
- package/src/metrics.ts +23 -0
- package/src/slot/upgradeStateToGloas.ts +47 -3
- package/src/stateTransition.ts +7 -2
- package/src/util/pendingDepositsLookup.ts +20 -1
package/lib/metrics.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ForkName } from "@lodestar/params";
|
|
1
2
|
import { MetricsRegister } from "@lodestar/utils";
|
|
2
3
|
import { ProposerRewardType } from "./block/types.js";
|
|
3
4
|
import { EpochTransitionStep } from "./epoch/index.js";
|
|
@@ -13,6 +14,16 @@ export declare function getMetrics(register: MetricsRegister): {
|
|
|
13
14
|
epochTransitionStepTime: import("@lodestar/utils").Histogram<{
|
|
14
15
|
step: EpochTransitionStep;
|
|
15
16
|
}>;
|
|
17
|
+
forkUpgradeTime: import("@lodestar/utils").Histogram<{
|
|
18
|
+
fork: ForkName;
|
|
19
|
+
}>;
|
|
20
|
+
onboardBuildersTime: import("@lodestar/utils").Histogram<import("@lodestar/utils").NoLabels>;
|
|
21
|
+
onboardBuildersDeposits: import("@lodestar/utils").Gauge<{
|
|
22
|
+
outcome: "onboarded" | "topup" | "kept" | "dropped";
|
|
23
|
+
}>;
|
|
24
|
+
onboardBuildersSignatureChecks: import("@lodestar/utils").Gauge<{
|
|
25
|
+
source: "cache" | "verified";
|
|
26
|
+
}>;
|
|
16
27
|
processBlockTime: import("@lodestar/utils").Histogram<import("@lodestar/utils").NoLabels>;
|
|
17
28
|
processBlockCommitTime: import("@lodestar/utils").Histogram<import("@lodestar/utils").NoLabels>;
|
|
18
29
|
stateHashTreeRootTime: import("@lodestar/utils").Histogram<{
|
package/lib/metrics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAC,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAC,gBAAgB,EAAE,uBAAuB,EAAC,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAC,yBAAyB,EAAC,MAAM,YAAY,CAAC;AAGrD,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAEzE;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,eAAe;IAIhD,mBAAmB;IAMnB,yBAAyB;IAKzB,uBAAuB;cAA4B,mBAAmB;;IAMtE,gBAAgB;IAOhB,sBAAsB;IAKtB,qBAAqB;gBAA8B,uBAAuB;;IAM1E,0BAA0B;IAI1B,2BAA2B;IAI3B,qBAAqB;IAIrB,kCAAkC;gBAA0B,gBAAgB;;IAK5E,iCAAiC;gBAA0B,gBAAgB;;IAK3E,oCAAoC;gBAA0B,gBAAgB;;IAK9E,mCAAmC;gBAA0B,gBAAgB;;IAK7E,mBAAmB;IAKnB,kCAAkC;IAIlC,mCAAmC;IAInC,oCAAoC;IAIpC,qCAAqC;IAIrC,wBAAwB;IAIxB,wCAAwC;IAIxC,oBAAoB;IAIpB,eAAe;cAAwB,kBAAkB;;EAM5D;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,yBAAyB,EAChC,OAAO,EAAE,4BAA4B,EACrC,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAcN;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,yBAAyB,EAAE,OAAO,EAAE,4BAA4B,GAAG,IAAI,CAYpH"}
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAC,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAC,gBAAgB,EAAE,uBAAuB,EAAC,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAC,yBAAyB,EAAC,MAAM,YAAY,CAAC;AAGrD,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAEzE;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,eAAe;IAIhD,mBAAmB;IAMnB,yBAAyB;IAKzB,uBAAuB;cAA4B,mBAAmB;;IAMtE,eAAe;cAA4B,QAAQ;;IAOnD,mBAAmB;IAKnB,uBAAuB;iBAA2B,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS;;IAK5F,8BAA8B;gBAA0B,OAAO,GAAG,UAAU;;IAK5E,gBAAgB;IAOhB,sBAAsB;IAKtB,qBAAqB;gBAA8B,uBAAuB;;IAM1E,0BAA0B;IAI1B,2BAA2B;IAI3B,qBAAqB;IAIrB,kCAAkC;gBAA0B,gBAAgB;;IAK5E,iCAAiC;gBAA0B,gBAAgB;;IAK3E,oCAAoC;gBAA0B,gBAAgB;;IAK9E,mCAAmC;gBAA0B,gBAAgB;;IAK7E,mBAAmB;IAKnB,kCAAkC;IAIlC,mCAAmC;IAInC,oCAAoC;IAIpC,qCAAqC;IAIrC,wBAAwB;IAIxB,wCAAwC;IAIxC,oBAAoB;IAIpB,eAAe;cAAwB,kBAAkB;;EAM5D;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,yBAAyB,EAChC,OAAO,EAAE,4BAA4B,EACrC,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAcN;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,yBAAyB,EAAE,OAAO,EAAE,4BAA4B,GAAG,IAAI,CAYpH"}
|
package/lib/metrics.js
CHANGED
|
@@ -22,6 +22,28 @@ export function getMetrics(register) {
|
|
|
22
22
|
labelNames: ["step"],
|
|
23
23
|
buckets: [0.01, 0.05, 0.1, 0.2, 0.5, 0.75, 1],
|
|
24
24
|
}),
|
|
25
|
+
forkUpgradeTime: register.histogram({
|
|
26
|
+
name: "lodestar_stfn_fork_upgrade_seconds",
|
|
27
|
+
help: "Time to upgrade the state at a fork boundary in seconds",
|
|
28
|
+
labelNames: ["fork"],
|
|
29
|
+
// The gloas upgrade is unbounded (see onboardBuildersTime), hence the long tail
|
|
30
|
+
buckets: [0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 30],
|
|
31
|
+
}),
|
|
32
|
+
onboardBuildersTime: register.histogram({
|
|
33
|
+
name: "lodestar_stfn_gloas_onboard_builders_seconds",
|
|
34
|
+
help: "Time spent in onboardBuildersFromPendingDeposits at the gloas fork transition",
|
|
35
|
+
buckets: [0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 30],
|
|
36
|
+
}),
|
|
37
|
+
onboardBuildersDeposits: register.gauge({
|
|
38
|
+
name: "lodestar_stfn_gloas_onboard_builders_deposits",
|
|
39
|
+
help: "Pending deposits handled at the gloas fork transition, by outcome",
|
|
40
|
+
labelNames: ["outcome"],
|
|
41
|
+
}),
|
|
42
|
+
onboardBuildersSignatureChecks: register.gauge({
|
|
43
|
+
name: "lodestar_stfn_gloas_onboard_builders_signature_checks",
|
|
44
|
+
help: "Builder deposit signature checks at the gloas fork transition. `verified` means the pre-verify cache missed and BLS ran inline, on the fork transition's critical path",
|
|
45
|
+
labelNames: ["source"],
|
|
46
|
+
}),
|
|
25
47
|
processBlockTime: register.histogram({
|
|
26
48
|
name: "lodestar_stfn_process_block_seconds",
|
|
27
49
|
help: "Time to process a single block in seconds",
|
package/lib/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { BeaconStateTransitionMetrics } from "../metrics.js";
|
|
1
2
|
import { CachedBeaconStateFulu, CachedBeaconStateGloas } from "../types.js";
|
|
2
3
|
/**
|
|
3
4
|
* Upgrade a state from Fulu to Gloas.
|
|
4
5
|
*/
|
|
5
|
-
export declare function upgradeStateToGloas(stateFulu: CachedBeaconStateFulu): CachedBeaconStateGloas;
|
|
6
|
+
export declare function upgradeStateToGloas(stateFulu: CachedBeaconStateFulu, metrics?: BeaconStateTransitionMetrics | null): CachedBeaconStateGloas;
|
|
6
7
|
//# sourceMappingURL=upgradeStateToGloas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgradeStateToGloas.d.ts","sourceRoot":"","sources":["../../src/slot/upgradeStateToGloas.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAC,qBAAqB,EAAE,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAM1E;;GAEG;AACH,wBAAgB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"upgradeStateToGloas.d.ts","sourceRoot":"","sources":["../../src/slot/upgradeStateToGloas.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAC,4BAA4B,EAAC,MAAM,eAAe,CAAC;AAChE,OAAO,EAAC,qBAAqB,EAAE,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAM1E;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,qBAAqB,EAChC,OAAO,CAAC,EAAE,4BAA4B,GAAG,IAAI,GAC5C,sBAAsB,CA0FxB"}
|
|
@@ -11,7 +11,7 @@ import { progressiveListRootNode } from "../util/ssz.js";
|
|
|
11
11
|
/**
|
|
12
12
|
* Upgrade a state from Fulu to Gloas.
|
|
13
13
|
*/
|
|
14
|
-
export function upgradeStateToGloas(stateFulu) {
|
|
14
|
+
export function upgradeStateToGloas(stateFulu, metrics) {
|
|
15
15
|
const { config } = stateFulu;
|
|
16
16
|
ssz.fulu.BeaconState.commitViewDU(stateFulu);
|
|
17
17
|
const stateGloasCloned = stateFulu;
|
|
@@ -67,7 +67,7 @@ export function upgradeStateToGloas(stateFulu) {
|
|
|
67
67
|
stateGloasView.latestBlockHash = stateFulu.latestExecutionPayloadHeader.blockHash;
|
|
68
68
|
const stateGloas = getCachedBeaconState(stateGloasView, stateFulu);
|
|
69
69
|
// Process pending builder deposits at the fork boundary
|
|
70
|
-
onboardBuildersFromPendingDeposits(stateGloas);
|
|
70
|
+
onboardBuildersFromPendingDeposits(stateGloas, metrics);
|
|
71
71
|
stateGloas.commit();
|
|
72
72
|
// Clear cache to ensure the cache of fulu fields is not used by new gloas fields
|
|
73
73
|
// biome-ignore lint/complexity/useLiteralKeys: It is a protected attribute
|
|
@@ -115,7 +115,20 @@ function migrateBasicListToGloas(fuluList, gloasType) {
|
|
|
115
115
|
* Applies any pending deposits for builders to onboard builders during the fork transition
|
|
116
116
|
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.8/specs/gloas/fork.md#new-onboard_builders_from_pending_deposits
|
|
117
117
|
*/
|
|
118
|
-
function onboardBuildersFromPendingDeposits(state) {
|
|
118
|
+
function onboardBuildersFromPendingDeposits(state, metrics) {
|
|
119
|
+
const timer = metrics?.onboardBuildersTime.startTimer();
|
|
120
|
+
// Counted so the duration above is interpretable: this loop walks the whole pending
|
|
121
|
+
// deposit queue, and its cost is dominated by whichever branch the queue happens to
|
|
122
|
+
// hit. `verified` signature checks are the ones the pre-verify cache missed, i.e. BLS
|
|
123
|
+
// running inline on the fork transition's critical path. The signature totals include
|
|
124
|
+
// the checks hasPendingValidator() does internally, which dominate when a builder
|
|
125
|
+
// deposit is preceded by same-pubkey validator deposits.
|
|
126
|
+
let onboarded = 0;
|
|
127
|
+
let topups = 0;
|
|
128
|
+
let kept = 0;
|
|
129
|
+
let dropped = 0;
|
|
130
|
+
let sigFromCache = 0;
|
|
131
|
+
let sigVerified = 0;
|
|
119
132
|
// Track pubkeys of new builders added when applying deposits. `state.builders` starts empty
|
|
120
133
|
// at the fork, so every builder pubkey here is one added in an earlier iteration.
|
|
121
134
|
const builderPubkeys = new Set();
|
|
@@ -129,6 +142,7 @@ function onboardBuildersFromPendingDeposits(state) {
|
|
|
129
142
|
if (isValidatorKnown(state, validatorIndex)) {
|
|
130
143
|
pendingDeposits.push(deposit);
|
|
131
144
|
pendingDepositsLookup.add(depositValue, pubkeyHex);
|
|
145
|
+
kept++;
|
|
132
146
|
continue;
|
|
133
147
|
}
|
|
134
148
|
if (builderPubkeys.has(pubkeyHex)) {
|
|
@@ -140,6 +154,7 @@ function onboardBuildersFromPendingDeposits(state) {
|
|
|
140
154
|
break;
|
|
141
155
|
}
|
|
142
156
|
}
|
|
157
|
+
topups++;
|
|
143
158
|
continue;
|
|
144
159
|
}
|
|
145
160
|
// Deposits for non-builders stay in the pending queue. If there is a valid pending
|
|
@@ -148,11 +163,13 @@ function onboardBuildersFromPendingDeposits(state) {
|
|
|
148
163
|
if (!isBuilderWithdrawalCredential(deposit.withdrawalCredentials)) {
|
|
149
164
|
pendingDeposits.push(deposit);
|
|
150
165
|
pendingDepositsLookup.add(depositValue, pubkeyHex);
|
|
166
|
+
kept++;
|
|
151
167
|
continue;
|
|
152
168
|
}
|
|
153
169
|
if (pendingDepositsLookup.hasPendingValidator(state.config, pubkeyHex, state.epochCtx.builderDepositSignatureCache)) {
|
|
154
170
|
pendingDeposits.push(deposit);
|
|
155
171
|
pendingDepositsLookup.add(depositValue, pubkeyHex);
|
|
172
|
+
kept++;
|
|
156
173
|
continue;
|
|
157
174
|
}
|
|
158
175
|
// Verify the deposit signature (proof of possession). If invalid the deposit is silently
|
|
@@ -161,14 +178,32 @@ function onboardBuildersFromPendingDeposits(state) {
|
|
|
161
178
|
// The prepareNextSlot scheduler pre-verifies these signatures in the epochs before the fork
|
|
162
179
|
// A cache miss falls back to verifying this one deposit — no worse than pre-cache.
|
|
163
180
|
const cached = state.epochCtx.builderDepositSignatureCache.getSignatureValidity(depositValue);
|
|
181
|
+
if (cached === null) {
|
|
182
|
+
sigVerified++;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
sigFromCache++;
|
|
186
|
+
}
|
|
164
187
|
const isValid = cached ??
|
|
165
188
|
isValidDepositSignature(state.config, deposit.pubkey, deposit.withdrawalCredentials, deposit.amount, deposit.signature);
|
|
166
189
|
if (!isValid) {
|
|
190
|
+
dropped++;
|
|
167
191
|
continue;
|
|
168
192
|
}
|
|
169
193
|
addBuilderToRegistry(state, deposit.pubkey, PAYLOAD_BUILDER_VERSION, deposit.withdrawalCredentials.subarray(12), deposit.amount, deposit.slot);
|
|
170
194
|
builderPubkeys.add(pubkeyHex);
|
|
195
|
+
onboarded++;
|
|
171
196
|
}
|
|
172
197
|
state.pendingDeposits = pendingDeposits;
|
|
198
|
+
timer?.();
|
|
199
|
+
if (metrics) {
|
|
200
|
+
metrics.onboardBuildersDeposits.set({ outcome: "onboarded" }, onboarded);
|
|
201
|
+
metrics.onboardBuildersDeposits.set({ outcome: "topup" }, topups);
|
|
202
|
+
metrics.onboardBuildersDeposits.set({ outcome: "kept" }, kept);
|
|
203
|
+
metrics.onboardBuildersDeposits.set({ outcome: "dropped" }, dropped);
|
|
204
|
+
const lookupChecks = pendingDepositsLookup.signatureChecks;
|
|
205
|
+
metrics.onboardBuildersSignatureChecks.set({ source: "cache" }, sigFromCache + lookupChecks.fromCache);
|
|
206
|
+
metrics.onboardBuildersSignatureChecks.set({ source: "verified" }, sigVerified + lookupChecks.verified);
|
|
207
|
+
}
|
|
173
208
|
}
|
|
174
209
|
//# sourceMappingURL=upgradeStateToGloas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgradeStateToGloas.js","sourceRoot":"","sources":["../../src/slot/upgradeStateToGloas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,mCAAmC,CAAC;AAYlE,OAAO,EAAC,uBAAuB,EAAE,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AACpC,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAC,uBAAuB,EAAC,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"upgradeStateToGloas.js","sourceRoot":"","sources":["../../src/slot/upgradeStateToGloas.ts"],"names":[],"mappings":"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"}
|
package/lib/stateTransition.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SLOTS_PER_EPOCH } from "@lodestar/params";
|
|
1
|
+
import { ForkName, SLOTS_PER_EPOCH } from "@lodestar/params";
|
|
2
2
|
import { ssz } from "@lodestar/types";
|
|
3
3
|
import { toRootHex } from "@lodestar/utils";
|
|
4
4
|
import { DataAvailabilityStatus, ExecutionPayloadStatus } from "./block/externalData.js";
|
|
@@ -171,7 +171,12 @@ function processSlotsWithTransientCache(postState, slot, epochTransitionCacheOpt
|
|
|
171
171
|
postState = upgradeStateToFulu(postState);
|
|
172
172
|
}
|
|
173
173
|
if (stateEpoch === config.GLOAS_FORK_EPOCH) {
|
|
174
|
-
|
|
174
|
+
// Timed, unlike the other fork upgrades: this one does unbounded work.
|
|
175
|
+
// onboardBuildersFromPendingDeposits walks the entire pending deposit queue, so its
|
|
176
|
+
// cost is set by whatever is sitting in that queue when the fork lands.
|
|
177
|
+
const timer = metrics?.forkUpgradeTime.startTimer({ fork: ForkName.gloas });
|
|
178
|
+
postState = upgradeStateToGloas(postState, metrics);
|
|
179
|
+
timer?.();
|
|
175
180
|
}
|
|
176
181
|
if (stateEpoch === config.HEZE_FORK_EPOCH) {
|
|
177
182
|
postState = upgradeStateToHeze(postState);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stateTransition.js","sourceRoot":"","sources":["../src/stateTransition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"stateTransition.js","sourceRoot":"","sources":["../src/stateTransition.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,8 @@ import { BuilderDepositSignatureCache } from "../cache/builderDepositSignatureCa
|
|
|
17
17
|
export declare class PendingDepositsLookup {
|
|
18
18
|
private readonly depositsByPubkey;
|
|
19
19
|
private readonly validationCache;
|
|
20
|
+
private signaturesFromCache;
|
|
21
|
+
private signaturesVerified;
|
|
20
22
|
private constructor();
|
|
21
23
|
/** Build an empty lookup for a sequence that will be populated incrementally. */
|
|
22
24
|
static buildEmpty(): PendingDepositsLookup;
|
|
@@ -32,6 +34,16 @@ export declare class PendingDepositsLookup {
|
|
|
32
34
|
* Most of the time it should hit the BuilderDepositSignatureCache so we don't have to validate
|
|
33
35
|
* signatures here.
|
|
34
36
|
*/
|
|
37
|
+
/**
|
|
38
|
+
* Signature checks performed inside `hasPendingValidator()`, split by whether the pre-verify
|
|
39
|
+
* cache served them. These are the scan the caller never sees: when a builder-routed deposit is
|
|
40
|
+
* preceded by same-pubkey validator deposits this walk dominates, and on a `true` result the
|
|
41
|
+
* caller skips its own signature check entirely.
|
|
42
|
+
*/
|
|
43
|
+
get signatureChecks(): {
|
|
44
|
+
fromCache: number;
|
|
45
|
+
verified: number;
|
|
46
|
+
};
|
|
35
47
|
hasPendingValidator(config: BeaconConfig, pubkeyHex: PubkeyHex, cache: BuilderDepositSignatureCache): boolean;
|
|
36
48
|
}
|
|
37
49
|
//# sourceMappingURL=pendingDepositsLookup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pendingDepositsLookup.d.ts","sourceRoot":"","sources":["../../src/util/pendingDepositsLookup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAC,SAAS,EAAE,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAC,4BAA4B,EAAC,MAAM,0CAA0C,CAAC;AAOtF;;;;;;;;;;;;GAYG;AACH,qBAAa,qBAAqB;
|
|
1
|
+
{"version":3,"file":"pendingDepositsLookup.d.ts","sourceRoot":"","sources":["../../src/util/pendingDepositsLookup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAC,SAAS,EAAE,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAC,4BAA4B,EAAC,MAAM,0CAA0C,CAAC;AAOtF;;;;;;;;;;;;GAYG;AACH,qBAAa,qBAAqB;IAK9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe;IALlC,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,kBAAkB,CAAK;IAE/B,OAAO,eAGH;IAEJ,iFAAiF;IACjF,MAAM,CAAC,UAAU,IAAI,qBAAqB,CAEzC;IAED;;OAEG;IACH,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAOtE;IAED;;;;;;;OAOG;IACH;;;;;OAKG;IACH,IAAI,eAAe,IAAI;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,CAE3D;IAED,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,4BAA4B,GAAG,OAAO,CA4C5G;CACF"}
|
|
@@ -15,6 +15,8 @@ import { isValidDepositSignature } from "../block/processDeposit.js";
|
|
|
15
15
|
export class PendingDepositsLookup {
|
|
16
16
|
depositsByPubkey;
|
|
17
17
|
validationCache;
|
|
18
|
+
signaturesFromCache = 0;
|
|
19
|
+
signaturesVerified = 0;
|
|
18
20
|
constructor(depositsByPubkey, validationCache) {
|
|
19
21
|
this.depositsByPubkey = depositsByPubkey;
|
|
20
22
|
this.validationCache = validationCache;
|
|
@@ -43,6 +45,15 @@ export class PendingDepositsLookup {
|
|
|
43
45
|
* Most of the time it should hit the BuilderDepositSignatureCache so we don't have to validate
|
|
44
46
|
* signatures here.
|
|
45
47
|
*/
|
|
48
|
+
/**
|
|
49
|
+
* Signature checks performed inside `hasPendingValidator()`, split by whether the pre-verify
|
|
50
|
+
* cache served them. These are the scan the caller never sees: when a builder-routed deposit is
|
|
51
|
+
* preceded by same-pubkey validator deposits this walk dominates, and on a `true` result the
|
|
52
|
+
* caller skips its own signature check entirely.
|
|
53
|
+
*/
|
|
54
|
+
get signatureChecks() {
|
|
55
|
+
return { fromCache: this.signaturesFromCache, verified: this.signaturesVerified };
|
|
56
|
+
}
|
|
46
57
|
hasPendingValidator(config, pubkeyHex, cache) {
|
|
47
58
|
const validation = this.validationCache.get(pubkeyHex);
|
|
48
59
|
if (validation?.hasValidSignature === true) {
|
|
@@ -61,7 +72,14 @@ export class PendingDepositsLookup {
|
|
|
61
72
|
}
|
|
62
73
|
for (let i = startIndex; i < deposits.length; i++) {
|
|
63
74
|
const deposit = deposits[i];
|
|
64
|
-
const
|
|
75
|
+
const cached = cache.getSignatureValidity(deposit);
|
|
76
|
+
if (cached === null) {
|
|
77
|
+
this.signaturesVerified++;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this.signaturesFromCache++;
|
|
81
|
+
}
|
|
82
|
+
const isValid = cached ??
|
|
65
83
|
isValidDepositSignature(config, deposit.pubkey, deposit.withdrawalCredentials, deposit.amount, deposit.signature);
|
|
66
84
|
if (isValid) {
|
|
67
85
|
this.validationCache.set(pubkeyHex, { hasValidSignature: true, validatedCount: i + 1 });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pendingDepositsLookup.js","sourceRoot":"","sources":["../../src/util/pendingDepositsLookup.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,uBAAuB,EAAC,MAAM,4BAA4B,CAAC;AAQnE;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,qBAAqB;
|
|
1
|
+
{"version":3,"file":"pendingDepositsLookup.js","sourceRoot":"","sources":["../../src/util/pendingDepositsLookup.ts"],"names":[],"mappings":"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"}
|
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.47.0-dev.
|
|
14
|
+
"version": "1.47.0-dev.6325e4e1fe",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -71,14 +71,14 @@
|
|
|
71
71
|
"@chainsafe/pubkey-index-map": "^3.0.0",
|
|
72
72
|
"@chainsafe/ssz": "^1.6.2",
|
|
73
73
|
"@chainsafe/swap-or-not-shuffle": "^1.2.1",
|
|
74
|
-
"@lodestar/config": "^1.47.0-dev.
|
|
75
|
-
"@lodestar/params": "^1.47.0-dev.
|
|
76
|
-
"@lodestar/types": "^1.47.0-dev.
|
|
77
|
-
"@lodestar/utils": "^1.47.0-dev.
|
|
74
|
+
"@lodestar/config": "^1.47.0-dev.6325e4e1fe",
|
|
75
|
+
"@lodestar/params": "^1.47.0-dev.6325e4e1fe",
|
|
76
|
+
"@lodestar/types": "^1.47.0-dev.6325e4e1fe",
|
|
77
|
+
"@lodestar/utils": "^1.47.0-dev.6325e4e1fe",
|
|
78
78
|
"@vekexasia/bigint-buffer2": "^1.1.1"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
|
-
"@lodestar/api": "^1.47.0-dev.
|
|
81
|
+
"@lodestar/api": "^1.47.0-dev.6325e4e1fe"
|
|
82
82
|
},
|
|
83
83
|
"keywords": [
|
|
84
84
|
"ethereum",
|
|
@@ -86,5 +86,5 @@
|
|
|
86
86
|
"beacon",
|
|
87
87
|
"blockchain"
|
|
88
88
|
],
|
|
89
|
-
"gitHead": "
|
|
89
|
+
"gitHead": "c87b2284d030026cf5b413a897de0eedbeb158d4"
|
|
90
90
|
}
|
package/src/metrics.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import {ForkName} from "@lodestar/params";
|
|
1
2
|
import {MetricsRegister} from "@lodestar/utils";
|
|
2
3
|
import {ProposerRewardType} from "./block/types.js";
|
|
3
4
|
import {EpochTransitionStep} from "./epoch/index.js";
|
|
@@ -31,6 +32,28 @@ export function getMetrics(register: MetricsRegister) {
|
|
|
31
32
|
labelNames: ["step"],
|
|
32
33
|
buckets: [0.01, 0.05, 0.1, 0.2, 0.5, 0.75, 1],
|
|
33
34
|
}),
|
|
35
|
+
forkUpgradeTime: register.histogram<{fork: ForkName}>({
|
|
36
|
+
name: "lodestar_stfn_fork_upgrade_seconds",
|
|
37
|
+
help: "Time to upgrade the state at a fork boundary in seconds",
|
|
38
|
+
labelNames: ["fork"],
|
|
39
|
+
// The gloas upgrade is unbounded (see onboardBuildersTime), hence the long tail
|
|
40
|
+
buckets: [0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 30],
|
|
41
|
+
}),
|
|
42
|
+
onboardBuildersTime: register.histogram({
|
|
43
|
+
name: "lodestar_stfn_gloas_onboard_builders_seconds",
|
|
44
|
+
help: "Time spent in onboardBuildersFromPendingDeposits at the gloas fork transition",
|
|
45
|
+
buckets: [0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 30],
|
|
46
|
+
}),
|
|
47
|
+
onboardBuildersDeposits: register.gauge<{outcome: "onboarded" | "topup" | "kept" | "dropped"}>({
|
|
48
|
+
name: "lodestar_stfn_gloas_onboard_builders_deposits",
|
|
49
|
+
help: "Pending deposits handled at the gloas fork transition, by outcome",
|
|
50
|
+
labelNames: ["outcome"],
|
|
51
|
+
}),
|
|
52
|
+
onboardBuildersSignatureChecks: register.gauge<{source: "cache" | "verified"}>({
|
|
53
|
+
name: "lodestar_stfn_gloas_onboard_builders_signature_checks",
|
|
54
|
+
help: "Builder deposit signature checks at the gloas fork transition. `verified` means the pre-verify cache missed and BLS ran inline, on the fork transition's critical path",
|
|
55
|
+
labelNames: ["source"],
|
|
56
|
+
}),
|
|
34
57
|
processBlockTime: register.histogram({
|
|
35
58
|
name: "lodestar_stfn_process_block_seconds",
|
|
36
59
|
help: "Time to process a single block in seconds",
|
|
@@ -15,6 +15,7 @@ import {ssz} from "@lodestar/types";
|
|
|
15
15
|
import {toPubkeyHex} from "@lodestar/utils";
|
|
16
16
|
import {isValidDepositSignature} from "../block/processDeposit.js";
|
|
17
17
|
import {getCachedBeaconState} from "../cache/stateCache.js";
|
|
18
|
+
import type {BeaconStateTransitionMetrics} from "../metrics.js";
|
|
18
19
|
import {CachedBeaconStateFulu, CachedBeaconStateGloas} from "../types.js";
|
|
19
20
|
import {addBuilderToRegistry, initializePtcWindow, isBuilderWithdrawalCredential} from "../util/gloas.js";
|
|
20
21
|
import {isValidatorKnown} from "../util/index.js";
|
|
@@ -24,7 +25,10 @@ import {progressiveListRootNode} from "../util/ssz.js";
|
|
|
24
25
|
/**
|
|
25
26
|
* Upgrade a state from Fulu to Gloas.
|
|
26
27
|
*/
|
|
27
|
-
export function upgradeStateToGloas(
|
|
28
|
+
export function upgradeStateToGloas(
|
|
29
|
+
stateFulu: CachedBeaconStateFulu,
|
|
30
|
+
metrics?: BeaconStateTransitionMetrics | null
|
|
31
|
+
): CachedBeaconStateGloas {
|
|
28
32
|
const {config} = stateFulu;
|
|
29
33
|
|
|
30
34
|
ssz.fulu.BeaconState.commitViewDU(stateFulu);
|
|
@@ -106,7 +110,7 @@ export function upgradeStateToGloas(stateFulu: CachedBeaconStateFulu): CachedBea
|
|
|
106
110
|
const stateGloas = getCachedBeaconState(stateGloasView, stateFulu);
|
|
107
111
|
|
|
108
112
|
// Process pending builder deposits at the fork boundary
|
|
109
|
-
onboardBuildersFromPendingDeposits(stateGloas);
|
|
113
|
+
onboardBuildersFromPendingDeposits(stateGloas, metrics);
|
|
110
114
|
|
|
111
115
|
stateGloas.commit();
|
|
112
116
|
// Clear cache to ensure the cache of fulu fields is not used by new gloas fields
|
|
@@ -164,7 +168,25 @@ function migrateBasicListToGloas<ElementType extends BasicType<unknown>>(
|
|
|
164
168
|
* Applies any pending deposits for builders to onboard builders during the fork transition
|
|
165
169
|
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.8/specs/gloas/fork.md#new-onboard_builders_from_pending_deposits
|
|
166
170
|
*/
|
|
167
|
-
function onboardBuildersFromPendingDeposits(
|
|
171
|
+
function onboardBuildersFromPendingDeposits(
|
|
172
|
+
state: CachedBeaconStateGloas,
|
|
173
|
+
metrics?: BeaconStateTransitionMetrics | null
|
|
174
|
+
): void {
|
|
175
|
+
const timer = metrics?.onboardBuildersTime.startTimer();
|
|
176
|
+
|
|
177
|
+
// Counted so the duration above is interpretable: this loop walks the whole pending
|
|
178
|
+
// deposit queue, and its cost is dominated by whichever branch the queue happens to
|
|
179
|
+
// hit. `verified` signature checks are the ones the pre-verify cache missed, i.e. BLS
|
|
180
|
+
// running inline on the fork transition's critical path. The signature totals include
|
|
181
|
+
// the checks hasPendingValidator() does internally, which dominate when a builder
|
|
182
|
+
// deposit is preceded by same-pubkey validator deposits.
|
|
183
|
+
let onboarded = 0;
|
|
184
|
+
let topups = 0;
|
|
185
|
+
let kept = 0;
|
|
186
|
+
let dropped = 0;
|
|
187
|
+
let sigFromCache = 0;
|
|
188
|
+
let sigVerified = 0;
|
|
189
|
+
|
|
168
190
|
// Track pubkeys of new builders added when applying deposits. `state.builders` starts empty
|
|
169
191
|
// at the fork, so every builder pubkey here is one added in an earlier iteration.
|
|
170
192
|
const builderPubkeys = new Set<string>();
|
|
@@ -182,6 +204,7 @@ function onboardBuildersFromPendingDeposits(state: CachedBeaconStateGloas): void
|
|
|
182
204
|
if (isValidatorKnown(state, validatorIndex)) {
|
|
183
205
|
pendingDeposits.push(deposit);
|
|
184
206
|
pendingDepositsLookup.add(depositValue, pubkeyHex);
|
|
207
|
+
kept++;
|
|
185
208
|
continue;
|
|
186
209
|
}
|
|
187
210
|
|
|
@@ -194,6 +217,7 @@ function onboardBuildersFromPendingDeposits(state: CachedBeaconStateGloas): void
|
|
|
194
217
|
break;
|
|
195
218
|
}
|
|
196
219
|
}
|
|
220
|
+
topups++;
|
|
197
221
|
continue;
|
|
198
222
|
}
|
|
199
223
|
|
|
@@ -203,6 +227,7 @@ function onboardBuildersFromPendingDeposits(state: CachedBeaconStateGloas): void
|
|
|
203
227
|
if (!isBuilderWithdrawalCredential(deposit.withdrawalCredentials)) {
|
|
204
228
|
pendingDeposits.push(deposit);
|
|
205
229
|
pendingDepositsLookup.add(depositValue, pubkeyHex);
|
|
230
|
+
kept++;
|
|
206
231
|
continue;
|
|
207
232
|
}
|
|
208
233
|
if (
|
|
@@ -210,6 +235,7 @@ function onboardBuildersFromPendingDeposits(state: CachedBeaconStateGloas): void
|
|
|
210
235
|
) {
|
|
211
236
|
pendingDeposits.push(deposit);
|
|
212
237
|
pendingDepositsLookup.add(depositValue, pubkeyHex);
|
|
238
|
+
kept++;
|
|
213
239
|
continue;
|
|
214
240
|
}
|
|
215
241
|
|
|
@@ -219,6 +245,11 @@ function onboardBuildersFromPendingDeposits(state: CachedBeaconStateGloas): void
|
|
|
219
245
|
// The prepareNextSlot scheduler pre-verifies these signatures in the epochs before the fork
|
|
220
246
|
// A cache miss falls back to verifying this one deposit — no worse than pre-cache.
|
|
221
247
|
const cached = state.epochCtx.builderDepositSignatureCache.getSignatureValidity(depositValue);
|
|
248
|
+
if (cached === null) {
|
|
249
|
+
sigVerified++;
|
|
250
|
+
} else {
|
|
251
|
+
sigFromCache++;
|
|
252
|
+
}
|
|
222
253
|
const isValid =
|
|
223
254
|
cached ??
|
|
224
255
|
isValidDepositSignature(
|
|
@@ -229,6 +260,7 @@ function onboardBuildersFromPendingDeposits(state: CachedBeaconStateGloas): void
|
|
|
229
260
|
deposit.signature
|
|
230
261
|
);
|
|
231
262
|
if (!isValid) {
|
|
263
|
+
dropped++;
|
|
232
264
|
continue;
|
|
233
265
|
}
|
|
234
266
|
|
|
@@ -241,7 +273,19 @@ function onboardBuildersFromPendingDeposits(state: CachedBeaconStateGloas): void
|
|
|
241
273
|
deposit.slot
|
|
242
274
|
);
|
|
243
275
|
builderPubkeys.add(pubkeyHex);
|
|
276
|
+
onboarded++;
|
|
244
277
|
}
|
|
245
278
|
|
|
246
279
|
state.pendingDeposits = pendingDeposits;
|
|
280
|
+
|
|
281
|
+
timer?.();
|
|
282
|
+
if (metrics) {
|
|
283
|
+
metrics.onboardBuildersDeposits.set({outcome: "onboarded"}, onboarded);
|
|
284
|
+
metrics.onboardBuildersDeposits.set({outcome: "topup"}, topups);
|
|
285
|
+
metrics.onboardBuildersDeposits.set({outcome: "kept"}, kept);
|
|
286
|
+
metrics.onboardBuildersDeposits.set({outcome: "dropped"}, dropped);
|
|
287
|
+
const lookupChecks = pendingDepositsLookup.signatureChecks;
|
|
288
|
+
metrics.onboardBuildersSignatureChecks.set({source: "cache"}, sigFromCache + lookupChecks.fromCache);
|
|
289
|
+
metrics.onboardBuildersSignatureChecks.set({source: "verified"}, sigVerified + lookupChecks.verified);
|
|
290
|
+
}
|
|
247
291
|
}
|
package/src/stateTransition.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
1
|
+
import {ForkName, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
2
2
|
import {Epoch, SignedBeaconBlock, SignedBlindedBeaconBlock, Slot, ssz} from "@lodestar/types";
|
|
3
3
|
import {toRootHex} from "@lodestar/utils";
|
|
4
4
|
import {BlockExternalData, DataAvailabilityStatus, ExecutionPayloadStatus} from "./block/externalData.js";
|
|
@@ -278,7 +278,12 @@ function processSlotsWithTransientCache(
|
|
|
278
278
|
postState = upgradeStateToFulu(postState as CachedBeaconStateElectra) as CachedBeaconStateAllForks;
|
|
279
279
|
}
|
|
280
280
|
if (stateEpoch === config.GLOAS_FORK_EPOCH) {
|
|
281
|
-
|
|
281
|
+
// Timed, unlike the other fork upgrades: this one does unbounded work.
|
|
282
|
+
// onboardBuildersFromPendingDeposits walks the entire pending deposit queue, so its
|
|
283
|
+
// cost is set by whatever is sitting in that queue when the fork lands.
|
|
284
|
+
const timer = metrics?.forkUpgradeTime.startTimer({fork: ForkName.gloas});
|
|
285
|
+
postState = upgradeStateToGloas(postState as CachedBeaconStateFulu, metrics) as CachedBeaconStateAllForks;
|
|
286
|
+
timer?.();
|
|
282
287
|
}
|
|
283
288
|
if (stateEpoch === config.HEZE_FORK_EPOCH) {
|
|
284
289
|
postState = upgradeStateToHeze(postState as CachedBeaconStateGloas) as CachedBeaconStateAllForks;
|
|
@@ -22,6 +22,9 @@ type PendingDepositsValidation = {
|
|
|
22
22
|
* newly-appended tail rather than re-running BLS on previously-invalid entries.
|
|
23
23
|
*/
|
|
24
24
|
export class PendingDepositsLookup {
|
|
25
|
+
private signaturesFromCache = 0;
|
|
26
|
+
private signaturesVerified = 0;
|
|
27
|
+
|
|
25
28
|
private constructor(
|
|
26
29
|
private readonly depositsByPubkey: Map<PubkeyHex, electra.PendingDeposit[]>,
|
|
27
30
|
private readonly validationCache: Map<PubkeyHex, PendingDepositsValidation>
|
|
@@ -52,6 +55,16 @@ export class PendingDepositsLookup {
|
|
|
52
55
|
* Most of the time it should hit the BuilderDepositSignatureCache so we don't have to validate
|
|
53
56
|
* signatures here.
|
|
54
57
|
*/
|
|
58
|
+
/**
|
|
59
|
+
* Signature checks performed inside `hasPendingValidator()`, split by whether the pre-verify
|
|
60
|
+
* cache served them. These are the scan the caller never sees: when a builder-routed deposit is
|
|
61
|
+
* preceded by same-pubkey validator deposits this walk dominates, and on a `true` result the
|
|
62
|
+
* caller skips its own signature check entirely.
|
|
63
|
+
*/
|
|
64
|
+
get signatureChecks(): {fromCache: number; verified: number} {
|
|
65
|
+
return {fromCache: this.signaturesFromCache, verified: this.signaturesVerified};
|
|
66
|
+
}
|
|
67
|
+
|
|
55
68
|
hasPendingValidator(config: BeaconConfig, pubkeyHex: PubkeyHex, cache: BuilderDepositSignatureCache): boolean {
|
|
56
69
|
const validation = this.validationCache.get(pubkeyHex);
|
|
57
70
|
if (validation?.hasValidSignature === true) {
|
|
@@ -73,8 +86,14 @@ export class PendingDepositsLookup {
|
|
|
73
86
|
|
|
74
87
|
for (let i = startIndex; i < deposits.length; i++) {
|
|
75
88
|
const deposit = deposits[i];
|
|
89
|
+
const cached = cache.getSignatureValidity(deposit);
|
|
90
|
+
if (cached === null) {
|
|
91
|
+
this.signaturesVerified++;
|
|
92
|
+
} else {
|
|
93
|
+
this.signaturesFromCache++;
|
|
94
|
+
}
|
|
76
95
|
const isValid =
|
|
77
|
-
|
|
96
|
+
cached ??
|
|
78
97
|
isValidDepositSignature(
|
|
79
98
|
config,
|
|
80
99
|
deposit.pubkey,
|