use crate::error::Result;
use crate::voter::Vote;
use async_trait::async_trait;
use tenzro_types::block::Block;
use tenzro_types::primitives::BlockHeight;
use tenzro_types::transaction::Transaction;
#[async_trait]
pub trait ConsensusEngine: Send + Sync {
async fn start(&mut self) -> Result<()>;
async fn stop(&mut self) -> Result<()>;
async fn propose_block(&self, transactions: Vec<Transaction>) -> Result<Block>;
async fn on_proposal(
&self,
block: &Block,
timeout_certificate: Option<crate::timeout::TimeoutCertificate>,
no_endorsement_certificate: Option<crate::timeout::NoEndorsementCertificate>,
proposer_high_qc_view: u64,
) -> Result<Vote>;
async fn on_vote(&self, vote: &Vote) -> Result<()>;
async fn finalized_height(&self) -> BlockHeight;
async fn is_leader(&self) -> bool;
}
#[async_trait]
pub trait ConsensusNetwork: Send + Sync {
async fn broadcast_proposal(&self, block: &Block) -> Result<()>;
async fn send_vote(&self, vote: &Vote) -> Result<()>;
async fn broadcast_vote(&self, vote: &Vote) -> Result<()>;
}
pub trait SlashingCallback: Send + Sync {
fn report_equivocation(
&self,
validator: &tenzro_types::primitives::Address,
view: u64,
evidence: &crate::validator::EquivocationEvidence,
);
}
#[async_trait]
pub trait StateManager: Send + Sync {
async fn execute_block(&self, block: &Block) -> Result<tenzro_types::primitives::Hash>;
async fn validate_block(&self, block: &Block) -> Result<()>;
async fn commit_block(&self, block: &Block) -> Result<()>;
async fn state_root(&self) -> tenzro_types::primitives::Hash;
}