Skip to content

Commit 4e1bddb

Browse files
committed
feat: max_per_epoch_activation_exit_churn_limit introduced
1 parent a5af4de commit 4e1bddb

File tree

9 files changed

+275
-16
lines changed

9 files changed

+275
-16
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { DevnetServiceConfig } from "../devnet-service-config.js";
2+
3+
export const ethGenenisGenerator = new DevnetServiceConfig({
4+
repository: {
5+
url: "[email protected]:AlexandrMov/ethereum-genesis-generator.git",
6+
branch: "master",
7+
},
8+
workspace: "workspaces/genesis-generator",
9+
name: "ethGenenisGenerator" as const,
10+
constants: {},
11+
labels: {},
12+
getters: {},
13+
});

packages/services/src/embedded/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { csmProverTool } from "./csm-prover-tool.js";
66
import { dataBus } from "./data-bus.js";
77
import { dockerRegistry } from "./docker-registry.js";
88
import { dsmBots } from "./dsm-bots.js";
9+
import { ethGenenisGenerator } from "./genesis-generator.js";
910
import { kapi } from "./kapi.js";
1011
import { kubo } from "./kubo.js";
1112
import { kurtosis } from "./kurtosis.js"
@@ -19,6 +20,7 @@ import { voting } from "./voting.js";
1920

2021
export const serviceConfigs = {
2122
blockscout,
23+
ethGenenisGenerator,
2224
lateProverBot,
2325
lidoCore,
2426
lidoCLI,

src/commands/chain/up.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Params, command } from "@devnet/command";
22
import { DevNetError, sleep } from "@devnet/utils";
33

44
import { BlockscoutUp } from "../blockscout/up.js";
5+
import { GenesisGeneratorK8SBuild } from "../genesis-generator/build.js";
56
import { K8sPing } from "../k8s/ping.js";
67
import { K8sSetDefaultContext } from "../k8s/set-default-context.js";
78
import { KurtosisDoraK8sIngressUp } from "../kurtosis/dora/up.js";
@@ -25,6 +26,7 @@ export const ChainUp = command.isomorphic({
2526

2627
await dre.runCommand(K8sSetDefaultContext, { context: defaultContext });
2728
await dre.runCommand(K8sPing, { context: defaultContext });
29+
await dre.runCommand(GenesisGeneratorK8SBuild, {});
2830
await dre.runCommand(KurtosisRunPackage, { preset: preset ?? '' });
2931

3032
await sleep(5000);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { command } from "@devnet/command";
2+
import { buildAndPushDockerImage } from "@devnet/docker";
3+
4+
import { SERVICE_NAME } from "./constants/genesis-generator.constants.js";
5+
import { genesisGeneratorExtension } from "./extensions/genesis-generator.extension.js";
6+
7+
export const GenesisGeneratorK8SBuild = command.isomorphic({
8+
description: `Build ${SERVICE_NAME} and push to Docker registry`,
9+
params: {},
10+
extensions: [genesisGeneratorExtension],
11+
async handler({ dre: { state, network, services, logger } }) {
12+
const dockerRegistry = await state.getDockerRegistry();
13+
14+
const TAG = `kt-${network.name}`;
15+
const IMAGE = 'lido/lido-genesis-generator';
16+
17+
await buildAndPushDockerImage({
18+
cwd: services.ethGenenisGenerator.artifact.root,
19+
registryHostname: dockerRegistry.registryHostname,
20+
buildContext: '.',
21+
imageName: IMAGE,
22+
tag: TAG,
23+
password: process.env.DOCKER_REGISTRY_PASSWORD ?? 'admin',
24+
username: process.env.DOCKER_REGISTRY_USERNAME ?? 'changeme',
25+
});
26+
27+
logger.log(`${SERVICE_NAME} image pushed to ${dockerRegistry.registryUrl}/${IMAGE}:${TAG}`);
28+
29+
await state.updateGenesisGeneratorImage({
30+
tag: TAG,
31+
image: IMAGE,
32+
registryHostname: dockerRegistry.registryHostname,
33+
})
34+
},
35+
});
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { DevNetRuntimeEnvironmentInterface } from "@devnet/command";
2+
3+
export const NAMESPACE = (dre: DevNetRuntimeEnvironmentInterface) =>
4+
`kt-${dre.network.name}-genesis-generator`;
5+
6+
export const SERVICE_NAME = "Ethereum Genesis Generator";
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import { DevNetRuntimeEnvironmentInterface } from "@devnet/command";
2+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
3+
import { Config, StateInterface } from "@devnet/state";
4+
import { isEmptyObject } from "@devnet/utils";
5+
import { z } from "zod";
6+
7+
8+
// augmenting the StateInterface
9+
declare module "@devnet/state" {
10+
export interface StateInterface {
11+
getGenesisGeneratorImage<M extends boolean = true>(must?: M,): Promise<M extends true
12+
? GenesisGeneratorStateImage
13+
: Partial<GenesisGeneratorStateImage>>;
14+
getGenesisGeneratorState<M extends boolean = true>(must?: M,): Promise<M extends true
15+
? GenesisGeneratorState
16+
: Partial<GenesisGeneratorState>>;
17+
18+
isGenesisGeneratorImageReady(): Promise<boolean>;
19+
20+
removeGenesisGeneratorState(): Promise<void>;
21+
22+
updateGenesisGeneratorImage(state: GenesisGeneratorStateImage): Promise<void>;
23+
}
24+
25+
export interface Config {
26+
genesisGeneratorK8s: GenesisGeneratorState;
27+
}
28+
}
29+
30+
export const GenesisGeneratorStateImage = z.object({
31+
image: z.string(),
32+
tag: z.string(),
33+
registryHostname: z.string()
34+
});
35+
36+
export type GenesisGeneratorStateImage = z.infer<typeof GenesisGeneratorStateImage>;
37+
38+
export const GenesisGeneratorStateRunning = z.object({
39+
helmRelease: z.string(),
40+
});
41+
42+
export type GenesisGeneratorStateRunning = z.infer<typeof GenesisGeneratorStateRunning>;
43+
44+
export const GenesisGeneratorState = z.object({
45+
image: GenesisGeneratorStateImage.optional(),
46+
});
47+
48+
export type GenesisGeneratorState = z.infer<typeof GenesisGeneratorState>;
49+
50+
export const genesisGeneratorExtension = (dre: DevNetRuntimeEnvironmentInterface) => {
51+
dre.state.updateGenesisGeneratorImage = (async function (stateImage: GenesisGeneratorStateImage) {
52+
const state = await dre.state.getGenesisGeneratorState(false);
53+
await dre.state.updateProperties("genesisGenerator", { ...state, image: stateImage });
54+
});
55+
56+
dre.state.removeGenesisGeneratorState = (async function () {
57+
await dre.state.updateProperties("genesisGenerator", {});
58+
});
59+
60+
dre.state.isGenesisGeneratorImageReady = (async function () {
61+
const state = await dre.state.getGenesisGeneratorImage(false);
62+
return state && !isEmptyObject(state) && (state.image !== undefined);
63+
});
64+
65+
dre.state.getGenesisGeneratorImage = (async function <M extends boolean = true>(must: M = true as M) {
66+
return dre.state.getProperties(
67+
{
68+
image: "genesisGenerator.image.image",
69+
tag: "genesisGenerator.image.tag",
70+
registryHostname: "genesisGenerator.image.registryHostname",
71+
},
72+
"genesisGeneratorK8s",
73+
GenesisGeneratorStateImage,
74+
must,
75+
);
76+
});
77+
78+
dre.state.getGenesisGeneratorState = (async function <M extends boolean = true>(must: M = true as M) {
79+
return dre.state.getProperties(
80+
'genesisGenerator',
81+
"genesisGeneratorK8s",
82+
GenesisGeneratorState,
83+
must,
84+
);
85+
});
86+
};

src/commands/kurtosis/run-package.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export const KurtosisRunPackage = command.isomorphic({
4949

5050
await kurtosis.sh`kurtosis run
5151
--enclave ${dre.network.name}
52-
github.com/ethpandaops/ethereum-package
52+
github.com/AlexandrMov/ethereum-package
5353
--production
5454
--args-file ${configFileName}`;
5555

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import { Params, command } from "@devnet/command";
2+
3+
import { ChainGetInfo } from "../chain/info.js";
4+
import { ChainUp } from "../chain/up.js";
5+
import { CouncilK8sUp } from "../council-k8s/up.js";
6+
import { DeployCSMContracts } from "../csm/deploy.js";
7+
import { DataBusDeploy } from "../data-bus/deploy.js";
8+
import { DSMBotsK8sUp } from "../dsm-bots-k8s/up.js";
9+
import { GitCheckout } from "../git/checkout.js";
10+
import { KapiK8sUp } from "../kapi-k8s/up.js";
11+
import { ActivateLidoProtocol } from "../lido-core/activate.js";
12+
import { AddNewOperator } from "../lido-core/add-new-operator.js";
13+
import { DeployLidoContracts } from "../lido-core/deploy.js";
14+
import { ReplaceDSM } from "../lido-core/replace-dsm.js";
15+
import { OracleK8sUp } from "../oracles-k8s/up.js";
16+
17+
export const FusakaSRV3DevNetConsolidationUp = command.cli({
18+
description: "Staking Router V3 Devnet0 on Fusaka test stand.",
19+
params: {
20+
verify: Params.boolean({
21+
description: "Enables verification of smart contracts during deployment.",
22+
}),
23+
dsm: Params.boolean({
24+
description: "Use full DSM setup.",
25+
default: false,
26+
}),
27+
preset: Params.string({
28+
description: "Kurtosis preset name",
29+
default: "fusaka-devnet2",
30+
}),
31+
},
32+
async handler({ params, dre, dre: { logger } }) {
33+
await dre.runCommand(GitCheckout, {
34+
service: "lidoCore",
35+
ref: "feat/staking-router-3.0",
36+
});
37+
38+
await dre.runCommand(GitCheckout, {
39+
service: "csm",
40+
ref: "main",
41+
});
42+
43+
await dre.runCommand(ChainUp, { preset: params.preset });
44+
logger.log("✅ Network initialized.");
45+
46+
const deployArgs = { verify: false };
47+
const depositArgs = { dsm: params.dsm };
48+
49+
logger.log("🚀 Deploying Lido Core contracts...");
50+
await dre.runCommand(DeployLidoContracts, {
51+
...deployArgs,
52+
configFile: dre.services.lidoCore.config.constants.SCRATCH_DEPLOY_CONFIG,
53+
normalizedClRewardPerEpoch: 64,
54+
normalizedClRewardMistakeRateBp: 1000,
55+
rebaseCheckNearestEpochDistance: 1,
56+
rebaseCheckDistantEpochDistance: 2,
57+
validatorDelayedTimeoutInSlots: 7200,
58+
validatorDelinquentTimeoutInSlots: 28_800,
59+
nodeOperatorNetworkPenetrationThresholdBp: 100,
60+
predictionDurationInSlots: 50_400,
61+
finalizationMaxNegativeRebaseEpochShift: 1350,
62+
exitEventsLookbackWindowInSlots: 7200,
63+
});
64+
logger.log("✅ Lido contracts deployed.");
65+
66+
logger.log("🚀 Deploying CSM contracts...");
67+
await dre.runCommand(DeployCSMContracts, deployArgs);
68+
logger.log("✅ CSM contracts deployed.");
69+
70+
await dre.runCommand(GitCheckout, {
71+
service: "lidoCLI",
72+
ref: "feature/sr-66-devnet0-1",
73+
});
74+
75+
logger.log("🚀 Activating Lido Core protocol...");
76+
await dre.runCommand(ActivateLidoProtocol, {});
77+
logger.log("✅ Lido Core protocol activated.");
78+
79+
if (!params.dsm) {
80+
logger.log("🚀 Replacing DSM with an EOA...");
81+
await dre.runCommand(ReplaceDSM, {});
82+
logger.log("✅ DSM replaced with an EOA.");
83+
}
84+
85+
const validators = 30;
86+
logger.log("🚀 Adding 3 new operators with validators...");
87+
await dre.runCommand(AddNewOperator, { ...depositArgs, operatorId: 2, stakingModuleId: 1, depositCount: validators});
88+
await dre.runCommand(AddNewOperator, { ...depositArgs, operatorId: 1, stakingModuleId: 1, depositCount: validators});
89+
await dre.runCommand(AddNewOperator, { ...depositArgs, operatorId: 3, stakingModuleId: 1, depositCount: validators});
90+
logger.log("✅ 3 new operators with validators added.");
91+
92+
logger.log("🚀 Run KAPI service in K8s.");
93+
await dre.runCommand(KapiK8sUp, {});
94+
95+
logger.log("🚀 Run Oracle service in K8s.");
96+
await dre.runCommand(OracleK8sUp, { tag: "6.0.1", build: false });
97+
98+
if (params.dsm) {
99+
logger.log("🚀 Deploying Data-bus...");
100+
await dre.runCommand(DataBusDeploy, {});
101+
logger.log("✅ Data-bus deployed.");
102+
103+
logger.log("🚀 Running Council service...");
104+
await dre.runCommand(CouncilK8sUp, {});
105+
logger.log("✅ Council service started.");
106+
107+
logger.log("🚀 Running DSM-bots service...");
108+
await dre.runCommand(DSMBotsK8sUp, {});
109+
logger.log("✅ DSM-bots service started.");
110+
}
111+
112+
await dre.runCommand(ChainGetInfo, {});
113+
},
114+
});

workspaces/kurtosis/fusaka-devnet2.yml

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,21 @@ participants:
2121
cl_volume_size: 51200
2222
count: 1
2323

24-
- el_type: erigon
25-
el_image: erigontech/erigon:v3.2.0-rc1
26-
el_extra_params: [ --prune.mode=archive ]
27-
el_min_cpu: 0
28-
el_max_cpu: 0
29-
el_min_mem: 0
30-
el_max_mem: 0
31-
el_volume_size: 51200
32-
# CL
33-
cl_type: lighthouse
34-
cl_image: sigp/lighthouse:v8.0.0-rc.1
35-
cl_extra_params: [ '--hierarchy-exponents=5,7,11', --reconstruct-historic-states ]
36-
supernode: true
37-
cl_volume_size: 51200
38-
count: 1
24+
# - el_type: erigon
25+
# el_image: erigontech/erigon:v3.2.0-rc1
26+
# el_extra_params: [ --prune.mode=archive ]
27+
# el_min_cpu: 0
28+
# el_max_cpu: 0
29+
# el_min_mem: 0
30+
# el_max_mem: 0
31+
# el_volume_size: 51200
32+
# # CL
33+
# cl_type: lighthouse
34+
# cl_image: sigp/lighthouse:v8.0.0-rc.1
35+
# cl_extra_params: [ '--hierarchy-exponents=5,7,11', --reconstruct-historic-states ]
36+
# supernode: true
37+
# cl_volume_size: 51200
38+
# count: 1
3939

4040
- el_type: geth
4141
el_image: ethereum/client-go:v1.16.4
@@ -73,6 +73,7 @@ network_params:
7373
bpo_5_target_blobs: 6
7474
withdrawal_type: "0x02"
7575
preset: mainnet
76+
max_per_epoch_activation_exit_churn_limit: 64000000000
7677

7778
persistent: true
7879

0 commit comments

Comments
 (0)