Skip to main content

ethexe_common/
network.rs

1// Copyright (C) Gear Technologies Inc.
2// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
3
4use 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}