Skip to content

Commit febbbfd

Browse files
authored
ETCM-843: Verify wrong genesis hash causes disconnection and blacklisting (#998)
1 parent 5e9b08a commit febbbfd

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

src/it/scala/io/iohk/ethereum/sync/RegularSyncItSpec.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package io.iohk.ethereum.sync
33
import com.typesafe.config.ConfigValueFactory
44
import io.iohk.ethereum.FreeSpecBase
55
import io.iohk.ethereum.metrics.{Metrics, MetricsConfig}
6-
import io.iohk.ethereum.network.PeerId
76
import io.iohk.ethereum.sync.util.RegularSyncItSpecUtils.FakePeer
87
import io.iohk.ethereum.sync.util.SyncCommonItSpec._
98
import io.iohk.ethereum.utils.Config

src/test/scala/io/iohk/ethereum/network/PeerManagerSpec.scala

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import io.iohk.ethereum.network.PeerActor.{ConnectTo, PeerClosedConnection}
1313
import io.iohk.ethereum.network.PeerEventBusActor.PeerEvent.PeerDisconnected
1414
import io.iohk.ethereum.network.PeerEventBusActor.SubscriptionClassifier.PeerHandshaked
1515
import io.iohk.ethereum.network.PeerEventBusActor.{PeerEvent, Publish, Subscribe}
16-
import io.iohk.ethereum.network.PeerManagerActor.{GetPeers, PeerConfiguration, Peers, SendMessage}
16+
import io.iohk.ethereum.network.PeerManagerActor.{GetPeers, PeerAddress, PeerConfiguration, Peers, SendMessage}
1717
import io.iohk.ethereum.network.discovery.{DiscoveryConfig, Node, PeerDiscoveryManager}
1818
import io.iohk.ethereum.network.p2p.messages.CommonMessages.NewBlock
1919
import io.iohk.ethereum.network.p2p.messages.ProtocolVersions
@@ -52,6 +52,27 @@ class PeerManagerSpec
5252
handleInitialNodesDiscovery()
5353
}
5454

55+
it should "blacklist peer that sent a status msg with invalid genesisHash" in new TestSetup {
56+
start()
57+
handleInitialNodesDiscovery()
58+
59+
val probe: TestProbe = createdPeers(1).probe
60+
61+
probe.expectMsgClass(classOf[PeerActor.ConnectTo])
62+
63+
peerManager ! PeerManagerActor.HandlePeerConnection(incomingConnection1.ref, incomingPeerAddress1)
64+
65+
val probe2: TestProbe = createdPeers(2).probe
66+
val peer = Peer(PeerId("peerid"), incomingPeerAddress1, probe2.ref, incomingConnection = true)
67+
68+
peerManager ! PeerClosedConnection(peer.remoteAddress.getHostString, Disconnect.Reasons.DisconnectRequested)
69+
70+
eventually {
71+
peerManager.underlyingActor.blacklist.keys.size shouldEqual 1
72+
peerManager.underlyingActor.blacklist.isBlacklisted(PeerAddress(peer.remoteAddress.getHostString)) shouldBe true
73+
}
74+
}
75+
5576
it should "blacklist peer that fail to establish tcp connection" in new TestSetup {
5677
start()
5778
handleInitialNodesDiscovery()

src/test/scala/io/iohk/ethereum/network/p2p/PeerActorSpec.scala

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import io.iohk.ethereum.network.p2p.messages.CommonMessages.Status.StatusEnc
2525
import io.iohk.ethereum.network.p2p.messages.PV62.GetBlockHeaders.GetBlockHeadersEnc
2626
import io.iohk.ethereum.network.p2p.messages.PV62._
2727
import io.iohk.ethereum.network.p2p.messages.{PV64, ProtocolVersions}
28-
import io.iohk.ethereum.network.p2p.messages.WireProtocol.Disconnect.Reasons
28+
import io.iohk.ethereum.network.p2p.messages.WireProtocol.Disconnect.{DisconnectEnc, Reasons}
2929
import io.iohk.ethereum.network.p2p.messages.WireProtocol.Hello.HelloEnc
3030
import io.iohk.ethereum.network.p2p.messages.WireProtocol.Pong.PongEnc
3131
import io.iohk.ethereum.network.p2p.messages.WireProtocol._
@@ -160,6 +160,35 @@ class PeerActorSpec
160160
knownNodesManager.expectNoMessage()
161161
}
162162

163+
it should "fail handshake with peer that has a wrong genesis hash" in new TestSetup {
164+
val uri = new URI(s"enode://${Hex.toHexString(remoteNodeId.toArray[Byte])}@localhost:9000")
165+
val completeUri = new URI(s"enode://${Hex.toHexString(remoteNodeId.toArray[Byte])}@127.0.0.1:9000?discport=9000")
166+
peer ! PeerActor.ConnectTo(uri)
167+
peer ! PeerActor.ConnectTo(uri)
168+
169+
rlpxConnection.expectMsgClass(classOf[RLPxConnectionHandler.ConnectTo])
170+
rlpxConnection.reply(RLPxConnectionHandler.ConnectionEstablished(remoteNodeId))
171+
172+
//Hello exchange
173+
val remoteHello = Hello(4, "test-client", Seq(Eth63Capability), 9000, ByteString("unused"))
174+
rlpxConnection.expectMsgPF() { case RLPxConnectionHandler.SendMessage(_: HelloEnc) => () }
175+
rlpxConnection.send(peer, RLPxConnectionHandler.MessageReceived(remoteHello))
176+
177+
val remoteStatus = Status(
178+
protocolVersion = ProtocolVersions.PV63,
179+
networkId = peerConf.networkId,
180+
totalDifficulty = daoForkBlockChainTotalDifficulty + 100000, // remote is after the fork
181+
bestHash = ByteString("blockhash"),
182+
genesisHash = genesisHash.drop(2)
183+
)
184+
185+
//Node status exchange
186+
rlpxConnection.expectMsgPF() { case RLPxConnectionHandler.SendMessage(_: StatusEnc) => () }
187+
rlpxConnection.send(peer, RLPxConnectionHandler.MessageReceived(remoteStatus))
188+
189+
rlpxConnection.expectMsgPF() { case RLPxConnectionHandler.SendMessage(_: DisconnectEnc) => () }
190+
}
191+
163192
it should "successfully connect to ETC peer with protocol 64" in new TestSetup {
164193
override def protocol: Version = ProtocolVersions.PV64
165194
val uri = new URI(s"enode://${Hex.toHexString(remoteNodeId.toArray[Byte])}@localhost:9000")

0 commit comments

Comments
 (0)