fuel_core_p2p/gossipsub/
topics.rsuse libp2p::gossipsub::{
Sha256Topic,
Topic,
TopicHash,
};
use super::messages::{
GossipTopicTag,
GossipsubBroadcastRequest,
};
pub const NEW_TX_GOSSIP_TOPIC: &str = "new_tx";
#[derive(Debug)]
pub struct GossipsubTopics {
new_tx_topic: TopicHash,
}
impl GossipsubTopics {
pub fn new(network_name: &str) -> Self {
let new_tx_topic: Sha256Topic =
Topic::new(format!("{NEW_TX_GOSSIP_TOPIC}/{network_name}"));
Self {
new_tx_topic: new_tx_topic.hash(),
}
}
pub fn get_gossipsub_tag(
&self,
incoming_topic: &TopicHash,
) -> Option<GossipTopicTag> {
match incoming_topic {
hash if hash == &self.new_tx_topic => Some(GossipTopicTag::NewTx),
_ => None,
}
}
pub fn get_gossipsub_topic_hash(
&self,
outgoing_request: &GossipsubBroadcastRequest,
) -> TopicHash {
match outgoing_request {
GossipsubBroadcastRequest::NewTx(_) => self.new_tx_topic.clone(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use fuel_core_types::fuel_tx::Transaction;
use libp2p::gossipsub::Topic;
use std::sync::Arc;
#[test]
fn test_gossipsub_topics() {
let network_name = "fuel_test_network";
let new_tx_topic: Sha256Topic =
Topic::new(format!("{NEW_TX_GOSSIP_TOPIC}/{network_name}"));
let gossipsub_topics = GossipsubTopics::new(network_name);
assert_eq!(gossipsub_topics.new_tx_topic, new_tx_topic.hash());
assert_eq!(
gossipsub_topics.get_gossipsub_tag(&new_tx_topic.hash()),
Some(GossipTopicTag::NewTx)
);
let broadcast_req =
GossipsubBroadcastRequest::NewTx(Arc::new(Transaction::default_test_tx()));
assert_eq!(
gossipsub_topics.get_gossipsub_topic_hash(&broadcast_req),
new_tx_topic.hash()
);
}
}