@@ -16,6 +16,9 @@ use super::snap::{
1616
1717use ethrex_rlp:: encode:: RLPEncode ;
1818
19+ const ETH_CAPABILITY_OFFSET : u8 = 0x10 ;
20+ const SNAP_CAPABILITY_OFFSET : u8 = 0x21 ;
21+
1922pub trait RLPxMessage : Sized {
2023 const CODE : u8 ;
2124
@@ -30,18 +33,20 @@ pub(crate) enum Message {
3033 Ping ( PingMessage ) ,
3134 Pong ( PongMessage ) ,
3235 Status ( StatusMessage ) ,
33- // https://github.com/ethereum/devp2p/blob/5713591d0366da78a913a811c7502d9ca91d29a8/caps/eth.md#getblockheaders-0x03
36+ // eth capability
37+ // https://github.com/ethereum/devp2p/blob/master/caps/eth.md
3438 GetBlockHeaders ( GetBlockHeaders ) ,
3539 BlockHeaders ( BlockHeaders ) ,
3640 Transactions ( Transactions ) ,
3741 GetBlockBodies ( GetBlockBodies ) ,
3842 BlockBodies ( BlockBodies ) ,
39- GetReceipts ( GetReceipts ) ,
40- Receipts ( Receipts ) ,
4143 NewPooledTransactionHashes ( NewPooledTransactionHashes ) ,
4244 GetPooledTransactions ( GetPooledTransactions ) ,
4345 PooledTransactions ( PooledTransactions ) ,
46+ GetReceipts ( GetReceipts ) ,
47+ Receipts ( Receipts ) ,
4448 // snap capability
49+ // https://github.com/ethereum/devp2p/blob/master/caps/snap.md
4550 GetAccountRange ( GetAccountRange ) ,
4651 AccountRange ( AccountRange ) ,
4752 GetStorageRanges ( GetStorageRanges ) ,
@@ -59,71 +64,87 @@ impl Message {
5964 Message :: Disconnect ( _) => DisconnectMessage :: CODE ,
6065 Message :: Ping ( _) => PingMessage :: CODE ,
6166 Message :: Pong ( _) => PongMessage :: CODE ,
62- Message :: Status ( _) => StatusMessage :: CODE ,
63- Message :: GetBlockHeaders ( _) => GetBlockHeaders :: CODE ,
64- Message :: BlockHeaders ( _) => BlockHeaders :: CODE ,
65- Message :: Transactions ( _) => Transactions :: CODE ,
66- Message :: GetBlockBodies ( _) => GetBlockBodies :: CODE ,
67- Message :: BlockBodies ( _) => BlockBodies :: CODE ,
68- Message :: GetReceipts ( _) => GetReceipts :: CODE ,
69- Message :: Receipts ( _) => Receipts :: CODE ,
70- Message :: NewPooledTransactionHashes ( _) => NewPooledTransactionHashes :: CODE ,
71- Message :: GetPooledTransactions ( _) => GetPooledTransactions :: CODE ,
72- Message :: PooledTransactions ( _) => PooledTransactions :: CODE ,
73- Message :: GetAccountRange ( _) => GetAccountRange :: CODE ,
74- Message :: AccountRange ( _) => AccountRange :: CODE ,
75- Message :: GetStorageRanges ( _) => GetStorageRanges :: CODE ,
76- Message :: StorageRanges ( _) => StorageRanges :: CODE ,
77- Message :: GetByteCodes ( _) => GetByteCodes :: CODE ,
78- Message :: ByteCodes ( _) => ByteCodes :: CODE ,
79- Message :: GetTrieNodes ( _) => GetTrieNodes :: CODE ,
80- Message :: TrieNodes ( _) => TrieNodes :: CODE ,
67+
68+ // eth capability
69+ Message :: Status ( _) => ETH_CAPABILITY_OFFSET + StatusMessage :: CODE ,
70+ Message :: Transactions ( _) => ETH_CAPABILITY_OFFSET + Transactions :: CODE ,
71+ Message :: GetBlockHeaders ( _) => ETH_CAPABILITY_OFFSET + GetBlockHeaders :: CODE ,
72+ Message :: BlockHeaders ( _) => ETH_CAPABILITY_OFFSET + BlockHeaders :: CODE ,
73+ Message :: GetBlockBodies ( _) => ETH_CAPABILITY_OFFSET + GetBlockBodies :: CODE ,
74+ Message :: BlockBodies ( _) => ETH_CAPABILITY_OFFSET + BlockBodies :: CODE ,
75+ Message :: NewPooledTransactionHashes ( _) => {
76+ ETH_CAPABILITY_OFFSET + NewPooledTransactionHashes :: CODE
77+ }
78+ Message :: GetPooledTransactions ( _) => {
79+ ETH_CAPABILITY_OFFSET + GetPooledTransactions :: CODE
80+ }
81+ Message :: PooledTransactions ( _) => ETH_CAPABILITY_OFFSET + PooledTransactions :: CODE ,
82+ Message :: GetReceipts ( _) => ETH_CAPABILITY_OFFSET + GetReceipts :: CODE ,
83+ Message :: Receipts ( _) => ETH_CAPABILITY_OFFSET + Receipts :: CODE ,
84+
85+ // snap capability
86+ Message :: GetAccountRange ( _) => SNAP_CAPABILITY_OFFSET + GetAccountRange :: CODE ,
87+ Message :: AccountRange ( _) => SNAP_CAPABILITY_OFFSET + AccountRange :: CODE ,
88+ Message :: GetStorageRanges ( _) => SNAP_CAPABILITY_OFFSET + GetStorageRanges :: CODE ,
89+ Message :: StorageRanges ( _) => SNAP_CAPABILITY_OFFSET + StorageRanges :: CODE ,
90+ Message :: GetByteCodes ( _) => SNAP_CAPABILITY_OFFSET + GetByteCodes :: CODE ,
91+ Message :: ByteCodes ( _) => SNAP_CAPABILITY_OFFSET + ByteCodes :: CODE ,
92+ Message :: GetTrieNodes ( _) => SNAP_CAPABILITY_OFFSET + GetTrieNodes :: CODE ,
93+ Message :: TrieNodes ( _) => SNAP_CAPABILITY_OFFSET + TrieNodes :: CODE ,
8194 }
8295 }
8396 pub fn decode ( msg_id : u8 , data : & [ u8 ] ) -> Result < Message , RLPDecodeError > {
84- match msg_id {
85- HelloMessage :: CODE => Ok ( Message :: Hello ( HelloMessage :: decode ( data) ?) ) ,
86- DisconnectMessage :: CODE => Ok ( Message :: Disconnect ( DisconnectMessage :: decode ( data) ?) ) ,
87- PingMessage :: CODE => Ok ( Message :: Ping ( PingMessage :: decode ( data) ?) ) ,
88- PongMessage :: CODE => Ok ( Message :: Pong ( PongMessage :: decode ( data) ?) ) ,
89- // Subprotocols like 'eth' use offsets to identify
90- // themselves, the eth capability starts
91- // at 0x10 (16), the status message
92- // has offset 0, so a message with id 0x10
93- // identifies an eth status message.
94- // Another example is the eth getBlockHeaders message,
95- // which has 3 as its offset, so it is identified as 0x13 (19).
96- // References:
97- // - https://ethereum.stackexchange.com/questions/37051/ethereum-network-messaging
98- // - https://github.com/ethereum/devp2p/blob/master/caps/eth.md#status-0x00
99- StatusMessage :: CODE => Ok ( Message :: Status ( StatusMessage :: decode ( data) ?) ) ,
100- Transactions :: CODE => Ok ( Message :: Transactions ( Transactions :: decode ( data) ?) ) ,
101- GetBlockHeaders :: CODE => Ok ( Message :: GetBlockHeaders ( GetBlockHeaders :: decode ( data) ?) ) ,
102- BlockHeaders :: CODE => Ok ( Message :: BlockHeaders ( BlockHeaders :: decode ( data) ?) ) ,
103- GetBlockBodies :: CODE => Ok ( Message :: GetBlockBodies ( GetBlockBodies :: decode ( data) ?) ) ,
104- BlockBodies :: CODE => Ok ( Message :: BlockBodies ( BlockBodies :: decode ( data) ?) ) ,
105- NewPooledTransactionHashes :: CODE => Ok ( Message :: NewPooledTransactionHashes (
106- NewPooledTransactionHashes :: decode ( data) ?,
107- ) ) ,
108- GetPooledTransactions :: CODE => Ok ( Message :: GetPooledTransactions (
109- GetPooledTransactions :: decode ( data) ?,
110- ) ) ,
111- PooledTransactions :: CODE => Ok ( Message :: PooledTransactions (
112- PooledTransactions :: decode ( data) ?,
113- ) ) ,
114- GetReceipts :: CODE => Ok ( Message :: GetReceipts ( GetReceipts :: decode ( data) ?) ) ,
115- Receipts :: CODE => Ok ( Message :: Receipts ( Receipts :: decode ( data) ?) ) ,
116- GetAccountRange :: CODE => Ok ( Message :: GetAccountRange ( GetAccountRange :: decode ( data) ?) ) ,
117- AccountRange :: CODE => Ok ( Message :: AccountRange ( AccountRange :: decode ( data) ?) ) ,
118- GetStorageRanges :: CODE => {
119- Ok ( Message :: GetStorageRanges ( GetStorageRanges :: decode ( data) ?) )
97+ if msg_id < ETH_CAPABILITY_OFFSET {
98+ match msg_id {
99+ HelloMessage :: CODE => Ok ( Message :: Hello ( HelloMessage :: decode ( data) ?) ) ,
100+ DisconnectMessage :: CODE => {
101+ Ok ( Message :: Disconnect ( DisconnectMessage :: decode ( data) ?) )
102+ }
103+ PingMessage :: CODE => Ok ( Message :: Ping ( PingMessage :: decode ( data) ?) ) ,
104+ PongMessage :: CODE => Ok ( Message :: Pong ( PongMessage :: decode ( data) ?) ) ,
105+ _ => Err ( RLPDecodeError :: MalformedData ) ,
106+ }
107+ } else if msg_id < SNAP_CAPABILITY_OFFSET {
108+ // eth capability
109+ match msg_id - ETH_CAPABILITY_OFFSET {
110+ StatusMessage :: CODE => Ok ( Message :: Status ( StatusMessage :: decode ( data) ?) ) ,
111+ Transactions :: CODE => Ok ( Message :: Transactions ( Transactions :: decode ( data) ?) ) ,
112+ GetBlockHeaders :: CODE => {
113+ Ok ( Message :: GetBlockHeaders ( GetBlockHeaders :: decode ( data) ?) )
114+ }
115+ BlockHeaders :: CODE => Ok ( Message :: BlockHeaders ( BlockHeaders :: decode ( data) ?) ) ,
116+ GetBlockBodies :: CODE => Ok ( Message :: GetBlockBodies ( GetBlockBodies :: decode ( data) ?) ) ,
117+ BlockBodies :: CODE => Ok ( Message :: BlockBodies ( BlockBodies :: decode ( data) ?) ) ,
118+ NewPooledTransactionHashes :: CODE => Ok ( Message :: NewPooledTransactionHashes (
119+ NewPooledTransactionHashes :: decode ( data) ?,
120+ ) ) ,
121+ GetPooledTransactions :: CODE => Ok ( Message :: GetPooledTransactions (
122+ GetPooledTransactions :: decode ( data) ?,
123+ ) ) ,
124+ PooledTransactions :: CODE => Ok ( Message :: PooledTransactions (
125+ PooledTransactions :: decode ( data) ?,
126+ ) ) ,
127+ GetReceipts :: CODE => Ok ( Message :: GetReceipts ( GetReceipts :: decode ( data) ?) ) ,
128+ Receipts :: CODE => Ok ( Message :: Receipts ( Receipts :: decode ( data) ?) ) ,
129+ _ => Err ( RLPDecodeError :: MalformedData ) ,
130+ }
131+ } else {
132+ // snap capability
133+ match msg_id - SNAP_CAPABILITY_OFFSET {
134+ GetAccountRange :: CODE => {
135+ return Ok ( Message :: GetAccountRange ( GetAccountRange :: decode ( data) ?) ) ;
136+ }
137+ AccountRange :: CODE => Ok ( Message :: AccountRange ( AccountRange :: decode ( data) ?) ) ,
138+ GetStorageRanges :: CODE => {
139+ return Ok ( Message :: GetStorageRanges ( GetStorageRanges :: decode ( data) ?) ) ;
140+ }
141+ StorageRanges :: CODE => Ok ( Message :: StorageRanges ( StorageRanges :: decode ( data) ?) ) ,
142+ GetByteCodes :: CODE => Ok ( Message :: GetByteCodes ( GetByteCodes :: decode ( data) ?) ) ,
143+ ByteCodes :: CODE => Ok ( Message :: ByteCodes ( ByteCodes :: decode ( data) ?) ) ,
144+ GetTrieNodes :: CODE => Ok ( Message :: GetTrieNodes ( GetTrieNodes :: decode ( data) ?) ) ,
145+ TrieNodes :: CODE => Ok ( Message :: TrieNodes ( TrieNodes :: decode ( data) ?) ) ,
146+ _ => Err ( RLPDecodeError :: MalformedData ) ,
120147 }
121- StorageRanges :: CODE => Ok ( Message :: StorageRanges ( StorageRanges :: decode ( data) ?) ) ,
122- GetByteCodes :: CODE => Ok ( Message :: GetByteCodes ( GetByteCodes :: decode ( data) ?) ) ,
123- ByteCodes :: CODE => Ok ( Message :: ByteCodes ( ByteCodes :: decode ( data) ?) ) ,
124- GetTrieNodes :: CODE => Ok ( Message :: GetTrieNodes ( GetTrieNodes :: decode ( data) ?) ) ,
125- TrieNodes :: CODE => Ok ( Message :: TrieNodes ( TrieNodes :: decode ( data) ?) ) ,
126- _ => Err ( RLPDecodeError :: MalformedData ) ,
127148 }
128149 }
129150
0 commit comments