protocol_event.rs 11 KB

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