1use crate::{
5 Address, ToDigest,
6 consensus::{BatchCommitmentValidationReply, BatchCommitmentValidationRequest},
7 ecdsa::{SignedData, VerifiedData},
8};
9use core::hash::Hash;
10use parity_scale_codec::{Decode, Encode};
11use sha3::Keccak256;
12
13pub type ValidatorRequest = ValidatorMessage<BatchCommitmentValidationRequest>;
14pub type ValidatorReply = ValidatorMessage<BatchCommitmentValidationReply>;
15
16#[derive(Debug, Clone, Encode, Decode, Eq, PartialEq, Hash)]
17pub struct ValidatorMessage<T> {
18 pub era_index: u64,
19 pub payload: T,
20}
21
22impl<T: ToDigest> ToDigest for ValidatorMessage<T> {
23 fn update_hasher(&self, hasher: &mut Keccak256) {
24 let Self { era_index, payload } = self;
25 era_index.to_be_bytes().update_hasher(hasher);
26 payload.update_hasher(hasher);
27 }
28}
29
30#[derive(Debug, Clone, Encode, Decode, Eq, PartialEq, derive_more::Unwrap, derive_more::From)]
31pub enum SignedValidatorMessage {
32 RequestBatchValidation(SignedData<ValidatorRequest>),
33 ApproveBatch(SignedData<ValidatorReply>),
34}
35
36impl SignedValidatorMessage {
37 pub fn into_verified(self) -> VerifiedValidatorMessage {
38 match self {
39 SignedValidatorMessage::RequestBatchValidation(request) => {
40 request.into_verified().into()
41 }
42 SignedValidatorMessage::ApproveBatch(reply) => reply.into_verified().into(),
43 }
44 }
45}
46
47#[cfg_attr(feature = "serde", derive(Hash))]
48#[derive(Debug, Clone, Eq, PartialEq, derive_more::Unwrap, derive_more::From)]
49pub enum VerifiedValidatorMessage {
50 RequestBatchValidation(VerifiedData<ValidatorRequest>),
51 ApproveBatch(VerifiedData<ValidatorReply>),
52}
53
54impl VerifiedValidatorMessage {
55 pub fn era_index(&self) -> u64 {
56 match self {
57 VerifiedValidatorMessage::RequestBatchValidation(request) => request.data().era_index,
58 VerifiedValidatorMessage::ApproveBatch(reply) => reply.data().era_index,
59 }
60 }
61
62 pub fn address(&self) -> Address {
63 match self {
64 VerifiedValidatorMessage::RequestBatchValidation(request) => request.address(),
65 VerifiedValidatorMessage::ApproveBatch(reply) => reply.address(),
66 }
67 }
68}