use super::{request::*, state::*, *};
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct BlockSyncBlockMeta {
pub height: block::Height,
pub hash: block::Hash,
pub size: BlockSizeEstimate,
}
#[derive(Clone, Debug)]
pub enum BlockSyncEvent {
PeerConnected(BlockSyncPeerSession),
PeerDisconnected(ZakuraPeerId),
HeaderTipChanged {
height: block::Height,
hash: block::Hash,
},
StateFrontiersChanged(BlockSyncFrontiers),
ChainTipGrow(BlockSyncFrontiers),
ChainTipReset(BlockSyncFrontiers),
NeededBlocks(Vec<BlockSyncBlockMeta>),
BlockApplyFinished {
token: BlockApplyToken,
height: block::Height,
hash: block::Hash,
result: BlockApplyResult,
local_frontier: Option<BlockSyncFrontiers>,
},
BlockRangeResponseFinished {
peer: ZakuraPeerId,
start_height: block::Height,
requested_count: u32,
returned_count: u32,
},
BlockRangeResponseReady {
peer: ZakuraPeerId,
start_height: block::Height,
requested_count: u32,
blocks: Vec<(block::Height, Arc<block::Block>, usize)>,
},
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum BlockApplyResult {
Committed,
Duplicate,
Rejected,
TimedOut,
}
pub type BlockApplyToken = u64;
#[derive(Clone, Debug)]
pub enum BlockSyncAction {
QueryNeededBlocks {
from: block::Height,
limit: u32,
best_header_tip: block::Height,
},
QueryBlocksByHeightRange {
peer: ZakuraPeerId,
start: block::Height,
count: u32,
},
SubmitBlock {
token: BlockApplyToken,
block: Arc<block::Block>,
},
Misbehavior {
peer: ZakuraPeerId,
reason: BlockSyncMisbehavior,
},
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum BlockSyncMisbehavior {
MalformedMessage,
UnsolicitedBlock,
GetBlocksTooLong,
GetBlocksSpam,
InvalidBlock,
SizeMismatch,
InvalidStatus,
UnsolicitedDone,
RangeUnavailable,
StatusSpam,
}
#[derive(Clone, Debug)]
pub(super) enum RoutineToReactor {
StatusReceived {
peer: ZakuraPeerId,
send_reply: bool,
},
ServeGetBlocks {
peer: ZakuraPeerId,
start_height: block::Height,
count: u32,
},
RequeryNeeded,
Misbehavior {
peer: ZakuraPeerId,
reason: BlockSyncMisbehavior,
},
}