use crate::{
block::Block,
common::{Payload, Round},
quorum_cert::QuorumCert,
vote_proposal::{MaybeSignedVoteProposal, VoteProposal},
};
use diem_crypto::hash::HashValue;
use diem_types::block_info::BlockInfo;
use executor_types::StateComputeResult;
use std::fmt::{Debug, Display, Formatter};
#[derive(Clone, Eq, PartialEq)]
pub struct ExecutedBlock {
block: Block,
state_compute_result: StateComputeResult,
}
impl Debug for ExecutedBlock {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
write!(f, "{}", self)
}
}
impl Display for ExecutedBlock {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
write!(f, "{}", self.block())
}
}
impl ExecutedBlock {
pub fn new(block: Block, state_compute_result: StateComputeResult) -> Self {
Self {
block,
state_compute_result,
}
}
pub fn block(&self) -> &Block { &self.block }
pub fn id(&self) -> HashValue { self.block().id() }
pub fn epoch(&self) -> u64 { self.block.epoch() }
pub fn payload(&self) -> Option<&Payload> { self.block().payload() }
pub fn parent_id(&self) -> HashValue {
self.quorum_cert().certified_block().id()
}
pub fn quorum_cert(&self) -> &QuorumCert { self.block().quorum_cert() }
pub fn round(&self) -> Round { self.block().round() }
pub fn timestamp_usecs(&self) -> u64 { self.block().timestamp_usecs() }
pub fn compute_result(&self) -> &StateComputeResult {
&self.state_compute_result
}
pub fn block_info(&self) -> BlockInfo {
self.block().gen_block_info(
self.compute_result().root_hash(),
self.compute_result().version(),
self.compute_result().epoch_state().clone(),
self.compute_result().pivot_decision().clone(),
)
}
pub fn maybe_signed_vote_proposal(&self) -> MaybeSignedVoteProposal {
MaybeSignedVoteProposal {
vote_proposal: VoteProposal::new(
self.compute_result().extension_proof(),
self.block.clone(),
self.compute_result().epoch_state().clone(),
self.compute_result().pivot_decision().clone(),
),
signature: self.compute_result().signature().clone(),
}
}
}