Skip to main content

tenzro_network/
lib.rs

1//! P2P networking layer for Tenzro Network
2//!
3//! This crate provides the networking infrastructure for Tenzro Network,
4//! an AI-Native, Agentic, Tokenized Settlement Layer blockchain.
5//!
6//! # Overview
7//!
8//! The networking layer is built on libp2p and provides:
9//!
10//! - **Gossipsub**: Pub/sub messaging for blocks, transactions, and consensus
11//! - **Kademlia DHT**: Peer discovery and routing
12//! - **Identify**: Peer information exchange
13//! - **Ping**: Connection health monitoring
14//!
15//! # Architecture
16//!
17//! The network service runs an event loop in a background task and communicates
18//! with the rest of the node through async channels. This allows the networking
19//! layer to be decoupled from the rest of the application.
20//!
21//! # Example
22//!
23//! ```no_run
24//! use tenzro_network::{NetworkService, TenzroNetworkService, NetworkConfig, NetworkMessage, MessagePayload};
25//!
26//! # async fn example() -> tenzro_network::Result<()> {
27//! // Create network service
28//! let config = NetworkConfig::testnet();
29//! let network = TenzroNetworkService::new(config).await?;
30//!
31//! // Subscribe to blocks
32//! let mut blocks_rx = network.subscribe("tenzro/blocks").await?;
33//!
34//! // Broadcast a message
35//! let message = NetworkMessage::new(MessagePayload::Ping);
36//! network.broadcast("tenzro/status", message).await?;
37//!
38//! // Receive messages
39//! tokio::spawn(async move {
40//!     while let Some(msg) = blocks_rx.recv().await {
41//!         println!("Received block message: {:?}", msg);
42//!     }
43//! });
44//!
45//! # Ok(())
46//! # }
47//! ```
48//!
49//! # Topics
50//!
51//! The network uses gossipsub topics for different message types:
52//!
53//! - `tenzro/blocks` - Block propagation
54//! - `tenzro/transactions` - Transaction propagation
55//! - `tenzro/consensus` - Consensus messages
56//! - `tenzro/attestations` - TEE attestations
57//! - `tenzro/models` - Model registrations
58//! - `tenzro/inference` - Inference requests/responses
59//! - `tenzro/status` - Status and discovery messages
60//!
61//! For testnet and mainnet, topics are prefixed accordingly:
62//! - Testnet: `tenzro/testnet/blocks/1.0.0`
63//! - Mainnet: `tenzro/mainnet/blocks/1.0.0`
64
65pub mod behaviour;
66pub mod block_sync_proto;
67pub mod config;
68pub mod consensus_direct_proto;
69pub mod discovery;
70pub mod error;
71pub mod gossip;
72pub mod message;
73pub mod metrics;
74pub mod mpc_relay;
75pub mod peer_manager;
76pub mod peer_status;
77pub mod service;
78pub mod transport;
79
80// Re-export commonly used types
81pub use behaviour::{TenzroBehaviour, TenzroNetwork};
82pub use block_sync_proto::{
83    BlockSyncBehaviour, BlockSyncError, BlockSyncRequest, BlockSyncResponse,
84    BLOCK_SYNC_PROTOCOL, MAX_BLOCKS_PER_RANGE, MAX_BLOCK_HASHES_PER_REQUEST,
85    MAX_INBOUND_STREAMS_PER_PEER, MAX_INFLIGHT_REQUESTS_PER_PEER,
86};
87pub use consensus_direct_proto::{
88    ConsensusDirectBehaviour, ConsensusDirectError, ConsensusDirectRequest,
89    ConsensusDirectResponse, CONSENSUS_DIRECT_PROTOCOL,
90};
91pub use mpc_relay::{
92    session_topic as mpc_session_topic, MpcDidResolver, MpcRelayBehaviour, MpcRelayError,
93    MpcRelayRequest, MpcRelayResponse, MPC_RELAY_GOSSIP_TOPIC_PREFIX, MPC_RELAY_PROTOCOL,
94};
95pub use config::NetworkConfig;
96pub use discovery::{BootstrapConfig, DiscoveryConfig, ProviderType};
97pub use error::{NetworkError, Result};
98pub use gossip::{GossipTopics, MessageDeduplicator, MessageValidation, TopicSubscriptions};
99pub use metrics::NetworkMetrics;
100pub use message::{
101    AgentAnnouncementMessage, AttestationMessage, ConsensusMessage, InferenceRequestMessage,
102    InferenceResponseMessage, MessagePayload, ModelRegistrationMessage, ModelSchedule,
103    NetworkMessage, PaymentDetails, PricingInfo, ProviderAnnouncementMessage, StatusMessage,
104    VoteType,
105};
106pub use peer_manager::{ManagedPeer, PeerManager, PeerManagerStats, ValidatorRegistry, VALIDATOR_ONLY_TOPICS};
107pub use peer_status::{PeerStatus as PeerChainStatus, PeerStatusTracker, DEFAULT_FRESHNESS};
108pub use service::{
109    BlockSyncOutboundError, InboundBlockSync, NetworkService, OutboundBlockSyncResult,
110    PeerEvent, TenzroNetworkService,
111};
112
113// Re-export libp2p types that are commonly used
114pub use libp2p::request_response::{InboundRequestId, OutboundRequestId};
115pub use libp2p::{Multiaddr, PeerId};
116
117#[cfg(test)]
118mod tests {
119    use super::*;
120
121    #[test]
122    fn test_config_validation() {
123        let config = NetworkConfig::default();
124        assert!(config.validate().is_ok());
125
126        let invalid_config = NetworkConfig {
127            listen_addresses: vec![],
128            ..Default::default()
129        };
130        assert!(invalid_config.validate().is_err());
131    }
132
133    #[test]
134    fn test_message_serialization() {
135        let msg = NetworkMessage::new(MessagePayload::Ping);
136        let bytes = msg.to_bytes().unwrap();
137        let decoded = NetworkMessage::from_bytes(&bytes).unwrap();
138
139        assert_eq!(msg.message_id, decoded.message_id);
140        assert_eq!(msg.timestamp, decoded.timestamp);
141    }
142
143    #[tokio::test]
144    async fn test_network_service_creation() {
145        let config = NetworkConfig::local();
146        let result = TenzroNetworkService::new(config).await;
147        assert!(result.is_ok());
148    }
149}