1use async_trait::async_trait;
2use hopr_crypto_packet::prelude::PacketSignals;
3pub use hopr_crypto_packet::{HoprSurb, prelude::HoprSenderId};
4use hopr_crypto_types::prelude::*;
5use hopr_internal_types::prelude::*;
6use hopr_network_types::prelude::{ResolvedTransportRouting, SurbMatcher};
7use hopr_primitive_types::balance::HoprBalance;
8
9use crate::errors::Result;
10
11#[derive(Debug)]
13pub struct FoundSurb {
14 pub sender_id: HoprSenderId,
16 pub surb: HoprSurb,
18 pub remaining: usize,
20}
21
22#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd)]
24pub struct SurbCacheConfig {
25 pub rb_capacity: usize,
27 pub distress_threshold: usize,
30}
31
32#[async_trait]
34pub trait HoprDbProtocolOperations {
35 async fn handle_acknowledgement(&self, ack: VerifiedAcknowledgement) -> Result<()>;
42
43 async fn get_network_winning_probability(&self) -> Result<WinningProbability>;
45
46 async fn get_network_ticket_price(&self) -> Result<HoprBalance>;
48
49 async fn find_surb(&self, matcher: SurbMatcher) -> Result<FoundSurb>;
51
52 fn get_surb_config(&self) -> SurbCacheConfig;
54
55 async fn to_send_no_ack(&self, data: Box<[u8]>, destination: OffchainPublicKey) -> Result<OutgoingPacket>;
57
58 async fn to_send(
60 &self,
61 data: Box<[u8]>,
62 routing: ResolvedTransportRouting,
63 outgoing_ticket_win_prob: WinningProbability,
64 outgoing_ticket_price: HoprBalance,
65 signals: PacketSignals,
66 ) -> Result<OutgoingPacket>;
67
68 #[allow(clippy::wrong_self_convention)]
70 async fn from_recv(
71 &self,
72 data: Box<[u8]>,
73 pkt_keypair: &OffchainKeypair,
74 sender: OffchainPublicKey,
75 outgoing_ticket_win_prob: WinningProbability,
76 outgoing_ticket_price: HoprBalance,
77 ) -> Result<IncomingPacket>;
78}
79
80#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
82pub struct AuxiliaryPacketInfo {
83 pub packet_signals: PacketSignals,
87 pub num_surbs: usize,
89}
90
91#[allow(clippy::large_enum_variant)] pub enum IncomingPacket {
93 Final {
95 packet_tag: PacketTag,
96 previous_hop: OffchainPublicKey,
97 sender: HoprPseudonym,
98 plain_text: Box<[u8]>,
99 ack_key: HalfKey,
100 info: AuxiliaryPacketInfo,
101 },
102 Forwarded {
104 packet_tag: PacketTag,
105 previous_hop: OffchainPublicKey,
106 next_hop: OffchainPublicKey,
107 data: Box<[u8]>,
108 ack_key: HalfKey,
110 },
111 Acknowledgement {
113 packet_tag: PacketTag,
114 previous_hop: OffchainPublicKey,
115 ack: Acknowledgement,
116 },
117}
118
119pub struct OutgoingPacket {
121 pub next_hop: OffchainPublicKey,
122 pub ack_challenge: HalfKeyChallenge,
123 pub data: Box<[u8]>,
124}
125
126impl std::fmt::Debug for OutgoingPacket {
127 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
128 f.debug_struct("OutgoingPacket")
129 .field("next_hop", &self.next_hop)
130 .field("ack_challenge", &self.ack_challenge)
131 .finish_non_exhaustive()
132 }
133}
134
135#[allow(clippy::large_enum_variant)] pub enum ResolvedAcknowledgement {
137 Sending(VerifiedAcknowledgement),
138 RelayingWin(AcknowledgedTicket),
139 RelayingLoss(Hash),
140}