Skip to content

Commit cc5cc02

Browse files
committed
[ETCM-842] Remove ETH61 and ETH62 as possible protocols
1 parent bfb2bef commit cc5cc02

File tree

16 files changed

+143
-213
lines changed

16 files changed

+143
-213
lines changed

src/it/scala/io/iohk/ethereum/sync/util/CommonFakePeer.scala

-1
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,6 @@ abstract class CommonFakePeer(peerName: String, fakePeerCustomConfig: FakePeerCu
190190
peerStatistics,
191191
handshaker,
192192
authHandshaker,
193-
EthereumMessageDecoder,
194193
discoveryConfig,
195194
blacklist,
196195
blockchainConfig.capabilities

src/it/scala/io/iohk/ethereum/txExecTest/util/DumpChainApp.scala

-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ object DumpChainApp extends App with NodeKeyBuilder with SecureRandomBuilder wit
113113
knownNodesManager = actorSystem.deadLetters, // TODO: fixme
114114
handshaker = handshaker,
115115
authHandshaker = authHandshaker,
116-
messageDecoder = EthereumMessageDecoder,
117116
discoveryConfig = discoveryConfig,
118117
blacklist = blacklist,
119118
capabilities = blockchainConfig.capabilities

src/main/scala/io/iohk/ethereum/network/PeerActor.scala

+2-4
Original file line numberDiff line numberDiff line change
@@ -320,13 +320,12 @@ object PeerActor {
320320
incomingConnection: Boolean,
321321
handshaker: Handshaker[R],
322322
authHandshaker: AuthHandshaker,
323-
messageDecoder: MessageDecoder,
324323
capabilities: List[Capability]
325324
): Props =
326325
Props(
327326
new PeerActor(
328327
peerAddress,
329-
rlpxConnectionFactory(authHandshaker, messageDecoder, peerConfiguration.rlpxConfiguration, capabilities),
328+
rlpxConnectionFactory(authHandshaker, peerConfiguration.rlpxConfiguration, capabilities),
330329
peerConfiguration,
331330
peerEventBus,
332331
knownNodesManager,
@@ -338,13 +337,12 @@ object PeerActor {
338337

339338
def rlpxConnectionFactory(
340339
authHandshaker: AuthHandshaker,
341-
messageDecoder: MessageDecoder,
342340
rlpxConfiguration: RLPxConfiguration,
343341
capabilities: List[Capability]
344342
): ActorContext => ActorRef = { ctx =>
345343
ctx.actorOf(
346344
RLPxConnectionHandler
347-
.props(NetworkMessageDecoder orElse messageDecoder, capabilities, authHandshaker, rlpxConfiguration),
345+
.props(capabilities, authHandshaker, rlpxConfiguration),
348346
"rlpx-connection"
349347
)
350348
}

src/main/scala/io/iohk/ethereum/network/PeerManagerActor.scala

-4
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,6 @@ object PeerManagerActor {
421421
peerStatistics: ActorRef,
422422
handshaker: Handshaker[R],
423423
authHandshaker: AuthHandshaker,
424-
messageDecoder: MessageDecoder,
425424
discoveryConfig: DiscoveryConfig,
426425
blacklist: Blacklist,
427426
capabilities: List[Capability]
@@ -433,7 +432,6 @@ object PeerManagerActor {
433432
knownNodesManager,
434433
handshaker,
435434
authHandshaker,
436-
messageDecoder,
437435
capabilities
438436
)
439437

@@ -458,7 +456,6 @@ object PeerManagerActor {
458456
knownNodesManager: ActorRef,
459457
handshaker: Handshaker[R],
460458
authHandshaker: AuthHandshaker,
461-
messageDecoder: MessageDecoder,
462459
capabilities: List[Capability]
463460
): (ActorContext, InetSocketAddress, Boolean) => ActorRef = { (ctx, address, incomingConnection) =>
464461
val id: String = address.toString.filterNot(_ == '/')
@@ -470,7 +467,6 @@ object PeerManagerActor {
470467
incomingConnection,
471468
handshaker,
472469
authHandshaker,
473-
messageDecoder,
474470
capabilities
475471
)
476472
ctx.actorOf(props, id)

src/main/scala/io/iohk/ethereum/network/p2p/Message.scala

+5-6
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,10 @@ trait MessageSerializable extends Message {
2121
}
2222

2323
trait MessageDecoder { self =>
24-
def fromBytes(`type`: Int, payload: Array[Byte], protocolVersion: Capability): Message
24+
def fromBytes(`type`: Int, payload: Array[Byte]): Message
2525

26-
def orElse(otherMessageDecoder: MessageDecoder): MessageDecoder = new MessageDecoder {
27-
override def fromBytes(`type`: Int, payload: Array[Byte], protocolVersion: Capability): Message =
28-
Try { self.fromBytes(`type`, payload, protocolVersion) }
29-
.getOrElse(otherMessageDecoder.fromBytes(`type`, payload, protocolVersion))
30-
}
26+
def orElse(otherMessageDecoder: MessageDecoder): MessageDecoder = (`type`: Int, payload: Array[Byte]) =>
27+
Try {
28+
self.fromBytes(`type`, payload)
29+
}.getOrElse(otherMessageDecoder.fromBytes(`type`, payload))
3130
}

src/main/scala/io/iohk/ethereum/network/p2p/MessageDecoders.scala

+39-52
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import io.iohk.ethereum.network.p2p.messages.WireProtocol._
2121

2222
object NetworkMessageDecoder extends MessageDecoder {
2323

24-
override def fromBytes(msgCode: Int, payload: Array[Byte], protocolVersion: Capability): Message =
24+
override def fromBytes(msgCode: Int, payload: Array[Byte]): Message =
2525
msgCode match {
2626
case Disconnect.code => payload.toDisconnect
2727
case Ping.code => payload.toPing
@@ -32,75 +32,62 @@ object NetworkMessageDecoder extends MessageDecoder {
3232

3333
}
3434

35-
// scalastyle:off
36-
object EthereumMessageDecoder extends MessageDecoder {
37-
38-
override def fromBytes(msgCode: Int, payload: Array[Byte], protocolVersion: Capability): Message = {
39-
protocolVersion match {
40-
case ETC64 => handleETC64(msgCode, payload)
41-
case ETH63 => handleETH63(msgCode, payload)
42-
case ETH62 => handleETH62(msgCode, payload)
43-
case ETH61 => handleETH61(msgCode, payload)
44-
case pv => throw new RuntimeException("Unknown protocol version: " + pv)
45-
}
46-
}
35+
object ETC64MessageDecoder extends MessageDecoder {
36+
import io.iohk.ethereum.network.p2p.messages.ETC64.Status._
37+
import io.iohk.ethereum.network.p2p.messages.ETC64.NewBlock._
4738

48-
private def handleCommonMessages(msgCode: Int, payload: Array[Byte]): Message = {
49-
msgCode match {
50-
case Codes.StatusCode =>
51-
import io.iohk.ethereum.network.p2p.messages.BaseETH6XMessages.Status._
52-
payload.toStatus
53-
case Codes.NewBlockCode =>
54-
import io.iohk.ethereum.network.p2p.messages.BaseETH6XMessages.NewBlock._
55-
payload.toNewBlock
56-
case Codes.SignedTransactionsCode =>
57-
payload.toSignedTransactions
58-
case _ =>
59-
throw new RuntimeException("Unknown message type: " + msgCode)
60-
}
61-
}
62-
63-
private def handleETH61(msgCode: Int, payload: Array[Byte]): Message = {
64-
msgCode match {
65-
case Codes.NewBlockHashesCode =>
66-
import io.iohk.ethereum.network.p2p.messages.ETH61.NewBlockHashes._
67-
payload.toNewBlockHashes
68-
case Codes.BlockHashesFromNumberCode =>
69-
payload.toBlockHashesFromNumber
70-
case _ => handleCommonMessages(msgCode, payload)
71-
}
72-
}
73-
74-
private def handleETH62(msgCode: Int, payload: Array[Byte]): Message = {
39+
def fromBytes(msgCode: Int, payload: Array[Byte]): Message = {
7540
msgCode match {
41+
case Codes.StatusCode => payload.toStatus
42+
case Codes.NewBlockCode => payload.toNewBlock
43+
case Codes.GetNodeDataCode => payload.toGetNodeData
44+
case Codes.NodeDataCode => payload.toNodeData
45+
case Codes.GetReceiptsCode => payload.toGetReceipts
46+
case Codes.ReceiptsCode => payload.toReceipts
7647
case Codes.NewBlockHashesCode => payload.toNewBlockHashes
7748
case Codes.GetBlockHeadersCode => payload.toGetBlockHeaders
7849
case Codes.BlockHeadersCode => payload.toBlockHeaders
7950
case Codes.GetBlockBodiesCode => payload.toGetBlockBodies
8051
case Codes.BlockBodiesCode => payload.toBlockBodies
81-
case _ => handleCommonMessages(msgCode, payload)
52+
case Codes.BlockHashesFromNumberCode => payload.toBlockHashesFromNumber
53+
case Codes.SignedTransactionsCode => payload.toSignedTransactions
54+
case _ => throw new RuntimeException(s"Unknown message type: ${msgCode}")
8255
}
8356
}
57+
}
8458

85-
private def handleETH63(msgCode: Int, payload: Array[Byte]): Message = {
59+
object ETH63MessageDecoder extends MessageDecoder {
60+
import io.iohk.ethereum.network.p2p.messages.BaseETH6XMessages.Status._
61+
import io.iohk.ethereum.network.p2p.messages.BaseETH6XMessages.NewBlock._
62+
63+
def fromBytes(msgCode: Int, payload: Array[Byte]): Message = {
8664
msgCode match {
8765
case Codes.GetNodeDataCode => payload.toGetNodeData
8866
case Codes.NodeDataCode => payload.toNodeData
8967
case Codes.GetReceiptsCode => payload.toGetReceipts
9068
case Codes.ReceiptsCode => payload.toReceipts
91-
case _ => handleETH62(msgCode, payload)
69+
case Codes.NewBlockHashesCode => payload.toNewBlockHashes
70+
case Codes.GetBlockHeadersCode => payload.toGetBlockHeaders
71+
case Codes.BlockHeadersCode => payload.toBlockHeaders
72+
case Codes.GetBlockBodiesCode => payload.toGetBlockBodies
73+
case Codes.BlockBodiesCode => payload.toBlockBodies
74+
case Codes.BlockHashesFromNumberCode => payload.toBlockHashesFromNumber
75+
case Codes.StatusCode => payload.toStatus
76+
case Codes.NewBlockCode => payload.toNewBlock
77+
case Codes.SignedTransactionsCode => payload.toSignedTransactions
78+
case _ => throw new RuntimeException(s"Unknown message type: ${msgCode}")
9279
}
9380
}
81+
}
9482

95-
private def handleETC64(msgCode: Int, payload: Array[Byte]): Message = {
96-
msgCode match {
97-
case Codes.StatusCode =>
98-
import io.iohk.ethereum.network.p2p.messages.ETC64.Status._
99-
payload.toStatus
100-
case Codes.NewBlockCode =>
101-
import io.iohk.ethereum.network.p2p.messages.ETC64.NewBlock._
102-
payload.toNewBlock
103-
case _ => handleETH63(msgCode, payload)
83+
// scalastyle:off
84+
object EthereumMessageDecoder {
85+
type Decoder = (Int, Array[Byte]) => Message
86+
def ethMessageDecoder(protocolVersion: Capability): MessageDecoder = {
87+
protocolVersion match {
88+
case Capability.Capabilities.Etc64Capability => ETC64MessageDecoder.fromBytes
89+
case Capability.Capabilities.Eth63Capability => ETH63MessageDecoder.fromBytes
90+
case _ => throw new RuntimeException(s"Unsupported Protocol Version $protocolVersion")
10491
}
10592
}
10693
}

src/main/scala/io/iohk/ethereum/network/p2p/messages/package.scala

+6
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,14 @@ package object messages {
55
val ETH61: Capability = Capability("eth", 61.toByte)
66
val ETH62: Capability = Capability("eth", 62.toByte)
77
val ETH63: Capability = Capability("eth", 63.toByte)
8+
val ETH64: Capability = Capability("eth", 64.toByte)
9+
val ETH65: Capability = Capability("eth", 65.toByte)
10+
val ETH66: Capability = Capability("eth", 66.toByte)
11+
812
val ETC64: Capability = Capability("etc", 64.toByte)
913

14+
val SNAP1: Capability = Capability("snap", 1.toByte)
15+
1016
val SubProtocolOffset = 0x10
1117
}
1218

src/main/scala/io/iohk/ethereum/network/rlpx/MessageCodec.scala

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ object MessageCodec {
1919
class MessageCodec(
2020
frameCodec: FrameCodec,
2121
messageDecoder: MessageDecoder,
22-
protocolVersion: Capability,
2322
val remotePeer2PeerVersion: Long
2423
) {
2524
import MessageCodec._
@@ -43,7 +42,7 @@ class MessageCodec(
4342
}
4443

4544
payloadTry.map { payload =>
46-
messageDecoder.fromBytes(frame.`type`, payload, protocolVersion)
45+
messageDecoder.fromBytes(frame.`type`, payload)
4746
}
4847
}
4948
}

src/main/scala/io/iohk/ethereum/network/rlpx/RLPxConnectionHandler.scala

+25-21
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,14 @@ import cats.data.NonEmptyList
99
import io.iohk.ethereum.network.p2p.messages.{Capability, WireProtocol}
1010
import io.iohk.ethereum.network.p2p.messages.WireProtocol.Hello
1111
import io.iohk.ethereum.network.p2p.messages.WireProtocol.Hello.HelloEnc
12-
import io.iohk.ethereum.network.p2p.{Message, MessageDecoder, MessageSerializable, NetworkMessageDecoder}
13-
import io.iohk.ethereum.network.rlpx.RLPxConnectionHandler.{HelloExtractor, RLPxConfiguration}
12+
import io.iohk.ethereum.network.p2p.{
13+
EthereumMessageDecoder,
14+
Message,
15+
MessageDecoder,
16+
MessageSerializable,
17+
NetworkMessageDecoder
18+
}
19+
import io.iohk.ethereum.network.rlpx.RLPxConnectionHandler.{HelloCodec, RLPxConfiguration}
1420
import io.iohk.ethereum.utils.ByteUtils
1521
import org.bouncycastle.util.encoders.Hex
1622

@@ -30,12 +36,11 @@ import scala.util.{Failure, Success, Try}
3036
* 4. once handshake is done (and secure connection established) actor can send/receive messages (`handshaked` state)
3137
*/
3238
class RLPxConnectionHandler(
33-
messageDecoder: MessageDecoder,
3439
capabilities: List[Capability],
3540
authHandshaker: AuthHandshaker,
36-
messageCodecFactory: (FrameCodec, MessageDecoder, Capability, Long) => MessageCodec,
41+
messageCodecFactory: (FrameCodec, Capability, Long) => MessageCodec,
3742
rlpxConfiguration: RLPxConfiguration,
38-
extractor: Secrets => HelloExtractor
43+
extractor: Secrets => HelloCodec
3944
) extends Actor
4045
with ActorLogging {
4146

@@ -172,7 +177,7 @@ class RLPxConnectionHandler(
172177
}
173178

174179
def awaitInitialHello(
175-
extractor: HelloExtractor,
180+
extractor: HelloCodec,
176181
cancellableAckTimeout: Option[CancellableAckTimeout] = None,
177182
seqNumber: Int = 0
178183
): Receive =
@@ -183,7 +188,7 @@ class RLPxConnectionHandler(
183188
) orElse handleReceiveHello(extractor, cancellableAckTimeout, seqNumber)
184189

185190
private def handleSendHello(
186-
extractor: HelloExtractor,
191+
extractor: HelloCodec,
187192
cancellableAckTimeout: Option[CancellableAckTimeout] = None,
188193
seqNumber: Int = 0
189194
): Receive = {
@@ -211,7 +216,7 @@ class RLPxConnectionHandler(
211216
}
212217

213218
private def handleReceiveHello(
214-
extractor: HelloExtractor,
219+
extractor: HelloCodec,
215220
cancellableAckTimeout: Option[CancellableAckTimeout] = None,
216221
seqNumber: Int = 0
217222
): Receive = { case Received(data) =>
@@ -241,9 +246,9 @@ class RLPxConnectionHandler(
241246
}
242247
}
243248

244-
private def negotiateCodec(hello: Hello, extractor: HelloExtractor): Option[(MessageCodec, Capability)] =
249+
private def negotiateCodec(hello: Hello, extractor: HelloCodec): Option[(MessageCodec, Capability)] =
245250
Capability.negotiate(hello.capabilities.toList, capabilities).map { negotiated =>
246-
(messageCodecFactory(extractor.frameCodec, messageDecoder, negotiated, hello.p2pVersion), negotiated)
251+
(messageCodecFactory(extractor.frameCodec, negotiated, hello.p2pVersion), negotiated)
247252
}
248253

249254
private def processFrames(frames: Seq[Frame], messageCodec: MessageCodec): Unit =
@@ -373,29 +378,28 @@ class RLPxConnectionHandler(
373378

374379
object RLPxConnectionHandler {
375380
def props(
376-
messageDecoder: MessageDecoder,
377381
capabilities: List[Capability],
378382
authHandshaker: AuthHandshaker,
379383
rlpxConfiguration: RLPxConfiguration
380384
): Props =
381385
Props(
382386
new RLPxConnectionHandler(
383-
messageDecoder,
384387
capabilities,
385388
authHandshaker,
386-
messageCodecFactory,
389+
ethMessageCodecFactory,
387390
rlpxConfiguration,
388-
HelloExtractor.apply
391+
HelloCodec.apply
389392
)
390393
)
391394

392-
def messageCodecFactory(
395+
def ethMessageCodecFactory(
393396
frameCodec: FrameCodec,
394-
messageDecoder: MessageDecoder,
395-
protocolVersion: Capability,
397+
negotiated: Capability,
396398
p2pVersion: Long
397-
): MessageCodec =
398-
new MessageCodec(frameCodec, messageDecoder, protocolVersion, p2pVersion)
399+
): MessageCodec = {
400+
val md = EthereumMessageDecoder.ethMessageDecoder(negotiated) orElse NetworkMessageDecoder
401+
new MessageCodec(frameCodec, md, p2pVersion)
402+
}
399403

400404
case class ConnectTo(uri: URI)
401405

@@ -424,7 +428,7 @@ object RLPxConnectionHandler {
424428
val waitForTcpAckTimeout: FiniteDuration
425429
}
426430

427-
case class HelloExtractor(secrets: Secrets) {
431+
case class HelloCodec(secrets: Secrets) {
428432
import MessageCodec._
429433
lazy val frameCodec = new FrameCodec(secrets)
430434

@@ -448,7 +452,7 @@ object RLPxConnectionHandler {
448452
private def extractHello(frame: Frame): Option[Hello] = {
449453
val frameData = frame.payload.toArray
450454
if (frame.`type` == Hello.code) {
451-
val m = NetworkMessageDecoder.fromBytes(frame.`type`, frameData, Capability.Capabilities.Eth63Capability)
455+
val m = NetworkMessageDecoder.fromBytes(frame.`type`, frameData)
452456
Some(m.asInstanceOf[Hello])
453457
} else {
454458
None

src/main/scala/io/iohk/ethereum/nodebuilder/NodeBuilder.scala

+1-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import io.iohk.ethereum.network.EtcPeerManagerActor.PeerInfo
2424
import io.iohk.ethereum.network.PeerManagerActor.PeerConfiguration
2525
import io.iohk.ethereum.network.discovery.{DiscoveryConfig, DiscoveryServiceBuilder, PeerDiscoveryManager}
2626
import io.iohk.ethereum.network.handshaker.{EtcHandshaker, EtcHandshakerConfiguration, Handshaker}
27-
import io.iohk.ethereum.network.p2p.EthereumMessageDecoder
27+
import io.iohk.ethereum.network.p2p.{EthereumMessageDecoder, NetworkMessageDecoder}
2828
import io.iohk.ethereum.network.rlpx.AuthHandshaker
2929
import io.iohk.ethereum.network.{PeerManagerActor, ServerActor, _}
3030
import io.iohk.ethereum.ommers.OmmersPool
@@ -245,7 +245,6 @@ trait PeerManagerActorBuilder {
245245
peerStatistics,
246246
handshaker,
247247
authHandshaker,
248-
EthereumMessageDecoder,
249248
discoveryConfig,
250249
blacklist,
251250
blockchainConfig.capabilities

0 commit comments

Comments
 (0)