tendermint/abci/request/
begin_block.rs

1// bring into scope for doc links
2#[allow(unused)]
3use super::DeliverTx;
4use crate::{
5    abci::types::{CommitInfo, Misbehavior},
6    block,
7    prelude::*,
8    Hash,
9};
10
11#[doc = include_str!("../doc/request-beginblock.md")]
12#[derive(Clone, PartialEq, Eq, Debug)]
13pub struct BeginBlock {
14    /// The block's hash.
15    ///
16    /// This can be derived from the block header.
17    pub hash: Hash,
18    /// The block header.
19    pub header: block::Header,
20    /// Information about the last commit.
21    ///
22    /// This includes the round, the list of validators, and which validators
23    /// signed the last block.
24    pub last_commit_info: CommitInfo,
25    /// Evidence of validator misbehavior.
26    pub byzantine_validators: Vec<Misbehavior>,
27}
28
29// =============================================================================
30// Protobuf conversions
31// =============================================================================
32
33mod v0_34 {
34    use super::BeginBlock;
35    use crate::Error;
36    use tendermint_proto::v0_34 as pb;
37    use tendermint_proto::Protobuf;
38
39    impl From<BeginBlock> for pb::abci::RequestBeginBlock {
40        fn from(begin_block: BeginBlock) -> Self {
41            Self {
42                hash: begin_block.hash.into(),
43                header: Some(begin_block.header.into()),
44                last_commit_info: Some(begin_block.last_commit_info.into()),
45                byzantine_validators: begin_block
46                    .byzantine_validators
47                    .into_iter()
48                    .map(Into::into)
49                    .collect(),
50            }
51        }
52    }
53
54    impl TryFrom<pb::abci::RequestBeginBlock> for BeginBlock {
55        type Error = Error;
56
57        fn try_from(begin_block: pb::abci::RequestBeginBlock) -> Result<Self, Self::Error> {
58            Ok(Self {
59                hash: begin_block.hash.try_into()?,
60                header: begin_block
61                    .header
62                    .ok_or_else(Error::missing_header)?
63                    .try_into()?,
64                last_commit_info: begin_block
65                    .last_commit_info
66                    .ok_or_else(Error::missing_last_commit_info)?
67                    .try_into()?,
68                byzantine_validators: begin_block
69                    .byzantine_validators
70                    .into_iter()
71                    .map(TryInto::try_into)
72                    .collect::<Result<_, _>>()?,
73            })
74        }
75    }
76
77    impl Protobuf<pb::abci::RequestBeginBlock> for BeginBlock {}
78}
79
80mod v0_37 {
81    use super::BeginBlock;
82    use crate::Error;
83    use tendermint_proto::v0_37 as pb;
84    use tendermint_proto::Protobuf;
85
86    impl From<BeginBlock> for pb::abci::RequestBeginBlock {
87        fn from(begin_block: BeginBlock) -> Self {
88            Self {
89                hash: begin_block.hash.into(),
90                header: Some(begin_block.header.into()),
91                last_commit_info: Some(begin_block.last_commit_info.into()),
92                byzantine_validators: begin_block
93                    .byzantine_validators
94                    .into_iter()
95                    .map(Into::into)
96                    .collect(),
97            }
98        }
99    }
100
101    impl TryFrom<pb::abci::RequestBeginBlock> for BeginBlock {
102        type Error = Error;
103
104        fn try_from(begin_block: pb::abci::RequestBeginBlock) -> Result<Self, Self::Error> {
105            Ok(Self {
106                hash: begin_block.hash.try_into()?,
107                header: begin_block
108                    .header
109                    .ok_or_else(Error::missing_header)?
110                    .try_into()?,
111                last_commit_info: begin_block
112                    .last_commit_info
113                    .ok_or_else(Error::missing_last_commit_info)?
114                    .try_into()?,
115                byzantine_validators: begin_block
116                    .byzantine_validators
117                    .into_iter()
118                    .map(TryInto::try_into)
119                    .collect::<Result<_, _>>()?,
120            })
121        }
122    }
123
124    impl Protobuf<pb::abci::RequestBeginBlock> for BeginBlock {}
125}