@@ -28,7 +28,6 @@ use nakamoto_common::p2p::Domain;
28
28
use nakamoto_common:: block:: time:: { AdjustedClock , Clock , LocalDuration , LocalTime } ;
29
29
use nakamoto_common:: block:: Height ;
30
30
use nakamoto_common:: collections:: { HashMap , HashSet } ;
31
- use nakamoto_common:: source;
32
31
use nakamoto_net as network;
33
32
34
33
use crate :: fsm:: addrmgr;
@@ -56,6 +55,13 @@ const MAX_STALE_HEIGHT_DIFFERENCE: Height = 2016;
56
55
/// A time offset, in seconds.
57
56
type TimeOffset = i64 ;
58
57
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
+
59
65
/// Peer manager configuration.
60
66
#[ derive( Debug , Clone ) ]
61
67
pub struct Config {
@@ -140,6 +146,8 @@ pub struct PeerInfo {
140
146
/// An offset in seconds, between this peer's clock and ours.
141
147
/// A positive offset means the peer's clock is ahead of ours.
142
148
pub time_offset : TimeOffset ,
149
+ /// Address of our node, as seen by remote.
150
+ pub receiver : Address ,
143
151
/// Whether this peer relays transactions.
144
152
pub relay : bool ,
145
153
/// Whether this peer supports BIP-339.
@@ -212,25 +220,15 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
212
220
213
221
for addr in peers {
214
222
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 } ) ;
221
224
}
222
225
}
223
226
self . outbox . set_timer ( IDLE_TIMEOUT ) ;
224
227
self . maintain_connections ( addrs) ;
225
228
}
226
229
227
230
/// 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 ) {
234
232
match event {
235
233
Event :: PeerTimedOut { addr } => {
236
234
self . disconnect ( addr, DisconnectReason :: PeerTimeout ( "other" ) ) ;
@@ -240,7 +238,7 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
240
238
}
241
239
Event :: MessageReceived { from, message } => match message. as_ref ( ) {
242
240
NetworkMessage :: Version ( msg) => {
243
- self . received_version ( & from, msg, tree. height ( ) , addrs ) ;
241
+ self . received_version ( & from, msg, tree. height ( ) ) ;
244
242
}
245
243
NetworkMessage :: Verack => {
246
244
self . received_verack ( & from) ;
@@ -349,7 +347,11 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
349
347
}
350
348
// Set a timeout for receiving the `version` message.
351
349
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
+ } ) ;
353
355
}
354
356
355
357
/// Called when a peer disconnected.
@@ -408,24 +410,17 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
408
410
}
409
411
410
412
/// 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) {
419
415
self . _disconnect ( * addr, reason) ;
420
416
}
421
417
}
422
418
423
- fn handle_version < A : AddressSource > (
419
+ fn handle_version (
424
420
& mut self ,
425
421
addr : & PeerId ,
426
422
msg : & VersionMessage ,
427
423
height : Height ,
428
- addrs : & mut A ,
429
424
) -> Result < ( ) , DisconnectReason > {
430
425
let now = self . clock . local_time ( ) ;
431
426
@@ -496,11 +491,6 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
496
491
return Err ( DisconnectReason :: Other ( reason) ) ;
497
492
}
498
493
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
-
504
494
match conn. link {
505
495
Link :: Inbound => {
506
496
self . outbox
@@ -535,6 +525,7 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
535
525
services,
536
526
persistent,
537
527
user_agent,
528
+ receiver,
538
529
state : HandshakeState :: ReceivedVersion { since : now } ,
539
530
relay,
540
531
wtxidrelay : false ,
@@ -561,6 +552,7 @@ impl<C: AdjustedClock<PeerId>> PeerManager<C> {
561
552
services : peer. services ,
562
553
persistent : peer. persistent ,
563
554
user_agent : peer. user_agent . clone ( ) ,
555
+ receiver : peer. receiver . clone ( ) ,
564
556
height : peer. height ,
565
557
version : peer. version ,
566
558
relay : peer. relay ,
@@ -988,7 +980,7 @@ mod tests {
988
980
peermgr. initialize ( & mut addrs) ;
989
981
peermgr. connect ( & remote) ;
990
982
peermgr. peer_connected ( remote, local, Link :: Outbound , height) ;
991
- peermgr. received_version ( & remote, & version, height, & mut addrs ) ;
983
+ peermgr. received_version ( & remote, & version, height) ;
992
984
993
985
assert_matches ! (
994
986
peermgr. peers. get( & remote) ,
@@ -1024,7 +1016,7 @@ mod tests {
1024
1016
peermgr. initialize ( & mut addrs) ;
1025
1017
peermgr. connect ( & remote) ;
1026
1018
peermgr. peer_connected ( remote, local, Link :: Outbound , height) ;
1027
- peermgr. received_version ( & remote, & version, height, & mut addrs ) ;
1019
+ peermgr. received_version ( & remote, & version, height) ;
1028
1020
peermgr. received_verack ( & remote) ;
1029
1021
peermgr. received_wtxidrelay ( & remote) ;
1030
1022
@@ -1210,7 +1202,7 @@ mod tests {
1210
1202
peermgr. peer_connected ( remote, local, Link :: Outbound , height) ;
1211
1203
assert ! ( peermgr. peers. contains_key( & remote) ) ;
1212
1204
1213
- peermgr. received_version ( & remote, & version, height, & mut addrs ) ;
1205
+ peermgr. received_version ( & remote, & version, height) ;
1214
1206
assert ! ( peermgr. peers. contains_key( & remote) ) ;
1215
1207
1216
1208
peermgr. received_verack ( & remote) ;
@@ -1230,7 +1222,7 @@ mod tests {
1230
1222
peermgr. peer_connected ( remote, local, Link :: Outbound , height) ;
1231
1223
assert ! ( peermgr. peers. contains_key( & remote) ) ;
1232
1224
1233
- peermgr. received_version ( & remote, & version, height, & mut addrs ) ;
1225
+ peermgr. received_version ( & remote, & version, height) ;
1234
1226
assert ! ( peermgr. peers. contains_key( & remote) ) ;
1235
1227
1236
1228
peermgr. received_verack ( & remote) ;
0 commit comments