@lodestar/beacon-node 1.39.0-dev.d4a47659a5 → 1.39.0-dev.f4236afdba
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/impl/beacon/blocks/utils.js +1 -1
- package/lib/api/impl/beacon/blocks/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +1 -4
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +2 -12
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/initState.d.ts +1 -14
- package/lib/chain/initState.d.ts.map +1 -1
- package/lib/chain/initState.js +1 -62
- package/lib/chain/initState.js.map +1 -1
- package/lib/chain/interface.d.ts +0 -2
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts +0 -4
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +1 -21
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +0 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +6 -9
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/db/beacon.d.ts +3 -7
- package/lib/db/beacon.d.ts.map +1 -1
- package/lib/db/beacon.js +33 -12
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/buckets.d.ts +12 -6
- package/lib/db/buckets.d.ts.map +1 -1
- package/lib/db/buckets.js +6 -1
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/interface.d.ts +2 -7
- package/lib/db/interface.d.ts.map +1 -1
- package/lib/db/repositories/index.d.ts +0 -3
- package/lib/db/repositories/index.d.ts.map +1 -1
- package/lib/db/repositories/index.js +0 -3
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/execution/engine/http.d.ts +1 -1
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +2 -3
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/index.d.ts.map +1 -1
- package/lib/execution/engine/index.js +1 -1
- package/lib/execution/engine/index.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +1 -1
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/{eth1/provider → execution/engine}/jsonRpcHttpClient.d.ts +1 -1
- package/lib/execution/engine/jsonRpcHttpClient.d.ts.map +1 -0
- package/lib/execution/engine/jsonRpcHttpClient.js.map +1 -0
- package/lib/execution/engine/jwt.d.ts.map +1 -0
- package/lib/execution/engine/jwt.js.map +1 -0
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +1 -1
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +1 -1
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +1 -1
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/execution/engine/utils.d.ts +64 -2
- package/lib/execution/engine/utils.d.ts.map +1 -1
- package/lib/execution/engine/utils.js +91 -2
- package/lib/execution/engine/utils.js.map +1 -1
- package/lib/index.d.ts +1 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -2
- package/lib/index.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +0 -35
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +0 -90
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +10 -9
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/options.d.ts +0 -2
- package/lib/node/options.d.ts.map +1 -1
- package/lib/node/options.js +0 -2
- package/lib/node/options.js.map +1 -1
- package/lib/node/utils/interop/deposits.d.ts +2 -1
- package/lib/node/utils/interop/deposits.d.ts.map +1 -1
- package/lib/node/utils/interop/deposits.js.map +1 -1
- package/lib/node/utils/interop/state.d.ts +1 -1
- package/lib/node/utils/interop/state.d.ts.map +1 -1
- package/lib/node/utils/state.d.ts +1 -7
- package/lib/node/utils/state.d.ts.map +1 -1
- package/lib/node/utils/state.js +1 -14
- package/lib/node/utils/state.js.map +1 -1
- package/package.json +14 -20
- package/src/api/impl/beacon/blocks/utils.ts +1 -1
- package/src/chain/chain.ts +1 -15
- package/src/chain/initState.ts +1 -97
- package/src/chain/interface.ts +0 -2
- package/src/chain/prepareNextSlot.ts +1 -28
- package/src/chain/produceBlock/produceBlockBody.ts +6 -10
- package/src/db/beacon.ts +38 -16
- package/src/db/buckets.ts +12 -7
- package/src/db/interface.ts +2 -13
- package/src/db/repositories/index.ts +0 -3
- package/src/execution/engine/http.ts +8 -9
- package/src/execution/engine/index.ts +1 -1
- package/src/execution/engine/interface.ts +1 -1
- package/src/{eth1/provider → execution/engine}/jsonRpcHttpClient.ts +1 -1
- package/src/execution/engine/mock.ts +1 -2
- package/src/execution/engine/payloadIdCache.ts +1 -1
- package/src/execution/engine/types.ts +9 -9
- package/src/execution/engine/utils.ts +111 -5
- package/src/index.ts +1 -2
- package/src/metrics/metrics/lodestar.ts +0 -92
- package/src/node/nodejs.ts +11 -9
- package/src/node/options.ts +0 -3
- package/src/node/utils/interop/deposits.ts +3 -1
- package/src/node/utils/interop/state.ts +1 -1
- package/src/node/utils/state.ts +3 -18
- package/lib/chain/genesis/genesis.d.ts +0 -51
- package/lib/chain/genesis/genesis.d.ts.map +0 -1
- package/lib/chain/genesis/genesis.js +0 -123
- package/lib/chain/genesis/genesis.js.map +0 -1
- package/lib/chain/genesis/interface.d.ts +0 -13
- package/lib/chain/genesis/interface.d.ts.map +0 -1
- package/lib/chain/genesis/interface.js +0 -2
- package/lib/chain/genesis/interface.js.map +0 -1
- package/lib/db/repositories/depositDataRoot.d.ts +0 -22
- package/lib/db/repositories/depositDataRoot.d.ts.map +0 -1
- package/lib/db/repositories/depositDataRoot.js +0 -62
- package/lib/db/repositories/depositDataRoot.js.map +0 -1
- package/lib/db/repositories/depositEvent.d.ts +0 -13
- package/lib/db/repositories/depositEvent.d.ts.map +0 -1
- package/lib/db/repositories/depositEvent.js +0 -27
- package/lib/db/repositories/depositEvent.js.map +0 -1
- package/lib/db/repositories/eth1Data.d.ts +0 -13
- package/lib/db/repositories/eth1Data.d.ts.map +0 -1
- package/lib/db/repositories/eth1Data.js +0 -26
- package/lib/db/repositories/eth1Data.js.map +0 -1
- package/lib/db/single/index.d.ts +0 -3
- package/lib/db/single/index.d.ts.map +0 -1
- package/lib/db/single/index.js +0 -3
- package/lib/db/single/index.js.map +0 -1
- package/lib/db/single/preGenesisState.d.ts +0 -16
- package/lib/db/single/preGenesisState.d.ts.map +0 -1
- package/lib/db/single/preGenesisState.js +0 -29
- package/lib/db/single/preGenesisState.js.map +0 -1
- package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts +0 -14
- package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts.map +0 -1
- package/lib/db/single/preGenesisStateLastProcessedBlock.js +0 -27
- package/lib/db/single/preGenesisStateLastProcessedBlock.js.map +0 -1
- package/lib/eth1/errors.d.ts +0 -66
- package/lib/eth1/errors.d.ts.map +0 -1
- package/lib/eth1/errors.js +0 -27
- package/lib/eth1/errors.js.map +0 -1
- package/lib/eth1/eth1DataCache.d.ts +0 -19
- package/lib/eth1/eth1DataCache.d.ts.map +0 -1
- package/lib/eth1/eth1DataCache.js +0 -19
- package/lib/eth1/eth1DataCache.js.map +0 -1
- package/lib/eth1/eth1DepositDataTracker.d.ts +0 -80
- package/lib/eth1/eth1DepositDataTracker.d.ts.map +0 -1
- package/lib/eth1/eth1DepositDataTracker.js +0 -317
- package/lib/eth1/eth1DepositDataTracker.js.map +0 -1
- package/lib/eth1/eth1DepositsCache.d.ts +0 -42
- package/lib/eth1/eth1DepositsCache.d.ts.map +0 -1
- package/lib/eth1/eth1DepositsCache.js +0 -119
- package/lib/eth1/eth1DepositsCache.js.map +0 -1
- package/lib/eth1/index.d.ts +0 -31
- package/lib/eth1/index.d.ts.map +0 -1
- package/lib/eth1/index.js +0 -71
- package/lib/eth1/index.js.map +0 -1
- package/lib/eth1/interface.d.ts +0 -74
- package/lib/eth1/interface.d.ts.map +0 -1
- package/lib/eth1/interface.js +0 -8
- package/lib/eth1/interface.js.map +0 -1
- package/lib/eth1/options.d.ts +0 -22
- package/lib/eth1/options.d.ts.map +0 -1
- package/lib/eth1/options.js +0 -8
- package/lib/eth1/options.js.map +0 -1
- package/lib/eth1/provider/eth1Provider.d.ts +0 -39
- package/lib/eth1/provider/eth1Provider.d.ts.map +0 -1
- package/lib/eth1/provider/eth1Provider.js +0 -147
- package/lib/eth1/provider/eth1Provider.js.map +0 -1
- package/lib/eth1/provider/jsonRpcHttpClient.d.ts.map +0 -1
- package/lib/eth1/provider/jsonRpcHttpClient.js.map +0 -1
- package/lib/eth1/provider/jwt.d.ts.map +0 -1
- package/lib/eth1/provider/jwt.js.map +0 -1
- package/lib/eth1/provider/utils.d.ts +0 -65
- package/lib/eth1/provider/utils.d.ts.map +0 -1
- package/lib/eth1/provider/utils.js +0 -120
- package/lib/eth1/provider/utils.js.map +0 -1
- package/lib/eth1/stream.d.ts +0 -15
- package/lib/eth1/stream.d.ts.map +0 -1
- package/lib/eth1/stream.js +0 -54
- package/lib/eth1/stream.js.map +0 -1
- package/lib/eth1/utils/depositContract.d.ts +0 -14
- package/lib/eth1/utils/depositContract.d.ts.map +0 -1
- package/lib/eth1/utils/depositContract.js +0 -33
- package/lib/eth1/utils/depositContract.js.map +0 -1
- package/lib/eth1/utils/deposits.d.ts +0 -8
- package/lib/eth1/utils/deposits.d.ts.map +0 -1
- package/lib/eth1/utils/deposits.js +0 -47
- package/lib/eth1/utils/deposits.js.map +0 -1
- package/lib/eth1/utils/eth1Data.d.ts +0 -22
- package/lib/eth1/utils/eth1Data.d.ts.map +0 -1
- package/lib/eth1/utils/eth1Data.js +0 -77
- package/lib/eth1/utils/eth1Data.js.map +0 -1
- package/lib/eth1/utils/eth1DepositEvent.d.ts +0 -7
- package/lib/eth1/utils/eth1DepositEvent.d.ts.map +0 -1
- package/lib/eth1/utils/eth1DepositEvent.js +0 -13
- package/lib/eth1/utils/eth1DepositEvent.js.map +0 -1
- package/lib/eth1/utils/eth1Vote.d.ts +0 -17
- package/lib/eth1/utils/eth1Vote.d.ts.map +0 -1
- package/lib/eth1/utils/eth1Vote.js +0 -111
- package/lib/eth1/utils/eth1Vote.js.map +0 -1
- package/lib/eth1/utils/groupDepositEventsByBlock.d.ts +0 -9
- package/lib/eth1/utils/groupDepositEventsByBlock.d.ts.map +0 -1
- package/lib/eth1/utils/groupDepositEventsByBlock.js +0 -17
- package/lib/eth1/utils/groupDepositEventsByBlock.js.map +0 -1
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts +0 -10
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts.map +0 -1
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.js +0 -14
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.js.map +0 -1
- package/src/chain/genesis/genesis.ts +0 -190
- package/src/chain/genesis/interface.ts +0 -14
- package/src/db/repositories/depositDataRoot.ts +0 -80
- package/src/db/repositories/depositEvent.ts +0 -32
- package/src/db/repositories/eth1Data.ts +0 -33
- package/src/db/single/index.ts +0 -2
- package/src/db/single/preGenesisState.ts +0 -37
- package/src/db/single/preGenesisStateLastProcessedBlock.ts +0 -34
- package/src/eth1/errors.ts +0 -40
- package/src/eth1/eth1DataCache.ts +0 -26
- package/src/eth1/eth1DepositDataTracker.ts +0 -410
- package/src/eth1/eth1DepositsCache.ts +0 -141
- package/src/eth1/index.ts +0 -94
- package/src/eth1/interface.ts +0 -87
- package/src/eth1/options.ts +0 -28
- package/src/eth1/provider/eth1Provider.ts +0 -229
- package/src/eth1/provider/utils.ts +0 -136
- package/src/eth1/stream.ts +0 -75
- package/src/eth1/utils/depositContract.ts +0 -37
- package/src/eth1/utils/deposits.ts +0 -70
- package/src/eth1/utils/eth1Data.ts +0 -100
- package/src/eth1/utils/eth1DepositEvent.ts +0 -12
- package/src/eth1/utils/eth1Vote.ts +0 -142
- package/src/eth1/utils/groupDepositEventsByBlock.ts +0 -19
- package/src/eth1/utils/optimizeNextBlockDiffForGenesis.ts +0 -18
- /package/lib/{eth1/provider → execution/engine}/jsonRpcHttpClient.js +0 -0
- /package/lib/{eth1/provider → execution/engine}/jwt.d.ts +0 -0
- /package/lib/{eth1/provider → execution/engine}/jwt.js +0 -0
- /package/src/{eth1/provider → execution/engine}/jwt.ts +0 -0
|
@@ -11,7 +11,6 @@ import {
|
|
|
11
11
|
import {ExecutionPayload, RootHex, bellatrix, deneb, ssz} from "@lodestar/types";
|
|
12
12
|
import {fromHex, toRootHex} from "@lodestar/utils";
|
|
13
13
|
import {ZERO_HASH_HEX} from "../../constants/index.js";
|
|
14
|
-
import {quantityToNum} from "../../eth1/provider/utils.js";
|
|
15
14
|
import {INTEROP_BLOCK_HASH} from "../../node/utils/interop/state.js";
|
|
16
15
|
import {kzgCommitmentToVersionedHash} from "../../util/blobs.js";
|
|
17
16
|
import {kzg} from "../../util/kzg.js";
|
|
@@ -29,7 +28,7 @@ import {
|
|
|
29
28
|
serializeExecutionPayload,
|
|
30
29
|
serializeExecutionRequests,
|
|
31
30
|
} from "./types.js";
|
|
32
|
-
import {JsonRpcBackend} from "./utils.js";
|
|
31
|
+
import {JsonRpcBackend, quantityToNum} from "./utils.js";
|
|
33
32
|
|
|
34
33
|
const INTEROP_GAS_LIMIT = 30e6;
|
|
35
34
|
const PRUNE_PAYLOAD_ID_AFTER_MS = 5000;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
2
2
|
import {pruneSetToMax} from "@lodestar/utils";
|
|
3
|
-
import {DATA, QUANTITY} from "../../eth1/provider/utils.js";
|
|
4
3
|
import {PayloadAttributesRpc} from "./types.js";
|
|
4
|
+
import {DATA, QUANTITY} from "./utils.js";
|
|
5
5
|
|
|
6
6
|
// Idealy this only need to be set to the max head reorgs number
|
|
7
7
|
const MAX_PAYLOAD_IDS = SLOTS_PER_EPOCH;
|
|
@@ -23,6 +23,14 @@ import {
|
|
|
23
23
|
} from "@lodestar/types";
|
|
24
24
|
import {BlobAndProof} from "@lodestar/types/deneb";
|
|
25
25
|
import {BlobAndProofV2} from "@lodestar/types/fulu";
|
|
26
|
+
import {
|
|
27
|
+
ExecutionPayloadStatus,
|
|
28
|
+
ExecutionRequestType,
|
|
29
|
+
PayloadAttributes,
|
|
30
|
+
VersionedHashes,
|
|
31
|
+
isExecutionRequestType,
|
|
32
|
+
} from "./interface.js";
|
|
33
|
+
import {WithdrawalV1} from "./payloadIdCache.js";
|
|
26
34
|
import {
|
|
27
35
|
DATA,
|
|
28
36
|
QUANTITY,
|
|
@@ -32,15 +40,7 @@ import {
|
|
|
32
40
|
numToQuantity,
|
|
33
41
|
quantityToBigint,
|
|
34
42
|
quantityToNum,
|
|
35
|
-
} from "
|
|
36
|
-
import {
|
|
37
|
-
ExecutionPayloadStatus,
|
|
38
|
-
ExecutionRequestType,
|
|
39
|
-
PayloadAttributes,
|
|
40
|
-
VersionedHashes,
|
|
41
|
-
isExecutionRequestType,
|
|
42
|
-
} from "./interface.js";
|
|
43
|
-
import {WithdrawalV1} from "./payloadIdCache.js";
|
|
43
|
+
} from "./utils.js";
|
|
44
44
|
|
|
45
45
|
export type EngineApiRpcParamTypes = {
|
|
46
46
|
/**
|
|
@@ -1,14 +1,120 @@
|
|
|
1
|
-
import {isErrorAborted, isFetchError} from "@lodestar/utils";
|
|
2
|
-
import {
|
|
1
|
+
import {bigIntToBytes, bytesToBigInt, fromHex, fromHexInto, isErrorAborted, isFetchError, toHex} from "@lodestar/utils";
|
|
2
|
+
import {isQueueErrorAborted} from "../../util/queue/errors.js";
|
|
3
|
+
import {ExecutionEngineState, ExecutionPayloadStatus} from "./interface.js";
|
|
3
4
|
import {
|
|
4
5
|
ErrorJsonRpcResponse,
|
|
5
6
|
HttpRpcError,
|
|
6
7
|
IJsonRpcHttpClient,
|
|
7
8
|
JsonRpcHttpClientEvent,
|
|
8
9
|
JsonRpcHttpClientEventEmitter,
|
|
9
|
-
} from "
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
} from "./jsonRpcHttpClient.js";
|
|
11
|
+
|
|
12
|
+
/** QUANTITY as defined in ethereum execution layer JSON RPC https://eth.wiki/json-rpc/API */
|
|
13
|
+
export type QUANTITY = string;
|
|
14
|
+
/** DATA as defined in ethereum execution layer JSON RPC https://eth.wiki/json-rpc/API */
|
|
15
|
+
export type DATA = string;
|
|
16
|
+
|
|
17
|
+
export const rootHexRegex = /^0x[a-fA-F0-9]{64}$/;
|
|
18
|
+
|
|
19
|
+
export type IJson = string | number | boolean | undefined | IJson[] | {[key: string]: IJson};
|
|
20
|
+
|
|
21
|
+
export interface RpcPayload<P = IJson[]> {
|
|
22
|
+
method: string;
|
|
23
|
+
params: P;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* QUANTITY as defined in ethereum execution layer JSON RPC https://eth.wiki/json-rpc/API
|
|
28
|
+
*
|
|
29
|
+
* When encoding QUANTITIES (integers, numbers): encode as hex, prefix with “0x”, the most compact representation (slight exception: zero should be represented as “0x0”). Examples:
|
|
30
|
+
* - 0x41 (65 in decimal)
|
|
31
|
+
* - 0x400 (1024 in decimal)
|
|
32
|
+
* - WRONG: 0x (should always have at least one digit - zero is “0x0”)
|
|
33
|
+
* - WRONG: 0x0400 (no leading zeroes allowed)
|
|
34
|
+
* - WRONG: ff (must be prefixed 0x)
|
|
35
|
+
*/
|
|
36
|
+
export function numToQuantity(num: number | bigint): QUANTITY {
|
|
37
|
+
return "0x" + num.toString(16);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* QUANTITY as defined in ethereum execution layer JSON RPC https://eth.wiki/json-rpc/API
|
|
42
|
+
*/
|
|
43
|
+
export function quantityToNum(hex: QUANTITY, id = ""): number {
|
|
44
|
+
const num = parseInt(hex, 16);
|
|
45
|
+
if (Number.isNaN(num) || num < 0) throw Error(`Invalid hex decimal ${id} '${hex}'`);
|
|
46
|
+
return num;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* QUANTITY as defined in ethereum execution layer JSON RPC https://eth.wiki/json-rpc/API.
|
|
51
|
+
* Typesafe fn to convert hex string to bigint. The BigInt constructor param is any
|
|
52
|
+
*/
|
|
53
|
+
export function quantityToBigint(hex: QUANTITY, id = ""): bigint {
|
|
54
|
+
try {
|
|
55
|
+
return BigInt(hex);
|
|
56
|
+
} catch (e) {
|
|
57
|
+
throw Error(`Invalid hex bigint ${id} '${hex}': ${(e as Error).message}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* QUANTITY as defined in ethereum execution layer JSON RPC https://eth.wiki/json-rpc/API.
|
|
63
|
+
*/
|
|
64
|
+
export function quantityToBytes(hex: QUANTITY): Uint8Array {
|
|
65
|
+
const bn = quantityToBigint(hex);
|
|
66
|
+
return bigIntToBytes(bn, 32, "le");
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* QUANTITY as defined in ethereum execution layer JSON RPC https://eth.wiki/json-rpc/API.
|
|
71
|
+
* Compress a 32 ByteVector into a QUANTITY
|
|
72
|
+
*/
|
|
73
|
+
export function bytesToQuantity(bytes: Uint8Array): QUANTITY {
|
|
74
|
+
const bn = bytesToBigInt(bytes, "le");
|
|
75
|
+
return numToQuantity(bn);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* DATA as defined in ethereum execution layer JSON RPC https://eth.wiki/json-rpc/API
|
|
80
|
+
*
|
|
81
|
+
* When encoding UNFORMATTED DATA (byte arrays, account addresses, hashes, bytecode arrays): encode as hex, prefix with
|
|
82
|
+
* “0x”, two hex digits per byte. Examples:
|
|
83
|
+
*
|
|
84
|
+
* - 0x41 (size 1, “A”)
|
|
85
|
+
* - 0x004200 (size 3, “\0B\0”)
|
|
86
|
+
* - 0x (size 0, “”)
|
|
87
|
+
* - WRONG: 0xf0f0f (must be even number of digits)
|
|
88
|
+
* - WRONG: 004200 (must be prefixed 0x)
|
|
89
|
+
*/
|
|
90
|
+
export function bytesToData(bytes: Uint8Array): DATA {
|
|
91
|
+
return toHex(bytes);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* DATA as defined in ethereum execution layer JSON RPC https://eth.wiki/json-rpc/API
|
|
96
|
+
*/
|
|
97
|
+
export function dataToBytes(hex: DATA, fixedLength: number | null): Uint8Array {
|
|
98
|
+
try {
|
|
99
|
+
const bytes = fromHex(hex);
|
|
100
|
+
if (fixedLength != null && bytes.length !== fixedLength) {
|
|
101
|
+
throw Error(`Wrong data length ${bytes.length} expected ${fixedLength}`);
|
|
102
|
+
}
|
|
103
|
+
return bytes;
|
|
104
|
+
} catch (e) {
|
|
105
|
+
(e as Error).message = `Invalid hex string: ${(e as Error).message}`;
|
|
106
|
+
throw e;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Convert DATA into a preallocated buffer
|
|
112
|
+
* fromHexInto will throw if buffer's length is not the same as the decoded hex length
|
|
113
|
+
*/
|
|
114
|
+
export function dataIntoBytes(hex: DATA, buffer: Uint8Array): Uint8Array {
|
|
115
|
+
fromHexInto(hex, buffer);
|
|
116
|
+
return buffer;
|
|
117
|
+
}
|
|
12
118
|
|
|
13
119
|
export type JsonRpcBackend = {
|
|
14
120
|
// biome-ignore lint/suspicious/noExplicitAny: We need to use `any` type here
|
package/src/index.ts
CHANGED
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
export type {RestApiServerMetrics, RestApiServerModules, RestApiServerOpts} from "./api/rest/base.js";
|
|
4
4
|
export {RestApiServer} from "./api/rest/base.js";
|
|
5
|
-
export {checkAndPersistAnchorState, initStateFromDb
|
|
5
|
+
export {checkAndPersistAnchorState, initStateFromDb} from "./chain/index.js";
|
|
6
6
|
export {DbCPStateDatastore} from "./chain/stateCache/datastore/db.js";
|
|
7
7
|
export {FileCPStateDatastore} from "./chain/stateCache/datastore/file.js";
|
|
8
8
|
export {BeaconDb, type IBeaconDb} from "./db/index.js";
|
|
9
|
-
export {Eth1Provider, type IEth1Provider} from "./eth1/index.js";
|
|
10
9
|
// Export metrics utilities to de-duplicate validator metrics
|
|
11
10
|
export {
|
|
12
11
|
type HttpMetricsServer,
|
|
@@ -1619,98 +1619,6 @@ export function createLodestarMetrics(
|
|
|
1619
1619
|
}),
|
|
1620
1620
|
},
|
|
1621
1621
|
|
|
1622
|
-
eth1: {
|
|
1623
|
-
depositTrackerIsCaughtup: register.gauge({
|
|
1624
|
-
name: "lodestar_eth1_deposit_tracker_is_caughtup",
|
|
1625
|
-
help: "Eth1 deposit is caught up 0=false 1=true",
|
|
1626
|
-
}),
|
|
1627
|
-
depositTrackerUpdateErrors: register.gauge({
|
|
1628
|
-
name: "lodestar_eth1_deposit_tracker_update_errors_total",
|
|
1629
|
-
help: "Eth1 deposit update loop errors total",
|
|
1630
|
-
}),
|
|
1631
|
-
remoteHighestBlock: register.gauge({
|
|
1632
|
-
name: "lodestar_eth1_remote_highest_block",
|
|
1633
|
-
help: "Eth1 current highest block number",
|
|
1634
|
-
}),
|
|
1635
|
-
depositEventsFetched: register.gauge({
|
|
1636
|
-
name: "lodestar_eth1_deposit_events_fetched_total",
|
|
1637
|
-
help: "Eth1 deposit events fetched total",
|
|
1638
|
-
}),
|
|
1639
|
-
lastProcessedDepositBlockNumber: register.gauge({
|
|
1640
|
-
name: "lodestar_eth1_last_processed_deposit_block_number",
|
|
1641
|
-
help: "Eth1 deposit tracker lastProcessedDepositBlockNumber",
|
|
1642
|
-
}),
|
|
1643
|
-
blocksFetched: register.gauge({
|
|
1644
|
-
name: "lodestar_eth1_blocks_fetched_total",
|
|
1645
|
-
help: "Eth1 blocks fetched total",
|
|
1646
|
-
}),
|
|
1647
|
-
lastFetchedBlockBlockNumber: register.gauge({
|
|
1648
|
-
name: "lodestar_eth1_last_fetched_block_block_number",
|
|
1649
|
-
help: "Eth1 deposit tracker last fetched block's block number",
|
|
1650
|
-
}),
|
|
1651
|
-
lastFetchedBlockTimestamp: register.gauge({
|
|
1652
|
-
name: "lodestar_eth1_last_fetched_block_timestamp",
|
|
1653
|
-
help: "Eth1 deposit tracker last fetched block's timestamp",
|
|
1654
|
-
}),
|
|
1655
|
-
eth1FollowDistanceSecondsConfig: register.gauge({
|
|
1656
|
-
name: "lodestar_eth1_follow_distance_seconds_config",
|
|
1657
|
-
help: "Constant with value = SECONDS_PER_ETH1_BLOCK * ETH1_FOLLOW_DISTANCE",
|
|
1658
|
-
}),
|
|
1659
|
-
eth1FollowDistanceDynamic: register.gauge({
|
|
1660
|
-
name: "lodestar_eth1_follow_distance_dynamic",
|
|
1661
|
-
help: "Eth1 dynamic follow distance changed by the deposit tracker if blocks are slow",
|
|
1662
|
-
}),
|
|
1663
|
-
eth1GetBlocksBatchSizeDynamic: register.gauge({
|
|
1664
|
-
name: "lodestar_eth1_blocks_batch_size_dynamic",
|
|
1665
|
-
help: "Dynamic batch size to fetch blocks",
|
|
1666
|
-
}),
|
|
1667
|
-
eth1GetLogsBatchSizeDynamic: register.gauge({
|
|
1668
|
-
name: "lodestar_eth1_logs_batch_size_dynamic",
|
|
1669
|
-
help: "Dynamic batch size to fetch deposit logs",
|
|
1670
|
-
}),
|
|
1671
|
-
},
|
|
1672
|
-
|
|
1673
|
-
eth1HttpClient: {
|
|
1674
|
-
requestTime: register.histogram<{routeId: string}>({
|
|
1675
|
-
name: "lodestar_eth1_http_client_request_time_seconds",
|
|
1676
|
-
help: "eth1 JsonHttpClient - histogram or roundtrip request times",
|
|
1677
|
-
labelNames: ["routeId"],
|
|
1678
|
-
// Provide max resolution on problematic values around 1 second
|
|
1679
|
-
buckets: [0.1, 0.5, 1, 2, 5, 15],
|
|
1680
|
-
}),
|
|
1681
|
-
streamTime: register.histogram<{routeId: string}>({
|
|
1682
|
-
name: "lodestar_eth1_http_client_stream_time_seconds",
|
|
1683
|
-
help: "eth1 JsonHttpClient - streaming time by routeId",
|
|
1684
|
-
labelNames: ["routeId"],
|
|
1685
|
-
// Provide max resolution on problematic values around 1 second
|
|
1686
|
-
buckets: [0.1, 0.5, 1, 2, 5, 15],
|
|
1687
|
-
}),
|
|
1688
|
-
requestErrors: register.gauge<{routeId: string}>({
|
|
1689
|
-
name: "lodestar_eth1_http_client_request_errors_total",
|
|
1690
|
-
help: "eth1 JsonHttpClient - total count of request errors",
|
|
1691
|
-
labelNames: ["routeId"],
|
|
1692
|
-
}),
|
|
1693
|
-
retryCount: register.gauge<{routeId: string}>({
|
|
1694
|
-
name: "lodestar_eth1_http_client_request_retries_total",
|
|
1695
|
-
help: "eth1 JsonHttpClient - total count of request retries",
|
|
1696
|
-
labelNames: ["routeId"],
|
|
1697
|
-
}),
|
|
1698
|
-
requestUsedFallbackUrl: register.gauge<{routeId: string}>({
|
|
1699
|
-
name: "lodestar_eth1_http_client_request_used_fallback_url_total",
|
|
1700
|
-
help: "eth1 JsonHttpClient - total count of requests on fallback url(s)",
|
|
1701
|
-
labelNames: ["routeId"],
|
|
1702
|
-
}),
|
|
1703
|
-
activeRequests: register.gauge<{routeId: string}>({
|
|
1704
|
-
name: "lodestar_eth1_http_client_active_requests",
|
|
1705
|
-
help: "eth1 JsonHttpClient - current count of active requests",
|
|
1706
|
-
labelNames: ["routeId"],
|
|
1707
|
-
}),
|
|
1708
|
-
configUrlsCount: register.gauge({
|
|
1709
|
-
name: "lodestar_eth1_http_client_config_urls_count",
|
|
1710
|
-
help: "eth1 JsonHttpClient - static config urls count",
|
|
1711
|
-
}),
|
|
1712
|
-
},
|
|
1713
|
-
|
|
1714
1622
|
executionEnginerHttpClient: {
|
|
1715
1623
|
requestTime: register.histogram<{routeId: string}>({
|
|
1716
1624
|
name: "lodestar_execution_engine_http_client_request_time_seconds",
|
package/src/node/nodejs.ts
CHANGED
|
@@ -13,7 +13,6 @@ import {BeaconRestApiServer, getApi} from "../api/index.js";
|
|
|
13
13
|
import {BeaconChain, IBeaconChain, initBeaconMetrics} from "../chain/index.js";
|
|
14
14
|
import {ValidatorMonitor, createValidatorMonitor} from "../chain/validatorMonitor.js";
|
|
15
15
|
import {IBeaconDb} from "../db/index.js";
|
|
16
|
-
import {initializeEth1ForBlockProduction} from "../eth1/index.js";
|
|
17
16
|
import {initializeExecutionBuilder, initializeExecutionEngine} from "../execution/index.js";
|
|
18
17
|
import {HttpMetricsServer, Metrics, createMetrics, getHttpMetricsServer} from "../metrics/index.js";
|
|
19
18
|
import {MonitoringService} from "../monitoring/index.js";
|
|
@@ -68,7 +67,6 @@ enum LoggerModule {
|
|
|
68
67
|
api = "api",
|
|
69
68
|
backfill = "backfill",
|
|
70
69
|
chain = "chain",
|
|
71
|
-
eth1 = "eth1",
|
|
72
70
|
execution = "execution",
|
|
73
71
|
metrics = "metrics",
|
|
74
72
|
monitoring = "monitoring",
|
|
@@ -199,6 +197,17 @@ export class BeaconNode {
|
|
|
199
197
|
// TODO: Should this call be awaited?
|
|
200
198
|
await db.pruneHotDb();
|
|
201
199
|
|
|
200
|
+
// Delete deprecated eth1 data to free up disk space for users
|
|
201
|
+
logger.debug("Deleting deprecated eth1 data from database");
|
|
202
|
+
const startTime = Date.now();
|
|
203
|
+
db.deleteDeprecatedEth1Data()
|
|
204
|
+
.then(() => {
|
|
205
|
+
logger.debug("Deleted deprecated eth1 data", {durationMs: Date.now() - startTime});
|
|
206
|
+
})
|
|
207
|
+
.catch((e) => {
|
|
208
|
+
logger.error("Failed to delete deprecated eth1 data", {}, e);
|
|
209
|
+
});
|
|
210
|
+
|
|
202
211
|
const monitoring = opts.monitoring.endpoint
|
|
203
212
|
? new MonitoringService(
|
|
204
213
|
"beacon",
|
|
@@ -220,13 +229,6 @@ export class BeaconNode {
|
|
|
220
229
|
validatorMonitor,
|
|
221
230
|
anchorState,
|
|
222
231
|
isAnchorStateFinalized,
|
|
223
|
-
eth1: initializeEth1ForBlockProduction(opts.eth1, {
|
|
224
|
-
config,
|
|
225
|
-
db,
|
|
226
|
-
metrics,
|
|
227
|
-
logger: logger.child({module: LoggerModule.eth1}),
|
|
228
|
-
signal,
|
|
229
|
-
}),
|
|
230
232
|
executionEngine: initializeExecutionEngine(opts.executionEngine, {
|
|
231
233
|
metrics,
|
|
232
234
|
signal,
|
package/src/node/options.ts
CHANGED
|
@@ -2,7 +2,6 @@ import {ApiOptions, defaultApiOptions} from "../api/options.js";
|
|
|
2
2
|
import {ArchiveMode, DEFAULT_ARCHIVE_MODE, IChainOptions, defaultChainOptions} from "../chain/options.js";
|
|
3
3
|
import {ValidatorMonitorOpts, defaultValidatorMonitorOpts} from "../chain/validatorMonitor.js";
|
|
4
4
|
import {DatabaseOptions, defaultDbOptions} from "../db/options.js";
|
|
5
|
-
import {Eth1Options, defaultEth1Options} from "../eth1/options.js";
|
|
6
5
|
import {
|
|
7
6
|
ExecutionBuilderOpts,
|
|
8
7
|
ExecutionEngineOpts,
|
|
@@ -26,7 +25,6 @@ export interface IBeaconNodeOptions {
|
|
|
26
25
|
api: ApiOptions;
|
|
27
26
|
chain: IChainOptions;
|
|
28
27
|
db: DatabaseOptions;
|
|
29
|
-
eth1: Eth1Options;
|
|
30
28
|
executionEngine: ExecutionEngineOpts;
|
|
31
29
|
executionBuilder: ExecutionBuilderOpts;
|
|
32
30
|
metrics: MetricsOptions;
|
|
@@ -40,7 +38,6 @@ export const defaultOptions: IBeaconNodeOptions = {
|
|
|
40
38
|
api: defaultApiOptions,
|
|
41
39
|
chain: defaultChainOptions,
|
|
42
40
|
db: defaultDbOptions,
|
|
43
|
-
eth1: defaultEth1Options,
|
|
44
41
|
executionEngine: defaultExecutionEngineOpts,
|
|
45
42
|
executionBuilder: defaultExecutionBuilderOpts,
|
|
46
43
|
metrics: defaultMetricsOptions,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {digest} from "@chainsafe/as-sha256";
|
|
2
2
|
import {Tree, toGindex} from "@chainsafe/persistent-merkle-tree";
|
|
3
|
+
import {ByteVectorType, CompositeViewDU, ListCompositeType} from "@chainsafe/ssz";
|
|
3
4
|
import {ChainConfig} from "@lodestar/config";
|
|
4
5
|
import {
|
|
5
6
|
BLS_WITHDRAWAL_PREFIX,
|
|
@@ -9,7 +10,8 @@ import {
|
|
|
9
10
|
} from "@lodestar/params";
|
|
10
11
|
import {ZERO_HASH, computeDomain, computeSigningRoot, interopSecretKeys} from "@lodestar/state-transition";
|
|
11
12
|
import {phase0, ssz} from "@lodestar/types";
|
|
12
|
-
|
|
13
|
+
|
|
14
|
+
export type DepositTree = CompositeViewDU<ListCompositeType<ByteVectorType>>;
|
|
13
15
|
|
|
14
16
|
/**
|
|
15
17
|
* Compute and return deposit data from other validators.
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
initializeBeaconStateFromEth1,
|
|
7
7
|
} from "@lodestar/state-transition";
|
|
8
8
|
import {Bytes32, TimeSeconds, phase0, ssz, sszTypesFor} from "@lodestar/types";
|
|
9
|
-
import {DepositTree} from "
|
|
9
|
+
import {DepositTree} from "./deposits.js";
|
|
10
10
|
|
|
11
11
|
export const INTEROP_BLOCK_HASH = Buffer.alloc(32, "B");
|
|
12
12
|
export const INTEROP_TIMESTAMP = Math.pow(2, 40);
|
package/src/node/utils/state.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {ChainForkConfig} from "@lodestar/config";
|
|
2
2
|
import {BeaconStateAllForks} from "@lodestar/state-transition";
|
|
3
|
-
import {
|
|
4
|
-
import {IBeaconDb} from "../../db/index.js";
|
|
3
|
+
import {ssz} from "@lodestar/types";
|
|
5
4
|
import {interopDeposits} from "./interop/deposits.js";
|
|
6
5
|
import {InteropStateOpts, getInteropState} from "./interop/state.js";
|
|
7
6
|
|
|
@@ -12,26 +11,12 @@ export function initDevState(
|
|
|
12
11
|
config: ChainForkConfig,
|
|
13
12
|
validatorCount: number,
|
|
14
13
|
interopStateOpts: InteropStateOpts
|
|
15
|
-
):
|
|
14
|
+
): BeaconStateAllForks {
|
|
16
15
|
const deposits = interopDeposits(
|
|
17
16
|
config,
|
|
18
17
|
ssz.phase0.DepositDataRootList.defaultViewDU(),
|
|
19
18
|
validatorCount,
|
|
20
19
|
interopStateOpts
|
|
21
20
|
);
|
|
22
|
-
|
|
23
|
-
return {deposits, state};
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export async function writeDeposits(db: IBeaconDb, deposits: phase0.Deposit[]): Promise<void> {
|
|
27
|
-
for (let i = 0; i < deposits.length; i++) {
|
|
28
|
-
await Promise.all([
|
|
29
|
-
db.depositEvent.put(i, {
|
|
30
|
-
blockNumber: i,
|
|
31
|
-
index: i,
|
|
32
|
-
depositData: deposits[i].data,
|
|
33
|
-
}),
|
|
34
|
-
db.depositDataRoot.put(i, ssz.phase0.DepositData.hashTreeRoot(deposits[i].data)),
|
|
35
|
-
]);
|
|
36
|
-
}
|
|
21
|
+
return getInteropState(config, interopStateOpts, deposits);
|
|
37
22
|
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { ChainForkConfig } from "@lodestar/config";
|
|
2
|
-
import { BeaconStateAllForks, CachedBeaconStateAllForks } from "@lodestar/state-transition";
|
|
3
|
-
import { Logger } from "@lodestar/utils";
|
|
4
|
-
import { DepositTree } from "../../db/repositories/depositDataRoot.js";
|
|
5
|
-
import { IEth1Provider } from "../../eth1/index.js";
|
|
6
|
-
import { GenesisResult, IGenesisBuilder } from "./interface.js";
|
|
7
|
-
export type GenesisBuilderKwargs = {
|
|
8
|
-
config: ChainForkConfig;
|
|
9
|
-
eth1Provider: IEth1Provider;
|
|
10
|
-
logger: Logger;
|
|
11
|
-
/** Use to restore pending progress */
|
|
12
|
-
pendingStatus?: {
|
|
13
|
-
state: BeaconStateAllForks;
|
|
14
|
-
depositTree: DepositTree;
|
|
15
|
-
lastProcessedBlockNumber: number;
|
|
16
|
-
};
|
|
17
|
-
signal?: AbortSignal;
|
|
18
|
-
maxBlocksPerPoll?: number;
|
|
19
|
-
};
|
|
20
|
-
export declare class GenesisBuilder implements IGenesisBuilder {
|
|
21
|
-
readonly state: CachedBeaconStateAllForks;
|
|
22
|
-
readonly depositTree: DepositTree;
|
|
23
|
-
/** Is null if no block has been processed yet */
|
|
24
|
-
lastProcessedBlockNumber: number | null;
|
|
25
|
-
private readonly config;
|
|
26
|
-
private readonly eth1Provider;
|
|
27
|
-
private readonly logger;
|
|
28
|
-
private readonly signal?;
|
|
29
|
-
private readonly eth1Params;
|
|
30
|
-
private readonly depositCache;
|
|
31
|
-
private readonly fromBlock;
|
|
32
|
-
private readonly logEvery;
|
|
33
|
-
private lastLog;
|
|
34
|
-
/** Current count of active validators in the state */
|
|
35
|
-
private activatedValidatorCount;
|
|
36
|
-
constructor({ config, eth1Provider, logger, signal, pendingStatus, maxBlocksPerPoll }: GenesisBuilderKwargs);
|
|
37
|
-
/**
|
|
38
|
-
* Get eth1 deposit events and blocks and apply to this.state until we found genesis.
|
|
39
|
-
*/
|
|
40
|
-
waitForGenesis(): Promise<GenesisResult>;
|
|
41
|
-
/**
|
|
42
|
-
* First phase of waiting for genesis.
|
|
43
|
-
* Stream deposits events in batches as big as possible without querying block data
|
|
44
|
-
* @returns Block number at which there are enough active validators is state for genesis
|
|
45
|
-
*/
|
|
46
|
-
private waitForGenesisValidators;
|
|
47
|
-
private applyDeposits;
|
|
48
|
-
/** Throttle genesis generation status log to prevent spamming */
|
|
49
|
-
private throttledLog;
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=genesis.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"genesis.d.ts","sourceRoot":"","sources":["../../../src/chain/genesis/genesis.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAE/D,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EAS1B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAC,WAAW,EAAC,MAAM,0CAA0C,CAAC;AACrE,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAGlD,OAAO,EAAC,aAAa,EAAE,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAE9D,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IAEf,sCAAsC;IACtC,aAAa,CAAC,EAAE;QACd,KAAK,EAAE,mBAAmB,CAAC;QAC3B,WAAW,EAAE,WAAW,CAAC;QACzB,wBAAwB,EAAE,MAAM,CAAC;KAClC,CAAC;IAEF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,qBAAa,cAAe,YAAW,eAAe;IAEpD,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,iDAAiD;IACjD,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,OAAO,CAAK;IACpB,sDAAsD;IACtD,OAAO,CAAC,uBAAuB,CAAS;gBAE5B,EAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAC,EAAE,oBAAoB;IAmCzG;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IAsC9C;;;;OAIG;YACW,wBAAwB;IAoBtC,OAAO,CAAC,aAAa;IAuBrB,iEAAiE;IACjE,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { Tree, toGindex } from "@chainsafe/persistent-merkle-tree";
|
|
2
|
-
import { GENESIS_EPOCH, GENESIS_SLOT } from "@lodestar/params";
|
|
3
|
-
import { applyDeposits, applyEth1BlockHash, applyTimestamp, createCachedBeaconState, createEmptyEpochCacheImmutableData, getActiveValidatorIndices, getGenesisBeaconState, getTemporaryBlockHeader, } from "@lodestar/state-transition";
|
|
4
|
-
import { ssz } from "@lodestar/types";
|
|
5
|
-
import { getDepositsAndBlockStreamForGenesis, getDepositsStream } from "../../eth1/stream.js";
|
|
6
|
-
export class GenesisBuilder {
|
|
7
|
-
// Expose state to persist on error
|
|
8
|
-
state;
|
|
9
|
-
depositTree;
|
|
10
|
-
/** Is null if no block has been processed yet */
|
|
11
|
-
lastProcessedBlockNumber = null;
|
|
12
|
-
config;
|
|
13
|
-
eth1Provider;
|
|
14
|
-
logger;
|
|
15
|
-
signal;
|
|
16
|
-
eth1Params;
|
|
17
|
-
depositCache = new Set();
|
|
18
|
-
fromBlock;
|
|
19
|
-
logEvery = 30 * 1000;
|
|
20
|
-
lastLog = 0;
|
|
21
|
-
/** Current count of active validators in the state */
|
|
22
|
-
activatedValidatorCount;
|
|
23
|
-
constructor({ config, eth1Provider, logger, signal, pendingStatus, maxBlocksPerPoll }) {
|
|
24
|
-
// at genesis builder, there is no genesis validator so we don't have a real BeaconConfig
|
|
25
|
-
// but we need BeaconConfig to temporarily create CachedBeaconState, the cast here is safe since we don't use any getDomain here
|
|
26
|
-
// the use of state as CachedBeaconState is just for convenient, GenesisResult returns TreeView anyway
|
|
27
|
-
this.eth1Provider = eth1Provider;
|
|
28
|
-
this.logger = logger;
|
|
29
|
-
this.signal = signal;
|
|
30
|
-
this.eth1Params = {
|
|
31
|
-
...config,
|
|
32
|
-
maxBlocksPerPoll: maxBlocksPerPoll ?? 10000,
|
|
33
|
-
};
|
|
34
|
-
let stateView;
|
|
35
|
-
if (pendingStatus) {
|
|
36
|
-
this.logger.info("Restoring pending genesis state", { block: pendingStatus.lastProcessedBlockNumber });
|
|
37
|
-
stateView = pendingStatus.state;
|
|
38
|
-
this.depositTree = pendingStatus.depositTree;
|
|
39
|
-
this.fromBlock = Math.max(pendingStatus.lastProcessedBlockNumber + 1, this.eth1Provider.deployBlock);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
stateView = getGenesisBeaconState(config, ssz.phase0.Eth1Data.defaultValue(), getTemporaryBlockHeader(config, config.getForkTypes(GENESIS_SLOT).BeaconBlock.defaultValue()));
|
|
43
|
-
this.depositTree = ssz.phase0.DepositDataRootList.defaultViewDU();
|
|
44
|
-
this.fromBlock = this.eth1Provider.deployBlock;
|
|
45
|
-
}
|
|
46
|
-
// TODO - PENDING: Ensure EpochCacheImmutableData is created only once
|
|
47
|
-
this.state = createCachedBeaconState(stateView, createEmptyEpochCacheImmutableData(config, stateView));
|
|
48
|
-
this.config = this.state.config;
|
|
49
|
-
this.activatedValidatorCount = getActiveValidatorIndices(stateView, GENESIS_EPOCH).length;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Get eth1 deposit events and blocks and apply to this.state until we found genesis.
|
|
53
|
-
*/
|
|
54
|
-
async waitForGenesis() {
|
|
55
|
-
await this.eth1Provider.validateContract();
|
|
56
|
-
// Load data from data from this.db.depositData, this.db.depositDataRoot
|
|
57
|
-
// And start from a more recent fromBlock
|
|
58
|
-
const blockNumberValidatorGenesis = await this.waitForGenesisValidators();
|
|
59
|
-
const depositsAndBlocksStream = getDepositsAndBlockStreamForGenesis(blockNumberValidatorGenesis, this.eth1Provider, this.eth1Params, this.signal);
|
|
60
|
-
for await (const [depositEvents, block] of depositsAndBlocksStream) {
|
|
61
|
-
this.applyDeposits(depositEvents);
|
|
62
|
-
applyTimestamp(this.config, this.state, block.timestamp);
|
|
63
|
-
applyEth1BlockHash(this.state, block.blockHash);
|
|
64
|
-
this.lastProcessedBlockNumber = block.blockNumber;
|
|
65
|
-
if (this.state.genesisTime >= this.config.MIN_GENESIS_TIME &&
|
|
66
|
-
this.activatedValidatorCount >= this.config.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT) {
|
|
67
|
-
this.logger.info("Found genesis state", { blockNumber: block.blockNumber });
|
|
68
|
-
return {
|
|
69
|
-
state: this.state,
|
|
70
|
-
depositTree: this.depositTree,
|
|
71
|
-
block,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
this.throttledLog(`Waiting for min genesis time ${block.timestamp} / ${this.config.MIN_GENESIS_TIME}`);
|
|
75
|
-
}
|
|
76
|
-
throw Error("depositsStream stopped without a valid genesis state");
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* First phase of waiting for genesis.
|
|
80
|
-
* Stream deposits events in batches as big as possible without querying block data
|
|
81
|
-
* @returns Block number at which there are enough active validators is state for genesis
|
|
82
|
-
*/
|
|
83
|
-
async waitForGenesisValidators() {
|
|
84
|
-
const depositsStream = getDepositsStream(this.fromBlock, this.eth1Provider, this.eth1Params, this.signal);
|
|
85
|
-
for await (const { depositEvents, blockNumber } of depositsStream) {
|
|
86
|
-
this.applyDeposits(depositEvents);
|
|
87
|
-
this.lastProcessedBlockNumber = blockNumber;
|
|
88
|
-
if (this.activatedValidatorCount >= this.config.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT) {
|
|
89
|
-
this.logger.info("Found enough genesis validators", { blockNumber });
|
|
90
|
-
return blockNumber;
|
|
91
|
-
}
|
|
92
|
-
this.throttledLog(`Found ${this.state.validators.length} / ${this.config.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT} validators to genesis`);
|
|
93
|
-
}
|
|
94
|
-
throw Error("depositsStream stopped without a valid genesis state");
|
|
95
|
-
}
|
|
96
|
-
applyDeposits(depositEvents) {
|
|
97
|
-
const newDeposits = depositEvents
|
|
98
|
-
.filter((depositEvent) => !this.depositCache.has(depositEvent.index))
|
|
99
|
-
.map((depositEvent) => {
|
|
100
|
-
this.depositCache.add(depositEvent.index);
|
|
101
|
-
this.depositTree.push(ssz.phase0.DepositData.hashTreeRoot(depositEvent.depositData));
|
|
102
|
-
const gindex = toGindex(this.depositTree.type.depth, BigInt(depositEvent.index));
|
|
103
|
-
// Apply changes from the push above
|
|
104
|
-
this.depositTree.commit();
|
|
105
|
-
const depositTreeNode = this.depositTree.node;
|
|
106
|
-
return {
|
|
107
|
-
proof: new Tree(depositTreeNode).getSingleProof(gindex),
|
|
108
|
-
data: depositEvent.depositData,
|
|
109
|
-
};
|
|
110
|
-
});
|
|
111
|
-
const { activatedValidatorCount } = applyDeposits(this.config, this.state, newDeposits, this.depositTree);
|
|
112
|
-
this.activatedValidatorCount += activatedValidatorCount;
|
|
113
|
-
// TODO: If necessary persist deposits here to this.db.depositData, this.db.depositDataRoot
|
|
114
|
-
}
|
|
115
|
-
/** Throttle genesis generation status log to prevent spamming */
|
|
116
|
-
throttledLog(message) {
|
|
117
|
-
if (Date.now() - this.lastLog > this.logEvery) {
|
|
118
|
-
this.lastLog = Date.now();
|
|
119
|
-
this.logger.info(message);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
//# sourceMappingURL=genesis.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"genesis.js","sourceRoot":"","sources":["../../../src/chain/genesis/genesis.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { CompositeViewDU, VectorCompositeType } from "@chainsafe/ssz";
|
|
2
|
-
import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
|
|
3
|
-
import { ssz } from "@lodestar/types";
|
|
4
|
-
import { Eth1Block } from "../../eth1/interface.js";
|
|
5
|
-
export type GenesisResult = {
|
|
6
|
-
state: CachedBeaconStateAllForks;
|
|
7
|
-
depositTree: CompositeViewDU<VectorCompositeType<typeof ssz.Root>>;
|
|
8
|
-
block: Eth1Block;
|
|
9
|
-
};
|
|
10
|
-
export interface IGenesisBuilder {
|
|
11
|
-
waitForGenesis: () => Promise<GenesisResult>;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=interface.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/chain/genesis/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAE,mBAAmB,EAAC,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAC,yBAAyB,EAAC,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AACpC,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAElD,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,yBAAyB,CAAC;IACjC,WAAW,EAAE,eAAe,CAAC,mBAAmB,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;CAC9C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/chain/genesis/interface.ts"],"names":[],"mappings":""}
|