hopr_transport_protocol/ack/
processor.rs

1use tracing::trace;
2
3use hopr_crypto_types::prelude::*;
4pub use hopr_db_api::protocol::AckResult;
5use hopr_db_api::protocol::HoprDbProtocolOperations;
6use hopr_internal_types::prelude::*;
7use hopr_transport_identity::PeerId;
8
9use crate::errors::{ProtocolError, Result};
10
11/// Implements protocol acknowledgement logic for acknowledgements
12#[derive(Clone)]
13pub struct AcknowledgementProcessor<Db: HoprDbProtocolOperations> {
14    db: Db,
15    chain_key: ChainKeypair,
16}
17
18impl<Db: HoprDbProtocolOperations> AcknowledgementProcessor<Db> {
19    pub fn new(db: Db, chain_key: &ChainKeypair) -> Self {
20        Self {
21            db,
22            chain_key: chain_key.clone(),
23        }
24    }
25
26    /// Processes the outgoing acknowledgement.
27    #[inline]
28    #[tracing::instrument(level = "debug", skip(self, ack))]
29    pub async fn send(&self, peer: &PeerId, ack: Acknowledgement) -> Acknowledgement {
30        ack
31    }
32
33    /// Processes the incoming acknowledgement.
34    #[tracing::instrument(level = "debug", skip(self, ack))]
35    pub async fn recv(&self, peer: &PeerId, mut ack: Acknowledgement) -> Result<AckResult> {
36        let remote_pk = OffchainPublicKey::try_from(peer)?;
37        if !ack.validate(&remote_pk) {
38            tracing::error!("Failed to verify signature on received acknowledgement");
39            return Err(ProtocolError::InvalidSignature);
40        };
41
42        self.db.handle_acknowledgement(ack, &self.chain_key).await.map_err(|e| {
43            trace!(error = %e, "Failed to process a received acknowledgement");
44            let error: ProtocolError = e.into();
45            error
46        })
47    }
48}