protocol_privmsg2.rs 11 KB

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