Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

optimize checkValidateIntention #2902

Merged
merged 1 commit into from
Apr 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions packages/common/src/constraints/CheckCandidates.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { logger } from "../index";
import { ChainData, logger } from "../index";
import { allCandidates, Candidate, setLastValid, setValid } from "../db";
import { constraintsLabel, OTV } from "./constraints";
import {
Expand All @@ -22,6 +22,7 @@ import { percentage, timeRemaining } from "../utils/util";
export const checkCandidate = async (
constraints: OTV,
candidate: Candidate,
validators: string[],
): Promise<boolean> => {
try {
let valid = false;
Expand All @@ -35,6 +36,7 @@ export const checkCandidate = async (
constraints.config,
constraints.chaindata,
candidate,
validators,
);
if (!validateValid) {
logger.info(
Expand Down Expand Up @@ -166,14 +168,16 @@ export const checkCandidate = async (

export const checkAllCandidates = async (
constraints: OTV,
chaindata: ChainData,
): Promise<boolean> => {
try {
const candidates = await allCandidates();
const validators = await chaindata.getValidators();
logger.info(`checking ${candidates.length} candidates`, constraintsLabel);
for (const [index, candidate] of candidates.entries()) {
const start = Date.now();

const isValid = await constraints.checkCandidate(candidate);
const isValid = await constraints.checkCandidate(candidate, validators);
const end = Date.now();
const time = `(${end - start}ms)`;
const remaining = timeRemaining(
Expand Down
24 changes: 1 addition & 23 deletions packages/common/src/constraints/ValidityChecks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ export const checkValidateIntention = async (
config: Config.ConfigSchema,
chaindata: ChainData,
candidate: Candidate,
validators: string[],
): Promise<boolean> => {
try {
const validators = await chaindata.getValidators();
if (
!validators?.length ||
validators.includes(Util.formatAddress(candidate?.stash, config))
Expand All @@ -65,28 +65,6 @@ export const checkValidateIntention = async (
}
};

// checks the validate intention for all validators
export const checkAllValidateIntentions = async (
config: Config.ConfigSchema,
chaindata: ChainData,
candidates: Candidate[],
): Promise<boolean> => {
try {
const validators = await chaindata.getValidators();
for (const candidate of candidates) {
if (!validators.includes(Util.formatAddress(candidate.stash, config))) {
await setValidateIntentionValidity(candidate, false);
} else {
await setValidateIntentionValidity(candidate, true);
}
}
return true;
} catch (e) {
logger.error(`Error checking validate intentions: ${e}`, constraintsLabel);
throw new Error("could not make validity check");
}
};

// checks that the validator is on the latest client version
export const checkLatestClientVersion = async (
config: Config.ConfigSchema,
Expand Down
9 changes: 6 additions & 3 deletions packages/common/src/constraints/constraints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,12 +100,15 @@ export class OTV implements Constraints {

// Checks the validity of all candidates
async checkAllCandidates(): Promise<boolean> {
return await checkAllCandidates(this);
return await checkAllCandidates(this, this.chaindata);
}

// Check the candidate and set any invalidity fields
async checkCandidate(candidate: Candidate): Promise<boolean> {
return await checkCandidate(this, candidate);
async checkCandidate(
candidate: Candidate,
validators: string[],
): Promise<boolean> {
return await checkCandidate(this, candidate, validators);
}

async scoreAllCandidates(): Promise<boolean> {
Expand Down
3 changes: 2 additions & 1 deletion packages/common/src/scorekeeper/Round.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,11 @@ export const startRound = async (

// Get all Candidates and set validity
const allCandidates = await queries.allCandidates();
const validators = await chaindata.getValidators();

// Set Validity
for (const [index, candidate] of allCandidates.entries()) {
const isValid = await constraints.checkCandidate(candidate);
const isValid = await constraints.checkCandidate(candidate, validators);

const progress = Math.floor((index / allCandidates.length) * 100);
jobStatusEmitter.emit("jobProgress", {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export const validityJob = async (
try {
const { constraints } = metadata;
const candidates = await allCandidates();
const validators = await metadata.chaindata.getValidators();
logger.info(`Checking ${candidates.length} candidates`, constraintsLabel);

// Calculate total number of candidates
Expand All @@ -43,7 +44,7 @@ export const validityJob = async (
for (const [index, candidate] of candidates.entries()) {
const start = Date.now();

const isValid = await constraints.checkCandidate(candidate);
const isValid = await constraints.checkCandidate(candidate, validators);
const end = Date.now();
const time = `(${end - start}ms)`;
const remaining = timeRemaining(index + 1, totalCandidates, end - start);
Expand Down Expand Up @@ -82,57 +83,6 @@ export const validityJobWithTiming = withExecutionTimeLogging(
"Validity Job Done",
);

export const candidateValidityJob = async (
constraints: Constraints.OTV,
candidateAddress: string,
) => {
try {
const start = Date.now();

const candidate = await queries.getCandidateByStash(candidateAddress);
if (candidate) {
await constraints.checkCandidate(candidate);

const end = Date.now();
const executionTime = (end - start) / 1000;

logger.info(
`validity for ${candidate.name} Done. (${executionTime}s)`,
constraintsLabel,
);
}
} catch (e) {
logger.error(`Error running validity job: ${e}`, constraintsLabel);
}
};

export const individualScoreJob = async (
constraints: Constraints.OTV,
candidateAddress: string,
) => {
try {
const start = Date.now();
const candidate = await queries.getCandidateByStash(candidateAddress);
if (candidate) {
let scoreMetadata = await queries.getLatestValidatorScoreMetadata();
if (!scoreMetadata) {
logger.warn(
`no score metadata, cannot score candidates`,
constraintsLabel,
);
await constraints.setScoreMetadata();
scoreMetadata = await queries.getLatestValidatorScoreMetadata();
}
await constraints.scoreCandidate(candidate, scoreMetadata);

const end = Date.now();
const executionTime = (end - start) / 1000;
}
} catch (e) {
logger.error(`Error running individual score job: ${e}`, constraintsLabel);
}
};

export const scoreJob = async (
metadata: JobRunnerMetadata,
): Promise<boolean> => {
Expand Down