From af06ad645133f580a87895353508053c5de60716 Mon Sep 17 00:00:00 2001 From: Alexis Sellier Date: Thu, 29 Sep 2022 10:48:41 +0200 Subject: [PATCH] Use message timestamp for filtering Signed-off-by: Alexis Sellier --- radicle-node/src/service.rs | 9 +++++-- radicle-node/src/service/message.rs | 20 ++++++++++++-- radicle-node/src/test/arbitrary.rs | 1 + radicle-node/src/test/gossip.rs | 13 +++++++-- radicle-node/src/test/tests.rs | 42 +++++++++++++++++++++++++++-- radicle-node/src/wire/message.rs | 8 +++++- 6 files changed, 84 insertions(+), 9 deletions(-) diff --git a/radicle-node/src/service.rs b/radicle-node/src/service.rs index 3e3722d5..49247dac 100644 --- a/radicle-node/src/service.rs +++ b/radicle-node/src/service.rs @@ -453,7 +453,12 @@ where let remote = repo.remote(&node).unwrap(); let peers = self.sessions.negotiated().map(|(_, p)| p); let refs = remote.refs.into(); - let msg = AnnouncementMessage::from(RefsAnnouncement { id, refs }); + let timestamp = self.clock.timestamp(); + let msg = AnnouncementMessage::from(RefsAnnouncement { + id, + refs, + timestamp, + }); let ann = msg.signed(&self.signer); self.reactor.broadcast(ann, peers); @@ -708,7 +713,7 @@ where // Returning true here means that the message should be relayed. if self.handle_announcement(&git, &ann)? { - self.gossip.received(ann.clone(), self.clock.timestamp()); + self.gossip.received(ann.clone(), ann.message.timestamp()); return Ok(Some(ann)); } } diff --git a/radicle-node/src/service/message.rs b/radicle-node/src/service/message.rs index 6be255a3..6e98db1e 100644 --- a/radicle-node/src/service/message.rs +++ b/radicle-node/src/service/message.rs @@ -173,14 +173,17 @@ pub struct RefsAnnouncement { pub id: Id, /// Updated refs. pub refs: Refs, - // TODO: Add timestamp + /// Time of announcement. + pub timestamp: Timestamp, } /// Node announcing its inventory to the network. /// This should be the whole inventory every time. #[derive(Debug, Clone, PartialEq, Eq)] pub struct InventoryAnnouncement { + /// Node inventory. pub inventory: Vec, + /// Time of announcement. pub timestamp: Timestamp, } @@ -207,6 +210,14 @@ impl AnnouncementMessage { signature, } } + + pub fn timestamp(&self) -> Timestamp { + match self { + Self::Inventory(InventoryAnnouncement { timestamp, .. }) => *timestamp, + Self::Refs(RefsAnnouncement { timestamp, .. }) => *timestamp, + Self::Node(NodeAnnouncement { timestamp, .. }) => *timestamp, + } + } } impl From for AnnouncementMessage { @@ -368,7 +379,12 @@ mod tests { #[quickcheck] fn prop_refs_announcement_signing(id: Id, refs: Refs) { let signer = MockSigner::new(&mut fastrand::Rng::new()); - let message = AnnouncementMessage::Refs(RefsAnnouncement { id, refs }); + let timestamp = 0; + let message = AnnouncementMessage::Refs(RefsAnnouncement { + id, + refs, + timestamp, + }); let ann = message.signed(&signer); assert!(ann.verify()); diff --git a/radicle-node/src/test/arbitrary.rs b/radicle-node/src/test/arbitrary.rs index e2ef0b68..ad232e76 100644 --- a/radicle-node/src/test/arbitrary.rs +++ b/radicle-node/src/test/arbitrary.rs @@ -61,6 +61,7 @@ impl Arbitrary for Message { message: RefsAnnouncement { id: Id::arbitrary(g), refs: Refs::arbitrary(g), + timestamp: Timestamp::arbitrary(g), } .into(), signature: crypto::Signature::from(ByteArray::<64>::arbitrary(g).into_inner()), diff --git a/radicle-node/src/test/gossip.rs b/radicle-node/src/test/gossip.rs index f43550e2..432da8d2 100644 --- a/radicle-node/src/test/gossip.rs +++ b/radicle-node/src/test/gossip.rs @@ -12,8 +12,17 @@ pub fn messages(count: usize, now: LocalTime, delta: LocalDuration) -> Vec>(); + assert_eq!(relayed.len(), second.len()); + assert_eq!(relayed, second); +} + #[test] fn test_inventory_relay() { // Topology is eve <-> alice <-> bob diff --git a/radicle-node/src/wire/message.rs b/radicle-node/src/wire/message.rs index cc0c8b8c..b9efc213 100644 --- a/radicle-node/src/wire/message.rs +++ b/radicle-node/src/wire/message.rs @@ -100,6 +100,7 @@ impl wire::Encode for RefsAnnouncement { n += self.id.encode(writer)?; n += self.refs.encode(writer)?; + n += self.timestamp.encode(writer)?; Ok(n) } @@ -109,8 +110,13 @@ impl wire::Decode for RefsAnnouncement { fn decode(reader: &mut R) -> Result { let id = Id::decode(reader)?; let refs = Refs::decode(reader)?; + let timestamp = Timestamp::decode(reader)?; - Ok(Self { id, refs }) + Ok(Self { + id, + refs, + timestamp, + }) } }