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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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,
contract_event::ContractEvent,
transaction::{Transaction, TransactionStatus},
};
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(),
)
}
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(),
),
signature: self.compute_result().signature().clone(),
}
}
pub fn transactions_to_commit(&self) -> Vec<Transaction> {
if self.block.block_data().is_reconfiguration_suffix() {
return vec![];
}
itertools::zip_eq(
self.block.transactions_to_execute(),
self.state_compute_result.compute_status(),
)
.filter_map(|(txn, status)| match status {
TransactionStatus::Keep(_) => Some(txn),
_ => None,
})
.collect()
}
pub fn reconfig_event(&self) -> Vec<ContractEvent> {
if self.block.block_data().is_reconfiguration_suffix() {
return vec![];
}
self.state_compute_result.reconfig_events().to_vec()
}
}