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
// Copyright (c) The Diem Core Contributors
// SPDX-License-Identifier: Apache-2.0
// Copyright 2021 Conflux Foundation. All rights reserved.
// Conflux is free software and distributed under GNU General Public License.
// See http://www.gnu.org/licenses/
use crate::{sync_info::SyncInfo, vote::Vote};
use anyhow::ensure;
use diem_crypto::HashValue;
use diem_types::validator_verifier::ValidatorVerifier;
use serde::{Deserialize, Serialize};
use std::fmt::{Display, Formatter};
/// VoteMsg is the struct that is ultimately sent by the voter in response for
/// receiving a proposal.
/// VoteMsg carries the `LedgerInfo` of a block that is going to be committed in
/// case this vote is gathers QuorumCertificate (see the detailed explanation in
/// the comments of `LedgerInfo`).
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq)]
pub struct VoteMsg {
/// The container for the vote (VoteData, LedgerInfo, Signature)
vote: Vote,
/// Sync info carries information about highest QC, TC and LedgerInfo
sync_info: SyncInfo,
}
impl Display for VoteMsg {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
write!(f, "VoteMsg: [{}]", self.vote,)
}
}
impl VoteMsg {
pub fn new(vote: Vote, sync_info: SyncInfo) -> Self {
Self { vote, sync_info }
}
/// Container for actual voting material
pub fn vote(&self) -> &Vote { &self.vote }
/// SyncInfo of the given vote message
pub fn sync_info(&self) -> &SyncInfo { &self.sync_info }
pub fn epoch(&self) -> u64 { self.vote.epoch() }
pub fn proposed_block_id(&self) -> HashValue {
self.vote.vote_data().proposed().id()
}
pub fn verify(&self, validator: &ValidatorVerifier) -> anyhow::Result<()> {
ensure!(
self.vote().epoch() == self.sync_info.epoch(),
"VoteMsg has different epoch"
);
// We're not verifying SyncInfo here yet: we are going to verify it only
// in case we need it. This way we avoid verifying O(n) SyncInfo
// messages while aggregating the votes (O(n^2) signature
// verifications).
self.vote().verify(validator)
}
}