protocol_privmsg2.rs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. use std::collections::VecDeque;
  2. use async_std::sync::{Arc, Mutex};
  3. use async_trait::async_trait;
  4. use darkfi_serial::{SerialDecodable, SerialEncodable};
  5. use fxhash::FxHashMap;
  6. use log::debug;
  7. use rand::{rngs::OsRng, RngCore};
  8. use smol::Executor;
  9. use darkfi::{net, util::async_util::sleep, Result};
  10. use crate::{
  11. model::{Event, EventId, Model},
  12. settings::get_current_time,
  13. };
  14. const UNREAD_EVENT_EXPIRE_TIME: u64 = 3600; // in seconds
  15. const SIZE_OF_SEEN_BUFFER: usize = 65536;
  16. const MAX_CONFIRM: u8 = 4;
  17. #[derive(Default, Clone)]
  18. struct RingBuffer<T> {
  19. pub items: VecDeque<T>,
  20. }
  21. impl<T: Eq + PartialEq + Clone> RingBuffer<T> {
  22. pub fn new(capacity: usize) -> Self {
  23. let items = VecDeque::with_capacity(capacity);
  24. Self { items }
  25. }
  26. pub fn push(&mut self, val: T) {
  27. if self.items.len() == self.items.capacity() {
  28. self.items.pop_front();
  29. }
  30. self.items.push_back(val);
  31. }
  32. pub fn contains(&self, val: &T) -> bool {
  33. self.items.contains(val)
  34. }
  35. }
  36. type InvId = u64;
  37. #[derive(SerialEncodable, SerialDecodable, Clone, Debug, PartialEq, Eq, Hash)]
  38. struct InvItem {
  39. id: InvId,
  40. hash: EventId,
  41. }
  42. #[derive(SerialDecodable, SerialEncodable, Clone, Debug)]
  43. struct Inv {
  44. invs: Vec<InvItem>,
  45. }
  46. #[derive(SerialDecodable, SerialEncodable, Clone, Debug)]
  47. struct SyncEvent {
  48. leaves: Vec<EventId>,
  49. }
  50. #[derive(SerialDecodable, SerialEncodable, Clone, Debug)]
  51. struct GetData {
  52. events: Vec<EventId>,
  53. }
  54. #[derive(Default)]
  55. pub struct Seen<T> {
  56. seen: Mutex<RingBuffer<T>>,
  57. }
  58. impl<T: Eq + PartialEq + Clone> Seen<T> {
  59. pub fn new() -> Self {
  60. Self { seen: Mutex::new(RingBuffer::new(SIZE_OF_SEEN_BUFFER)) }
  61. }
  62. pub async fn push(&self, item: &T) -> bool {
  63. let seen = &mut self.seen.lock().await;
  64. if !seen.contains(item) {
  65. seen.push(item.clone());
  66. return true
  67. }
  68. false
  69. }
  70. }
  71. #[derive(Default)]
  72. pub struct UnreadEvents {
  73. events: FxHashMap<EventId, Event>,
  74. }
  75. impl UnreadEvents {
  76. pub fn new() -> Self {
  77. Self { events: FxHashMap::default() }
  78. }
  79. fn contains(&self, key: &EventId) -> bool {
  80. self.events.contains_key(key)
  81. }
  82. fn get(&self, key: &EventId) -> Option<Event> {
  83. self.events.get(key).cloned()
  84. }
  85. // Increase the read_confirms for an event, if it has exceeded the MAX_CONFIRM
  86. // then remove it from the hash_map and return Some(event), otherwise return None
  87. fn inc_read_confirms(&mut self, key: &EventId) -> Option<Event> {
  88. let mut result = None;
  89. if let Some(event) = self.events.get_mut(key) {
  90. event.read_confirms += 1;
  91. if event.read_confirms >= MAX_CONFIRM {
  92. result = Some(event.clone())
  93. }
  94. }
  95. if result.is_some() {
  96. self.events.remove(key);
  97. }
  98. result
  99. }
  100. fn insert(&mut self, event: &Event) {
  101. // prune expired events
  102. let mut prune_ids = vec![];
  103. for (id, e) in self.events.iter() {
  104. if e.timestamp + (UNREAD_EVENT_EXPIRE_TIME * 1000) < get_current_time() {
  105. prune_ids.push(*id);
  106. }
  107. }
  108. for id in prune_ids {
  109. self.events.remove(&id);
  110. }
  111. self.events.insert(event.hash(), event.clone());
  112. }
  113. }
  114. pub struct ProtocolEvent {
  115. jobsman: net::ProtocolJobsManagerPtr,
  116. event_sub: net::MessageSubscription<Event>,
  117. inv_sub: net::MessageSubscription<Inv>,
  118. getdata_sub: net::MessageSubscription<GetData>,
  119. syncevent_sub: net::MessageSubscription<SyncEvent>,
  120. p2p: net::P2pPtr,
  121. channel: net::ChannelPtr,
  122. model: Arc<Mutex<Model>>,
  123. seen_event: Seen<EventId>,
  124. seen_inv: Seen<InvId>,
  125. unread_events: Arc<Mutex<UnreadEvents>>,
  126. }
  127. impl ProtocolEvent {
  128. pub async fn init(
  129. channel: net::ChannelPtr,
  130. p2p: net::P2pPtr,
  131. model: Arc<Mutex<Model>>,
  132. seen_event: Seen<EventId>,
  133. seen_inv: Seen<InvId>,
  134. unread_events: Arc<Mutex<UnreadEvents>>,
  135. ) -> net::ProtocolBasePtr {
  136. let message_subsytem = channel.get_message_subsystem();
  137. message_subsytem.add_dispatch::<Event>().await;
  138. message_subsytem.add_dispatch::<Inv>().await;
  139. message_subsytem.add_dispatch::<GetData>().await;
  140. message_subsytem.add_dispatch::<SyncEvent>().await;
  141. let event_sub =
  142. channel.clone().subscribe_msg::<Event>().await.expect("Missing Event dispatcher!");
  143. let inv_sub = channel.subscribe_msg::<Inv>().await.expect("Missing Inv dispatcher!");
  144. let getdata_sub =
  145. channel.clone().subscribe_msg::<GetData>().await.expect("Missing GetData dispatcher!");
  146. let syncevent_sub = channel
  147. .clone()
  148. .subscribe_msg::<SyncEvent>()
  149. .await
  150. .expect("Missing SyncEvent dispatcher!");
  151. Arc::new(Self {
  152. jobsman: net::ProtocolJobsManager::new("ProtocolEvent", channel.clone()),
  153. event_sub,
  154. inv_sub,
  155. getdata_sub,
  156. syncevent_sub,
  157. p2p,
  158. channel,
  159. model,
  160. seen_event,
  161. seen_inv,
  162. unread_events,
  163. })
  164. }
  165. async fn handle_receive_event(self: Arc<Self>) -> Result<()> {
  166. debug!(target: "ircd", "ProtocolEvent::handle_receive_event() [START]");
  167. let exclude_list = vec![self.channel.address()];
  168. loop {
  169. let event = self.event_sub.receive().await?;
  170. let mut event = (*event).to_owned();
  171. if !self.seen_event.push(&event.hash()).await {
  172. continue
  173. }
  174. event.read_confirms += 1;
  175. if event.read_confirms >= MAX_CONFIRM {
  176. self.new_event(&event).await?;
  177. } else {
  178. self.unread_events.lock().await.insert(&event);
  179. self.send_inv(&event).await?;
  180. }
  181. // Broadcast the msg
  182. self.p2p.broadcast_with_exclude(event, &exclude_list).await?;
  183. }
  184. }
  185. async fn handle_receive_inv(self: Arc<Self>) -> Result<()> {
  186. debug!(target: "ircd", "ProtocolEvent::handle_receive_inv() [START]");
  187. let exclude_list = vec![self.channel.address()];
  188. loop {
  189. let inv = self.inv_sub.receive().await?;
  190. let inv = (*inv).to_owned();
  191. for inv in inv.invs.iter() {
  192. if !self.seen_inv.push(&inv.id).await {
  193. continue
  194. }
  195. {
  196. let mut unread_events = self.unread_events.lock().await;
  197. if !unread_events.contains(&inv.hash) {
  198. self.send_getdata(vec![inv.hash]).await?;
  199. } else if let Some(event) = unread_events.inc_read_confirms(&inv.hash) {
  200. self.new_event(&event).await?;
  201. }
  202. }
  203. }
  204. // Broadcast the inv msg
  205. self.p2p.broadcast_with_exclude(inv, &exclude_list).await?;
  206. }
  207. }
  208. async fn handle_receive_getdata(self: Arc<Self>) -> Result<()> {
  209. debug!(target: "ircd", "ProtocolEvent::handle_receive_getdata() [START]");
  210. loop {
  211. let getdata = self.getdata_sub.receive().await?;
  212. let events = (*getdata).to_owned().events;
  213. for event_id in events {
  214. let unread_event = self.unread_events.lock().await.get(&event_id);
  215. if let Some(event) = unread_event {
  216. self.channel.send(event).await?;
  217. continue
  218. }
  219. let model_event = self.model.lock().await.get_event(&event_id);
  220. if let Some(event) = model_event {
  221. self.channel.send(event).await?;
  222. }
  223. }
  224. }
  225. }
  226. async fn handle_receive_syncevent(self: Arc<Self>) -> Result<()> {
  227. debug!(target: "ircd", "ProtocolEvent::handle_receive_syncevent() [START]");
  228. loop {
  229. let syncevent = self.syncevent_sub.receive().await?;
  230. let model = self.model.lock().await;
  231. let leaves = model.find_leaves();
  232. if leaves == syncevent.leaves {
  233. continue
  234. }
  235. for leaf in syncevent.leaves.iter() {
  236. if leaves.contains(leaf) {
  237. continue
  238. }
  239. let children = model.get_event_children(leaf);
  240. for child in children {
  241. self.channel.send(child).await?;
  242. }
  243. }
  244. }
  245. }
  246. // every 2 seconds send a SyncEvent msg
  247. async fn send_sync_hash_loop(self: Arc<Self>) -> Result<()> {
  248. loop {
  249. sleep(2).await;
  250. let leaves = self.model.lock().await.find_leaves();
  251. self.channel.send(SyncEvent { leaves }).await?;
  252. }
  253. }
  254. async fn new_event(&self, event: &Event) -> Result<()> {
  255. let mut model = self.model.lock().await;
  256. if model.is_orphan(event) {
  257. self.send_getdata(vec![event.hash()]).await?;
  258. } else {
  259. model.add(event.clone());
  260. }
  261. Ok(())
  262. }
  263. async fn send_inv(&self, event: &Event) -> Result<()> {
  264. let id = OsRng.next_u64();
  265. self.p2p.broadcast(Inv { invs: vec![InvItem { id, hash: event.hash() }] }).await?;
  266. Ok(())
  267. }
  268. async fn send_getdata(&self, events: Vec<EventId>) -> Result<()> {
  269. self.channel.send(GetData { events }).await?;
  270. Ok(())
  271. }
  272. }
  273. #[async_trait]
  274. impl net::ProtocolBase for ProtocolEvent {
  275. async fn start(self: Arc<Self>, executor: Arc<Executor<'_>>) -> Result<()> {
  276. debug!(target: "ircd", "ProtocolEvent::start() [START]");
  277. self.jobsman.clone().start(executor.clone());
  278. self.jobsman.clone().spawn(self.clone().handle_receive_event(), executor.clone()).await;
  279. self.jobsman.clone().spawn(self.clone().handle_receive_inv(), executor.clone()).await;
  280. self.jobsman.clone().spawn(self.clone().handle_receive_getdata(), executor.clone()).await;
  281. self.jobsman.clone().spawn(self.clone().handle_receive_syncevent(), executor.clone()).await;
  282. self.jobsman.clone().spawn(self.clone().send_sync_hash_loop(), executor.clone()).await;
  283. debug!(target: "ircd", "ProtocolEvent::start() [END]");
  284. Ok(())
  285. }
  286. fn name(&self) -> &'static str {
  287. "ProtocolEvent"
  288. }
  289. }
  290. impl net::Message for Event {
  291. fn name() -> &'static str {
  292. "event"
  293. }
  294. }
  295. impl net::Message for Inv {
  296. fn name() -> &'static str {
  297. "inv"
  298. }
  299. }
  300. impl net::Message for SyncEvent {
  301. fn name() -> &'static str {
  302. "syncevent"
  303. }
  304. }
  305. impl net::Message for GetData {
  306. fn name() -> &'static str {
  307. "getdata"
  308. }
  309. }