@lodestar/beacon-node 1.50.0-dev.3579e999b5 → 1.50.0-dev.53ad0a2af7
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/chain/initState.d.ts +2 -9
- package/lib/chain/initState.d.ts.map +1 -1
- package/lib/chain/initState.js +5 -38
- package/lib/chain/initState.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/package.json +15 -15
- package/src/chain/initState.ts +8 -60
- package/src/index.ts +1 -1
package/lib/chain/initState.d.ts
CHANGED
|
@@ -4,18 +4,11 @@ import { SignedBeaconBlock } from "@lodestar/types";
|
|
|
4
4
|
import { Logger } from "@lodestar/utils";
|
|
5
5
|
import { IBeaconDb } from "../db/index.js";
|
|
6
6
|
import { Metrics } from "../metrics/index.js";
|
|
7
|
-
export declare function persistAnchorState(config: ChainForkConfig, db: IBeaconDb, anchorState:
|
|
8
|
-
export declare function createGenesisBlock(config: ChainForkConfig, genesisState:
|
|
7
|
+
export declare function persistAnchorState(config: ChainForkConfig, db: IBeaconDb, anchorState: IBeaconStateView, anchorStateBytes: Uint8Array): Promise<void>;
|
|
8
|
+
export declare function createGenesisBlock(config: ChainForkConfig, genesisState: IBeaconStateView): SignedBeaconBlock;
|
|
9
9
|
/**
|
|
10
10
|
* Restore the latest beacon state from db
|
|
11
11
|
*/
|
|
12
12
|
export declare function initStateFromDb(config: ChainForkConfig, db: IBeaconDb, logger: Logger): Promise<BeaconStateAllForks>;
|
|
13
|
-
/**
|
|
14
|
-
* Initialize and persist an anchor state (either weak subjectivity or genesis)
|
|
15
|
-
*/
|
|
16
|
-
export declare function checkAndPersistAnchorState(config: ChainForkConfig, db: IBeaconDb, logger: Logger, anchorState: BeaconStateAllForks, anchorStateBytes: Uint8Array, { isWithinWeakSubjectivityPeriod, isCheckpointState, }: {
|
|
17
|
-
isWithinWeakSubjectivityPeriod: boolean;
|
|
18
|
-
isCheckpointState: boolean;
|
|
19
|
-
}): Promise<void>;
|
|
20
13
|
export declare function initBeaconMetrics(metrics: Metrics, state: IBeaconStateView): void;
|
|
21
14
|
//# sourceMappingURL=initState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initState.d.ts","sourceRoot":"","sources":["../../src/chain/initState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,
|
|
1
|
+
{"version":3,"file":"initState.d.ts","sourceRoot":"","sources":["../../src/chain/initState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAC,mBAAmB,EAAE,gBAAgB,EAAuC,MAAM,4BAA4B,CAAC;AACvH,OAAO,EAAC,iBAAiB,EAAM,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAgB,MAAM,EAA6B,MAAM,iBAAiB,CAAC;AAElF,OAAO,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAC;AAG5C,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,eAAe,EACvB,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,gBAAgB,EAC7B,gBAAgB,EAAE,UAAU,GAC3B,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,GAAG,iBAAiB,CAY7G;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,CAAC,CAc9B;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAKjF"}
|
package/lib/chain/initState.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ForkSeq, ZERO_HASH } from "@lodestar/params";
|
|
2
|
-
import { computeEpochAtSlot,
|
|
2
|
+
import { computeEpochAtSlot, isStatePostGloas } from "@lodestar/state-transition";
|
|
3
3
|
import { ssz } from "@lodestar/types";
|
|
4
|
-
import {
|
|
4
|
+
import { LodestarError, byteArrayEquals, toRootHex } from "@lodestar/utils";
|
|
5
5
|
import { GENESIS_SLOT } from "../constants/index.js";
|
|
6
6
|
import { getStateTypeFromBytes } from "../util/multifork.js";
|
|
7
7
|
export async function persistAnchorState(config, db, anchorState, anchorStateBytes) {
|
|
@@ -14,7 +14,7 @@ export async function persistAnchorState(config, db, anchorState, anchorStateByt
|
|
|
14
14
|
}
|
|
15
15
|
const latestBlockRoot = ssz.phase0.BeaconBlockHeader.hashTreeRoot(latestBlockHeader);
|
|
16
16
|
if (!byteArrayEquals(blockRoot, latestBlockRoot)) {
|
|
17
|
-
throw
|
|
17
|
+
throw new LodestarError({ code: "GENESIS_BLOCK_ROOT_MISMATCH" }, `Genesis block root ${toRootHex(blockRoot)} does not match genesis state latest block root ${toRootHex(latestBlockRoot)}`);
|
|
18
18
|
}
|
|
19
19
|
await Promise.all([
|
|
20
20
|
db.blockArchive.add(genesisBlock),
|
|
@@ -31,10 +31,9 @@ export function createGenesisBlock(config, genesisState) {
|
|
|
31
31
|
const genesisBlock = types.SignedBeaconBlock.defaultValue();
|
|
32
32
|
const stateRoot = genesisState.hashTreeRoot();
|
|
33
33
|
genesisBlock.message.stateRoot = stateRoot;
|
|
34
|
-
if (config.getForkSeq(GENESIS_SLOT) >= ForkSeq.gloas) {
|
|
34
|
+
if (config.getForkSeq(GENESIS_SLOT) >= ForkSeq.gloas && isStatePostGloas(genesisState)) {
|
|
35
35
|
const gloasBlock = genesisBlock;
|
|
36
|
-
|
|
37
|
-
gloasBlock.message.body.signedExecutionPayloadBid.message = gloasState.latestExecutionPayloadBid.toValue();
|
|
36
|
+
gloasBlock.message.body.signedExecutionPayloadBid.message = genesisState.latestExecutionPayloadBid;
|
|
38
37
|
}
|
|
39
38
|
return genesisBlock;
|
|
40
39
|
}
|
|
@@ -54,38 +53,6 @@ export async function initStateFromDb(config, db, logger) {
|
|
|
54
53
|
});
|
|
55
54
|
return state;
|
|
56
55
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Initialize and persist an anchor state (either weak subjectivity or genesis)
|
|
59
|
-
*/
|
|
60
|
-
export async function checkAndPersistAnchorState(config, db, logger, anchorState, anchorStateBytes, { isWithinWeakSubjectivityPeriod, isCheckpointState, }) {
|
|
61
|
-
const expectedFork = config.getForkInfo(computeStartSlotAtEpoch(anchorState.fork.epoch));
|
|
62
|
-
const expectedForkVersion = toHex(expectedFork.version);
|
|
63
|
-
const stateFork = toHex(anchorState.fork.currentVersion);
|
|
64
|
-
if (stateFork !== expectedForkVersion) {
|
|
65
|
-
throw Error(`State current fork version ${stateFork} not equal to current config ${expectedForkVersion}. Maybe caused by importing a state from a different network`);
|
|
66
|
-
}
|
|
67
|
-
const stateInfo = isCheckpointState ? "checkpoint" : "db";
|
|
68
|
-
if (isWithinWeakSubjectivityPeriod) {
|
|
69
|
-
logger.info(`Initializing beacon from a valid ${stateInfo} state`, {
|
|
70
|
-
slot: anchorState.slot,
|
|
71
|
-
epoch: computeEpochAtSlot(anchorState.slot),
|
|
72
|
-
stateRoot: toRootHex(anchorState.hashTreeRoot()),
|
|
73
|
-
isWithinWeakSubjectivityPeriod,
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
logger.warn(`Initializing from a stale ${stateInfo} state vulnerable to long range attacks`, {
|
|
78
|
-
slot: anchorState.slot,
|
|
79
|
-
epoch: computeEpochAtSlot(anchorState.slot),
|
|
80
|
-
stateRoot: toRootHex(anchorState.hashTreeRoot()),
|
|
81
|
-
isWithinWeakSubjectivityPeriod,
|
|
82
|
-
});
|
|
83
|
-
logger.warn("Checkpoint sync recommended, please use --help to see checkpoint sync options");
|
|
84
|
-
}
|
|
85
|
-
if (isCheckpointState || anchorState.slot === GENESIS_SLOT) {
|
|
86
|
-
await persistAnchorState(config, db, anchorState, anchorStateBytes);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
56
|
export function initBeaconMetrics(metrics, state) {
|
|
90
57
|
metrics.headSlot.set(state.slot);
|
|
91
58
|
metrics.previousJustifiedEpoch.set(state.previousJustifiedCheckpoint.epoch);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initState.js","sourceRoot":"","sources":["../../src/chain/initState.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,OAAO,EAAE,SAAS,EAAC,MAAM,kBAAkB,CAAC;AACnE,OAAO,
|
|
1
|
+
{"version":3,"file":"initState.js","sourceRoot":"","sources":["../../src/chain/initState.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type { RestApiServerMetrics, RestApiServerModules, RestApiServerOpts } from "./api/rest/base.js";
|
|
2
2
|
export { RestApiServer } from "./api/rest/base.js";
|
|
3
|
-
export {
|
|
3
|
+
export { persistAnchorState } from "./chain/index.js";
|
|
4
4
|
export { DbCPStateDatastore } from "./chain/stateCache/datastore/db.js";
|
|
5
5
|
export { FileCPStateDatastore } from "./chain/stateCache/datastore/file.js";
|
|
6
6
|
export { BeaconDb, type IBeaconDb } from "./db/index.js";
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAC,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AACtG,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAC,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AACtG,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAC,kBAAkB,EAAC,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAC,oBAAoB,EAAC,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAC,QAAQ,EAAE,KAAK,SAAS,EAAC,MAAM,eAAe,CAAC;AAEvD,OAAO,EACL,KAAK,iBAAiB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAC,KAAK,gBAAgB,EAAE,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAC7E,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAAC,qBAAqB,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Export generic RestApi server for CLI
|
|
2
2
|
export { RestApiServer } from "./api/rest/base.js";
|
|
3
|
-
export {
|
|
3
|
+
export { persistAnchorState } from "./chain/index.js";
|
|
4
4
|
export { DbCPStateDatastore } from "./chain/stateCache/datastore/db.js";
|
|
5
5
|
export { FileCPStateDatastore } from "./chain/stateCache/datastore/file.js";
|
|
6
6
|
export { BeaconDb } from "./db/index.js";
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAGxC,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAGxC,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAC,kBAAkB,EAAC,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAC,oBAAoB,EAAC,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAC,QAAQ,EAAiB,MAAM,eAAe,CAAC;AACvD,6DAA6D;AAC7D,OAAO,EAEL,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,2DAA2D;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAwB,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAC7E,cAAc,iBAAiB,CAAC;AAChC,oEAAoE;AACpE,OAAO,EAAC,qBAAqB,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC"}
|
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.53ad0a2af7",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -127,17 +127,17 @@
|
|
|
127
127
|
"@libp2p/prometheus-metrics": "^5.0.28",
|
|
128
128
|
"@libp2p/tcp": "^11.0.27",
|
|
129
129
|
"@libp2p/utils": "^7.4.0",
|
|
130
|
-
"@lodestar/api": "^1.50.0-dev.
|
|
131
|
-
"@lodestar/config": "^1.50.0-dev.
|
|
132
|
-
"@lodestar/db": "^1.50.0-dev.
|
|
133
|
-
"@lodestar/fork-choice": "^1.50.0-dev.
|
|
134
|
-
"@lodestar/logger": "^1.50.0-dev.
|
|
135
|
-
"@lodestar/params": "^1.50.0-dev.
|
|
136
|
-
"@lodestar/reqresp": "^1.50.0-dev.
|
|
137
|
-
"@lodestar/state-transition": "^1.50.0-dev.
|
|
138
|
-
"@lodestar/types": "^1.50.0-dev.
|
|
139
|
-
"@lodestar/utils": "^1.50.0-dev.
|
|
140
|
-
"@lodestar/validator": "^1.50.0-dev.
|
|
130
|
+
"@lodestar/api": "^1.50.0-dev.53ad0a2af7",
|
|
131
|
+
"@lodestar/config": "^1.50.0-dev.53ad0a2af7",
|
|
132
|
+
"@lodestar/db": "^1.50.0-dev.53ad0a2af7",
|
|
133
|
+
"@lodestar/fork-choice": "^1.50.0-dev.53ad0a2af7",
|
|
134
|
+
"@lodestar/logger": "^1.50.0-dev.53ad0a2af7",
|
|
135
|
+
"@lodestar/params": "^1.50.0-dev.53ad0a2af7",
|
|
136
|
+
"@lodestar/reqresp": "^1.50.0-dev.53ad0a2af7",
|
|
137
|
+
"@lodestar/state-transition": "^1.50.0-dev.53ad0a2af7",
|
|
138
|
+
"@lodestar/types": "^1.50.0-dev.53ad0a2af7",
|
|
139
|
+
"@lodestar/utils": "^1.50.0-dev.53ad0a2af7",
|
|
140
|
+
"@lodestar/validator": "^1.50.0-dev.53ad0a2af7",
|
|
141
141
|
"@multiformats/multiaddr": "^13.0.1",
|
|
142
142
|
"datastore-core": "^12.0.1",
|
|
143
143
|
"datastore-level": "^13.0.1",
|
|
@@ -158,8 +158,8 @@
|
|
|
158
158
|
"devDependencies": {
|
|
159
159
|
"@libp2p/interface-internal": "^3.1.12",
|
|
160
160
|
"@libp2p/logger": "^6.2.13",
|
|
161
|
-
"@lodestar/spec-test-util": "^1.50.0-dev.
|
|
162
|
-
"@lodestar/test-utils": "^1.50.0-dev.
|
|
161
|
+
"@lodestar/spec-test-util": "^1.50.0-dev.53ad0a2af7",
|
|
162
|
+
"@lodestar/test-utils": "^1.50.0-dev.53ad0a2af7",
|
|
163
163
|
"@types/js-yaml": "^4.0.5",
|
|
164
164
|
"@types/qs": "^6.9.7",
|
|
165
165
|
"@types/tmp": "^0.2.3",
|
|
@@ -174,5 +174,5 @@
|
|
|
174
174
|
"beacon",
|
|
175
175
|
"blockchain"
|
|
176
176
|
],
|
|
177
|
-
"gitHead": "
|
|
177
|
+
"gitHead": "52f4dcd16fb0f39ec3d30c30881a431ee598442a"
|
|
178
178
|
}
|
package/src/chain/initState.ts
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import {ChainForkConfig} from "@lodestar/config";
|
|
2
2
|
import {ForkPostGloas, ForkSeq, ZERO_HASH} from "@lodestar/params";
|
|
3
|
-
import {
|
|
4
|
-
BeaconStateAllForks,
|
|
5
|
-
BeaconStateGloas,
|
|
6
|
-
IBeaconStateView,
|
|
7
|
-
computeEpochAtSlot,
|
|
8
|
-
computeStartSlotAtEpoch,
|
|
9
|
-
} from "@lodestar/state-transition";
|
|
3
|
+
import {BeaconStateAllForks, IBeaconStateView, computeEpochAtSlot, isStatePostGloas} from "@lodestar/state-transition";
|
|
10
4
|
import {SignedBeaconBlock, ssz} from "@lodestar/types";
|
|
11
|
-
import {Logger, byteArrayEquals,
|
|
5
|
+
import {LodestarError, Logger, byteArrayEquals, toRootHex} from "@lodestar/utils";
|
|
12
6
|
import {GENESIS_SLOT} from "../constants/index.js";
|
|
13
7
|
import {IBeaconDb} from "../db/index.js";
|
|
14
8
|
import {Metrics} from "../metrics/index.js";
|
|
@@ -17,7 +11,7 @@ import {getStateTypeFromBytes} from "../util/multifork.js";
|
|
|
17
11
|
export async function persistAnchorState(
|
|
18
12
|
config: ChainForkConfig,
|
|
19
13
|
db: IBeaconDb,
|
|
20
|
-
anchorState:
|
|
14
|
+
anchorState: IBeaconStateView,
|
|
21
15
|
anchorStateBytes: Uint8Array
|
|
22
16
|
): Promise<void> {
|
|
23
17
|
if (anchorState.slot === GENESIS_SLOT) {
|
|
@@ -33,7 +27,8 @@ export async function persistAnchorState(
|
|
|
33
27
|
const latestBlockRoot = ssz.phase0.BeaconBlockHeader.hashTreeRoot(latestBlockHeader);
|
|
34
28
|
|
|
35
29
|
if (!byteArrayEquals(blockRoot, latestBlockRoot)) {
|
|
36
|
-
throw
|
|
30
|
+
throw new LodestarError(
|
|
31
|
+
{code: "GENESIS_BLOCK_ROOT_MISMATCH"},
|
|
37
32
|
`Genesis block root ${toRootHex(blockRoot)} does not match genesis state latest block root ${toRootHex(latestBlockRoot)}`
|
|
38
33
|
);
|
|
39
34
|
}
|
|
@@ -48,16 +43,15 @@ export async function persistAnchorState(
|
|
|
48
43
|
}
|
|
49
44
|
}
|
|
50
45
|
|
|
51
|
-
export function createGenesisBlock(config: ChainForkConfig, genesisState:
|
|
46
|
+
export function createGenesisBlock(config: ChainForkConfig, genesisState: IBeaconStateView): SignedBeaconBlock {
|
|
52
47
|
const types = config.getForkTypes(GENESIS_SLOT);
|
|
53
48
|
const genesisBlock = types.SignedBeaconBlock.defaultValue();
|
|
54
49
|
const stateRoot = genesisState.hashTreeRoot();
|
|
55
50
|
genesisBlock.message.stateRoot = stateRoot;
|
|
56
51
|
|
|
57
|
-
if (config.getForkSeq(GENESIS_SLOT) >= ForkSeq.gloas) {
|
|
52
|
+
if (config.getForkSeq(GENESIS_SLOT) >= ForkSeq.gloas && isStatePostGloas(genesisState)) {
|
|
58
53
|
const gloasBlock = genesisBlock as SignedBeaconBlock<ForkPostGloas>;
|
|
59
|
-
|
|
60
|
-
gloasBlock.message.body.signedExecutionPayloadBid.message = gloasState.latestExecutionPayloadBid.toValue();
|
|
54
|
+
gloasBlock.message.body.signedExecutionPayloadBid.message = genesisState.latestExecutionPayloadBid;
|
|
61
55
|
}
|
|
62
56
|
|
|
63
57
|
return genesisBlock;
|
|
@@ -86,52 +80,6 @@ export async function initStateFromDb(
|
|
|
86
80
|
return state;
|
|
87
81
|
}
|
|
88
82
|
|
|
89
|
-
/**
|
|
90
|
-
* Initialize and persist an anchor state (either weak subjectivity or genesis)
|
|
91
|
-
*/
|
|
92
|
-
export async function checkAndPersistAnchorState(
|
|
93
|
-
config: ChainForkConfig,
|
|
94
|
-
db: IBeaconDb,
|
|
95
|
-
logger: Logger,
|
|
96
|
-
anchorState: BeaconStateAllForks,
|
|
97
|
-
anchorStateBytes: Uint8Array,
|
|
98
|
-
{
|
|
99
|
-
isWithinWeakSubjectivityPeriod,
|
|
100
|
-
isCheckpointState,
|
|
101
|
-
}: {isWithinWeakSubjectivityPeriod: boolean; isCheckpointState: boolean}
|
|
102
|
-
): Promise<void> {
|
|
103
|
-
const expectedFork = config.getForkInfo(computeStartSlotAtEpoch(anchorState.fork.epoch));
|
|
104
|
-
const expectedForkVersion = toHex(expectedFork.version);
|
|
105
|
-
const stateFork = toHex(anchorState.fork.currentVersion);
|
|
106
|
-
if (stateFork !== expectedForkVersion) {
|
|
107
|
-
throw Error(
|
|
108
|
-
`State current fork version ${stateFork} not equal to current config ${expectedForkVersion}. Maybe caused by importing a state from a different network`
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const stateInfo = isCheckpointState ? "checkpoint" : "db";
|
|
113
|
-
if (isWithinWeakSubjectivityPeriod) {
|
|
114
|
-
logger.info(`Initializing beacon from a valid ${stateInfo} state`, {
|
|
115
|
-
slot: anchorState.slot,
|
|
116
|
-
epoch: computeEpochAtSlot(anchorState.slot),
|
|
117
|
-
stateRoot: toRootHex(anchorState.hashTreeRoot()),
|
|
118
|
-
isWithinWeakSubjectivityPeriod,
|
|
119
|
-
});
|
|
120
|
-
} else {
|
|
121
|
-
logger.warn(`Initializing from a stale ${stateInfo} state vulnerable to long range attacks`, {
|
|
122
|
-
slot: anchorState.slot,
|
|
123
|
-
epoch: computeEpochAtSlot(anchorState.slot),
|
|
124
|
-
stateRoot: toRootHex(anchorState.hashTreeRoot()),
|
|
125
|
-
isWithinWeakSubjectivityPeriod,
|
|
126
|
-
});
|
|
127
|
-
logger.warn("Checkpoint sync recommended, please use --help to see checkpoint sync options");
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if (isCheckpointState || anchorState.slot === GENESIS_SLOT) {
|
|
131
|
-
await persistAnchorState(config, db, anchorState, anchorStateBytes);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
83
|
export function initBeaconMetrics(metrics: Metrics, state: IBeaconStateView): void {
|
|
136
84
|
metrics.headSlot.set(state.slot);
|
|
137
85
|
metrics.previousJustifiedEpoch.set(state.previousJustifiedCheckpoint.epoch);
|
package/src/index.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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 {
|
|
5
|
+
export {persistAnchorState} 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";
|