Skip to content

Commit 71cd341

Browse files
committed
[p2p] Move peer connections to an event
1 parent d7e958f commit 71cd341

File tree

8 files changed

+50
-57
lines changed

8 files changed

+50
-57
lines changed

client/src/client.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ impl<W: Waker> handle::Handle for Handle<W> {
574574
event::wait(
575575
&events,
576576
|e| match e {
577-
fsm::Event::PeerConnected { addr: a, link }
577+
fsm::Event::PeerConnected { addr: a, link, .. }
578578
if a == addr || (addr.ip().is_unspecified() && a.port() == addr.port()) =>
579579
{
580580
Some(link)

client/src/event.rs

+2
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ mod test {
343343
client
344344
.protocol
345345
.connected(remote, &local_addr, Link::Inbound);
346+
client.step();
346347
client.received(&remote, version(42));
347348
client.received(&remote, NetworkMessage::Verack);
348349
client.step();
@@ -357,6 +358,7 @@ mod test {
357358
client
358359
.protocol
359360
.connected(remote, &local_addr, Link::Inbound);
361+
client.step();
360362
client.received(&remote, version(43));
361363
client.received(&remote, NetworkMessage::Verack);
362364
client.step();

common/src/p2p/peer.rs

-6
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,6 @@ impl KnownAddress {
350350
pub trait AddressSource {
351351
/// Sample a random peer address. Returns `None` if there are no addresses left.
352352
fn sample(&mut self, services: ServiceFlags) -> Option<(Address, Source)>;
353-
/// Record an address of ours as seen by a remote peer.
354-
fn record_local_address(&mut self, addr: net::SocketAddr);
355353
/// Return an iterator over random peer addresses.
356354
fn iter(&mut self, services: ServiceFlags) -> Box<dyn Iterator<Item = (Address, Source)> + '_>;
357355
}
@@ -365,10 +363,6 @@ pub mod test {
365363
self.pop_front()
366364
}
367365

368-
fn record_local_address(&mut self, _addr: net::SocketAddr) {
369-
// Do nothing.
370-
}
371-
372366
fn iter(
373367
&mut self,
374368
_services: ServiceFlags,

p2p/src/fsm.rs

+5-8
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ use nakamoto_common::block::{BlockHash, Height};
5656
use nakamoto_common::block::{BlockTime, Transaction};
5757
use nakamoto_common::network;
5858
use nakamoto_common::nonempty::NonEmpty;
59-
use nakamoto_common::p2p::peer::AddressSource;
6059
use nakamoto_common::p2p::{peer, Domain};
6160
use nakamoto_net as traits;
6261

@@ -630,8 +629,7 @@ impl<T: BlockTree, F: Filters, P: peer::Store, C: AdjustedClock<PeerId>> StateMa
630629
self.invmgr.received_event(e.clone(), &self.tree);
631630
self.syncmgr.received_event(e.clone(), &mut self.tree);
632631
self.addrmgr.received_event(e.clone(), &self.tree);
633-
self.peermgr
634-
.received_event(e, &self.tree, &mut self.addrmgr);
632+
self.peermgr.received_event(e, &self.tree);
635633
}
636634

637635
/// Process a user command.
@@ -792,6 +790,8 @@ impl<T: BlockTree, F: Filters, P: peer::Store, C: AdjustedClock<PeerId>> traits:
792790
return;
793791
}
794792

793+
// Nb. We only send this message internally, hence we don't
794+
// push it to our outbox.
795795
self.event(Event::MessageReceived {
796796
from: addr,
797797
message: Arc::new(msg.payload),
@@ -804,11 +804,8 @@ impl<T: BlockTree, F: Filters, P: peer::Store, C: AdjustedClock<PeerId>> traits:
804804
}
805805

806806
fn connected(&mut self, addr: net::SocketAddr, local_addr: &net::SocketAddr, link: Link) {
807-
let height = self.tree.height();
808-
809-
self.addrmgr.record_local_address(*local_addr);
810-
self.addrmgr.peer_connected(&addr);
811-
self.peermgr.peer_connected(addr, *local_addr, link, height);
807+
self.peermgr
808+
.peer_connected(addr, *local_addr, link, self.tree.height());
812809
}
813810

814811
fn disconnected(

p2p/src/fsm/addrmgr.rs

+9-6
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,19 @@ impl<P: Store, C: Clock> AddressManager<P, C> {
136136
/// Event received.
137137
pub fn received_event<T>(&mut self, event: Event, _tree: &T) {
138138
match event {
139+
Event::PeerConnected { addr, .. } => {
140+
self.peer_connected(&addr);
141+
}
139142
Event::PeerNegotiated {
140143
addr,
141144
link,
142145
services,
146+
receiver,
143147
..
144148
} => {
149+
if let Ok(addr) = receiver.socket_addr() {
150+
self.local_addrs.insert(addr);
151+
}
145152
self.peer_negotiated(&addr, services, link);
146153
}
147154
Event::MessageReceived { from, message } => {
@@ -214,15 +221,15 @@ impl<P: Store, C: Clock> AddressManager<P, C> {
214221
}
215222

216223
/// Called when a peer has connected.
217-
pub fn peer_connected(&mut self, addr: &net::SocketAddr) {
224+
fn peer_connected(&mut self, addr: &net::SocketAddr) {
218225
if !self::is_routable(&addr.ip()) || self::is_local(&addr.ip()) {
219226
return;
220227
}
221228
self.connected.insert(addr.ip());
222229
}
223230

224231
/// Called when a peer has handshaked.
225-
pub fn peer_negotiated(&mut self, addr: &net::SocketAddr, services: ServiceFlags, link: Link) {
232+
fn peer_negotiated(&mut self, addr: &net::SocketAddr, services: ServiceFlags, link: Link) {
226233
let time = self.clock.local_time();
227234

228235
if !self.connected.contains(&addr.ip()) {
@@ -563,10 +570,6 @@ impl<P: Store, C: Clock> AddressSource for AddressManager<P, C> {
563570
AddressManager::sample(self, services)
564571
}
565572

566-
fn record_local_address(&mut self, addr: net::SocketAddr) {
567-
self.local_addrs.insert(addr);
568-
}
569-
570573
fn iter(&mut self, services: ServiceFlags) -> Box<dyn Iterator<Item = (Address, Source)> + '_> {
571574
Box::new(AddressManager::iter(self, services))
572575
}

p2p/src/fsm/event.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
use std::sync::Arc;
33
use std::{error, fmt, io, net};
44

5+
use nakamoto_common::bitcoin::network::address::Address;
56
use nakamoto_common::bitcoin::network::constants::ServiceFlags;
67
use nakamoto_common::bitcoin::network::message::NetworkMessage;
78
use nakamoto_common::bitcoin::{Transaction, Txid};
@@ -36,6 +37,8 @@ pub enum Event {
3637
PeerConnected {
3738
/// Peer address.
3839
addr: PeerId,
40+
/// Local address.
41+
local_addr: net::SocketAddr,
3942
/// Connection link.
4043
link: Link,
4144
},
@@ -80,6 +83,8 @@ pub enum Event {
8083
persistent: bool,
8184
/// Peer height.
8285
height: Height,
86+
/// Address of our node, as seen by remote.
87+
receiver: Address,
8388
/// Peer user agent.
8489
user_agent: String,
8590
/// Negotiated protocol version.
@@ -334,7 +339,7 @@ impl fmt::Display for Event {
334339
write!(fmt, "Transaction {} status changed: {}", txid, status)
335340
}
336341
Self::Synced { height, .. } => write!(fmt, "filters synced up to height {}", height),
337-
Self::PeerConnected { addr, link } => {
342+
Self::PeerConnected { addr, link, .. } => {
338343
write!(fmt, "Peer {} connected ({:?})", &addr, link)
339344
}
340345
Self::PeerConnectionFailed { addr, error } => {

p2p/src/fsm/peermgr.rs

+26-34
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ use nakamoto_common::p2p::Domain;
2828
use nakamoto_common::block::time::{AdjustedClock, Clock, LocalDuration, LocalTime};
2929
use nakamoto_common::block::Height;
3030
use nakamoto_common::collections::{HashMap, HashSet};
31-
use nakamoto_common::source;
3231
use nakamoto_net as network;
3332

3433
use crate::fsm::addrmgr;
@@ -56,6 +55,13 @@ const MAX_STALE_HEIGHT_DIFFERENCE: Height = 2016;
5655
/// A time offset, in seconds.
5756
type TimeOffset = i64;
5857

58+
#[derive(thiserror::Error, Debug)]
59+
pub enum Error {
60+
/// Connection to peer failed.
61+
#[error("connection to {addr} failed")]
62+
ConnectionFailed { addr: PeerId },
63+
}
64+
5965
/// Peer manager configuration.
6066
#[derive(Debug, Clone)]
6167
pub struct Config {
@@ -140,6 +146,8 @@ pub struct PeerInfo {
140146
/// An offset in seconds, between this peer's clock and ours.
141147
/// A positive offset means the peer's clock is ahead of ours.
142148
pub time_offset: TimeOffset,
149+
/// Address of our node, as seen by remote.
150+
pub receiver: Address,
143151
/// Whether this peer relays transactions.
144152
pub relay: bool,
145153
/// Whether this peer supports BIP-339.
@@ -212,25 +220,15 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
212220

213221
for addr in peers {
214222
if !self.connect(&addr) {
215-
// TODO: Return error here, or send event.
216-
panic!(
217-
"{}: unable to connect to persistent peer: {}",
218-
source!(),
219-
addr
220-
);
223+
self.outbox.error(Error::ConnectionFailed { addr });
221224
}
222225
}
223226
self.outbox.set_timer(IDLE_TIMEOUT);
224227
self.maintain_connections(addrs);
225228
}
226229

227230
/// Event received.
228-
pub fn received_event<T: BlockReader, A: AddressSource>(
229-
&mut self,
230-
event: Event,
231-
tree: &T,
232-
addrs: &mut A,
233-
) {
231+
pub fn received_event<T: BlockReader>(&mut self, event: Event, tree: &T) {
234232
match event {
235233
Event::PeerTimedOut { addr } => {
236234
self.disconnect(addr, DisconnectReason::PeerTimeout("other"));
@@ -240,7 +238,7 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
240238
}
241239
Event::MessageReceived { from, message } => match message.as_ref() {
242240
NetworkMessage::Version(msg) => {
243-
self.received_version(&from, msg, tree.height(), addrs);
241+
self.received_version(&from, msg, tree.height());
244242
}
245243
NetworkMessage::Verack => {
246244
self.received_verack(&from);
@@ -349,7 +347,11 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
349347
}
350348
// Set a timeout for receiving the `version` message.
351349
self.outbox.set_timer(HANDSHAKE_TIMEOUT);
352-
self.outbox.event(Event::PeerConnected { addr, link });
350+
self.outbox.event(Event::PeerConnected {
351+
addr,
352+
local_addr,
353+
link,
354+
});
353355
}
354356

355357
/// Called when a peer disconnected.
@@ -408,24 +410,17 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
408410
}
409411

410412
/// Called when a `version` message was received.
411-
fn received_version<A: AddressSource>(
412-
&mut self,
413-
addr: &PeerId,
414-
msg: &VersionMessage,
415-
height: Height,
416-
addrs: &mut A,
417-
) {
418-
if let Err(reason) = self.handle_version(addr, msg, height, addrs) {
413+
fn received_version(&mut self, addr: &PeerId, msg: &VersionMessage, height: Height) {
414+
if let Err(reason) = self.handle_version(addr, msg, height) {
419415
self._disconnect(*addr, reason);
420416
}
421417
}
422418

423-
fn handle_version<A: AddressSource>(
419+
fn handle_version(
424420
&mut self,
425421
addr: &PeerId,
426422
msg: &VersionMessage,
427423
height: Height,
428-
addrs: &mut A,
429424
) -> Result<(), DisconnectReason> {
430425
let now = self.clock.local_time();
431426

@@ -496,11 +491,6 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
496491
return Err(DisconnectReason::Other(reason));
497492
}
498493

499-
// Record the address this peer has of us.
500-
if let Ok(addr) = receiver.socket_addr() {
501-
addrs.record_local_address(addr);
502-
}
503-
504494
match conn.link {
505495
Link::Inbound => {
506496
self.outbox
@@ -535,6 +525,7 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
535525
services,
536526
persistent,
537527
user_agent,
528+
receiver,
538529
state: HandshakeState::ReceivedVersion { since: now },
539530
relay,
540531
wtxidrelay: false,
@@ -561,6 +552,7 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
561552
services: peer.services,
562553
persistent: peer.persistent,
563554
user_agent: peer.user_agent.clone(),
555+
receiver: peer.receiver.clone(),
564556
height: peer.height,
565557
version: peer.version,
566558
relay: peer.relay,
@@ -988,7 +980,7 @@ mod tests {
988980
peermgr.initialize(&mut addrs);
989981
peermgr.connect(&remote);
990982
peermgr.peer_connected(remote, local, Link::Outbound, height);
991-
peermgr.received_version(&remote, &version, height, &mut addrs);
983+
peermgr.received_version(&remote, &version, height);
992984

993985
assert_matches!(
994986
peermgr.peers.get(&remote),
@@ -1024,7 +1016,7 @@ mod tests {
10241016
peermgr.initialize(&mut addrs);
10251017
peermgr.connect(&remote);
10261018
peermgr.peer_connected(remote, local, Link::Outbound, height);
1027-
peermgr.received_version(&remote, &version, height, &mut addrs);
1019+
peermgr.received_version(&remote, &version, height);
10281020
peermgr.received_verack(&remote);
10291021
peermgr.received_wtxidrelay(&remote);
10301022

@@ -1210,7 +1202,7 @@ mod tests {
12101202
peermgr.peer_connected(remote, local, Link::Outbound, height);
12111203
assert!(peermgr.peers.contains_key(&remote));
12121204

1213-
peermgr.received_version(&remote, &version, height, &mut addrs);
1205+
peermgr.received_version(&remote, &version, height);
12141206
assert!(peermgr.peers.contains_key(&remote));
12151207

12161208
peermgr.received_verack(&remote);
@@ -1230,7 +1222,7 @@ mod tests {
12301222
peermgr.peer_connected(remote, local, Link::Outbound, height);
12311223
assert!(peermgr.peers.contains_key(&remote));
12321224

1233-
peermgr.received_version(&remote, &version, height, &mut addrs);
1225+
peermgr.received_version(&remote, &version, height);
12341226
assert!(peermgr.peers.contains_key(&remote));
12351227

12361228
peermgr.received_verack(&remote);

p2p/src/fsm/syncmgr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ impl<C: Clock> SyncManager<C> {
187187
}
188188

189189
/// Called when a new peer was negotiated.
190-
pub fn peer_negotiated<T: BlockReader>(
190+
fn peer_negotiated<T: BlockReader>(
191191
&mut self,
192192
addr: PeerId,
193193
height: Height,

0 commit comments

Comments
 (0)