@lodestar/state-transition 1.50.0-dev.be50566b7e → 1.50.0-dev.cddd01a6c6
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/indexedBuilderState.d.ts +19 -0
- package/lib/block/indexedBuilderState.d.ts.map +1 -0
- package/lib/block/indexedBuilderState.js +60 -0
- package/lib/block/indexedBuilderState.js.map +1 -0
- package/lib/block/processBuilderDepositRequest.d.ts +2 -2
- package/lib/block/processBuilderDepositRequest.d.ts.map +1 -1
- package/lib/block/processBuilderDepositRequest.js +5 -4
- package/lib/block/processBuilderDepositRequest.js.map +1 -1
- package/lib/block/processBuilderExitRequest.d.ts +2 -2
- package/lib/block/processBuilderExitRequest.d.ts.map +1 -1
- package/lib/block/processBuilderExitRequest.js +4 -3
- package/lib/block/processBuilderExitRequest.js.map +1 -1
- package/lib/block/processParentExecutionPayload.d.ts.map +1 -1
- package/lib/block/processParentExecutionPayload.js +23 -18
- package/lib/block/processParentExecutionPayload.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/rewards/attestationsRewards.d.ts.map +1 -1
- package/lib/rewards/attestationsRewards.js +8 -1
- package/lib/rewards/attestationsRewards.js.map +1 -1
- package/lib/util/gloas.d.ts +11 -14
- package/lib/util/gloas.d.ts.map +1 -1
- package/lib/util/gloas.js +2 -42
- package/lib/util/gloas.js.map +1 -1
- package/lib/util/index.d.ts +1 -1
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js +1 -1
- package/lib/util/index.js.map +1 -1
- package/lib/util/sszBytes.d.ts +2 -0
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +14 -1
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +7 -7
- package/src/block/indexedBuilderState.ts +65 -0
- package/src/block/processBuilderDepositRequest.ts +6 -17
- package/src/block/processBuilderExitRequest.ts +5 -9
- package/src/block/processParentExecutionPayload.ts +27 -23
- package/src/index.ts +1 -0
- package/src/rewards/attestationsRewards.ts +8 -1
- package/src/util/gloas.ts +2 -53
- package/src/util/index.ts +1 -0
- package/src/util/sszBytes.ts +19 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BuilderIndex } from "@lodestar/types";
|
|
2
|
+
import { CachedBeaconStateGloas } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Block-scoped pubkey -> index map and ascending reuse candidates for `state.builders`, built in one pass.
|
|
5
|
+
* Only valid while builder pubkeys change exclusively via `addBuilderToRegistry()` and no builder becomes
|
|
6
|
+
* newly reusable (candidates are re-checked lazily, never added). Do not use across blocks/slots.
|
|
7
|
+
*/
|
|
8
|
+
export declare class IndexedBuilderState {
|
|
9
|
+
readonly state: CachedBeaconStateGloas;
|
|
10
|
+
private readonly currentEpoch;
|
|
11
|
+
private readonly indexByPubkey;
|
|
12
|
+
private readonly reusableIndexCandidates;
|
|
13
|
+
private candidateCursor;
|
|
14
|
+
constructor(state: CachedBeaconStateGloas);
|
|
15
|
+
findBuilderIndexByPubkey(pubkey: Uint8Array): BuilderIndex | null;
|
|
16
|
+
addBuilderToRegistry(pubkey: Uint8Array, version: number, executionAddress: Uint8Array, amount: number): void;
|
|
17
|
+
private findReusableBuilderIndex;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=indexedBuilderState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexedBuilderState.d.ts","sourceRoot":"","sources":["../../src/block/indexedBuilderState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAmB,MAAM,iBAAiB,CAAC;AAG/D,OAAO,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAInD;;;;GAIG;AACH,qBAAa,mBAAmB;IAMlB,QAAQ,CAAC,KAAK,EAAE,sBAAsB;IALlD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsC;IACpE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAsB;IAC9D,OAAO,CAAC,eAAe,CAAK;IAE5B,YAAqB,KAAK,EAAE,sBAAsB,EAWjD;IAED,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAEhE;IAED,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAY5G;IAED,OAAO,CAAC,wBAAwB;CAWjC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { toPubkeyHex } from "@lodestar/utils";
|
|
2
|
+
import { computeEpochAtSlot } from "../util/epoch.js";
|
|
3
|
+
import { createBuilderView } from "../util/gloas.js";
|
|
4
|
+
/**
|
|
5
|
+
* Block-scoped pubkey -> index map and ascending reuse candidates for `state.builders`, built in one pass.
|
|
6
|
+
* Only valid while builder pubkeys change exclusively via `addBuilderToRegistry()` and no builder becomes
|
|
7
|
+
* newly reusable (candidates are re-checked lazily, never added). Do not use across blocks/slots.
|
|
8
|
+
*/
|
|
9
|
+
export class IndexedBuilderState {
|
|
10
|
+
state;
|
|
11
|
+
currentEpoch;
|
|
12
|
+
indexByPubkey = new Map();
|
|
13
|
+
reusableIndexCandidates = [];
|
|
14
|
+
candidateCursor = 0;
|
|
15
|
+
constructor(state) {
|
|
16
|
+
this.state = state;
|
|
17
|
+
state.builders.commit();
|
|
18
|
+
const builders = state.builders.getAllReadonlyValues();
|
|
19
|
+
this.currentEpoch = computeEpochAtSlot(state.slot);
|
|
20
|
+
for (const [index, builder] of builders.entries()) {
|
|
21
|
+
const pubkeyHex = toPubkeyHex(builder.pubkey);
|
|
22
|
+
this.indexByPubkey.set(pubkeyHex, index);
|
|
23
|
+
if (canReuseBuilder(builder, this.currentEpoch)) {
|
|
24
|
+
this.reusableIndexCandidates.push(index);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
findBuilderIndexByPubkey(pubkey) {
|
|
29
|
+
return this.indexByPubkey.get(toPubkeyHex(pubkey)) ?? null;
|
|
30
|
+
}
|
|
31
|
+
addBuilderToRegistry(pubkey, version, executionAddress, amount) {
|
|
32
|
+
const builder = createBuilderView(pubkey, version, executionAddress, amount, this.currentEpoch);
|
|
33
|
+
const reusableIndex = this.findReusableBuilderIndex();
|
|
34
|
+
const index = reusableIndex ?? this.state.builders.length;
|
|
35
|
+
if (reusableIndex !== null) {
|
|
36
|
+
const oldBuilder = this.state.builders.getReadonly(index);
|
|
37
|
+
this.indexByPubkey.delete(toPubkeyHex(oldBuilder.pubkey));
|
|
38
|
+
this.state.builders.set(index, builder);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
this.state.builders.push(builder);
|
|
42
|
+
}
|
|
43
|
+
this.indexByPubkey.set(toPubkeyHex(pubkey), index);
|
|
44
|
+
}
|
|
45
|
+
findReusableBuilderIndex() {
|
|
46
|
+
while (this.candidateCursor < this.reusableIndexCandidates.length) {
|
|
47
|
+
const index = this.reusableIndexCandidates[this.candidateCursor++];
|
|
48
|
+
const builder = this.state.builders.getReadonly(index);
|
|
49
|
+
// Top-ups can invalidate initial candidates
|
|
50
|
+
if (canReuseBuilder(builder, this.currentEpoch)) {
|
|
51
|
+
return index;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function canReuseBuilder(builder, currentEpoch) {
|
|
58
|
+
return builder.withdrawableEpoch <= currentEpoch && builder.balance === 0;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=indexedBuilderState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexedBuilderState.js","sourceRoot":"","sources":["../../src/block/indexedBuilderState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { gloas } from "@lodestar/types";
|
|
2
|
-
import {
|
|
2
|
+
import { IndexedBuilderState } from "./indexedBuilderState.js";
|
|
3
3
|
/**
|
|
4
4
|
* Process a builder deposit request from the execution layer: register a new builder
|
|
5
5
|
* (proof-of-possession gated) or top up an existing builder's balance.
|
|
6
6
|
*
|
|
7
7
|
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.11/specs/gloas/beacon-chain.md#new-process_builder_deposit_request
|
|
8
8
|
*/
|
|
9
|
-
export declare function processBuilderDepositRequest(
|
|
9
|
+
export declare function processBuilderDepositRequest(indexedState: IndexedBuilderState, request: gloas.BuilderDepositRequest): void;
|
|
10
10
|
//# sourceMappingURL=processBuilderDepositRequest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processBuilderDepositRequest.d.ts","sourceRoot":"","sources":["../../src/block/processBuilderDepositRequest.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"processBuilderDepositRequest.d.ts","sourceRoot":"","sources":["../../src/block/processBuilderDepositRequest.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAGtC,OAAO,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAE7D;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,mBAAmB,EACjC,OAAO,EAAE,KAAK,CAAC,qBAAqB,GACnC,IAAI,CA6BN"}
|
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
import { FAR_FUTURE_EPOCH, PAYLOAD_BUILDER_VERSION } from "@lodestar/params";
|
|
2
2
|
import { computeEpochAtSlot } from "../util/epoch.js";
|
|
3
|
-
import {
|
|
3
|
+
import { isBuilderWithdrawalCredential, isValidBuilderDepositSignature } from "../util/gloas.js";
|
|
4
4
|
/**
|
|
5
5
|
* Process a builder deposit request from the execution layer: register a new builder
|
|
6
6
|
* (proof-of-possession gated) or top up an existing builder's balance.
|
|
7
7
|
*
|
|
8
8
|
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.11/specs/gloas/beacon-chain.md#new-process_builder_deposit_request
|
|
9
9
|
*/
|
|
10
|
-
export function processBuilderDepositRequest(
|
|
10
|
+
export function processBuilderDepositRequest(indexedState, request) {
|
|
11
|
+
const { state } = indexedState;
|
|
11
12
|
const { pubkey, withdrawalCredentials, amount, signature } = request;
|
|
12
13
|
// Ignore deposits with unexpected withdrawal credential prefixes.
|
|
13
14
|
if (!isBuilderWithdrawalCredential(withdrawalCredentials)) {
|
|
14
15
|
return;
|
|
15
16
|
}
|
|
16
|
-
const builderIndex = findBuilderIndexByPubkey(
|
|
17
|
+
const builderIndex = indexedState.findBuilderIndexByPubkey(pubkey);
|
|
17
18
|
if (builderIndex === null) {
|
|
18
19
|
if (isValidBuilderDepositSignature(state.config, pubkey, withdrawalCredentials, amount, signature)) {
|
|
19
|
-
addBuilderToRegistry(
|
|
20
|
+
indexedState.addBuilderToRegistry(pubkey, PAYLOAD_BUILDER_VERSION, withdrawalCredentials.subarray(12), amount);
|
|
20
21
|
}
|
|
21
22
|
return;
|
|
22
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processBuilderDepositRequest.js","sourceRoot":"","sources":["../../src/block/processBuilderDepositRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAE,uBAAuB,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"processBuilderDepositRequest.js","sourceRoot":"","sources":["../../src/block/processBuilderDepositRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAE,uBAAuB,EAAC,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAC,6BAA6B,EAAE,8BAA8B,EAAC,MAAM,kBAAkB,CAAC;AAG/F;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,YAAiC,EACjC,OAAoC;IAEpC,MAAM,EAAC,KAAK,EAAC,GAAG,YAAY,CAAC;IAC7B,MAAM,EAAC,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,SAAS,EAAC,GAAG,OAAO,CAAC;IAEnE,kEAAkE;IAClE,IAAI,CAAC,6BAA6B,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,YAAY,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAEnE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,IAAI,8BAA8B,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;YACnG,YAAY,CAAC,oBAAoB,CAAC,MAAM,EAAE,uBAAuB,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACjH,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEjD,mFAAmF;IACnF,oFAAoF;IACpF,6EAA6E;IAC7E,IAAI,OAAO,CAAC,iBAAiB,KAAK,gBAAgB,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QAC5E,OAAO,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC;IAC9G,CAAC;IAED,qCAAqC;IACrC,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;AAC5B,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { gloas } from "@lodestar/types";
|
|
2
|
-
import {
|
|
2
|
+
import { IndexedBuilderState } from "./indexedBuilderState.js";
|
|
3
3
|
/**
|
|
4
4
|
* Apply a builder exit request. Authorizes the exit via `source_address` (the builder's
|
|
5
5
|
* execution_address), not the BLS key — mirroring EIP-7002's 0x01 credential exit.
|
|
@@ -9,5 +9,5 @@ import { CachedBeaconStateGloas } from "../types.js";
|
|
|
9
9
|
*
|
|
10
10
|
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.11/specs/gloas/beacon-chain.md#new-process_builder_exit_request
|
|
11
11
|
*/
|
|
12
|
-
export declare function processBuilderExitRequest(
|
|
12
|
+
export declare function processBuilderExitRequest(indexedState: IndexedBuilderState, request: gloas.BuilderExitRequest): void;
|
|
13
13
|
//# sourceMappingURL=processBuilderExitRequest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processBuilderExitRequest.d.ts","sourceRoot":"","sources":["../../src/block/processBuilderExitRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"processBuilderExitRequest.d.ts","sourceRoot":"","sources":["../../src/block/processBuilderExitRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAGtC,OAAO,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAE7D;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAoBpH"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { byteArrayEquals } from "@lodestar/utils";
|
|
2
|
-
import {
|
|
2
|
+
import { getPendingBalanceToWithdrawForBuilder, initiateBuilderExit, isActiveBuilder } from "../util/gloas.js";
|
|
3
3
|
/**
|
|
4
4
|
* Apply a builder exit request. Authorizes the exit via `source_address` (the builder's
|
|
5
5
|
* execution_address), not the BLS key — mirroring EIP-7002's 0x01 credential exit.
|
|
@@ -9,8 +9,9 @@ import { findBuilderIndexByPubkey, getPendingBalanceToWithdrawForBuilder, initia
|
|
|
9
9
|
*
|
|
10
10
|
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.11/specs/gloas/beacon-chain.md#new-process_builder_exit_request
|
|
11
11
|
*/
|
|
12
|
-
export function processBuilderExitRequest(
|
|
13
|
-
const
|
|
12
|
+
export function processBuilderExitRequest(indexedState, request) {
|
|
13
|
+
const { state } = indexedState;
|
|
14
|
+
const builderIndex = indexedState.findBuilderIndexByPubkey(request.pubkey);
|
|
14
15
|
if (builderIndex === null) {
|
|
15
16
|
return;
|
|
16
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processBuilderExitRequest.js","sourceRoot":"","sources":["../../src/block/processBuilderExitRequest.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"processBuilderExitRequest.js","sourceRoot":"","sources":["../../src/block/processBuilderExitRequest.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAC,qCAAqC,EAAE,mBAAmB,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAG7G;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,YAAiC,EAAE,OAAiC;IAC5G,MAAM,EAAC,KAAK,EAAC,GAAG,YAAY,CAAC;IAC7B,MAAM,YAAY,GAAG,YAAY,CAAC,wBAAwB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3E,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAEzD,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAO;IACT,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACtE,OAAO;IACT,CAAC;IACD,IAAI,qCAAqC,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACrE,OAAO;IACT,CAAC;IAED,mBAAmB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processParentExecutionPayload.d.ts","sourceRoot":"","sources":["../../src/block/processParentExecutionPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAA6C,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAC,WAAW,EAAE,KAAK,EAAM,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"processParentExecutionPayload.d.ts","sourceRoot":"","sources":["../../src/block/processParentExecutionPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAA6C,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAC,WAAW,EAAE,KAAK,EAAM,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AASnD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE,WAAW,CAAC,aAAa,CAAC,GAAG,IAAI,CAqBpH;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAoDlH"}
|
|
@@ -2,6 +2,7 @@ import { SLOTS_PER_EPOCH, SLOTS_PER_HISTORICAL_ROOT } from "@lodestar/params";
|
|
|
2
2
|
import { ssz } from "@lodestar/types";
|
|
3
3
|
import { byteArrayEquals, toRootHex } from "@lodestar/utils";
|
|
4
4
|
import { computeEpochAtSlot } from "../util/epoch.js";
|
|
5
|
+
import { IndexedBuilderState } from "./indexedBuilderState.js";
|
|
5
6
|
import { processBuilderDepositRequest } from "./processBuilderDepositRequest.js";
|
|
6
7
|
import { processBuilderExitRequest } from "./processBuilderExitRequest.js";
|
|
7
8
|
import { processConsolidationRequest } from "./processConsolidationRequest.js";
|
|
@@ -44,24 +45,8 @@ export function applyParentExecutionPayload(state, requests) {
|
|
|
44
45
|
const parentSlot = state.latestBlockHeader.slot;
|
|
45
46
|
const parentEpoch = computeEpochAtSlot(parentSlot);
|
|
46
47
|
const currentEpoch = computeEpochAtSlot(state.slot);
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
for (const deposit of requests.deposits) {
|
|
50
|
-
processDepositRequest(fork, state, deposit);
|
|
51
|
-
}
|
|
52
|
-
for (const withdrawal of requests.withdrawals) {
|
|
53
|
-
processWithdrawalRequest(fork, state, withdrawal);
|
|
54
|
-
}
|
|
55
|
-
for (const consolidation of requests.consolidations) {
|
|
56
|
-
processConsolidationRequest(state, consolidation);
|
|
57
|
-
}
|
|
58
|
-
for (const builderDeposit of requests.builderDeposits) {
|
|
59
|
-
processBuilderDepositRequest(state, builderDeposit);
|
|
60
|
-
}
|
|
61
|
-
for (const builderExit of requests.builderExits) {
|
|
62
|
-
processBuilderExitRequest(state, builderExit);
|
|
63
|
-
}
|
|
64
|
-
// Settle the builder payment
|
|
48
|
+
// Settle the builder payment before the requests so that a builder exit request
|
|
49
|
+
// is rejected while the payment is pending
|
|
65
50
|
if (parentEpoch === currentEpoch) {
|
|
66
51
|
settleBuilderPayment(state, SLOTS_PER_EPOCH + (parentSlot % SLOTS_PER_EPOCH));
|
|
67
52
|
}
|
|
@@ -77,6 +62,26 @@ export function applyParentExecutionPayload(state, requests) {
|
|
|
77
62
|
builderIndex: parentBid.builderIndex,
|
|
78
63
|
}));
|
|
79
64
|
}
|
|
65
|
+
// Process execution requests from parent's payload. The execution
|
|
66
|
+
// requests are processed at state.slot (child's slot), not the parent's slot.
|
|
67
|
+
for (const deposit of requests.deposits) {
|
|
68
|
+
processDepositRequest(fork, state, deposit);
|
|
69
|
+
}
|
|
70
|
+
for (const withdrawal of requests.withdrawals) {
|
|
71
|
+
processWithdrawalRequest(fork, state, withdrawal);
|
|
72
|
+
}
|
|
73
|
+
for (const consolidation of requests.consolidations) {
|
|
74
|
+
processConsolidationRequest(state, consolidation);
|
|
75
|
+
}
|
|
76
|
+
if (requests.builderDeposits.length > 0 || requests.builderExits.length > 0) {
|
|
77
|
+
const indexedState = new IndexedBuilderState(state);
|
|
78
|
+
for (const builderDeposit of requests.builderDeposits) {
|
|
79
|
+
processBuilderDepositRequest(indexedState, builderDeposit);
|
|
80
|
+
}
|
|
81
|
+
for (const builderExit of requests.builderExits) {
|
|
82
|
+
processBuilderExitRequest(indexedState, builderExit);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
80
85
|
// Update parent payload availability and latest block hash
|
|
81
86
|
state.executionPayloadAvailability.set(parentSlot % SLOTS_PER_HISTORICAL_ROOT, true);
|
|
82
87
|
state.latestBlockHash = parentBid.blockHash;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processParentExecutionPayload.js","sourceRoot":"","sources":["../../src/block/processParentExecutionPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,eAAe,EAAE,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAqB,GAAG,EAAC,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAC,eAAe,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAC,4BAA4B,EAAC,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAC,yBAAyB,EAAC,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAC,2BAA2B,EAAC,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAC,qBAAqB,EAAC,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAC,wBAAwB,EAAC,MAAM,+BAA+B,CAAC;AAEvE;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAAC,KAA6B,EAAE,KAAiC;IAC5G,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC;IACzD,MAAM,SAAS,GAAG,KAAK,CAAC,yBAAyB,CAAC;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC;IAEpD,MAAM,iBAAiB,GAAG,eAAe,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACpF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,qDAAqD;QACrD,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,qEAAqE;IACrE,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxE,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CACb,kDAAkD,SAAS,CAAC,YAAY,CAAC,aAAa,SAAS,CAAC,SAAS,CAAC,qBAAqB,CAAC,EAAE,CACnI,CAAC;IACJ,CAAC;IAED,2BAA2B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAA6B,EAAE,QAAiC;IAC1G,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,KAAK,CAAC,yBAAyB,CAAC;IAClD,MAAM,UAAU,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC;IAChD,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEpD,
|
|
1
|
+
{"version":3,"file":"processParentExecutionPayload.js","sourceRoot":"","sources":["../../src/block/processParentExecutionPayload.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { type BlockExternalData, DataAvailabilityStatus, ExecutionPayloadStatus } from "./block/externalData.js";
|
|
2
|
+
export { IndexedBuilderState } from "./block/indexedBuilderState.js";
|
|
2
3
|
export { getAttestationParticipationStatus, processAttestationsAltair } from "./block/processAttestationsAltair.js";
|
|
3
4
|
export { assertValidAttesterSlashing } from "./block/processAttesterSlashing.js";
|
|
4
5
|
export { isValidBlsToExecutionChange } from "./block/processBlsToExecutionChange.js";
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,iBAAiB,EAAE,sBAAsB,EAAE,sBAAsB,EAAC,MAAM,yBAAyB,CAAC;AAC/G,OAAO,EAAC,iCAAiC,EAAE,yBAAyB,EAAC,MAAM,sCAAsC,CAAC;AAClH,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAC,2BAA2B,EAAC,MAAM,wCAAwC,CAAC;AAEnF,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAE/E,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAC,sBAAsB,EAAC,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAC,gBAAgB,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EACL,KAAK,0BAA0B,EAC/B,oCAAoC,EACpC,mCAAmC,GACpC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,UAAU,EACV,KAAK,uBAAuB,EAC5B,kCAAkC,GACnC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,KAAK,oBAAoB,EAAE,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AAE9F,OAAO,EACL,KAAK,gBAAgB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,6BAA6B,EAC7B,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,KAAK,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,+BAA+B,CAAC;AAC/F,cAAc,sBAAsB,CAAC;AACrC,YAAY,EAAC,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAC,KAAK,4BAA4B,EAAE,UAAU,EAAC,MAAM,cAAc,CAAC;AAC3E,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,qBAAqB,EAAE,uCAAuC,EAAC,MAAM,iCAAiC,CAAC;AAC/G,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,eAAe,EAEf,iBAAiB,EACjB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,iBAAiB,EAAE,sBAAsB,EAAE,sBAAsB,EAAC,MAAM,yBAAyB,CAAC;AAC/G,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAC,iCAAiC,EAAE,yBAAyB,EAAC,MAAM,sCAAsC,CAAC;AAClH,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAC,2BAA2B,EAAC,MAAM,wCAAwC,CAAC;AAEnF,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAE/E,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAC,sBAAsB,EAAC,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAC,gBAAgB,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EACL,KAAK,0BAA0B,EAC/B,oCAAoC,EACpC,mCAAmC,GACpC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,UAAU,EACV,KAAK,uBAAuB,EAC5B,kCAAkC,GACnC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,KAAK,oBAAoB,EAAE,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AAE9F,OAAO,EACL,KAAK,gBAAgB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,6BAA6B,EAC7B,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,KAAK,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,+BAA+B,CAAC;AAC/F,cAAc,sBAAsB,CAAC;AACrC,YAAY,EAAC,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAC,KAAK,4BAA4B,EAAE,UAAU,EAAC,MAAM,cAAc,CAAC;AAC3E,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,qBAAqB,EAAE,uCAAuC,EAAC,MAAM,iCAAiC,CAAC;AAC/G,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,eAAe,EAEf,iBAAiB,EACjB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,cAAc,iBAAiB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { DataAvailabilityStatus, ExecutionPayloadStatus } from "./block/externalData.js";
|
|
2
|
+
export { IndexedBuilderState } from "./block/indexedBuilderState.js";
|
|
2
3
|
export { getAttestationParticipationStatus, processAttestationsAltair } from "./block/processAttestationsAltair.js";
|
|
3
4
|
export { assertValidAttesterSlashing } from "./block/processAttesterSlashing.js";
|
|
4
5
|
export { isValidBlsToExecutionChange } from "./block/processBlsToExecutionChange.js";
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,sBAAsB,EAAE,sBAAsB,EAAC,MAAM,yBAAyB,CAAC;AAC/G,OAAO,EAAC,iCAAiC,EAAE,yBAAyB,EAAC,MAAM,sCAAsC,CAAC;AAClH,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAC,2BAA2B,EAAC,MAAM,wCAAwC,CAAC;AACnF,qCAAqC;AACrC,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAC/E,yBAAyB;AACzB,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AACzC,6BAA6B;AAC7B,OAAO,EAAC,sBAAsB,EAAC,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAC,gBAAgB,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAEL,oCAAoC,EACpC,mCAAmC,GACpC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,UAAU,EAEV,kCAAkC,GACnC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAA4B,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AAC9F,oBAAoB;AACpB,OAAO,EAEL,uBAAuB,EACvB,mBAAmB,EACnB,6BAA6B,EAC7B,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAA0B,uBAAuB,EAAC,MAAM,+BAA+B,CAAC;AAC/F,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAoC,UAAU,EAAC,MAAM,cAAc,CAAC;AAC3E,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAYL,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,qBAAqB,EAAE,uCAAuC,EAAC,MAAM,iCAAiC,CAAC;AA0B/G,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,sBAAsB,EAAE,sBAAsB,EAAC,MAAM,yBAAyB,CAAC;AAC/G,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAC,iCAAiC,EAAE,yBAAyB,EAAC,MAAM,sCAAsC,CAAC;AAClH,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAC,2BAA2B,EAAC,MAAM,wCAAwC,CAAC;AACnF,qCAAqC;AACrC,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAC,2BAA2B,EAAC,MAAM,oCAAoC,CAAC;AAC/E,yBAAyB;AACzB,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AACzC,6BAA6B;AAC7B,OAAO,EAAC,sBAAsB,EAAC,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAC,gBAAgB,EAAE,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAEL,oCAAoC,EACpC,mCAAmC,GACpC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,UAAU,EAEV,kCAAkC,GACnC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAA4B,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AAC9F,oBAAoB;AACpB,OAAO,EAEL,uBAAuB,EACvB,mBAAmB,EACnB,6BAA6B,EAC7B,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAA0B,uBAAuB,EAAC,MAAM,+BAA+B,CAAC;AAC/F,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAoC,UAAU,EAAC,MAAM,cAAc,CAAC;AAC3E,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAYL,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,qBAAqB,EAAE,uCAAuC,EAAC,MAAM,iCAAiC,CAAC;AA0B/G,cAAc,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attestationsRewards.d.ts","sourceRoot":"","sources":["../../src/rewards/attestationsRewards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,WAAW,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAgB9C,OAAO,EAAC,cAAc,EAAE,OAAO,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"attestationsRewards.d.ts","sourceRoot":"","sources":["../../src/rewards/attestationsRewards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,WAAW,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAgB9C,OAAO,EAAC,cAAc,EAAE,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAKxD,OAAO,EAAC,yBAAyB,EAA0B,MAAM,aAAa,CAAC;AAgB/E,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,yBAAyB,EAChC,YAAY,CAAC,EAAE,CAAC,cAAc,GAAG,MAAM,CAAC,EAAE,GACzC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CA8BtC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { EFFECTIVE_BALANCE_INCREMENT, ForkName, ForkSeq, INACTIVITY_PENALTY_QUOTIENT_ALTAIR, INACTIVITY_PENALTY_QUOTIENT_BELLATRIX, MAX_EFFECTIVE_BALANCE, MAX_EFFECTIVE_BALANCE_ELECTRA, PARTICIPATION_FLAG_WEIGHTS, TIMELY_HEAD_FLAG_INDEX, TIMELY_SOURCE_FLAG_INDEX, TIMELY_TARGET_FLAG_INDEX, WEIGHT_DENOMINATOR, isForkPostElectra, } from "@lodestar/params";
|
|
2
2
|
import { fromHex } from "@lodestar/utils";
|
|
3
3
|
import { beforeProcessEpoch } from "../cache/epochTransitionCache.js";
|
|
4
|
+
import { processInactivityUpdates } from "../epoch/processInactivityUpdates.js";
|
|
5
|
+
import { processJustificationAndFinalization } from "../epoch/processJustificationAndFinalization.js";
|
|
4
6
|
import { FLAG_ELIGIBLE_ATTESTER, FLAG_PREV_HEAD_ATTESTER_UNSLASHED, FLAG_PREV_SOURCE_ATTESTER_UNSLASHED, FLAG_PREV_TARGET_ATTESTER_UNSLASHED, hasMarkers, isInInactivityLeak, } from "../util/index.js";
|
|
5
7
|
const defaultAttestationsReward = { head: 0, target: 0, source: 0, inclusionDelay: 0, inactivity: 0 };
|
|
6
8
|
const defaultAttestationsPenalty = { target: 0, source: 0 };
|
|
@@ -9,8 +11,13 @@ export async function computeAttestationsRewards(config, pubkeyCache, state, val
|
|
|
9
11
|
if (fork === ForkName.phase0) {
|
|
10
12
|
throw Error("Unsupported fork. Attestations rewards calculation is not available in phase0");
|
|
11
13
|
}
|
|
12
|
-
|
|
14
|
+
// Rewards are computed after justification and inactivity updates in epoch processing, so apply both to a clone
|
|
15
|
+
// before reading finality and inactivity scores, see
|
|
16
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.7.0-beta.2/specs/altair/beacon-chain.md#epoch-processing
|
|
17
|
+
const stateAltair = state.clone();
|
|
13
18
|
const transitionCache = beforeProcessEpoch(stateAltair);
|
|
19
|
+
processJustificationAndFinalization(stateAltair, transitionCache);
|
|
20
|
+
processInactivityUpdates(stateAltair, transitionCache);
|
|
14
21
|
const [idealRewards, penalties] = computeIdealAttestationsRewardsAndPenaltiesAltair(config, stateAltair, transitionCache);
|
|
15
22
|
const totalRewards = computeTotalAttestationsRewardsAltair(config, pubkeyCache, stateAltair, transitionCache, idealRewards, penalties, validatorIds);
|
|
16
23
|
return { idealRewards, totalRewards };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attestationsRewards.js","sourceRoot":"","sources":["../../src/rewards/attestationsRewards.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,2BAA2B,EAC3B,QAAQ,EACR,OAAO,EACP,kCAAkC,EAClC,qCAAqC,EACrC,qBAAqB,EACrB,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAC,OAAO,EAAC,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAuB,kBAAkB,EAAC,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"attestationsRewards.js","sourceRoot":"","sources":["../../src/rewards/attestationsRewards.ts"],"names":[],"mappings":"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"}
|
package/lib/util/gloas.d.ts
CHANGED
|
@@ -55,13 +55,6 @@ export declare function canBuilderCoverBid(state: CachedBeaconStateGloas, builde
|
|
|
55
55
|
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.1/specs/gloas/beacon-chain.md#new-initiate_builder_exit
|
|
56
56
|
*/
|
|
57
57
|
export declare function initiateBuilderExit(state: CachedBeaconStateGloas, builderIndex: BuilderIndex): void;
|
|
58
|
-
/**
|
|
59
|
-
* Find the index of a builder by their public key.
|
|
60
|
-
* Returns null if not found.
|
|
61
|
-
*
|
|
62
|
-
* May consider builder pubkey cache if performance becomes an issue.
|
|
63
|
-
*/
|
|
64
|
-
export declare function findBuilderIndexByPubkey(state: CachedBeaconStateGloas, pubkey: Uint8Array): BuilderIndex | null;
|
|
65
58
|
/**
|
|
66
59
|
* Use cached block roots to avoid repeated state root lookups while matching the spec's is_attestation_same_slot behavior.
|
|
67
60
|
*/
|
|
@@ -72,19 +65,23 @@ export declare function getPtcWindowEpochCacheData(state: CachedBeaconStateGloas
|
|
|
72
65
|
payloadTimelinessCommittees: Uint32Array[];
|
|
73
66
|
nextPayloadTimelinessCommittees: Uint32Array[];
|
|
74
67
|
};
|
|
75
|
-
/**
|
|
76
|
-
* Add a new builder to the builders registry. Reuses slots from exited and fully withdrawn
|
|
77
|
-
* builders when available, otherwise appends.
|
|
78
|
-
*
|
|
79
|
-
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.11/specs/gloas/beacon-chain.md#new-add_builder_to_registry
|
|
80
|
-
*/
|
|
81
|
-
export declare function addBuilderToRegistry(state: CachedBeaconStateGloas, pubkey: Uint8Array, version: number, executionAddress: Uint8Array, amount: number, slot: number): void;
|
|
82
68
|
/**
|
|
83
69
|
* Append a new builder to the registry without scanning for a reusable slot.
|
|
84
70
|
*
|
|
85
71
|
* This is only safe to be used at the gloas fork transition.
|
|
86
72
|
*/
|
|
87
73
|
export declare function appendBuilderToRegistry(state: CachedBeaconStateGloas, pubkey: Uint8Array, version: number, executionAddress: Uint8Array, amount: number, slot: number): void;
|
|
74
|
+
/**
|
|
75
|
+
* Build a Builder view from builder fields.
|
|
76
|
+
*/
|
|
77
|
+
export declare function createBuilderView(pubkey: Uint8Array, version: number, executionAddress: Uint8Array, amount: number, depositEpoch: Epoch): import("@chainsafe/ssz/lib/viewDU/container.js").ContainerTreeViewDUType<{
|
|
78
|
+
pubkey: import("@chainsafe/ssz").ByteVectorType;
|
|
79
|
+
version: import("@chainsafe/ssz").UintNumberType;
|
|
80
|
+
executionAddress: import("@lodestar/types").ExecutionAddressType;
|
|
81
|
+
balance: import("@chainsafe/ssz").UintNumberType;
|
|
82
|
+
depositEpoch: import("@chainsafe/ssz").UintNumberType;
|
|
83
|
+
withdrawableEpoch: import("@chainsafe/ssz").UintNumberType;
|
|
84
|
+
}>;
|
|
88
85
|
/**
|
|
89
86
|
* Verify the proof of possession on a builder deposit request.
|
|
90
87
|
*
|
package/lib/util/gloas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gloas.d.ts","sourceRoot":"","sources":["../../src/util/gloas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAc9C,OAAO,EAAC,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAM,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAC,qBAAqB,EAAE,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAI1E,OAAO,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAMzC,wBAAgB,6BAA6B,CAAC,qBAAqB,EAAE,UAAU,GAAG,OAAO,CAExF;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAQtF;AAOD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,YAAY,EAAE,YAAY,GAAG,cAAc,CAG9F;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,cAAc,EAAE,cAAc,GAAG,YAAY,CAGhG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,GAAG,OAAO,CAEtF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAE1F;AAED,wBAAgB,yBAAyB,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAUhG;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAEpH;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,YAAY,GACzB,MAAM,CAoBR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAUT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAWnG;AAED
|
|
1
|
+
{"version":3,"file":"gloas.d.ts","sourceRoot":"","sources":["../../src/util/gloas.ts"],"names":[],"mappings":"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"}
|
package/lib/util/gloas.js
CHANGED
|
@@ -130,20 +130,6 @@ export function initiateBuilderExit(state, builderIndex) {
|
|
|
130
130
|
const currentEpoch = computeEpochAtSlot(state.slot);
|
|
131
131
|
builder.withdrawableEpoch = currentEpoch + state.config.MIN_BUILDER_WITHDRAWABILITY_DELAY;
|
|
132
132
|
}
|
|
133
|
-
/**
|
|
134
|
-
* Find the index of a builder by their public key.
|
|
135
|
-
* Returns null if not found.
|
|
136
|
-
*
|
|
137
|
-
* May consider builder pubkey cache if performance becomes an issue.
|
|
138
|
-
*/
|
|
139
|
-
export function findBuilderIndexByPubkey(state, pubkey) {
|
|
140
|
-
for (let i = 0; i < state.builders.length; i++) {
|
|
141
|
-
if (byteArrayEquals(state.builders.getReadonly(i).pubkey, pubkey)) {
|
|
142
|
-
return i;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return null;
|
|
146
|
-
}
|
|
147
133
|
/**
|
|
148
134
|
* Use cached block roots to avoid repeated state root lookups while matching the spec's is_attestation_same_slot behavior.
|
|
149
135
|
*/
|
|
@@ -176,31 +162,6 @@ export function getPtcWindowEpochCacheData(state) {
|
|
|
176
162
|
nextPayloadTimelinessCommittees: toUint32Arrays(nextPtcWindow),
|
|
177
163
|
};
|
|
178
164
|
}
|
|
179
|
-
/**
|
|
180
|
-
* Add a new builder to the builders registry. Reuses slots from exited and fully withdrawn
|
|
181
|
-
* builders when available, otherwise appends.
|
|
182
|
-
*
|
|
183
|
-
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.11/specs/gloas/beacon-chain.md#new-add_builder_to_registry
|
|
184
|
-
*/
|
|
185
|
-
export function addBuilderToRegistry(state, pubkey, version, executionAddress, amount, slot) {
|
|
186
|
-
const currentEpoch = computeEpochAtSlot(state.slot);
|
|
187
|
-
const depositEpoch = computeEpochAtSlot(slot);
|
|
188
|
-
let builderIndex = state.builders.length;
|
|
189
|
-
for (let i = 0; i < state.builders.length; i++) {
|
|
190
|
-
const builder = state.builders.getReadonly(i);
|
|
191
|
-
if (builder.withdrawableEpoch <= currentEpoch && builder.balance === 0) {
|
|
192
|
-
builderIndex = i;
|
|
193
|
-
break;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
const newBuilder = createBuilderView(pubkey, version, executionAddress, amount, depositEpoch);
|
|
197
|
-
if (builderIndex < state.builders.length) {
|
|
198
|
-
state.builders.set(builderIndex, newBuilder);
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
state.builders.push(newBuilder);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
165
|
/**
|
|
205
166
|
* Append a new builder to the registry without scanning for a reusable slot.
|
|
206
167
|
*
|
|
@@ -211,10 +172,9 @@ export function appendBuilderToRegistry(state, pubkey, version, executionAddress
|
|
|
211
172
|
state.builders.push(createBuilderView(pubkey, version, executionAddress, amount, depositEpoch));
|
|
212
173
|
}
|
|
213
174
|
/**
|
|
214
|
-
* Build a Builder view
|
|
215
|
-
* and the append-only {@link appendBuilderToRegistry} so both paths produce an identical view.
|
|
175
|
+
* Build a Builder view from builder fields.
|
|
216
176
|
*/
|
|
217
|
-
function createBuilderView(pubkey, version, executionAddress, amount, depositEpoch) {
|
|
177
|
+
export function createBuilderView(pubkey, version, executionAddress, amount, depositEpoch) {
|
|
218
178
|
return ssz.gloas.Builder.toViewDU({
|
|
219
179
|
pubkey,
|
|
220
180
|
version,
|
package/lib/util/gloas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gloas.js","sourceRoot":"","sources":["../../src/util/gloas.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,qCAAqC,EACrC,mCAAmC,EACnC,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,QAAQ,EACR,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAA6C,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAEhF,OAAO,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAC,kBAAkB,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAC,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAC,0CAA0C,EAAC,MAAM,WAAW,CAAC;AACrE,OAAO,EAAC,sCAAsC,EAAE,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAC,yBAAyB,EAAC,MAAM,gBAAgB,CAAC;AAEzD,MAAM,UAAU,6BAA6B,CAAC,qBAAiC;IAC7E,OAAO,qBAAqB,CAAC,CAAC,CAAC,KAAK,yBAAyB,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAA6B;IAC5E,8GAA8G;IAC9G,MAAM,cAAc,GAClB,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,4BAA4B,CAAC,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC3F,MAAM,CAAC,eAAe,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,cAAc,GAAG,MAAM,CAAC,mCAAmC,CAAC,CAAC;IAE5E,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,qCAAqC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,oDAAoD;IACpD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,cAAsB;IACnD,uGAAuG;IACvG,OAAO,mBAAmB,CAAC,cAAc,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mCAAmC,CAAC,YAA0B;IAC5E,sGAAsG;IACtG,OAAO,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,kBAAkB,CAAC;AAC9F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mCAAmC,CAAC,cAA8B;IAChF,uGAAuG;IACvG,OAAO,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC;AACpG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAsB,EAAE,cAAqB;IAC3E,OAAO,OAAO,CAAC,YAAY,GAAG,cAAc,IAAI,OAAO,CAAC,iBAAiB,KAAK,gBAAgB,CAAC;AACjG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,cAAsB,EAAE,cAAsB;IAChF,OAAO,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,cAAsB,EAAE,cAAsB;IACtF,MAAM,qBAAqB,GAAG,CAAC,cAAc,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IAE/F,IAAI,cAAc,GAAG,cAAc,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,cAAc,GAAG,cAAc,CAAC;QAChD,OAAO,cAAc,GAAG,CAAC,OAAO,GAAG,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,GAAG,cAAc,CAAC;IAChD,OAAO,cAAc,GAAG,CAAC,OAAO,GAAG,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;AAC9F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,cAAsB,EAAE,QAAgB,EAAE,cAAsB;IACzG,OAAO,QAAQ,KAAK,yBAAyB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;AAChF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qCAAqC,CACnD,KAA6B,EAC7B,YAA0B;IAE1B,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,0BAA0B;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,yBAAyB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChE,MAAM,UAAU,GAAG,KAAK,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,UAAU,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;YAC7C,cAAc,IAAI,UAAU,CAAC,MAAM,CAAC;QACtC,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,UAAU,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;YACrD,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAA6B,EAC7B,YAA0B,EAC1B,SAAiB;IAEjB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,qCAAqC,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG,kBAAkB,GAAG,cAAc,CAAC;IAEvD,IAAI,OAAO,CAAC,OAAO,GAAG,UAAU,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,GAAG,UAAU,IAAI,SAAS,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA6B,EAAE,YAA0B;IAC3F,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEjD,2CAA2C;IAC3C,IAAI,OAAO,CAAC,iBAAiB,KAAK,gBAAgB,EAAE,CAAC;QACnD,OAAO;IACT,CAAC;IAED,yBAAyB;IACzB,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,iBAAiB,GAAG,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC;AAC5F,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"gloas.js","sourceRoot":"","sources":["../../src/util/gloas.ts"],"names":[],"mappings":"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"}
|
package/lib/util/index.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ export * from "./signatureSets.js";
|
|
|
28
28
|
export * from "./signingRoot.js";
|
|
29
29
|
export * from "./slot.js";
|
|
30
30
|
export * from "./ssz.js";
|
|
31
|
-
export { type StateBytesMetadata, getValidatorCountFromStateBytes, readBeaconStateBytesMetadata, } from "./sszBytes.js";
|
|
31
|
+
export { type StateBytesMetadata, getValidatorCountFromStateBytes, getValidatorPubkeyFromStateBytes, readBeaconStateBytesMetadata, } from "./sszBytes.js";
|
|
32
32
|
export * from "./syncCommittee.js";
|
|
33
33
|
export * from "./validator.js";
|
|
34
34
|
export * from "./weakSubjectivity.js";
|
package/lib/util/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,KAAK,kBAAkB,EACvB,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,eAAe,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,KAAK,kBAAkB,EACvB,+BAA+B,EAC/B,gCAAgC,EAChC,4BAA4B,GAC7B,MAAM,eAAe,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC"}
|
package/lib/util/index.js
CHANGED
|
@@ -28,7 +28,7 @@ export * from "./signatureSets.js";
|
|
|
28
28
|
export * from "./signingRoot.js";
|
|
29
29
|
export * from "./slot.js";
|
|
30
30
|
export * from "./ssz.js";
|
|
31
|
-
export { getValidatorCountFromStateBytes, readBeaconStateBytesMetadata, } from "./sszBytes.js";
|
|
31
|
+
export { getValidatorCountFromStateBytes, getValidatorPubkeyFromStateBytes, readBeaconStateBytesMetadata, } from "./sszBytes.js";
|
|
32
32
|
export * from "./syncCommittee.js";
|
|
33
33
|
export * from "./validator.js";
|
|
34
34
|
export * from "./weakSubjectivity.js";
|
package/lib/util/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,OAAO,EAEL,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,eAAe,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,OAAO,EAEL,+BAA+B,EAC/B,gCAAgC,EAChC,4BAA4B,GAC7B,MAAM,eAAe,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC"}
|
package/lib/util/sszBytes.d.ts
CHANGED
|
@@ -17,4 +17,6 @@ export declare function scanActiveValidatorsFromStateBytes(stateBytes: Uint8Arra
|
|
|
17
17
|
totalActiveBalanceIncrements: number;
|
|
18
18
|
} | null;
|
|
19
19
|
export declare function getValidatorCountFromStateBytes(config: ChainForkConfig, stateBytes: Uint8Array): number | null;
|
|
20
|
+
/** Returns a view into `stateBytes`, or null if the index is not in the registry. */
|
|
21
|
+
export declare function getValidatorPubkeyFromStateBytes(config: ChainForkConfig, stateBytes: Uint8Array, index: number): Uint8Array | null;
|
|
20
22
|
//# sourceMappingURL=sszBytes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sszBytes.d.ts","sourceRoot":"","sources":["../../src/util/sszBytes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAA8B,OAAO,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAM,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"sszBytes.d.ts","sourceRoot":"","sources":["../../src/util/sszBytes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAA8B,OAAO,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAM,MAAM,iBAAiB,CAAC;AAuB9D,eAAO,MAAM,oBAAoB,QAA0D,CAAC;AAe5F,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAGzF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,CAGrH;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAE7D;AAED,MAAM,MAAM,kBAAkB,GAAG;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,qBAAqB,EAAE,UAAU,CAAA;CAAC,CAAC;AAEtG,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,UAAU,GAAG,kBAAkB,GAAG,IAAI,CAgBzF;AAED,yGAAyG;AACzG,wBAAgB,kCAAkC,CAChD,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,EAC9C,KAAK,EAAE,KAAK,GACX;IAAC,oBAAoB,EAAE,MAAM,CAAC;IAAC,4BAA4B,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI,CAkC7E;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAI9G;AAED,qFAAqF;AACrF,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,GACZ,UAAU,GAAG,IAAI,CAUnB"}
|
package/lib/util/sszBytes.js
CHANGED
|
@@ -16,7 +16,8 @@ const ROOT_SIZE = 32;
|
|
|
16
16
|
* withdrawable_epoch: Epoch [fixed - 8 bytes]
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
|
-
const
|
|
19
|
+
const PUBKEY_SIZE = 48;
|
|
20
|
+
const VALIDATOR_EFFECTIVE_BALANCE_OFFSET = PUBKEY_SIZE + ROOT_SIZE;
|
|
20
21
|
const VALIDATOR_ACTIVATION_EPOCH_OFFSET = VALIDATOR_EFFECTIVE_BALANCE_OFFSET + UINT64_SIZE + 1 + UINT64_SIZE;
|
|
21
22
|
const VALIDATOR_EXIT_EPOCH_OFFSET = VALIDATOR_ACTIVATION_EPOCH_OFFSET + UINT64_SIZE;
|
|
22
23
|
export const VALIDATOR_BYTES_SIZE = VALIDATOR_EXIT_EPOCH_OFFSET + UINT64_SIZE + UINT64_SIZE;
|
|
@@ -82,6 +83,18 @@ export function getValidatorCountFromStateBytes(config, stateBytes) {
|
|
|
82
83
|
// A non-null range always holds a whole number of validator records, so the division is exact
|
|
83
84
|
return range === null ? null : (range.end - range.start) / VALIDATOR_BYTES_SIZE;
|
|
84
85
|
}
|
|
86
|
+
/** Returns a view into `stateBytes`, or null if the index is not in the registry. */
|
|
87
|
+
export function getValidatorPubkeyFromStateBytes(config, stateBytes, index) {
|
|
88
|
+
const range = getValidatorsRangeFromStateBytes(stateBytes, getStateTypeFromBytes(config, stateBytes));
|
|
89
|
+
if (range === null) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const start = range.start + index * VALIDATOR_BYTES_SIZE;
|
|
93
|
+
if (index < 0 || start >= range.end) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
return stateBytes.subarray(start, start + PUBKEY_SIZE);
|
|
97
|
+
}
|
|
85
98
|
function getValidatorsRangeFromStateBytes(stateBytes, stateType) {
|
|
86
99
|
let range;
|
|
87
100
|
try {
|
package/lib/util/sszBytes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sszBytes.js","sourceRoot":"","sources":["../../src/util/sszBytes.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,2BAA2B,EAAmB,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAA2B,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAE3C,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB;;;;;;;;;;;;GAYG;AACH,MAAM,
|
|
1
|
+
{"version":3,"file":"sszBytes.js","sourceRoot":"","sources":["../../src/util/sszBytes.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.50.0-dev.
|
|
14
|
+
"version": "1.50.0-dev.cddd01a6c6",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -69,14 +69,14 @@
|
|
|
69
69
|
"@chainsafe/lodestar-z": "catalog:",
|
|
70
70
|
"@chainsafe/persistent-merkle-tree": "^1.3.1",
|
|
71
71
|
"@chainsafe/ssz": "^1.8.0",
|
|
72
|
-
"@lodestar/config": "^1.50.0-dev.
|
|
73
|
-
"@lodestar/params": "^1.50.0-dev.
|
|
74
|
-
"@lodestar/types": "^1.50.0-dev.
|
|
75
|
-
"@lodestar/utils": "^1.50.0-dev.
|
|
72
|
+
"@lodestar/config": "^1.50.0-dev.cddd01a6c6",
|
|
73
|
+
"@lodestar/params": "^1.50.0-dev.cddd01a6c6",
|
|
74
|
+
"@lodestar/types": "^1.50.0-dev.cddd01a6c6",
|
|
75
|
+
"@lodestar/utils": "^1.50.0-dev.cddd01a6c6",
|
|
76
76
|
"@vekexasia/bigint-buffer2": "^1.1.1"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
|
-
"@lodestar/test-utils": "^1.50.0-dev.
|
|
79
|
+
"@lodestar/test-utils": "^1.50.0-dev.cddd01a6c6"
|
|
80
80
|
},
|
|
81
81
|
"keywords": [
|
|
82
82
|
"ethereum",
|
|
@@ -84,5 +84,5 @@
|
|
|
84
84
|
"beacon",
|
|
85
85
|
"blockchain"
|
|
86
86
|
],
|
|
87
|
-
"gitHead": "
|
|
87
|
+
"gitHead": "c7fb39f2eec334ea8664f96ec2f1c92e7630d085"
|
|
88
88
|
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {BuilderIndex, Epoch, PubkeyHex} from "@lodestar/types";
|
|
2
|
+
import {Builder} from "@lodestar/types/gloas";
|
|
3
|
+
import {toPubkeyHex} from "@lodestar/utils";
|
|
4
|
+
import {CachedBeaconStateGloas} from "../types.js";
|
|
5
|
+
import {computeEpochAtSlot} from "../util/epoch.js";
|
|
6
|
+
import {createBuilderView} from "../util/gloas.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Block-scoped pubkey -> index map and ascending reuse candidates for `state.builders`, built in one pass.
|
|
10
|
+
* Only valid while builder pubkeys change exclusively via `addBuilderToRegistry()` and no builder becomes
|
|
11
|
+
* newly reusable (candidates are re-checked lazily, never added). Do not use across blocks/slots.
|
|
12
|
+
*/
|
|
13
|
+
export class IndexedBuilderState {
|
|
14
|
+
private readonly currentEpoch: Epoch;
|
|
15
|
+
private readonly indexByPubkey = new Map<PubkeyHex, BuilderIndex>();
|
|
16
|
+
private readonly reusableIndexCandidates: BuilderIndex[] = [];
|
|
17
|
+
private candidateCursor = 0;
|
|
18
|
+
|
|
19
|
+
constructor(readonly state: CachedBeaconStateGloas) {
|
|
20
|
+
state.builders.commit();
|
|
21
|
+
const builders = state.builders.getAllReadonlyValues();
|
|
22
|
+
this.currentEpoch = computeEpochAtSlot(state.slot);
|
|
23
|
+
for (const [index, builder] of builders.entries()) {
|
|
24
|
+
const pubkeyHex = toPubkeyHex(builder.pubkey);
|
|
25
|
+
this.indexByPubkey.set(pubkeyHex, index);
|
|
26
|
+
if (canReuseBuilder(builder, this.currentEpoch)) {
|
|
27
|
+
this.reusableIndexCandidates.push(index);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
findBuilderIndexByPubkey(pubkey: Uint8Array): BuilderIndex | null {
|
|
33
|
+
return this.indexByPubkey.get(toPubkeyHex(pubkey)) ?? null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
addBuilderToRegistry(pubkey: Uint8Array, version: number, executionAddress: Uint8Array, amount: number): void {
|
|
37
|
+
const builder = createBuilderView(pubkey, version, executionAddress, amount, this.currentEpoch);
|
|
38
|
+
const reusableIndex = this.findReusableBuilderIndex();
|
|
39
|
+
const index = reusableIndex ?? this.state.builders.length;
|
|
40
|
+
if (reusableIndex !== null) {
|
|
41
|
+
const oldBuilder = this.state.builders.getReadonly(index);
|
|
42
|
+
this.indexByPubkey.delete(toPubkeyHex(oldBuilder.pubkey));
|
|
43
|
+
this.state.builders.set(index, builder);
|
|
44
|
+
} else {
|
|
45
|
+
this.state.builders.push(builder);
|
|
46
|
+
}
|
|
47
|
+
this.indexByPubkey.set(toPubkeyHex(pubkey), index);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private findReusableBuilderIndex(): BuilderIndex | null {
|
|
51
|
+
while (this.candidateCursor < this.reusableIndexCandidates.length) {
|
|
52
|
+
const index = this.reusableIndexCandidates[this.candidateCursor++];
|
|
53
|
+
const builder = this.state.builders.getReadonly(index);
|
|
54
|
+
// Top-ups can invalidate initial candidates
|
|
55
|
+
if (canReuseBuilder(builder, this.currentEpoch)) {
|
|
56
|
+
return index;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function canReuseBuilder(builder: Builder, currentEpoch: Epoch): boolean {
|
|
64
|
+
return builder.withdrawableEpoch <= currentEpoch && builder.balance === 0;
|
|
65
|
+
}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import {FAR_FUTURE_EPOCH, PAYLOAD_BUILDER_VERSION} from "@lodestar/params";
|
|
2
2
|
import {gloas} from "@lodestar/types";
|
|
3
|
-
import {CachedBeaconStateGloas} from "../types.js";
|
|
4
3
|
import {computeEpochAtSlot} from "../util/epoch.js";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
findBuilderIndexByPubkey,
|
|
8
|
-
isBuilderWithdrawalCredential,
|
|
9
|
-
isValidBuilderDepositSignature,
|
|
10
|
-
} from "../util/gloas.js";
|
|
4
|
+
import {isBuilderWithdrawalCredential, isValidBuilderDepositSignature} from "../util/gloas.js";
|
|
5
|
+
import {IndexedBuilderState} from "./indexedBuilderState.js";
|
|
11
6
|
|
|
12
7
|
/**
|
|
13
8
|
* Process a builder deposit request from the execution layer: register a new builder
|
|
@@ -16,9 +11,10 @@ import {
|
|
|
16
11
|
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.11/specs/gloas/beacon-chain.md#new-process_builder_deposit_request
|
|
17
12
|
*/
|
|
18
13
|
export function processBuilderDepositRequest(
|
|
19
|
-
|
|
14
|
+
indexedState: IndexedBuilderState,
|
|
20
15
|
request: gloas.BuilderDepositRequest
|
|
21
16
|
): void {
|
|
17
|
+
const {state} = indexedState;
|
|
22
18
|
const {pubkey, withdrawalCredentials, amount, signature} = request;
|
|
23
19
|
|
|
24
20
|
// Ignore deposits with unexpected withdrawal credential prefixes.
|
|
@@ -26,18 +22,11 @@ export function processBuilderDepositRequest(
|
|
|
26
22
|
return;
|
|
27
23
|
}
|
|
28
24
|
|
|
29
|
-
const builderIndex = findBuilderIndexByPubkey(
|
|
25
|
+
const builderIndex = indexedState.findBuilderIndexByPubkey(pubkey);
|
|
30
26
|
|
|
31
27
|
if (builderIndex === null) {
|
|
32
28
|
if (isValidBuilderDepositSignature(state.config, pubkey, withdrawalCredentials, amount, signature)) {
|
|
33
|
-
addBuilderToRegistry(
|
|
34
|
-
state,
|
|
35
|
-
pubkey,
|
|
36
|
-
PAYLOAD_BUILDER_VERSION,
|
|
37
|
-
withdrawalCredentials.subarray(12),
|
|
38
|
-
amount,
|
|
39
|
-
state.slot
|
|
40
|
-
);
|
|
29
|
+
indexedState.addBuilderToRegistry(pubkey, PAYLOAD_BUILDER_VERSION, withdrawalCredentials.subarray(12), amount);
|
|
41
30
|
}
|
|
42
31
|
return;
|
|
43
32
|
}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import {gloas} from "@lodestar/types";
|
|
2
2
|
import {byteArrayEquals} from "@lodestar/utils";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
findBuilderIndexByPubkey,
|
|
6
|
-
getPendingBalanceToWithdrawForBuilder,
|
|
7
|
-
initiateBuilderExit,
|
|
8
|
-
isActiveBuilder,
|
|
9
|
-
} from "../util/gloas.js";
|
|
3
|
+
import {getPendingBalanceToWithdrawForBuilder, initiateBuilderExit, isActiveBuilder} from "../util/gloas.js";
|
|
4
|
+
import {IndexedBuilderState} from "./indexedBuilderState.js";
|
|
10
5
|
|
|
11
6
|
/**
|
|
12
7
|
* Apply a builder exit request. Authorizes the exit via `source_address` (the builder's
|
|
@@ -17,8 +12,9 @@ import {
|
|
|
17
12
|
*
|
|
18
13
|
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.11/specs/gloas/beacon-chain.md#new-process_builder_exit_request
|
|
19
14
|
*/
|
|
20
|
-
export function processBuilderExitRequest(
|
|
21
|
-
const
|
|
15
|
+
export function processBuilderExitRequest(indexedState: IndexedBuilderState, request: gloas.BuilderExitRequest): void {
|
|
16
|
+
const {state} = indexedState;
|
|
17
|
+
const builderIndex = indexedState.findBuilderIndexByPubkey(request.pubkey);
|
|
22
18
|
if (builderIndex === null) {
|
|
23
19
|
return;
|
|
24
20
|
}
|
|
@@ -3,6 +3,7 @@ import {BeaconBlock, gloas, ssz} from "@lodestar/types";
|
|
|
3
3
|
import {byteArrayEquals, toRootHex} from "@lodestar/utils";
|
|
4
4
|
import {CachedBeaconStateGloas} from "../types.js";
|
|
5
5
|
import {computeEpochAtSlot} from "../util/epoch.js";
|
|
6
|
+
import {IndexedBuilderState} from "./indexedBuilderState.js";
|
|
6
7
|
import {processBuilderDepositRequest} from "./processBuilderDepositRequest.js";
|
|
7
8
|
import {processBuilderExitRequest} from "./processBuilderExitRequest.js";
|
|
8
9
|
import {processConsolidationRequest} from "./processConsolidationRequest.js";
|
|
@@ -53,29 +54,8 @@ export function applyParentExecutionPayload(state: CachedBeaconStateGloas, reque
|
|
|
53
54
|
const parentEpoch = computeEpochAtSlot(parentSlot);
|
|
54
55
|
const currentEpoch = computeEpochAtSlot(state.slot);
|
|
55
56
|
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
for (const deposit of requests.deposits) {
|
|
59
|
-
processDepositRequest(fork, state, deposit);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
for (const withdrawal of requests.withdrawals) {
|
|
63
|
-
processWithdrawalRequest(fork, state, withdrawal);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
for (const consolidation of requests.consolidations) {
|
|
67
|
-
processConsolidationRequest(state, consolidation);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
for (const builderDeposit of requests.builderDeposits) {
|
|
71
|
-
processBuilderDepositRequest(state, builderDeposit);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
for (const builderExit of requests.builderExits) {
|
|
75
|
-
processBuilderExitRequest(state, builderExit);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Settle the builder payment
|
|
57
|
+
// Settle the builder payment before the requests so that a builder exit request
|
|
58
|
+
// is rejected while the payment is pending
|
|
79
59
|
if (parentEpoch === currentEpoch) {
|
|
80
60
|
settleBuilderPayment(state, SLOTS_PER_EPOCH + (parentSlot % SLOTS_PER_EPOCH));
|
|
81
61
|
} else if (parentEpoch === currentEpoch - 1) {
|
|
@@ -92,6 +72,30 @@ export function applyParentExecutionPayload(state: CachedBeaconStateGloas, reque
|
|
|
92
72
|
);
|
|
93
73
|
}
|
|
94
74
|
|
|
75
|
+
// Process execution requests from parent's payload. The execution
|
|
76
|
+
// requests are processed at state.slot (child's slot), not the parent's slot.
|
|
77
|
+
for (const deposit of requests.deposits) {
|
|
78
|
+
processDepositRequest(fork, state, deposit);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (const withdrawal of requests.withdrawals) {
|
|
82
|
+
processWithdrawalRequest(fork, state, withdrawal);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
for (const consolidation of requests.consolidations) {
|
|
86
|
+
processConsolidationRequest(state, consolidation);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (requests.builderDeposits.length > 0 || requests.builderExits.length > 0) {
|
|
90
|
+
const indexedState = new IndexedBuilderState(state);
|
|
91
|
+
for (const builderDeposit of requests.builderDeposits) {
|
|
92
|
+
processBuilderDepositRequest(indexedState, builderDeposit);
|
|
93
|
+
}
|
|
94
|
+
for (const builderExit of requests.builderExits) {
|
|
95
|
+
processBuilderExitRequest(indexedState, builderExit);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
95
99
|
// Update parent payload availability and latest block hash
|
|
96
100
|
state.executionPayloadAvailability.set(parentSlot % SLOTS_PER_HISTORICAL_ROOT, true);
|
|
97
101
|
state.latestBlockHash = parentBid.blockHash;
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export {type BlockExternalData, DataAvailabilityStatus, ExecutionPayloadStatus} from "./block/externalData.js";
|
|
2
|
+
export {IndexedBuilderState} from "./block/indexedBuilderState.js";
|
|
2
3
|
export {getAttestationParticipationStatus, processAttestationsAltair} from "./block/processAttestationsAltair.js";
|
|
3
4
|
export {assertValidAttesterSlashing} from "./block/processAttesterSlashing.js";
|
|
4
5
|
export {isValidBlsToExecutionChange} from "./block/processBlsToExecutionChange.js";
|
|
@@ -18,6 +18,8 @@ import {
|
|
|
18
18
|
import {ValidatorIndex, rewards} from "@lodestar/types";
|
|
19
19
|
import {fromHex} from "@lodestar/utils";
|
|
20
20
|
import {EpochTransitionCache, beforeProcessEpoch} from "../cache/epochTransitionCache.js";
|
|
21
|
+
import {processInactivityUpdates} from "../epoch/processInactivityUpdates.js";
|
|
22
|
+
import {processJustificationAndFinalization} from "../epoch/processJustificationAndFinalization.js";
|
|
21
23
|
import {CachedBeaconStateAllForks, CachedBeaconStateAltair} from "../types.js";
|
|
22
24
|
import {
|
|
23
25
|
FLAG_ELIGIBLE_ATTESTER,
|
|
@@ -45,8 +47,13 @@ export async function computeAttestationsRewards(
|
|
|
45
47
|
throw Error("Unsupported fork. Attestations rewards calculation is not available in phase0");
|
|
46
48
|
}
|
|
47
49
|
|
|
48
|
-
|
|
50
|
+
// Rewards are computed after justification and inactivity updates in epoch processing, so apply both to a clone
|
|
51
|
+
// before reading finality and inactivity scores, see
|
|
52
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.7.0-beta.2/specs/altair/beacon-chain.md#epoch-processing
|
|
53
|
+
const stateAltair = state.clone() as CachedBeaconStateAltair;
|
|
49
54
|
const transitionCache = beforeProcessEpoch(stateAltair);
|
|
55
|
+
processJustificationAndFinalization(stateAltair, transitionCache);
|
|
56
|
+
processInactivityUpdates(stateAltair, transitionCache);
|
|
50
57
|
|
|
51
58
|
const [idealRewards, penalties] = computeIdealAttestationsRewardsAndPenaltiesAltair(
|
|
52
59
|
config,
|
package/src/util/gloas.ts
CHANGED
|
@@ -178,21 +178,6 @@ export function initiateBuilderExit(state: CachedBeaconStateGloas, builderIndex:
|
|
|
178
178
|
builder.withdrawableEpoch = currentEpoch + state.config.MIN_BUILDER_WITHDRAWABILITY_DELAY;
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
-
/**
|
|
182
|
-
* Find the index of a builder by their public key.
|
|
183
|
-
* Returns null if not found.
|
|
184
|
-
*
|
|
185
|
-
* May consider builder pubkey cache if performance becomes an issue.
|
|
186
|
-
*/
|
|
187
|
-
export function findBuilderIndexByPubkey(state: CachedBeaconStateGloas, pubkey: Uint8Array): BuilderIndex | null {
|
|
188
|
-
for (let i = 0; i < state.builders.length; i++) {
|
|
189
|
-
if (byteArrayEquals(state.builders.getReadonly(i).pubkey, pubkey)) {
|
|
190
|
-
return i;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
return null;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
181
|
/**
|
|
197
182
|
* Use cached block roots to avoid repeated state root lookups while matching the spec's is_attestation_same_slot behavior.
|
|
198
183
|
*/
|
|
@@ -248,41 +233,6 @@ export function getPtcWindowEpochCacheData(state: CachedBeaconStateGloas): {
|
|
|
248
233
|
};
|
|
249
234
|
}
|
|
250
235
|
|
|
251
|
-
/**
|
|
252
|
-
* Add a new builder to the builders registry. Reuses slots from exited and fully withdrawn
|
|
253
|
-
* builders when available, otherwise appends.
|
|
254
|
-
*
|
|
255
|
-
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.11/specs/gloas/beacon-chain.md#new-add_builder_to_registry
|
|
256
|
-
*/
|
|
257
|
-
export function addBuilderToRegistry(
|
|
258
|
-
state: CachedBeaconStateGloas,
|
|
259
|
-
pubkey: Uint8Array,
|
|
260
|
-
version: number,
|
|
261
|
-
executionAddress: Uint8Array,
|
|
262
|
-
amount: number,
|
|
263
|
-
slot: number
|
|
264
|
-
): void {
|
|
265
|
-
const currentEpoch = computeEpochAtSlot(state.slot);
|
|
266
|
-
const depositEpoch = computeEpochAtSlot(slot);
|
|
267
|
-
|
|
268
|
-
let builderIndex = state.builders.length;
|
|
269
|
-
for (let i = 0; i < state.builders.length; i++) {
|
|
270
|
-
const builder = state.builders.getReadonly(i);
|
|
271
|
-
if (builder.withdrawableEpoch <= currentEpoch && builder.balance === 0) {
|
|
272
|
-
builderIndex = i;
|
|
273
|
-
break;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
const newBuilder = createBuilderView(pubkey, version, executionAddress, amount, depositEpoch);
|
|
278
|
-
|
|
279
|
-
if (builderIndex < state.builders.length) {
|
|
280
|
-
state.builders.set(builderIndex, newBuilder);
|
|
281
|
-
} else {
|
|
282
|
-
state.builders.push(newBuilder);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
236
|
/**
|
|
287
237
|
* Append a new builder to the registry without scanning for a reusable slot.
|
|
288
238
|
*
|
|
@@ -301,10 +251,9 @@ export function appendBuilderToRegistry(
|
|
|
301
251
|
}
|
|
302
252
|
|
|
303
253
|
/**
|
|
304
|
-
* Build a Builder view
|
|
305
|
-
* and the append-only {@link appendBuilderToRegistry} so both paths produce an identical view.
|
|
254
|
+
* Build a Builder view from builder fields.
|
|
306
255
|
*/
|
|
307
|
-
function createBuilderView(
|
|
256
|
+
export function createBuilderView(
|
|
308
257
|
pubkey: Uint8Array,
|
|
309
258
|
version: number,
|
|
310
259
|
executionAddress: Uint8Array,
|
package/src/util/index.ts
CHANGED
package/src/util/sszBytes.ts
CHANGED
|
@@ -19,7 +19,8 @@ const ROOT_SIZE = 32;
|
|
|
19
19
|
* withdrawable_epoch: Epoch [fixed - 8 bytes]
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
|
-
const
|
|
22
|
+
const PUBKEY_SIZE = 48;
|
|
23
|
+
const VALIDATOR_EFFECTIVE_BALANCE_OFFSET = PUBKEY_SIZE + ROOT_SIZE;
|
|
23
24
|
const VALIDATOR_ACTIVATION_EPOCH_OFFSET = VALIDATOR_EFFECTIVE_BALANCE_OFFSET + UINT64_SIZE + 1 + UINT64_SIZE;
|
|
24
25
|
const VALIDATOR_EXIT_EPOCH_OFFSET = VALIDATOR_ACTIVATION_EPOCH_OFFSET + UINT64_SIZE;
|
|
25
26
|
export const VALIDATOR_BYTES_SIZE = VALIDATOR_EXIT_EPOCH_OFFSET + UINT64_SIZE + UINT64_SIZE;
|
|
@@ -118,6 +119,23 @@ export function getValidatorCountFromStateBytes(config: ChainForkConfig, stateBy
|
|
|
118
119
|
return range === null ? null : (range.end - range.start) / VALIDATOR_BYTES_SIZE;
|
|
119
120
|
}
|
|
120
121
|
|
|
122
|
+
/** Returns a view into `stateBytes`, or null if the index is not in the registry. */
|
|
123
|
+
export function getValidatorPubkeyFromStateBytes(
|
|
124
|
+
config: ChainForkConfig,
|
|
125
|
+
stateBytes: Uint8Array,
|
|
126
|
+
index: number
|
|
127
|
+
): Uint8Array | null {
|
|
128
|
+
const range = getValidatorsRangeFromStateBytes(stateBytes, getStateTypeFromBytes(config, stateBytes));
|
|
129
|
+
if (range === null) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
const start = range.start + index * VALIDATOR_BYTES_SIZE;
|
|
133
|
+
if (index < 0 || start >= range.end) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
return stateBytes.subarray(start, start + PUBKEY_SIZE);
|
|
137
|
+
}
|
|
138
|
+
|
|
121
139
|
function getValidatorsRangeFromStateBytes(
|
|
122
140
|
stateBytes: Uint8Array,
|
|
123
141
|
stateType: SSZTypesFor<ForkAll, "BeaconState">
|