Skip to content

Commit

Permalink
[ETCM-842] Remove ETH61 and ETH62 as possible protocols (#1010)
Browse files Browse the repository at this point in the history
* [ETCM-842] Remove ETH61 and ETH62 as possible protocols

* [ETCM-842] Apply PR remarks
  • Loading branch information
dzajkowski committed Jun 16, 2021
1 parent cb0d31e commit 477e2ec
Show file tree
Hide file tree
Showing 16 changed files with 132 additions and 206 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,6 @@ abstract class CommonFakePeer(peerName: String, fakePeerCustomConfig: FakePeerCu
peerStatistics,
handshaker,
authHandshaker,
EthereumMessageDecoder,
discoveryConfig,
blacklist,
blockchainConfig.capabilities
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ object DumpChainApp extends App with NodeKeyBuilder with SecureRandomBuilder wit
knownNodesManager = actorSystem.deadLetters, // TODO: fixme
handshaker = handshaker,
authHandshaker = authHandshaker,
messageDecoder = EthereumMessageDecoder,
discoveryConfig = discoveryConfig,
blacklist = blacklist,
capabilities = blockchainConfig.capabilities
Expand Down
6 changes: 2 additions & 4 deletions src/main/scala/io/iohk/ethereum/network/PeerActor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -320,13 +320,12 @@ object PeerActor {
incomingConnection: Boolean,
handshaker: Handshaker[R],
authHandshaker: AuthHandshaker,
messageDecoder: MessageDecoder,
capabilities: List[Capability]
): Props =
Props(
new PeerActor(
peerAddress,
rlpxConnectionFactory(authHandshaker, messageDecoder, peerConfiguration.rlpxConfiguration, capabilities),
rlpxConnectionFactory(authHandshaker, peerConfiguration.rlpxConfiguration, capabilities),
peerConfiguration,
peerEventBus,
knownNodesManager,
Expand All @@ -338,13 +337,12 @@ object PeerActor {

def rlpxConnectionFactory(
authHandshaker: AuthHandshaker,
messageDecoder: MessageDecoder,
rlpxConfiguration: RLPxConfiguration,
capabilities: List[Capability]
): ActorContext => ActorRef = { ctx =>
ctx.actorOf(
RLPxConnectionHandler
.props(NetworkMessageDecoder orElse messageDecoder, capabilities, authHandshaker, rlpxConfiguration),
.props(capabilities, authHandshaker, rlpxConfiguration),
"rlpx-connection"
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,6 @@ object PeerManagerActor {
peerStatistics: ActorRef,
handshaker: Handshaker[R],
authHandshaker: AuthHandshaker,
messageDecoder: MessageDecoder,
discoveryConfig: DiscoveryConfig,
blacklist: Blacklist,
capabilities: List[Capability]
Expand All @@ -433,7 +432,6 @@ object PeerManagerActor {
knownNodesManager,
handshaker,
authHandshaker,
messageDecoder,
capabilities
)

Expand All @@ -458,7 +456,6 @@ object PeerManagerActor {
knownNodesManager: ActorRef,
handshaker: Handshaker[R],
authHandshaker: AuthHandshaker,
messageDecoder: MessageDecoder,
capabilities: List[Capability]
): (ActorContext, InetSocketAddress, Boolean) => ActorRef = { (ctx, address, incomingConnection) =>
val id: String = address.toString.filterNot(_ == '/')
Expand All @@ -470,7 +467,6 @@ object PeerManagerActor {
incomingConnection,
handshaker,
authHandshaker,
messageDecoder,
capabilities
)
ctx.actorOf(props, id)
Expand Down
11 changes: 5 additions & 6 deletions src/main/scala/io/iohk/ethereum/network/p2p/Message.scala
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,10 @@ trait MessageSerializable extends Message {
}

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

def orElse(otherMessageDecoder: MessageDecoder): MessageDecoder = new MessageDecoder {
override def fromBytes(`type`: Int, payload: Array[Byte], protocolVersion: Capability): Message =
Try { self.fromBytes(`type`, payload, protocolVersion) }
.getOrElse(otherMessageDecoder.fromBytes(`type`, payload, protocolVersion))
}
def orElse(otherMessageDecoder: MessageDecoder): MessageDecoder = (`type`: Int, payload: Array[Byte]) =>
Try {
self.fromBytes(`type`, payload)
}.getOrElse(otherMessageDecoder.fromBytes(`type`, payload))
}
93 changes: 40 additions & 53 deletions src/main/scala/io/iohk/ethereum/network/p2p/MessageDecoders.scala
Original file line number Diff line number Diff line change
Expand Up @@ -21,86 +21,73 @@ import io.iohk.ethereum.network.p2p.messages.WireProtocol._

object NetworkMessageDecoder extends MessageDecoder {

override def fromBytes(msgCode: Int, payload: Array[Byte], protocolVersion: Capability): Message =
override def fromBytes(msgCode: Int, payload: Array[Byte]): Message =
msgCode match {
case Disconnect.code => payload.toDisconnect
case Ping.code => payload.toPing
case Pong.code => payload.toPong
case Hello.code => payload.toHello
case _ => throw new RuntimeException(s"Unknown message type: ${msgCode}")
case _ => throw new RuntimeException(s"Unknown message type: $msgCode")
}

}

// scalastyle:off
object EthereumMessageDecoder extends MessageDecoder {

override def fromBytes(msgCode: Int, payload: Array[Byte], protocolVersion: Capability): Message = {
protocolVersion match {
case ETC64 => handleETC64(msgCode, payload)
case ETH63 => handleETH63(msgCode, payload)
case ETH62 => handleETH62(msgCode, payload)
case ETH61 => handleETH61(msgCode, payload)
case pv => throw new RuntimeException("Unknown protocol version: " + pv)
}
}

private def handleCommonMessages(msgCode: Int, payload: Array[Byte]): Message = {
msgCode match {
case Codes.StatusCode =>
import io.iohk.ethereum.network.p2p.messages.BaseETH6XMessages.Status._
payload.toStatus
case Codes.NewBlockCode =>
import io.iohk.ethereum.network.p2p.messages.BaseETH6XMessages.NewBlock._
payload.toNewBlock
case Codes.SignedTransactionsCode =>
payload.toSignedTransactions
case _ =>
throw new RuntimeException("Unknown message type: " + msgCode)
}
}
object ETC64MessageDecoder extends MessageDecoder {
import io.iohk.ethereum.network.p2p.messages.ETC64.Status._
import io.iohk.ethereum.network.p2p.messages.ETC64.NewBlock._

private def handleETH61(msgCode: Int, payload: Array[Byte]): Message = {
msgCode match {
case Codes.NewBlockHashesCode =>
import io.iohk.ethereum.network.p2p.messages.ETH61.NewBlockHashes._
payload.toNewBlockHashes
case Codes.BlockHashesFromNumberCode =>
payload.toBlockHashesFromNumber
case _ => handleCommonMessages(msgCode, payload)
}
}

private def handleETH62(msgCode: Int, payload: Array[Byte]): Message = {
def fromBytes(msgCode: Int, payload: Array[Byte]): Message = {
msgCode match {
case Codes.StatusCode => payload.toStatus
case Codes.NewBlockCode => payload.toNewBlock
case Codes.GetNodeDataCode => payload.toGetNodeData
case Codes.NodeDataCode => payload.toNodeData
case Codes.GetReceiptsCode => payload.toGetReceipts
case Codes.ReceiptsCode => payload.toReceipts
case Codes.NewBlockHashesCode => payload.toNewBlockHashes
case Codes.GetBlockHeadersCode => payload.toGetBlockHeaders
case Codes.BlockHeadersCode => payload.toBlockHeaders
case Codes.GetBlockBodiesCode => payload.toGetBlockBodies
case Codes.BlockBodiesCode => payload.toBlockBodies
case _ => handleCommonMessages(msgCode, payload)
case Codes.BlockHashesFromNumberCode => payload.toBlockHashesFromNumber
case Codes.SignedTransactionsCode => payload.toSignedTransactions
case _ => throw new RuntimeException(s"Unknown message type: $msgCode")
}
}
}

private def handleETH63(msgCode: Int, payload: Array[Byte]): Message = {
object ETH63MessageDecoder extends MessageDecoder {
import io.iohk.ethereum.network.p2p.messages.BaseETH6XMessages.Status._
import io.iohk.ethereum.network.p2p.messages.BaseETH6XMessages.NewBlock._

def fromBytes(msgCode: Int, payload: Array[Byte]): Message = {
msgCode match {
case Codes.GetNodeDataCode => payload.toGetNodeData
case Codes.NodeDataCode => payload.toNodeData
case Codes.GetReceiptsCode => payload.toGetReceipts
case Codes.ReceiptsCode => payload.toReceipts
case _ => handleETH62(msgCode, payload)
case Codes.NewBlockHashesCode => payload.toNewBlockHashes
case Codes.GetBlockHeadersCode => payload.toGetBlockHeaders
case Codes.BlockHeadersCode => payload.toBlockHeaders
case Codes.GetBlockBodiesCode => payload.toGetBlockBodies
case Codes.BlockBodiesCode => payload.toBlockBodies
case Codes.BlockHashesFromNumberCode => payload.toBlockHashesFromNumber
case Codes.StatusCode => payload.toStatus
case Codes.NewBlockCode => payload.toNewBlock
case Codes.SignedTransactionsCode => payload.toSignedTransactions
case _ => throw new RuntimeException(s"Unknown message type: $msgCode")
}
}
}

private def handleETC64(msgCode: Int, payload: Array[Byte]): Message = {
msgCode match {
case Codes.StatusCode =>
import io.iohk.ethereum.network.p2p.messages.ETC64.Status._
payload.toStatus
case Codes.NewBlockCode =>
import io.iohk.ethereum.network.p2p.messages.ETC64.NewBlock._
payload.toNewBlock
case _ => handleETH63(msgCode, payload)
// scalastyle:off
object EthereumMessageDecoder {
type Decoder = (Int, Array[Byte]) => Message
def ethMessageDecoder(protocolVersion: Capability): MessageDecoder = {
protocolVersion match {
case Capability.Capabilities.Etc64Capability => ETC64MessageDecoder.fromBytes
case Capability.Capabilities.Eth63Capability => ETH63MessageDecoder.fromBytes
case _ => throw new RuntimeException(s"Unsupported Protocol Version $protocolVersion")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,14 @@ package object messages {
val ETH61: Capability = Capability("eth", 61.toByte)
val ETH62: Capability = Capability("eth", 62.toByte)
val ETH63: Capability = Capability("eth", 63.toByte)
val ETH64: Capability = Capability("eth", 64.toByte)
val ETH65: Capability = Capability("eth", 65.toByte)
val ETH66: Capability = Capability("eth", 66.toByte)

val ETC64: Capability = Capability("etc", 64.toByte)

val SNAP1: Capability = Capability("snap", 1.toByte)

val SubProtocolOffset = 0x10
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ object MessageCodec {
class MessageCodec(
frameCodec: FrameCodec,
messageDecoder: MessageDecoder,
protocolVersion: Capability,
val remotePeer2PeerVersion: Long
) {
import MessageCodec._
Expand All @@ -43,7 +42,7 @@ class MessageCodec(
}

payloadTry.map { payload =>
messageDecoder.fromBytes(frame.`type`, payload, protocolVersion)
messageDecoder.fromBytes(frame.`type`, payload)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,14 @@ import cats.data.NonEmptyList
import io.iohk.ethereum.network.p2p.messages.{Capability, WireProtocol}
import io.iohk.ethereum.network.p2p.messages.WireProtocol.Hello
import io.iohk.ethereum.network.p2p.messages.WireProtocol.Hello.HelloEnc
import io.iohk.ethereum.network.p2p.{Message, MessageDecoder, MessageSerializable, NetworkMessageDecoder}
import io.iohk.ethereum.network.rlpx.RLPxConnectionHandler.{HelloExtractor, RLPxConfiguration}
import io.iohk.ethereum.network.p2p.{
EthereumMessageDecoder,
Message,
MessageDecoder,
MessageSerializable,
NetworkMessageDecoder
}
import io.iohk.ethereum.network.rlpx.RLPxConnectionHandler.{HelloCodec, RLPxConfiguration}
import io.iohk.ethereum.utils.ByteUtils
import org.bouncycastle.util.encoders.Hex

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

Expand Down Expand Up @@ -172,7 +177,7 @@ class RLPxConnectionHandler(
}

def awaitInitialHello(
extractor: HelloExtractor,
extractor: HelloCodec,
cancellableAckTimeout: Option[CancellableAckTimeout] = None,
seqNumber: Int = 0
): Receive =
Expand All @@ -183,7 +188,7 @@ class RLPxConnectionHandler(
) orElse handleReceiveHello(extractor, cancellableAckTimeout, seqNumber)

private def handleSendHello(
extractor: HelloExtractor,
extractor: HelloCodec,
cancellableAckTimeout: Option[CancellableAckTimeout] = None,
seqNumber: Int = 0
): Receive = {
Expand Down Expand Up @@ -211,7 +216,7 @@ class RLPxConnectionHandler(
}

private def handleReceiveHello(
extractor: HelloExtractor,
extractor: HelloCodec,
cancellableAckTimeout: Option[CancellableAckTimeout] = None,
seqNumber: Int = 0
): Receive = { case Received(data) =>
Expand Down Expand Up @@ -241,9 +246,9 @@ class RLPxConnectionHandler(
}
}

private def negotiateCodec(hello: Hello, extractor: HelloExtractor): Option[(MessageCodec, Capability)] =
private def negotiateCodec(hello: Hello, extractor: HelloCodec): Option[(MessageCodec, Capability)] =
Capability.negotiate(hello.capabilities.toList, capabilities).map { negotiated =>
(messageCodecFactory(extractor.frameCodec, messageDecoder, negotiated, hello.p2pVersion), negotiated)
(messageCodecFactory(extractor.frameCodec, negotiated, hello.p2pVersion), negotiated)
}

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

object RLPxConnectionHandler {
def props(
messageDecoder: MessageDecoder,
capabilities: List[Capability],
authHandshaker: AuthHandshaker,
rlpxConfiguration: RLPxConfiguration
): Props =
Props(
new RLPxConnectionHandler(
messageDecoder,
capabilities,
authHandshaker,
messageCodecFactory,
ethMessageCodecFactory,
rlpxConfiguration,
HelloExtractor.apply
HelloCodec.apply
)
)

def messageCodecFactory(
def ethMessageCodecFactory(
frameCodec: FrameCodec,
messageDecoder: MessageDecoder,
protocolVersion: Capability,
negotiated: Capability,
p2pVersion: Long
): MessageCodec =
new MessageCodec(frameCodec, messageDecoder, protocolVersion, p2pVersion)
): MessageCodec = {
val md = EthereumMessageDecoder.ethMessageDecoder(negotiated) orElse NetworkMessageDecoder
new MessageCodec(frameCodec, md, p2pVersion)
}

case class ConnectTo(uri: URI)

Expand Down Expand Up @@ -424,7 +428,7 @@ object RLPxConnectionHandler {
val waitForTcpAckTimeout: FiniteDuration
}

case class HelloExtractor(secrets: Secrets) {
case class HelloCodec(secrets: Secrets) {
import MessageCodec._
lazy val frameCodec = new FrameCodec(secrets)

Expand All @@ -448,7 +452,7 @@ object RLPxConnectionHandler {
private def extractHello(frame: Frame): Option[Hello] = {
val frameData = frame.payload.toArray
if (frame.`type` == Hello.code) {
val m = NetworkMessageDecoder.fromBytes(frame.`type`, frameData, Capability.Capabilities.Eth63Capability)
val m = NetworkMessageDecoder.fromBytes(frame.`type`, frameData)
Some(m.asInstanceOf[Hello])
} else {
None
Expand Down
2 changes: 0 additions & 2 deletions src/main/scala/io/iohk/ethereum/nodebuilder/NodeBuilder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import io.iohk.ethereum.network.EtcPeerManagerActor.PeerInfo
import io.iohk.ethereum.network.PeerManagerActor.PeerConfiguration
import io.iohk.ethereum.network.discovery.{DiscoveryConfig, DiscoveryServiceBuilder, PeerDiscoveryManager}
import io.iohk.ethereum.network.handshaker.{EtcHandshaker, EtcHandshakerConfiguration, Handshaker}
import io.iohk.ethereum.network.p2p.EthereumMessageDecoder
import io.iohk.ethereum.network.rlpx.AuthHandshaker
import io.iohk.ethereum.network.{PeerManagerActor, ServerActor, _}
import io.iohk.ethereum.ommers.OmmersPool
Expand Down Expand Up @@ -245,7 +244,6 @@ trait PeerManagerActorBuilder {
peerStatistics,
handshaker,
authHandshaker,
EthereumMessageDecoder,
discoveryConfig,
blacklist,
blockchainConfig.capabilities
Expand Down

0 comments on commit 477e2ec

Please sign in to comment.