Skip to content

Commit c3a12c9

Browse files
authored
fix(gossipsub): use the protobuf max message size
#5868 introduced the customization of message size and mesh parameters per topic. When decoding a message if no max size is defined per topic we should not use the default which is not customizable, we should just no-op as we are already covered by the max protobuf size passed to `GossipsubDecoder`, the respective tests are also not required. Sorry I overlook this when reviewing #5868. Cc @elijahhampton Pull-Request: #5983.
1 parent 68b5dfe commit c3a12c9

File tree

2 files changed

+8
-204
lines changed

2 files changed

+8
-204
lines changed

protocols/gossipsub/src/behaviour/tests.rs

Lines changed: 0 additions & 196 deletions
Original file line numberDiff line numberDiff line change
@@ -6567,202 +6567,6 @@ fn test_publish_large_message_with_specific_transmit_size_config() {
65676567
);
65686568
}
65696569

6570-
#[test]
6571-
fn test_validation_error_message_size_too_large_default() {
6572-
let config = ConfigBuilder::default()
6573-
.validation_mode(ValidationMode::None)
6574-
.build()
6575-
.unwrap();
6576-
6577-
let (mut gs, peers, _, topic_hashes) = inject_nodes1()
6578-
.peer_no(1)
6579-
.topics(vec![String::from("test")])
6580-
.to_subscribe(true)
6581-
.gs_config(config)
6582-
.create_network();
6583-
6584-
let data = vec![0u8; Config::default_max_transmit_size() + 1];
6585-
let raw_message = RawMessage {
6586-
source: Some(peers[0]),
6587-
data,
6588-
sequence_number: Some(1u64),
6589-
topic: topic_hashes[0].clone(),
6590-
signature: None,
6591-
key: None,
6592-
validated: false,
6593-
};
6594-
6595-
gs.on_connection_handler_event(
6596-
peers[0],
6597-
ConnectionId::new_unchecked(0),
6598-
HandlerEvent::Message {
6599-
rpc: Rpc {
6600-
messages: vec![raw_message],
6601-
subscriptions: vec![],
6602-
control_msgs: vec![],
6603-
},
6604-
invalid_messages: vec![],
6605-
},
6606-
);
6607-
6608-
let event = gs.events.pop_front().expect("Event should be generated");
6609-
match event {
6610-
ToSwarm::GenerateEvent(Event::Message {
6611-
propagation_source,
6612-
message_id: _,
6613-
message,
6614-
}) => {
6615-
assert_eq!(propagation_source, peers[0]);
6616-
assert_eq!(message.data.len(), Config::default_max_transmit_size() + 1);
6617-
}
6618-
ToSwarm::NotifyHandler { peer_id, .. } => {
6619-
assert_eq!(peer_id, peers[0]);
6620-
}
6621-
_ => panic!("Unexpected event"),
6622-
}
6623-
6624-
// Simulate a peer sending a message exceeding the default max_transmit_size + 1 (65537 bytes).
6625-
// The codec's max_length is set high to allow encoding/decoding the RPC, while
6626-
// max_transmit_sizes enforces the per-topic limit (in this case the default).
6627-
let mut codec = GossipsubCodec::new(
6628-
Config::default_max_transmit_size() * 2,
6629-
ValidationMode::Strict,
6630-
HashMap::new(),
6631-
);
6632-
let mut buf = BytesMut::new();
6633-
let rpc = proto::RPC {
6634-
publish: vec![proto::Message {
6635-
from: Some(peers[0].to_bytes()),
6636-
data: Some(vec![0u8; Config::default_max_transmit_size() + 1]),
6637-
seqno: Some(1u64.to_be_bytes().to_vec()),
6638-
topic: topic_hashes[0].to_string(),
6639-
signature: None,
6640-
key: None,
6641-
}],
6642-
subscriptions: vec![],
6643-
control: None,
6644-
};
6645-
codec.encode(rpc, &mut buf).unwrap();
6646-
6647-
let decoded = codec.decode(&mut buf).unwrap().unwrap();
6648-
match decoded {
6649-
HandlerEvent::Message {
6650-
rpc,
6651-
invalid_messages,
6652-
} => {
6653-
assert!(
6654-
rpc.messages.is_empty(),
6655-
"No valid messages should be present"
6656-
);
6657-
assert_eq!(invalid_messages.len(), 1, "One message should be invalid");
6658-
let (invalid_msg, error) = &invalid_messages[0];
6659-
assert_eq!(
6660-
invalid_msg.data.len(),
6661-
Config::default_max_transmit_size() + 1
6662-
);
6663-
assert_eq!(error, &ValidationError::MessageSizeTooLargeForTopic);
6664-
}
6665-
_ => panic!("Unexpected event"),
6666-
}
6667-
}
6668-
6669-
#[test]
6670-
fn test_validation_message_size_within_default() {
6671-
let config = ConfigBuilder::default()
6672-
.validation_mode(ValidationMode::None)
6673-
.build()
6674-
.unwrap();
6675-
6676-
let (mut gs, peers, _, topic_hashes) = inject_nodes1()
6677-
.peer_no(1)
6678-
.topics(vec![String::from("test")])
6679-
.to_subscribe(true)
6680-
.gs_config(config)
6681-
.create_network();
6682-
6683-
let data = vec![0u8; Config::default_max_transmit_size() - 100];
6684-
let raw_message = RawMessage {
6685-
source: Some(peers[0]),
6686-
data,
6687-
sequence_number: Some(1u64),
6688-
topic: topic_hashes[0].clone(),
6689-
signature: None,
6690-
key: None,
6691-
validated: false,
6692-
};
6693-
6694-
gs.on_connection_handler_event(
6695-
peers[0],
6696-
ConnectionId::new_unchecked(0),
6697-
HandlerEvent::Message {
6698-
rpc: Rpc {
6699-
messages: vec![raw_message],
6700-
subscriptions: vec![],
6701-
control_msgs: vec![],
6702-
},
6703-
invalid_messages: vec![],
6704-
},
6705-
);
6706-
6707-
let event = gs.events.pop_front().expect("Event should be generated");
6708-
match event {
6709-
ToSwarm::GenerateEvent(Event::Message {
6710-
propagation_source,
6711-
message_id: _,
6712-
message,
6713-
}) => {
6714-
assert_eq!(propagation_source, peers[0]);
6715-
assert_eq!(
6716-
message.data.len(),
6717-
Config::default_max_transmit_size() - 100
6718-
);
6719-
}
6720-
ToSwarm::NotifyHandler { peer_id, .. } => {
6721-
assert_eq!(peer_id, peers[0]);
6722-
}
6723-
_ => panic!("Unexpected event"),
6724-
}
6725-
6726-
// Simulate a peer sending a message within the default max_transmit_size (65536 bytes).
6727-
// The codec's max_length allows encoding/decoding the RPC, and max_transmit_sizes confirms
6728-
// the message size is acceptable.
6729-
let mut codec = GossipsubCodec::new(
6730-
Config::default_max_transmit_size() * 2,
6731-
ValidationMode::None,
6732-
HashMap::new(),
6733-
);
6734-
let mut buf = BytesMut::new();
6735-
let rpc = proto::RPC {
6736-
publish: vec![proto::Message {
6737-
from: Some(peers[0].to_bytes()),
6738-
data: Some(vec![0u8; Config::default_max_transmit_size() - 100]),
6739-
seqno: Some(1u64.to_be_bytes().to_vec()),
6740-
topic: topic_hashes[0].to_string(),
6741-
signature: None,
6742-
key: None,
6743-
}],
6744-
subscriptions: vec![],
6745-
control: None,
6746-
};
6747-
codec.encode(rpc, &mut buf).unwrap();
6748-
6749-
let decoded = codec.decode(&mut buf).unwrap().unwrap();
6750-
match decoded {
6751-
HandlerEvent::Message {
6752-
rpc,
6753-
invalid_messages,
6754-
} => {
6755-
assert_eq!(rpc.messages.len(), 1, "One valid message should be present");
6756-
assert!(invalid_messages.is_empty(), "No messages should be invalid");
6757-
assert_eq!(
6758-
rpc.messages[0].data.len(),
6759-
Config::default_max_transmit_size() - 100
6760-
);
6761-
}
6762-
_ => panic!("Unexpected event"),
6763-
}
6764-
}
6765-
67666570
#[test]
67676571
fn test_validation_error_message_size_too_large_topic_specific() {
67686572
let topic = Topic::new("test");

protocols/gossipsub/src/protocol.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use crate::{
3838
ControlAction, Graft, IDontWant, IHave, IWant, MessageId, PeerInfo, PeerKind, Prune,
3939
RawMessage, Rpc, Subscription, SubscriptionAction,
4040
},
41-
Config, ValidationError,
41+
ValidationError,
4242
};
4343

4444
pub(crate) const SIGNING_PREFIX: &[u8] = b"libp2p-pubsub:";
@@ -194,12 +194,9 @@ impl GossipsubCodec {
194194
}
195195
}
196196

197-
/// Get the max transmit size for a given topic, falling back to the default.
198-
fn max_transmit_size_for_topic(&self, topic: &TopicHash) -> usize {
199-
self.max_transmit_sizes
200-
.get(topic)
201-
.copied()
202-
.unwrap_or(Config::default_max_transmit_size())
197+
/// Get the max transmit size for a given topic if it exists.
198+
fn max_transmit_size_for_topic(&self, topic: &TopicHash) -> Option<usize> {
199+
self.max_transmit_sizes.get(topic).copied()
203200
}
204201

205202
/// Verifies a gossipsub message. This returns either a success or failure. All errors
@@ -285,7 +282,10 @@ impl Decoder for GossipsubCodec {
285282
let topic = TopicHash::from_raw(&message.topic);
286283

287284
// Check the message size to ensure it doesn't bypass the configured max.
288-
if message.get_size() > self.max_transmit_size_for_topic(&topic) {
285+
if self
286+
.max_transmit_size_for_topic(&topic)
287+
.is_some_and(|max| message.get_size() > max)
288+
{
289289
let message = RawMessage {
290290
source: None, // don't bother inform the application
291291
data: message.data.unwrap_or_default(),

0 commit comments

Comments
 (0)