diff --git a/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/discovery/internal/PeerDiscoveryController.java b/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/discovery/internal/PeerDiscoveryController.java index 29a0135b88..3cfc0fdea9 100644 --- a/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/discovery/internal/PeerDiscoveryController.java +++ b/ethereum/p2p/src/main/java/tech/pegasys/pantheon/ethereum/p2p/discovery/internal/PeerDiscoveryController.java @@ -201,7 +201,11 @@ public void start() { throw new IllegalStateException("The peer table had already been started"); } - bootstrapNodes.stream().filter(p -> isPeerPermitted(localPeer, p)).forEach(peerTable::tryAdd); + final List initialDiscoveryPeers = + bootstrapNodes.stream() + .filter(p -> isPeerPermitted(localPeer, p)) + .collect(Collectors.toList()); + initialDiscoveryPeers.stream().forEach(peerTable::tryAdd); recursivePeerRefreshState = new RecursivePeerRefreshState( @@ -215,16 +219,20 @@ public void start() { PEER_REFRESH_ROUND_TIMEOUT_IN_SECONDS, 100); - final List initialDiscoveryPeers = - bootstrapNodes.stream() - .filter(p -> isPeerPermitted(localPeer, p)) - .collect(Collectors.toList()); - if (nodePermissioningController.isPresent()) { + + // if smart contract permissioning is enabled, bond with bootnodes + if (nodePermissioningController.get().getSyncStatusNodePermissioningProvider().isPresent()) { + for (DiscoveryPeer p : initialDiscoveryPeers) { + bond(p); + } + } + nodePermissioningController .get() .startPeerDiscoveryCallback( () -> recursivePeerRefreshState.start(initialDiscoveryPeers, localPeer.getId())); + } else { recursivePeerRefreshState.start(initialDiscoveryPeers, localPeer.getId()); } diff --git a/ethereum/p2p/src/test/java/tech/pegasys/pantheon/ethereum/p2p/NodePermissioningControllerTestHelper.java b/ethereum/p2p/src/test/java/tech/pegasys/pantheon/ethereum/p2p/NodePermissioningControllerTestHelper.java index 2ae8e7112f..73fb223bbf 100644 --- a/ethereum/p2p/src/test/java/tech/pegasys/pantheon/ethereum/p2p/NodePermissioningControllerTestHelper.java +++ b/ethereum/p2p/src/test/java/tech/pegasys/pantheon/ethereum/p2p/NodePermissioningControllerTestHelper.java @@ -14,6 +14,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -27,6 +28,8 @@ import java.util.Optional; import java.util.stream.Collectors; +import org.mockito.ArgumentCaptor; + public class NodePermissioningControllerTestHelper { private final EnodeURL localNode; @@ -88,6 +91,15 @@ public NodePermissioningController build() { }); } + ArgumentCaptor callback = ArgumentCaptor.forClass(Runnable.class); + doAnswer( + (i) -> { + callback.getValue().run(); + return null; + }) + .when(nodePermissioningController) + .startPeerDiscoveryCallback(callback.capture()); + return nodePermissioningController; } } diff --git a/ethereum/permissioning/src/main/java/tech/pegasys/pantheon/ethereum/permissioning/node/NodePermissioningController.java b/ethereum/permissioning/src/main/java/tech/pegasys/pantheon/ethereum/permissioning/node/NodePermissioningController.java index 3783315401..89fc2509c4 100644 --- a/ethereum/permissioning/src/main/java/tech/pegasys/pantheon/ethereum/permissioning/node/NodePermissioningController.java +++ b/ethereum/permissioning/src/main/java/tech/pegasys/pantheon/ethereum/permissioning/node/NodePermissioningController.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.Optional; -import com.google.common.annotations.VisibleForTesting; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -66,8 +65,7 @@ public void startPeerDiscoveryCallback(final Runnable peerDiscoveryCallback) { } } - @VisibleForTesting - Optional getSyncStatusNodePermissioningProvider() { + public Optional getSyncStatusNodePermissioningProvider() { return syncStatusNodePermissioningProvider; }