use of tech.pegasys.teku.infrastructure.async.Waiter.waitFor in project teku by ConsenSys.
the class GossipMessageHandlerIntegrationTest method shouldNotGossipAttestationsWhenPeerDeregistersFromTopic.
@Test
public void shouldNotGossipAttestationsWhenPeerDeregistersFromTopic() throws Exception {
final GossipEncoding gossipEncoding = GossipEncoding.SSZ_SNAPPY;
List<ValidateableAttestation> node2attestations = new ArrayList<>();
Subscribers<ProcessedAttestationListener> processedAttestationSubscribers = Subscribers.create(false);
final Consumer<Eth2P2PNetworkBuilder> networkBuilder1 = b -> {
b.gossipEncoding(gossipEncoding);
b.gossipedAttestationProcessor((__) -> SafeFuture.completedFuture(InternalValidationResult.ACCEPT));
b.processedAttestationSubscriptionProvider(processedAttestationSubscribers::subscribe);
};
final Consumer<Eth2P2PNetworkBuilder> networkBuilder2 = b -> {
b.gossipEncoding(gossipEncoding);
b.gossipedAttestationProcessor((attestation) -> {
node2attestations.add(attestation);
return SafeFuture.completedFuture(InternalValidationResult.ACCEPT);
});
};
// Setup network 1
final NodeManager node1 = createNodeManager(networkBuilder1);
final Eth2P2PNetwork network1 = node1.network();
// Setup network 2
final NodeManager node2 = createNodeManager(networkBuilder2);
final Eth2P2PNetwork network2 = node2.network();
// Connect networks 1 -> 2
waitFor(node1.connect(node2));
// Wait for connections to get set up
Waiter.waitFor(() -> {
assertThat(network1.getPeerCount()).isEqualTo(1);
assertThat(network2.getPeerCount()).isEqualTo(1);
});
// Propagate attestation from network 1
AttestationGenerator attestationGenerator = new AttestationGenerator(spec, validatorKeys);
final StateAndBlockSummary bestBlockAndState = getChainHead(node1);
Attestation attestation = attestationGenerator.validAttestation(bestBlockAndState);
final int subnetId = spec.computeSubnetForAttestation(bestBlockAndState.getState(), attestation);
ValidateableAttestation validAttestation = ValidateableAttestation.fromNetwork(spec, attestation, subnetId);
node1.network().subscribeToAttestationSubnetId(subnetId);
node2.network().subscribeToAttestationSubnetId(subnetId);
waitForTopicRegistration();
processedAttestationSubscribers.forEach(s -> s.accept(validAttestation));
waitForMessageToBeDelivered();
assertThat(node2attestations.size()).isEqualTo(1);
assertThat(node2attestations.get(0)).isEqualTo(validAttestation);
node1.network().unsubscribeFromAttestationSubnetId(subnetId);
node2.network().unsubscribeFromAttestationSubnetId(subnetId);
waitForTopicDeregistration();
processedAttestationSubscribers.forEach(s -> s.accept(validAttestation));
ensureConditionRemainsMet(() -> {
assertThat(node2attestations.size()).isEqualTo(1);
assertThat(node2attestations.get(0)).isEqualTo(validAttestation);
});
}
use of tech.pegasys.teku.infrastructure.async.Waiter.waitFor in project teku by ConsenSys.
the class GossipMessageHandlerIntegrationTest method shouldNotGossipAttestationsAcrossPeersThatAreNotOnTheSameSubnet.
@Test
public void shouldNotGossipAttestationsAcrossPeersThatAreNotOnTheSameSubnet() throws Exception {
final GossipEncoding gossipEncoding = GossipEncoding.SSZ_SNAPPY;
List<ValidateableAttestation> node2attestations = new ArrayList<>();
Subscribers<ProcessedAttestationListener> processedAttestationSubscribers = Subscribers.create(false);
final Consumer<Eth2P2PNetworkBuilder> networkBuilder1 = b -> {
b.gossipEncoding(gossipEncoding);
b.processedAttestationSubscriptionProvider(processedAttestationSubscribers::subscribe);
};
final Consumer<Eth2P2PNetworkBuilder> networkBuilder2 = b -> {
b.gossipEncoding(gossipEncoding);
b.gossipedAttestationProcessor((attestation) -> {
node2attestations.add(attestation);
return SafeFuture.completedFuture(InternalValidationResult.ACCEPT);
});
};
// Setup network 1
final NodeManager node1 = createNodeManager(networkBuilder1);
final Eth2P2PNetwork network1 = node1.network();
// Setup network 2
final NodeManager node2 = createNodeManager(networkBuilder2);
final Eth2P2PNetwork network2 = node2.network();
// Connect networks 1 -> 2
waitFor(node1.connect(node2));
// Wait for connections to get set up
Waiter.waitFor(() -> {
assertThat(network1.getPeerCount()).isEqualTo(1);
assertThat(network2.getPeerCount()).isEqualTo(1);
});
// Propagate attestation from network 1
AttestationGenerator attestationGenerator = new AttestationGenerator(spec, validatorKeys);
final StateAndBlockSummary bestBlockAndState = getChainHead(node1);
Attestation validAttestation = attestationGenerator.validAttestation(bestBlockAndState);
processedAttestationSubscribers.forEach(s -> s.accept(ValidateableAttestation.from(spec, validAttestation)));
ensureConditionRemainsMet(() -> assertThat(node2attestations).isEmpty());
}
use of tech.pegasys.teku.infrastructure.async.Waiter.waitFor in project teku by ConsenSys.
the class ProposerSlashingGossipIntegrationTest method shouldGossipToPeers.
@Test
public void shouldGossipToPeers() throws Exception {
final GossipEncoding gossipEncoding = GossipEncoding.SSZ_SNAPPY;
// Set up publishers & consumers
Set<ProposerSlashing> receivedGossip = new HashSet<>();
final OperationProcessor<ProposerSlashing> operationProcessor = (slashing) -> {
receivedGossip.add(slashing);
return SafeFuture.completedFuture(InternalValidationResult.ACCEPT);
};
// Setup network 1
final Consumer<Eth2P2PNetworkBuilder> networkBuilder = b -> b.gossipEncoding(gossipEncoding);
NodeManager node1 = createNodeManager(networkBuilder);
// Setup network 2
final Consumer<Eth2P2PNetworkBuilder> networkBuilder2 = b -> b.gossipEncoding(gossipEncoding).gossipedProposerSlashingProcessor(operationProcessor);
NodeManager node2 = createNodeManager(networkBuilder2);
// Connect networks 1 -> 2
waitFor(node1.connect(node2));
// Wait for connections to get set up
Waiter.waitFor(() -> {
assertThat(node1.network().getPeerCount()).isEqualTo(1);
assertThat(node2.network().getPeerCount()).isEqualTo(1);
});
// Wait for subscriptions to complete (jvm-libp2p does this asynchronously)
Thread.sleep(2000);
// Create and publish slashing
final ProposerSlashing slashing = dataStructureUtil.randomProposerSlashing();
node1.network().publishProposerSlashing(slashing);
// Verify the slashing was gossiped across the network
Waiter.waitFor(() -> assertThat(receivedGossip).containsExactly(slashing));
}
use of tech.pegasys.teku.infrastructure.async.Waiter.waitFor in project teku by ConsenSys.
the class GossipMessageHandlerIntegrationTest method shouldGossipBlocksAcrossToIndirectlyConnectedPeers.
@Test
public void shouldGossipBlocksAcrossToIndirectlyConnectedPeers() throws Exception {
final GossipEncoding gossipEncoding = GossipEncoding.SSZ_SNAPPY;
final UInt64 blockSlot = UInt64.valueOf(2L);
// Setup network 1
final Consumer<Eth2P2PNetworkBuilder> networkBuilder = b -> b.gossipEncoding(gossipEncoding);
NodeManager node1 = createNodeManager(networkBuilder);
node1.chainUtil().setSlot(blockSlot);
// Setup network 2
Set<SignedBeaconBlock> node2ReceivedBlocks = new HashSet<>();
final Consumer<Eth2P2PNetworkBuilder> networkBuilder2 = b -> b.gossipEncoding(gossipEncoding).gossipedBlockProcessor((block) -> {
node2ReceivedBlocks.add(block);
return SafeFuture.completedFuture(InternalValidationResult.ACCEPT);
});
NodeManager node2 = createNodeManager(networkBuilder2);
node2.chainUtil().setSlot(blockSlot);
// Setup network 3
Set<SignedBeaconBlock> node3ReceivedBlocks = new HashSet<>();
final Consumer<Eth2P2PNetworkBuilder> networkBuilder3 = b -> b.gossipEncoding(gossipEncoding).gossipedBlockProcessor((block) -> {
node3ReceivedBlocks.add(block);
return SafeFuture.completedFuture(InternalValidationResult.ACCEPT);
});
NodeManager node3 = createNodeManager(networkBuilder3);
node2.chainUtil().setSlot(blockSlot);
// Connect networks 1 -> 2 -> 3
waitFor(node1.connect(node2));
waitFor(node2.connect(node3));
// Wait for connections to get set up
Waiter.waitFor(() -> {
assertThat(node1.network().getPeerCount()).isEqualTo(1);
assertThat(node2.network().getPeerCount()).isEqualTo(2);
assertThat(node3.network().getPeerCount()).isEqualTo(1);
});
// Wait for subscriptions to complete (jvm-libp2p does this asynchronously)
Thread.sleep(2000);
// Propagate block from network 1
final SignedBeaconBlock newBlock = node1.chainUtil().createBlockAtSlot(blockSlot);
node1.gossipBlock(newBlock);
// Verify the expected block was gossiped across the network
Waiter.waitFor(() -> {
assertThat(node2ReceivedBlocks).containsExactly(newBlock);
assertThat(node3ReceivedBlocks).containsExactly(newBlock);
});
}
use of tech.pegasys.teku.infrastructure.async.Waiter.waitFor in project teku by ConsenSys.
the class GossipMessageHandlerIntegrationTest method shouldNotGossipInvalidBlocks.
@Test
public void shouldNotGossipInvalidBlocks() throws Exception {
final GossipEncoding gossipEncoding = GossipEncoding.SSZ_SNAPPY;
final UInt64 blockSlot = UInt64.valueOf(2L);
final Set<SignedBeaconBlock> node3ReceivedBlocks = new HashSet<>();
// Setup network 1
NodeManager node1 = createNodeManager(b -> b.gossipEncoding(gossipEncoding));
node1.chainUtil().setSlot(blockSlot);
// Setup network 2
NodeManager node2 = createNodeManager(b1 -> b1.gossipEncoding(gossipEncoding).gossipedBlockProcessor(block -> {
// Report block as invalid
return SafeFuture.completedFuture(InternalValidationResult.reject("No"));
}));
node2.chainUtil().setSlot(blockSlot);
// Setup network 3
NodeManager node3 = createNodeManager(b -> b.gossipEncoding(gossipEncoding).gossipedBlockProcessor(block -> {
node3ReceivedBlocks.add(block);
return SafeFuture.completedFuture(InternalValidationResult.ACCEPT);
}));
node3.chainUtil().setSlot(blockSlot);
// Connect networks 1 -> 2 -> 3
waitFor(node1.connect(node2));
waitFor(node2.connect(node3));
// Wait for connections to get set up
Waiter.waitFor(() -> {
assertThat(node1.network().getPeerCount()).isEqualTo(1);
assertThat(node2.network().getPeerCount()).isEqualTo(2);
assertThat(node3.network().getPeerCount()).isEqualTo(1);
});
// Wait for subscriptions to complete (jvm-libp2p does this asynchronously)
Thread.sleep(2000);
// Propagate invalid block from network 1
final SignedBeaconBlock newBlock = node1.chainUtil().createBlockAtSlotFromInvalidProposer(blockSlot);
node1.gossipBlock(newBlock);
// Wait for blocks to propagate
assertThat(node1.network().getPeerCount()).isEqualTo(1);
// Node2 receives the block from node1 but doesn't not gossip it on to node3 as it's invalid
ensureConditionRemainsMet(() -> assertThat(node3ReceivedBlocks).isEmpty(), 10000);
}
Aggregations