Skip to content

Commit

Permalink
Verify recording metrics in BlockProductionDuty tests (Consensys#7631)
Browse files Browse the repository at this point in the history
  • Loading branch information
courtneyeh authored Oct 26, 2023
1 parent e8956bd commit 0ade8dc
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -77,22 +77,51 @@ public SafeFuture<DutyResult> performDuty() {
return forkProvider.getForkInfo(slot).thenCompose(this::produceBlock);
}

public SafeFuture<DutyResult> produceBlock(final ForkInfo forkInfo) {
private SafeFuture<DutyResult> produceBlock(final ForkInfo forkInfo) {
return createRandaoReveal(forkInfo)
.thenCompose(
signature ->
validatorDutyMetrics.record(
() -> createUnsignedBlock(signature), this, Step.CREATE))
.thenCompose(this::validateBlock)
.thenCompose(
unsignedBlock ->
blockContainer ->
validatorDutyMetrics.record(
() -> signBlockContainer(forkInfo, unsignedBlock), this, Step.SIGN))
() -> signBlockContainer(forkInfo, blockContainer), this, Step.SIGN))
.thenCompose(
signedBlockContainer ->
validatorDutyMetrics.record(() -> sendBlock(signedBlockContainer), this, Step.SEND))
.exceptionally(error -> DutyResult.forError(validator.getPublicKey(), error));
}

private SafeFuture<BLSSignature> createRandaoReveal(final ForkInfo forkInfo) {
return validator.getSigner().createRandaoReveal(spec.computeEpochAtSlot(slot), forkInfo);
}

private SafeFuture<Optional<BlockContainer>> createUnsignedBlock(
final BLSSignature randaoReveal) {
return validatorApiChannel.createUnsignedBlock(
slot, randaoReveal, validator.getGraffiti(), useBlindedBlock);
}

private SafeFuture<BlockContainer> validateBlock(
final Optional<BlockContainer> maybeBlockContainer) {
final BlockContainer unsignedBlockContainer =
maybeBlockContainer.orElseThrow(
() -> new IllegalStateException("Node was not syncing but could not create block"));
checkArgument(
unsignedBlockContainer.getSlot().equals(slot),
"Unsigned block slot (%s) does not match expected slot %s",
unsignedBlockContainer.getSlot(),
slot);
return SafeFuture.completedFuture(unsignedBlockContainer);
}

private SafeFuture<SignedBlockContainer> signBlockContainer(
final ForkInfo forkInfo, final BlockContainer blockContainer) {
return blockContainerSigner.sign(blockContainer, validator, forkInfo);
}

private SafeFuture<DutyResult> sendBlock(final SignedBlockContainer signedBlockContainer) {
return validatorApiChannel
.sendSignedBlock(signedBlockContainer)
Expand All @@ -111,28 +140,6 @@ private SafeFuture<DutyResult> sendBlock(final SignedBlockContainer signedBlockC
});
}

public SafeFuture<Optional<BlockContainer>> createUnsignedBlock(final BLSSignature randaoReveal) {
return validatorApiChannel.createUnsignedBlock(
slot, randaoReveal, validator.getGraffiti(), useBlindedBlock);
}

public SafeFuture<BLSSignature> createRandaoReveal(final ForkInfo forkInfo) {
return validator.getSigner().createRandaoReveal(spec.computeEpochAtSlot(slot), forkInfo);
}

public SafeFuture<SignedBlockContainer> signBlockContainer(
final ForkInfo forkInfo, final Optional<BlockContainer> maybeBlockContainer) {
final BlockContainer unsignedBlockContainer =
maybeBlockContainer.orElseThrow(
() -> new IllegalStateException("Node was not syncing but could not create block"));
checkArgument(
unsignedBlockContainer.getSlot().equals(slot),
"Unsigned block slot (%s) does not match expected slot %s",
unsignedBlockContainer.getSlot(),
slot);
return blockContainerSigner.sign(unsignedBlockContainer, validator, forkInfo);
}

@Override
public String toString() {
return "BlockProductionDuty{"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import static tech.pegasys.teku.infrastructure.async.SafeFuture.completedFuture;
Expand Down Expand Up @@ -69,6 +71,7 @@
import tech.pegasys.teku.validator.api.ValidatorApiChannel;
import tech.pegasys.teku.validator.client.ForkProvider;
import tech.pegasys.teku.validator.client.Validator;
import tech.pegasys.teku.validator.client.duties.ValidatorDutyMetrics.Step;
import tech.pegasys.teku.validator.client.signer.BlockContainerSigner;
import tech.pegasys.teku.validator.client.signer.MilestoneBasedBlockContainerSigner;

Expand All @@ -92,9 +95,8 @@ class BlockProductionDutyTest {
private final ValidatorLogger validatorLogger = mock(ValidatorLogger.class);
private final BlockContainerSigner blockContainerSigner =
new MilestoneBasedBlockContainerSigner(spec);

private final StubMetricsSystem metricSystem = new StubMetricsSystem();

private final ValidatorDutyMetrics validatorDutyMetrics =
spy(ValidatorDutyMetrics.create(new StubMetricsSystem()));
private BlockProductionDuty duty;

@BeforeEach
Expand All @@ -108,7 +110,7 @@ public void setUp() {
blockContainerSigner,
false,
spec,
ValidatorDutyMetrics.create(metricSystem));
validatorDutyMetrics);
when(forkProvider.getForkInfo(any())).thenReturn(completedFuture(fork));
}

Expand All @@ -124,7 +126,7 @@ public void shouldCreateAndPublishBlock(final boolean isBlindedBlocksEnabled) {
blockContainerSigner,
isBlindedBlocksEnabled,
spec,
ValidatorDutyMetrics.create(metricSystem));
validatorDutyMetrics);
final BLSSignature randaoReveal = dataStructureUtil.randomSignature();
final BLSSignature blockSignature = dataStructureUtil.randomSignature();
final BeaconBlock unsignedBlock;
Expand Down Expand Up @@ -157,6 +159,10 @@ public void shouldCreateAndPublishBlock(final boolean isBlindedBlocksEnabled) {
eq(Set.of(unsignedBlock.hashTreeRoot())),
ArgumentMatchers.argThat(Optional::isPresent));
verifyNoMoreInteractions(validatorLogger);

verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.CREATE));
verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.SIGN));
verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.SEND));
}

@Test
Expand All @@ -170,7 +176,7 @@ public void forDeneb_shouldCreateAndPublishBlockContents() {
blockContainerSigner,
false,
spec,
ValidatorDutyMetrics.create(metricSystem));
validatorDutyMetrics);

final BLSSignature randaoReveal = dataStructureUtil.randomSignature();
final BLSSignature blockSignature = dataStructureUtil.randomSignature();
Expand Down Expand Up @@ -238,6 +244,10 @@ public void forDeneb_shouldCreateAndPublishBlockContents() {
assertThat(signedBlobSidecar.getSignature())
.isEqualTo(blobSidecarsSignatures.get(unsignedBlobSidecar));
});

verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.CREATE));
verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.SIGN));
verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.SEND));
}

@Test
Expand All @@ -251,7 +261,7 @@ public void forDeneb_shouldCreateAndPublishBlindedBlockContents() {
blockContainerSigner,
true,
spec,
ValidatorDutyMetrics.create(metricSystem));
validatorDutyMetrics);

final BLSSignature randaoReveal = dataStructureUtil.randomSignature();
final BLSSignature blockSignature = dataStructureUtil.randomSignature();
Expand Down Expand Up @@ -326,6 +336,10 @@ public void forDeneb_shouldCreateAndPublishBlindedBlockContents() {
assertThat(signedBlindedBlobSidecar.getSignature())
.isEqualTo(blindedBlobSidecarsSignatures.get(unsignedBlindedBlobSidecar));
});

verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.CREATE));
verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.SIGN));
verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.SEND));
}

@Test
Expand All @@ -335,6 +349,7 @@ public void shouldFailWhenCreateRandaoFails() {
.thenReturn(failedFuture(error));

assertDutyFails(error);
verifyNoInteractions(validatorDutyMetrics);
}

@Test
Expand Down Expand Up @@ -364,6 +379,9 @@ public void shouldFailWhenCreateUnsignedBlockFails() {
.thenReturn(failedFuture(error));

assertDutyFails(error);

verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.CREATE));
verifyNoMoreInteractions(validatorDutyMetrics);
}

@Test
Expand All @@ -384,6 +402,9 @@ public void shouldFailWhenCreateUnsignedBlockReturnsEmpty() {
eq(Set.of(validator.getPublicKey().toAbbreviatedString())),
any(IllegalStateException.class));
verifyNoMoreInteractions(validatorLogger);

verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.CREATE));
verifyNoMoreInteractions(validatorDutyMetrics);
}

@Test
Expand All @@ -399,6 +420,10 @@ public void shouldFailWhenSigningBlockFails() {
when(signer.signBlock(unsignedBlock, fork)).thenReturn(failedFuture(error));

assertDutyFails(error);

verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.CREATE));
verify(validatorDutyMetrics).record(any(), any(BlockProductionDuty.class), eq(Step.SIGN));
verifyNoMoreInteractions(validatorDutyMetrics);
}

public void assertDutyFails(final RuntimeException error) {
Expand Down

0 comments on commit 0ade8dc

Please sign in to comment.