diff --git a/packages/beacon-node/src/chain/validation/aggregateAndProof.ts b/packages/beacon-node/src/chain/validation/aggregateAndProof.ts index 71c7fbedd7d8..291821bb7ea6 100644 --- a/packages/beacon-node/src/chain/validation/aggregateAndProof.ts +++ b/packages/beacon-node/src/chain/validation/aggregateAndProof.ts @@ -76,25 +76,17 @@ export async function validateGossipAggregateAndProof( // -- i.e. get_ancestor(store, aggregate.data.beacon_block_root, compute_start_slot_at_epoch(store.finalized_checkpoint.epoch)) == store.finalized_checkpoint.root // > Altready check in `chain.forkChoice.hasBlock(attestation.data.beaconBlockRoot)` - // TODO: Must be a state in the same chain as attHeadBlock, but dialed to target.epoch - const attHeadState = - computeEpochAtSlot(attHeadBlock.slot) < attEpoch - ? await chain.regen - .getCheckpointState(attTarget, RegenCaller.validateGossipAggregateAndProof) - .catch((e: Error) => { - throw new AttestationError(GossipAction.REJECT, { - code: AttestationErrorCode.MISSING_ATTESTATION_HEAD_STATE, - error: e as Error, - }); - }) - : await chain.regen - .getState(attHeadBlock.stateRoot, RegenCaller.validateGossipAggregateAndProof) - .catch((e: Error) => { - throw new AttestationError(GossipAction.REJECT, { - code: AttestationErrorCode.MISSING_ATTESTATION_HEAD_STATE, - error: e as Error, - }); - }); + // Using the target checkpoint state here caused unstable memory issue + // See https://github.com/ChainSafe/lodestar/issues/4896 + // TODO: https://github.com/ChainSafe/lodestar/issues/4900 + const attHeadState = await chain.regen + .getState(attHeadBlock.stateRoot, RegenCaller.validateGossipAggregateAndProof) + .catch((e: Error) => { + throw new AttestationError(GossipAction.REJECT, { + code: AttestationErrorCode.MISSING_ATTESTATION_HEAD_STATE, + error: e as Error, + }); + }); const committeeIndices: number[] = getCommitteeIndices(attHeadState, attSlot, attIndex); diff --git a/packages/beacon-node/src/chain/validation/attestation.ts b/packages/beacon-node/src/chain/validation/attestation.ts index 416417c76f99..b463dbdf9533 100644 --- a/packages/beacon-node/src/chain/validation/attestation.ts +++ b/packages/beacon-node/src/chain/validation/attestation.ts @@ -76,21 +76,17 @@ export async function validateGossipAttestation( // --i.e. get_ancestor(store, attestation.data.beacon_block_root, compute_start_slot_at_epoch(attestation.data.target.epoch)) == attestation.data.target.root // > Altready check in `verifyHeadBlockAndTargetRoot()` - // TODO: Must be a state in the same chain as attHeadBlock, but dialed to target.epoch - const attHeadState = - computeEpochAtSlot(attHeadBlock.slot) < attEpoch - ? await chain.regen.getCheckpointState(attTarget, RegenCaller.validateGossipAttestation).catch((e: Error) => { - throw new AttestationError(GossipAction.REJECT, { - code: AttestationErrorCode.MISSING_ATTESTATION_HEAD_STATE, - error: e as Error, - }); - }) - : await chain.regen.getState(attHeadBlock.stateRoot, RegenCaller.validateGossipAttestation).catch((e: Error) => { - throw new AttestationError(GossipAction.REJECT, { - code: AttestationErrorCode.MISSING_ATTESTATION_HEAD_STATE, - error: e as Error, - }); - }); + // Using the target checkpoint state here caused unstable memory issue + // See https://github.com/ChainSafe/lodestar/issues/4896 + // TODO: https://github.com/ChainSafe/lodestar/issues/4900 + const attHeadState = await chain.regen + .getState(attHeadBlock.stateRoot, RegenCaller.validateGossipAttestation) + .catch((e: Error) => { + throw new AttestationError(GossipAction.REJECT, { + code: AttestationErrorCode.MISSING_ATTESTATION_HEAD_STATE, + error: e as Error, + }); + }); // [REJECT] The committee index is within the expected range // -- i.e. data.index < get_committee_count_per_slot(state, data.target.epoch)