Add more plumbing for block processing
This commit is contained in:
		
							parent
							
								
									16bc6ba82a
								
							
						
					
					
						commit
						513972b75c
					
				| @ -1,4 +1,4 @@ | ||||
| use std::sync::{ Arc, RwLock }; | ||||
| use std::sync::Arc; | ||||
| use std::thread; | ||||
| use super::db::{ DB, open_db }; | ||||
| use super::config::LighthouseConfig; | ||||
| @ -13,7 +13,7 @@ use super::sync::run_sync_future; | ||||
| /// Represents the co-ordination of the
 | ||||
| /// networking, syncing and RPC (not-yet-implemented) threads.
 | ||||
| pub struct Client { | ||||
|     pub db: Arc<RwLock<DB>>, | ||||
|     pub db: Arc<DB>, | ||||
|     pub network_thread: thread::JoinHandle<()>, | ||||
|     pub sync_thread: thread::JoinHandle<()>, | ||||
| } | ||||
| @ -30,7 +30,7 @@ impl Client { | ||||
|         // Open the local db
 | ||||
|         let db = { | ||||
|             let db = open_db(&config.data_dir); | ||||
|             Arc::new(RwLock::new(db)) | ||||
|             Arc::new(db) | ||||
|         }; | ||||
| 
 | ||||
|         // Start the network thread
 | ||||
| @ -57,7 +57,7 @@ impl Client { | ||||
|             let (sync_out_sender, sync_out_receiver) = unbounded(); | ||||
|             let (sync_in_sender, sync_in_receiver) = unbounded(); | ||||
|             let sync_log = log.new(o!()); | ||||
|             let sync_db = Arc::clone(&db); | ||||
|             let sync_db = db.clone(); | ||||
|             let thread = thread::spawn(move || { | ||||
|                 run_sync_future( | ||||
|                     sync_db, | ||||
|  | ||||
							
								
								
									
										23
									
								
								lighthouse/sync/block.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								lighthouse/sync/block.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| use super::db::DB; | ||||
| use slog::Logger; | ||||
| 
 | ||||
| pub enum BlockStatus { | ||||
|     Valid, | ||||
|     AlreadyKnown, | ||||
|     TooOld, | ||||
|     TimeInvalid, | ||||
|     UnknownPoWHash, | ||||
|     NoAttestations, | ||||
|     InvalidAttestation, | ||||
|     NotProposerSigned, | ||||
| } | ||||
| 
 | ||||
| pub fn process_unverified_blocks( | ||||
|     _serialized_block: &[u8], | ||||
|     _db: &DB, | ||||
|     _log: Logger) | ||||
| { | ||||
|     //
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -1,12 +0,0 @@ | ||||
| pub enum SyncEventType { | ||||
|     Invalid, | ||||
|     PeerConnect, | ||||
|     PeerDrop, | ||||
|     ReceiveBlocks, | ||||
|     ReceiveAttestationRecords, | ||||
| } | ||||
| 
 | ||||
| pub struct SyncEvent { | ||||
|     event: SyncEventType, | ||||
|     data: Option<Vec<u8>> | ||||
| } | ||||
| @ -3,7 +3,7 @@ extern crate slog; | ||||
| extern crate tokio; | ||||
| extern crate network_libp2p; | ||||
| 
 | ||||
| pub mod messages; | ||||
| pub mod block; | ||||
| pub mod network; | ||||
| pub mod sync_future; | ||||
| pub mod wire_protocol; | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| use std::sync::{ RwLock, Arc }; | ||||
| use std::sync::Arc; | ||||
| use super::db::DB; | ||||
| use slog::Logger; | ||||
| 
 | ||||
| @ -8,7 +8,12 @@ use super::network_libp2p::message::{ | ||||
|     NetworkEventType, | ||||
| }; | ||||
| 
 | ||||
| use super::wire_protocol::{ WireMessageType, message_type }; | ||||
| use super::block::process_unverified_blocks; | ||||
| 
 | ||||
| use super::wire_protocol::{ | ||||
|     WireMessage, | ||||
|     WireMessageHeader, | ||||
| }; | ||||
| 
 | ||||
| use super::futures::sync::mpsc::{ | ||||
|     UnboundedSender, | ||||
| @ -20,7 +25,7 @@ use super::futures::sync::mpsc::{ | ||||
| /// (e.g., libp2p) has an event to push up to the sync process.
 | ||||
| pub fn handle_network_event( | ||||
|     event: NetworkEvent, | ||||
|     db: Arc<RwLock<DB>>, | ||||
|     db: Arc<DB>, | ||||
|     network_tx: UnboundedSender<OutgoingMessage>, | ||||
|     log: Logger) | ||||
|     -> Result<(), ()> | ||||
| @ -34,7 +39,7 @@ pub fn handle_network_event( | ||||
|                 if let Some(data) = event.data { | ||||
|                     handle_network_message( | ||||
|                         data, | ||||
|                         db, | ||||
|                         &db, | ||||
|                         network_tx, | ||||
|                         log) | ||||
|                 } else { | ||||
| @ -51,16 +56,27 @@ pub fn handle_network_event( | ||||
| /// (e.g., libp2p) has sent a message to us.
 | ||||
| fn handle_network_message( | ||||
|     message: Vec<u8>, | ||||
|     _db: Arc<RwLock<DB>>, | ||||
|     db: &DB, | ||||
|     _network_tx: UnboundedSender<OutgoingMessage>, | ||||
|     _log: Logger) | ||||
|     log: Logger) | ||||
|     -> Result<(), ()> | ||||
| { | ||||
|     match message_type(&message) { | ||||
|         Some(WireMessageType::Blocks) => { | ||||
|             // Do something with inbound blocks.
 | ||||
|             Ok(()) | ||||
|     match WireMessage::decode(&message) { | ||||
|         Ok(msg) => { | ||||
|             match msg.header { | ||||
|                 WireMessageHeader::Blocks => { | ||||
|                     process_unverified_blocks( | ||||
|                         msg.body, | ||||
|                         db, | ||||
|                         log | ||||
|                     ); | ||||
|                     Ok(()) | ||||
|                 } | ||||
|                 _ => Ok(()) | ||||
|             } | ||||
|         } | ||||
|         Err(_) => { | ||||
|             return Ok(())  // No need to pass the error back
 | ||||
|         } | ||||
|         _ => Ok(()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -9,7 +9,7 @@ use super::network_libp2p::message::{ | ||||
|     OutgoingMessage, | ||||
| }; | ||||
| use super::network::handle_network_event; | ||||
| use std::sync::{ RwLock, Arc }; | ||||
| use std::sync::Arc; | ||||
| use super::db::DB; | ||||
| use slog::Logger; | ||||
| 
 | ||||
| @ -25,7 +25,7 @@ type SyncReceiver = UnboundedReceiver<Vec<u8>>; | ||||
| /// from the network and the RPC and update
 | ||||
| /// the state.
 | ||||
| pub fn run_sync_future( | ||||
|     db: Arc<RwLock<DB>>, | ||||
|     db: Arc<DB>, | ||||
|     network_tx: NetworkSender, | ||||
|     network_rx: NetworkReceiver, | ||||
|     _sync_tx: SyncSender, | ||||
|  | ||||
| @ -1,4 +1,9 @@ | ||||
| pub enum WireMessageType { | ||||
| pub enum WireMessageDecodeError { | ||||
|     TooShort, | ||||
|     UnknownType, | ||||
| } | ||||
| 
 | ||||
| pub enum WireMessageHeader { | ||||
|     Status, | ||||
|     NewBlockHashes, | ||||
|     GetBlockHashes, | ||||
| @ -8,6 +13,48 @@ pub enum WireMessageType { | ||||
|     NewBlock, | ||||
| } | ||||
| 
 | ||||
| pub struct WireMessage<'a> { | ||||
|     pub header: WireMessageHeader, | ||||
|     pub body: &'a [u8], | ||||
| } | ||||
| 
 | ||||
| impl<'a> WireMessage<'a> { | ||||
|     pub fn decode(bytes: &'a Vec<u8>) | ||||
|         -> Result<Self, WireMessageDecodeError> | ||||
|     { | ||||
|         if let Some((header_byte, body)) = bytes.split_first() { | ||||
|             let header = match header_byte { | ||||
|                 0x06 => Some(WireMessageHeader::Blocks), | ||||
|                 _ => None | ||||
|             }; | ||||
|             match header { | ||||
|                 Some(header) => Ok(Self{header, body}), | ||||
|                 None => Err(WireMessageDecodeError::UnknownType) | ||||
|             } | ||||
|         } else { | ||||
|             Err(WireMessageDecodeError::TooShort) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /* | ||||
| pub fn decode_wire_message(bytes: &[u8]) | ||||
|     -> Result<WireMessage, WireMessageDecodeError> | ||||
| { | ||||
|     if let Some((header_byte, body)) = bytes.split_first() { | ||||
|         let header = match header_byte { | ||||
|             0x06 => Some(WireMessageType::Blocks), | ||||
|             _ => None | ||||
|         }; | ||||
|         match header { | ||||
|             Some(header) => Ok((header, body)), | ||||
|             None => Err(WireMessageDecodeError::UnknownType) | ||||
|         } | ||||
|     } else { | ||||
|         Err(WireMessageDecodeError::TooShort) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /// Determines the message type of some given
 | ||||
| /// message.
 | ||||
| @ -22,3 +69,21 @@ pub fn message_type(message: &Vec<u8>) | ||||
|         _ => None | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub fn identify_wire_protocol_message(message: &Vec<u8>) | ||||
|     -> Result<(WireMessageType, &[u8]), WireMessageDecodeError> | ||||
| { | ||||
|     fn strip_header(v: &Vec<u8>) -> &[u8] { | ||||
|         match v.get(1..v.len()) { | ||||
|             None => &vec![], | ||||
|             Some(s) => s | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     match message.get(0) { | ||||
|         Some(0x06) => Ok((WireMessageType::Blocks, strip_header(message))), | ||||
|         None => Err(WireMessageDecodeError::TooShort), | ||||
|         _ => Err(WireMessageDecodeError::UnknownType), | ||||
|     } | ||||
| } | ||||
| */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user