1
1
package io .iohk .ethereum .network .p2p
2
2
3
+ import scala .util .Try
4
+
3
5
import io .iohk .ethereum .network .p2p .messages .BaseETH6XMessages .SignedTransactions ._
4
6
import io .iohk .ethereum .network .p2p .messages .Capability
5
7
import io .iohk .ethereum .network .p2p .messages .Codes
@@ -19,15 +21,17 @@ import io.iohk.ethereum.network.p2p.messages.WireProtocol.Ping._
19
21
import io .iohk .ethereum .network .p2p .messages .WireProtocol .Pong ._
20
22
import io .iohk .ethereum .network .p2p .messages .WireProtocol ._
21
23
24
+ import MessageDecoder ._
25
+
22
26
object NetworkMessageDecoder extends MessageDecoder {
23
27
24
- override def fromBytes (msgCode : Int , payload : Array [Byte ]): Message =
28
+ override def fromBytes (msgCode : Int , payload : Array [Byte ]): Either [ DecodingError , Message ] =
25
29
msgCode match {
26
- case Disconnect .code => payload.toDisconnect
27
- case Ping .code => payload.toPing
28
- case Pong .code => payload.toPong
29
- case Hello .code => payload.toHello
30
- case _ => throw new RuntimeException (s " Unknown network message type: $msgCode" )
30
+ case Disconnect .code => Try ( payload.toDisconnect).toEither
31
+ case Ping .code => Try ( payload.toPing).toEither
32
+ case Pong .code => Try ( payload.toPong).toEither
33
+ case Hello .code => Try ( payload.toHello).toEither
34
+ case _ => Left ( new RuntimeException (s " Unknown network message type: $msgCode" ) )
31
35
}
32
36
33
37
}
@@ -36,79 +40,78 @@ object ETC64MessageDecoder extends MessageDecoder {
36
40
import io .iohk .ethereum .network .p2p .messages .ETC64 .Status ._
37
41
import io .iohk .ethereum .network .p2p .messages .ETC64 .NewBlock ._
38
42
39
- def fromBytes (msgCode : Int , payload : Array [Byte ]): Message =
43
+ def fromBytes (msgCode : Int , payload : Array [Byte ]): Either [ DecodingError , Message ] =
40
44
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
47
- case Codes .NewBlockHashesCode => payload.toNewBlockHashes
48
- case Codes .GetBlockHeadersCode => payload.toGetBlockHeaders
49
- case Codes .BlockHeadersCode => payload.toBlockHeaders
50
- case Codes .GetBlockBodiesCode => payload.toGetBlockBodies
51
- case Codes .BlockBodiesCode => payload.toBlockBodies
52
- case Codes .BlockHashesFromNumberCode => payload.toBlockHashesFromNumber
53
- case Codes .SignedTransactionsCode => payload.toSignedTransactions
54
- case _ => throw new RuntimeException (s " Unknown etc/64 message type: $msgCode" )
45
+ case Codes .StatusCode => Try ( payload.toStatus).toEither
46
+ case Codes .NewBlockCode => Try ( payload.toNewBlock).toEither
47
+ case Codes .GetNodeDataCode => Try ( payload.toGetNodeData).toEither
48
+ case Codes .NodeDataCode => Try ( payload.toNodeData).toEither
49
+ case Codes .GetReceiptsCode => Try ( payload.toGetReceipts).toEither
50
+ case Codes .ReceiptsCode => Try ( payload.toReceipts).toEither
51
+ case Codes .NewBlockHashesCode => Try ( payload.toNewBlockHashes).toEither
52
+ case Codes .GetBlockHeadersCode => Try ( payload.toGetBlockHeaders).toEither
53
+ case Codes .BlockHeadersCode => Try ( payload.toBlockHeaders).toEither
54
+ case Codes .GetBlockBodiesCode => Try ( payload.toGetBlockBodies).toEither
55
+ case Codes .BlockBodiesCode => Try ( payload.toBlockBodies).toEither
56
+ case Codes .BlockHashesFromNumberCode => Try ( payload.toBlockHashesFromNumber).toEither
57
+ case Codes .SignedTransactionsCode => Try ( payload.toSignedTransactions).toEither
58
+ case _ => Left ( new RuntimeException (s " Unknown etc/64 message type: $msgCode" ) )
55
59
}
56
60
}
57
61
58
62
object ETH64MessageDecoder extends MessageDecoder {
59
63
import io .iohk .ethereum .network .p2p .messages .ETH64 .Status ._
60
64
import io .iohk .ethereum .network .p2p .messages .BaseETH6XMessages .NewBlock ._
61
65
62
- def fromBytes (msgCode : Int , payload : Array [Byte ]): Message =
66
+ def fromBytes (msgCode : Int , payload : Array [Byte ]): Either [ DecodingError , Message ] =
63
67
msgCode match {
64
- case Codes .GetNodeDataCode => payload.toGetNodeData
65
- case Codes .NodeDataCode => payload.toNodeData
66
- case Codes .GetReceiptsCode => payload.toGetReceipts
67
- case Codes .ReceiptsCode => payload.toReceipts
68
- case Codes .NewBlockHashesCode => payload.toNewBlockHashes
69
- case Codes .GetBlockHeadersCode => payload.toGetBlockHeaders
70
- case Codes .BlockHeadersCode => payload.toBlockHeaders
71
- case Codes .GetBlockBodiesCode => payload.toGetBlockBodies
72
- case Codes .BlockBodiesCode => payload.toBlockBodies
73
- case Codes .BlockHashesFromNumberCode => payload.toBlockHashesFromNumber
74
- case Codes .StatusCode => payload.toStatus
75
- case Codes .NewBlockCode => payload.toNewBlock
76
- case Codes .SignedTransactionsCode => payload.toSignedTransactions
77
- case _ => throw new RuntimeException (s " Unknown eth/64 message type: $msgCode" )
68
+ case Codes .GetNodeDataCode => Try ( payload.toGetNodeData).toEither
69
+ case Codes .NodeDataCode => Try ( payload.toNodeData).toEither
70
+ case Codes .GetReceiptsCode => Try ( payload.toGetReceipts).toEither
71
+ case Codes .ReceiptsCode => Try ( payload.toReceipts).toEither
72
+ case Codes .NewBlockHashesCode => Try ( payload.toNewBlockHashes).toEither
73
+ case Codes .GetBlockHeadersCode => Try ( payload.toGetBlockHeaders).toEither
74
+ case Codes .BlockHeadersCode => Try ( payload.toBlockHeaders).toEither
75
+ case Codes .GetBlockBodiesCode => Try ( payload.toGetBlockBodies).toEither
76
+ case Codes .BlockBodiesCode => Try ( payload.toBlockBodies).toEither
77
+ case Codes .BlockHashesFromNumberCode => Try ( payload.toBlockHashesFromNumber).toEither
78
+ case Codes .StatusCode => Try ( payload.toStatus).toEither
79
+ case Codes .NewBlockCode => Try ( payload.toNewBlock).toEither
80
+ case Codes .SignedTransactionsCode => Try ( payload.toSignedTransactions).toEither
81
+ case _ => Left ( new RuntimeException (s " Unknown eth/64 message type: $msgCode" ) )
78
82
}
79
83
}
80
84
81
85
object ETH63MessageDecoder extends MessageDecoder {
82
86
import io .iohk .ethereum .network .p2p .messages .BaseETH6XMessages .Status ._
83
87
import io .iohk .ethereum .network .p2p .messages .BaseETH6XMessages .NewBlock ._
84
88
85
- def fromBytes (msgCode : Int , payload : Array [Byte ]): Message =
89
+ def fromBytes (msgCode : Int , payload : Array [Byte ]): Either [ DecodingError , Message ] =
86
90
msgCode match {
87
- case Codes .GetNodeDataCode => payload.toGetNodeData
88
- case Codes .NodeDataCode => payload.toNodeData
89
- case Codes .GetReceiptsCode => payload.toGetReceipts
90
- case Codes .ReceiptsCode => payload.toReceipts
91
- case Codes .NewBlockHashesCode => payload.toNewBlockHashes
92
- case Codes .GetBlockHeadersCode => payload.toGetBlockHeaders
93
- case Codes .BlockHeadersCode => payload.toBlockHeaders
94
- case Codes .GetBlockBodiesCode => payload.toGetBlockBodies
95
- case Codes .BlockBodiesCode => payload.toBlockBodies
96
- case Codes .BlockHashesFromNumberCode => payload.toBlockHashesFromNumber
97
- case Codes .StatusCode => payload.toStatus
98
- case Codes .NewBlockCode => payload.toNewBlock
99
- case Codes .SignedTransactionsCode => payload.toSignedTransactions
100
- case _ => throw new RuntimeException (s " Unknown eth/63 message type: $msgCode" )
91
+ case Codes .GetNodeDataCode => Try ( payload.toGetNodeData).toEither
92
+ case Codes .NodeDataCode => Try ( payload.toNodeData).toEither
93
+ case Codes .GetReceiptsCode => Try ( payload.toGetReceipts).toEither
94
+ case Codes .ReceiptsCode => Try ( payload.toReceipts).toEither
95
+ case Codes .NewBlockHashesCode => Try ( payload.toNewBlockHashes).toEither
96
+ case Codes .GetBlockHeadersCode => Try ( payload.toGetBlockHeaders).toEither
97
+ case Codes .BlockHeadersCode => Try ( payload.toBlockHeaders).toEither
98
+ case Codes .GetBlockBodiesCode => Try ( payload.toGetBlockBodies).toEither
99
+ case Codes .BlockBodiesCode => Try ( payload.toBlockBodies).toEither
100
+ case Codes .BlockHashesFromNumberCode => Try ( payload.toBlockHashesFromNumber).toEither
101
+ case Codes .StatusCode => Try ( payload.toStatus).toEither
102
+ case Codes .NewBlockCode => Try ( payload.toNewBlock).toEither
103
+ case Codes .SignedTransactionsCode => Try ( payload.toSignedTransactions).toEither
104
+ case _ => Left ( new RuntimeException (s " Unknown eth/63 message type: $msgCode" ) )
101
105
}
102
106
}
103
107
104
108
// scalastyle:off
105
109
object EthereumMessageDecoder {
106
- type Decoder = (Int , Array [Byte ]) => Message
107
110
def ethMessageDecoder (protocolVersion : Capability ): MessageDecoder =
108
111
protocolVersion match {
109
- case Capability .Capabilities .Etc64Capability => ETC64MessageDecoder .fromBytes
110
- case Capability .Capabilities .Eth63Capability => ETH63MessageDecoder .fromBytes
111
- case Capability .Capabilities .Eth64Capability => ETH64MessageDecoder .fromBytes
112
+ case Capability .Capabilities .Etc64Capability => ETC64MessageDecoder .orElse( NetworkMessageDecoder )
113
+ case Capability .Capabilities .Eth63Capability => ETH63MessageDecoder .orElse( NetworkMessageDecoder )
114
+ case Capability .Capabilities .Eth64Capability => ETH64MessageDecoder .orElse( NetworkMessageDecoder )
112
115
case _ => throw new RuntimeException (s " Unsupported Protocol Version $protocolVersion" )
113
116
}
114
117
}
0 commit comments