Skip to content

Commit

Permalink
Making comparison between local/remote BeaconParam less error prone. (#…
Browse files Browse the repository at this point in the history
…3973)

* Normalise values when comparing validator's beacon local config with remote beacon config

* Filling missing properties in remote config with spec defaults

* renaming a variable for clarity

* extract value to variable before comparison

* using the normalized value in log statement
  • Loading branch information
dadepo committed May 5, 2022
1 parent 3eeb6e2 commit 7d78388
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 8 deletions.
2 changes: 1 addition & 1 deletion packages/cli/src/cmds/validator/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ export async function validatorHandler(args: IValidatorCliArgs & IGlobalArgs): P
onGracefulShutdownCbs.push(async () => controller.abort());

const dbOps = {
config: config,
config,
controller: new LevelDbController({name: dbPath}, {logger}),
};
const slashingProtection = new SlashingProtection(dbOps);
Expand Down
20 changes: 14 additions & 6 deletions packages/validator/src/util/params.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,28 @@
import {IChainConfig, chainConfigToJson} from "@chainsafe/lodestar-config";
import {IChainConfig, chainConfigToJson, defaultChainConfig} from "@chainsafe/lodestar-config";

export class NotEqualParamsError extends Error {}

/**
* Assert localConfig values match externalSpecJson. externalSpecJson may contain more values than localConfig.
*/
export function assertEqualParams(localConfig: IChainConfig, externalSpecJson: Record<string, string>): void {
const params1Json = chainConfigToJson(localConfig) as Record<string, unknown>;
const params2Json = externalSpecJson;
const localConfigJson = chainConfigToJson(localConfig) as Record<string, unknown>;

const externalSpecJsonWithDefaults = {
// fill missing properties in remote config with spec default values
...chainConfigToJson(defaultChainConfig),
...externalSpecJson,
};

const errors: string[] = [];

// Ensure only that the localConfig values match the remote spec
for (const key of Object.keys(params1Json)) {
if (params1Json[key] !== params2Json[key])
errors.push(`${key} different value: ${params1Json[key]} != ${params2Json[key]}`);
for (const key of Object.keys(localConfigJson)) {
const localValue = String(localConfigJson[key]).toLocaleLowerCase();
const remoteValue = String(externalSpecJsonWithDefaults[key]).toLocaleLowerCase();
if (localValue !== remoteValue) {
errors.push(`${key} different value: ${localValue} != ${remoteValue}`);
}
}

if (errors.length > 0) {
Expand Down
8 changes: 7 additions & 1 deletion packages/validator/test/unit/utils/params.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {chainConfigToJson} from "@chainsafe/lodestar-config";
import {chainConfig} from "@chainsafe/lodestar-config/default";
import {expect} from "chai";
import {assertEqualParams, NotEqualParamsError} from "../../../src/util/params";
import {assertEqualParams, NotEqualParamsError} from "../../../src/util";

describe("utils / params / assertEqualParams", () => {
it("default == default", () => {
Expand All @@ -18,4 +18,10 @@ describe("utils / params / assertEqualParams", () => {

expect(() => assertEqualParams(chainConfig, otherConfig)).to.throw(NotEqualParamsError);
});

it("should fill missing remote values with default and be equal", () => {
const chainConfigJson = chainConfigToJson(chainConfig);
delete chainConfigJson["DEPOSIT_CONTRACT_ADDRESS"];
assertEqualParams(chainConfig, chainConfigJson);
});
});

0 comments on commit 7d78388

Please sign in to comment.