Skip to content

Commit 03ab418

Browse files
authored
feat(l1): add code offset by capability (lambdaclass#2910)
**Motivation** <!-- Why does this pull request exist? What are its goals? --> The protocol capability offset was hardcoded within the msg code. **Description** In order to decouple the msg code from the protocol offset, a const was created with the len of the protocol. <!-- A clear and concise general description of the changes this PR introduces --> <!-- Link to issues: Resolves lambdaclass#111, Resolves lambdaclass#222 --> [geth reference](https://github.com/ethereum/go-ethereum/blob/20ad4f500e7fafab93f6d94fa171a5c0309de6ce/cmd/devp2p/internal/ethtest/protocol.go#L62) Closes lambdaclass#2902
1 parent 5831c26 commit 03ab418

File tree

6 files changed

+104
-83
lines changed

6 files changed

+104
-83
lines changed

crates/networking/p2p/rlpx/eth/blocks.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ impl GetBlockHeaders {
138138
}
139139

140140
impl RLPxMessage for GetBlockHeaders {
141-
const CODE: u8 = 0x13;
141+
const CODE: u8 = 0x03;
142142
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
143143
let mut encoded_data = vec![];
144144
let limit = self.limit;
@@ -179,7 +179,7 @@ impl BlockHeaders {
179179
}
180180

181181
impl RLPxMessage for BlockHeaders {
182-
const CODE: u8 = 0x14;
182+
const CODE: u8 = 0x04;
183183
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
184184
let mut encoded_data = vec![];
185185
// Each message is encoded with its own
@@ -247,7 +247,7 @@ impl GetBlockBodies {
247247
}
248248

249249
impl RLPxMessage for GetBlockBodies {
250-
const CODE: u8 = 0x15;
250+
const CODE: u8 = 0x05;
251251
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
252252
let mut encoded_data = vec![];
253253
Encoder::new(&mut encoded_data)
@@ -286,7 +286,7 @@ impl BlockBodies {
286286
}
287287

288288
impl RLPxMessage for BlockBodies {
289-
const CODE: u8 = 0x16;
289+
const CODE: u8 = 0x06;
290290
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
291291
let mut encoded_data = vec![];
292292
Encoder::new(&mut encoded_data)

crates/networking/p2p/rlpx/eth/receipts.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ impl GetReceipts {
2525
}
2626

2727
impl RLPxMessage for GetReceipts {
28-
const CODE: u8 = 0x1F;
28+
const CODE: u8 = 0x0F;
2929
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
3030
let mut encoded_data = vec![];
3131
Encoder::new(&mut encoded_data)
@@ -64,7 +64,7 @@ impl Receipts {
6464
}
6565

6666
impl RLPxMessage for Receipts {
67-
const CODE: u8 = 0x20;
67+
const CODE: u8 = 0x10;
6868

6969
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
7070
let mut encoded_data = vec![];

crates/networking/p2p/rlpx/eth/status.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pub(crate) struct StatusMessage {
2323
}
2424

2525
impl RLPxMessage for StatusMessage {
26-
const CODE: u8 = 0x10;
26+
const CODE: u8 = 0x00;
2727
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
2828
let mut encoded_data = vec![];
2929
Encoder::new(&mut encoded_data)

crates/networking/p2p/rlpx/eth/transactions.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ impl Transactions {
3333
}
3434

3535
impl RLPxMessage for Transactions {
36-
const CODE: u8 = 0x12;
36+
const CODE: u8 = 0x02;
3737
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
3838
let mut encoded_data = vec![];
3939
let mut encoder = Encoder::new(&mut encoded_data);
@@ -121,7 +121,7 @@ impl NewPooledTransactionHashes {
121121
}
122122

123123
impl RLPxMessage for NewPooledTransactionHashes {
124-
const CODE: u8 = 0x18;
124+
const CODE: u8 = 0x08;
125125
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
126126
let mut encoded_data = vec![];
127127
Encoder::new(&mut encoded_data)
@@ -233,7 +233,7 @@ impl GetPooledTransactions {
233233
}
234234

235235
impl RLPxMessage for GetPooledTransactions {
236-
const CODE: u8 = 0x19;
236+
const CODE: u8 = 0x09;
237237
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
238238
let mut encoded_data = vec![];
239239
Encoder::new(&mut encoded_data)
@@ -300,7 +300,7 @@ impl PooledTransactions {
300300
}
301301

302302
impl RLPxMessage for PooledTransactions {
303-
const CODE: u8 = 0x1A;
303+
const CODE: u8 = 0x0A;
304304
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
305305
let mut encoded_data = vec![];
306306
Encoder::new(&mut encoded_data)

crates/networking/p2p/rlpx/message.rs

Lines changed: 85 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ use super::snap::{
1616

1717
use ethrex_rlp::encode::RLPEncode;
1818

19+
const ETH_CAPABILITY_OFFSET: u8 = 0x10;
20+
const SNAP_CAPABILITY_OFFSET: u8 = 0x21;
21+
1922
pub 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

crates/networking/p2p/rlpx/snap.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ pub(crate) struct TrieNodes {
8181
}
8282

8383
impl RLPxMessage for GetAccountRange {
84-
const CODE: u8 = 0x21;
84+
const CODE: u8 = 0x00;
8585
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
8686
let mut encoded_data = vec![];
8787
Encoder::new(&mut encoded_data)
@@ -118,7 +118,7 @@ impl RLPxMessage for GetAccountRange {
118118
}
119119

120120
impl RLPxMessage for AccountRange {
121-
const CODE: u8 = 0x22;
121+
const CODE: u8 = 0x01;
122122
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
123123
let mut encoded_data = vec![];
124124
Encoder::new(&mut encoded_data)
@@ -149,7 +149,7 @@ impl RLPxMessage for AccountRange {
149149
}
150150

151151
impl RLPxMessage for GetStorageRanges {
152-
const CODE: u8 = 0x23;
152+
const CODE: u8 = 0x02;
153153
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
154154
let mut encoded_data = vec![];
155155
Encoder::new(&mut encoded_data)
@@ -195,7 +195,7 @@ impl RLPxMessage for GetStorageRanges {
195195
}
196196

197197
impl RLPxMessage for StorageRanges {
198-
const CODE: u8 = 0x24;
198+
const CODE: u8 = 0x03;
199199
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
200200
let mut encoded_data = vec![];
201201
Encoder::new(&mut encoded_data)
@@ -222,7 +222,7 @@ impl RLPxMessage for StorageRanges {
222222
}
223223

224224
impl RLPxMessage for GetByteCodes {
225-
const CODE: u8 = 0x25;
225+
const CODE: u8 = 0x04;
226226
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
227227
let mut encoded_data = vec![];
228228
Encoder::new(&mut encoded_data)
@@ -249,7 +249,7 @@ impl RLPxMessage for GetByteCodes {
249249
}
250250

251251
impl RLPxMessage for ByteCodes {
252-
const CODE: u8 = 0x26;
252+
const CODE: u8 = 0x05;
253253
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
254254
let mut encoded_data = vec![];
255255
Encoder::new(&mut encoded_data)
@@ -274,7 +274,7 @@ impl RLPxMessage for ByteCodes {
274274
}
275275

276276
impl RLPxMessage for GetTrieNodes {
277-
const CODE: u8 = 0x27;
277+
const CODE: u8 = 0x06;
278278
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
279279
let mut encoded_data = vec![];
280280
Encoder::new(&mut encoded_data)
@@ -308,7 +308,7 @@ impl RLPxMessage for GetTrieNodes {
308308
}
309309

310310
impl RLPxMessage for TrieNodes {
311-
const CODE: u8 = 0x28;
311+
const CODE: u8 = 0x07;
312312
fn encode(&self, buf: &mut dyn BufMut) -> Result<(), RLPEncodeError> {
313313
let mut encoded_data = vec![];
314314
Encoder::new(&mut encoded_data)

0 commit comments

Comments
 (0)