use of tech.pegasys.teku.spec.datastructures.attestation.ProcessedAttestationListener 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.spec.datastructures.attestation.ProcessedAttestationListener 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.spec.datastructures.attestation.ProcessedAttestationListener in project teku by ConsenSys.
the class GossipMessageHandlerIntegrationTest method shouldGossipAttestationsAcrossPeersThatAreOnTheSameSubnet.
@Test
public void shouldGossipAttestationsAcrossPeersThatAreOnTheSameSubnet() 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);
ValidateableAttestation validAttestation = ValidateableAttestation.from(spec, attestationGenerator.validAttestation(bestBlockAndState));
final int subnetId = spec.computeSubnetForAttestation(bestBlockAndState.getState(), validAttestation.getAttestation());
node1.network().subscribeToAttestationSubnetId(subnetId);
node2.network().subscribeToAttestationSubnetId(subnetId);
waitForTopicRegistration();
processedAttestationSubscribers.forEach(s -> s.accept(validAttestation));
Waiter.waitFor(() -> {
assertThat(node2attestations.size()).isEqualTo(1);
assertThat(node2attestations.get(0)).isEqualTo(validAttestation);
});
}
Aggregations