1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
use crate::sm::Msg; /// Message container holding received messages /// /// Trait only purpose is to pin [MessageStore] constructing this container pub trait MessageContainer { type Store: MessageStore; } /// Accumulates messages received from other parties /// /// StateMachine implementations need to handle incoming messages: they need to store messages /// somewhere until sufficient messages received, incoming messages needs to be pre-validated /// (haven't we received message from this party at this round? is it a p2p message, as we expected? /// and so on). MessageStore encapsulates all this boilerplate. pub trait MessageStore { /// Message body type M; /// Error type type Err; /// Resulting messages container holding received messages type Output; /// Pushes received message to store /// /// Might result in error if pre-validation failed. However, it does not /// prevent MessageStore from accepting further messages. fn push_msg(&mut self, msg: Msg<Self::M>) -> Result<(), Self::Err>; /// Indicates if store contains message from this party fn contains_msg_from(&self, sender: u16) -> bool; /// Indicates whether store needs more messages to receive fn wants_more(&self) -> bool; /// Returns resulting messages container /// /// Returns error if store needs more messages (see [wants_more](Self::wants_more)). fn finish(self) -> Result<Self::Output, Self::Err>; /// Retrieve uncooperative parties /// /// Returns how many more messages we expected to receive and list of parties who didn't send /// a message fn blame(&self) -> (u16, Vec<u16>); }