use std::{
collections::HashMap,
fmt::{self, Display, Formatter},
};
use serde::Serialize;
use casper_types::{ExecutionResult, PublicKey};
use crate::{
components::{consensus::EraId, deploy_acceptor::Error, small_network::GossipedAddress},
effect::Responder,
types::{
Block, BlockHash, BlockHeader, Deploy, DeployHash, DeployHeader, FinalitySignature,
FinalizedBlock, Item, Timestamp,
},
utils::Source,
};
#[derive(Debug, Serialize)]
#[must_use]
pub enum NetworkAnnouncement<I, P> {
MessageReceived {
sender: I,
payload: P,
},
GossipOurAddress(GossipedAddress),
NewPeer(I),
}
impl<I, P> Display for NetworkAnnouncement<I, P>
where
I: Display,
P: Display,
{
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
NetworkAnnouncement::MessageReceived { sender, payload } => {
write!(formatter, "received from {}: {}", sender, payload)
}
NetworkAnnouncement::GossipOurAddress(_) => write!(formatter, "gossip our address"),
NetworkAnnouncement::NewPeer(id) => {
write!(formatter, "new peer connection established to {}", id)
}
}
}
}
#[derive(Debug, Serialize)]
#[must_use]
pub enum RpcServerAnnouncement {
DeployReceived {
deploy: Box<Deploy>,
responder: Option<Responder<Result<(), Error>>>,
},
}
impl Display for RpcServerAnnouncement {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
RpcServerAnnouncement::DeployReceived { deploy, .. } => {
write!(formatter, "api server received {}", deploy.id())
}
}
}
}
#[derive(Debug, Serialize)]
pub enum DeployAcceptorAnnouncement<I> {
AcceptedNewDeploy {
deploy: Box<Deploy>,
source: Source<I>,
},
InvalidDeploy {
deploy: Box<Deploy>,
source: Source<I>,
},
}
impl<I: Display> Display for DeployAcceptorAnnouncement<I> {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
DeployAcceptorAnnouncement::AcceptedNewDeploy { deploy, source } => write!(
formatter,
"accepted new deploy {} from {}",
deploy.id(),
source
),
DeployAcceptorAnnouncement::InvalidDeploy { deploy, source } => {
write!(formatter, "invalid deploy {} from {}", deploy.id(), source)
}
}
}
}
#[derive(Debug)]
pub enum ConsensusAnnouncement<I> {
Finalized(Box<FinalizedBlock>),
Handled(Box<BlockHeader>),
Fault {
era_id: EraId,
public_key: Box<PublicKey>,
timestamp: Timestamp,
},
DisconnectFromPeer(I),
}
impl<I> Display for ConsensusAnnouncement<I>
where
I: Display,
{
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
ConsensusAnnouncement::Finalized(block) => {
write!(formatter, "finalized proto block {}", block)
}
ConsensusAnnouncement::Handled(block_header) => write!(
formatter,
"Linear chain block has been handled by consensus, height={}, hash={}",
block_header.height(),
block_header.hash()
),
ConsensusAnnouncement::Fault {
era_id,
public_key,
timestamp,
} => write!(
formatter,
"Validator fault with public key: {} has been identified at time: {} in era: {}",
public_key, timestamp, era_id,
),
ConsensusAnnouncement::DisconnectFromPeer(peer) => {
write!(formatter, "Consensus wanting to disconnect from {}", peer)
}
}
}
}
#[derive(Debug)]
pub enum BlockExecutorAnnouncement {
LinearChainBlock {
block: Block,
execution_results: HashMap<DeployHash, (DeployHeader, ExecutionResult)>,
},
}
impl Display for BlockExecutorAnnouncement {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
BlockExecutorAnnouncement::LinearChainBlock { block, .. } => {
write!(f, "created linear chain block {}", block.hash())
}
}
}
}
#[derive(Debug)]
pub enum GossiperAnnouncement<T: Item> {
NewCompleteItem(T::Id),
}
impl<T: Item> Display for GossiperAnnouncement<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
GossiperAnnouncement::NewCompleteItem(item) => write!(f, "new complete item {}", item),
}
}
}
#[derive(Debug)]
pub enum LinearChainAnnouncement {
BlockAdded {
block_hash: BlockHash,
block_header: Box<BlockHeader>,
},
NewFinalitySignature(Box<FinalitySignature>),
}
impl Display for LinearChainAnnouncement {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
LinearChainAnnouncement::BlockAdded { block_hash, .. } => {
write!(f, "block added {}", block_hash)
}
LinearChainAnnouncement::NewFinalitySignature(fs) => {
write!(f, "new finality signature {}", fs.block_hash)
}
}
}
}