Skip to content

Commit aa622b9

Browse files
author
Antoine Riard
committed
Implement DisconnectPeer event + test
1 parent 48b0d99 commit aa622b9

File tree

5 files changed

+151
-4
lines changed

5 files changed

+151
-4
lines changed

src/ln/channelmanager.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -685,10 +685,14 @@ impl ChannelManager {
685685
Ok(funding_msg) => {
686686
(chan, funding_msg.0, funding_msg.1)
687687
},
688-
Err(_e) => {
689-
//TODO: Push e to pendingevents
688+
Err(e) => {
689+
let mut pending_events = self.pending_events.lock().unwrap();
690+
pending_events.push(events::Event::DisconnectPeer {
691+
node_id: chan.get_their_node_id(),
692+
msg: e,
693+
});
690694
return;
691-
}
695+
},
692696
}
693697
},
694698
None => return
@@ -1811,6 +1815,12 @@ impl ChannelMessageHandler for ChannelManager {
18111815
}
18121816
}
18131817
}
1818+
1819+
//For testing purpose in peer_handler
1820+
fn push_event(&self, event: events::Event) {
1821+
let mut pending_events = self.pending_events.lock().unwrap();
1822+
pending_events.push(event);
1823+
}
18141824
}
18151825

18161826
#[cfg(test)]

src/ln/msgs.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,9 @@ pub trait ChannelMessageHandler : events::EventsProvider + Send + Sync {
435435
/// understand or indicate they require unknown feature bits), no_connection_possible is set
436436
/// and any outstanding channels should be failed.
437437
fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool);
438+
439+
//Testing
440+
fn push_event(&self, event: events::Event);
438441
}
439442

440443
pub trait RoutingMessageHandler : Send + Sync {
@@ -1534,3 +1537,16 @@ impl MsgEncodable for OnionErrorPacket {
15341537
res
15351538
}
15361539
}
1540+
1541+
impl MsgEncodable for HandleError {
1542+
fn encode(&self) -> Vec<u8> {
1543+
match self.msg.as_ref().unwrap() {
1544+
&ErrorAction::UpdateFailHTLC { ref msg } => msg.encode(),
1545+
_ => {
1546+
let mut res = Vec::with_capacity(self.err.len());
1547+
res.extend_from_slice(&self.err.as_bytes());
1548+
res
1549+
},
1550+
}
1551+
}
1552+
}

src/ln/peer_channel_encryptor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ impl PeerChannelEncryptor {
242242
}
243243

244244
// Separated for testing:
245-
fn process_act_one_with_ephemeral_key(&mut self, act_one: &[u8], our_node_secret: &SecretKey, our_ephemeral: SecretKey) -> Result<[u8; 50], HandleError> {
245+
pub fn process_act_one_with_ephemeral_key(&mut self, act_one: &[u8], our_node_secret: &SecretKey, our_ephemeral: SecretKey) -> Result<[u8; 50], HandleError> {
246246
assert_eq!(act_one.len(), 50);
247247

248248
match self.noise_state {

src/ln/peer_handler.rs

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
576576
/// calls to ChannelManager::process_pending_htlc_forward.
577577
pub fn process_events(&self) {
578578
let mut upstream_events = Vec::new();
579+
let mut disconnect_peers = Vec::new();
579580
{
580581
// TODO: There are some DoS attacks here where you can flood someone's outbound send
581582
// buffer by doing things like announcing channels on another node. We should be willing to
@@ -710,12 +711,26 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
710711
}
711712
continue;
712713
},
714+
Event::DisconnectPeer { ref node_id, ref msg } => {
715+
let (mut descriptor, peer) = get_peer_for_forwarding!(node_id, {
716+
//TODO: Do whatever we're gonna do for handling dropped messages
717+
});
718+
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 17)));
719+
Self::do_attempt_write_data(&mut descriptor, peer);
720+
disconnect_peers.push(descriptor.clone());
721+
// TODO: log err to take further action depend on kind of error
722+
continue;
723+
}
713724
}
714725

715726
upstream_events.push(event);
716727
}
717728
}
718729

730+
for descriptor in disconnect_peers {
731+
self.disconnect_event(&descriptor);
732+
}
733+
719734
let mut pending_events = self.pending_events.lock().unwrap();
720735
for event in upstream_events.drain(..) {
721736
pending_events.push(event);
@@ -756,3 +771,103 @@ impl<Descriptor: SocketDescriptor> EventsProvider for PeerManager<Descriptor> {
756771
ret
757772
}
758773
}
774+
775+
#[cfg(test)]
776+
mod tests {
777+
use chain::chaininterface;
778+
use ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor};
779+
use ln::channelmanager::{ChannelManager};
780+
use ln::router::{Router};
781+
use ln::msgs;
782+
use ln::peer_channel_encryptor::{PeerChannelEncryptor};
783+
use ln::msgs::{HandleError};
784+
use util::test_utils;
785+
use util::events;
786+
787+
use bitcoin::network::constants::Network;
788+
use bitcoin::util::misc::hex_bytes;
789+
790+
use secp256k1::Secp256k1;
791+
use secp256k1::key::{SecretKey, PublicKey};
792+
793+
use rand::{thread_rng,Rng};
794+
795+
use std::sync::{Arc, Mutex};
796+
797+
#[derive(PartialEq, Eq, Clone, Hash)]
798+
struct FileDescriptor {
799+
fd: u16,
800+
}
801+
802+
impl SocketDescriptor for FileDescriptor {
803+
fn send_data(&mut self, data: &Vec<u8>, _write_offset: usize, _resume_read: bool) -> usize {
804+
data.len()
805+
}
806+
}
807+
808+
fn create_network(peer_count: usize) -> Vec<PeerManager<FileDescriptor>> {
809+
let secp_ctx = Secp256k1::new();
810+
let mut peers = Vec::new();
811+
let mut rng = thread_rng();
812+
813+
for _ in 0..peer_count {
814+
let feeest = Arc::new(test_utils::TestFeeEstimator { sat_per_vbyte: 1 });
815+
let chain_monitor = Arc::new(chaininterface::ChainWatchInterfaceUtil::new());
816+
let tx_broadcaster = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())});
817+
let chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(chain_monitor.clone(), tx_broadcaster.clone()));
818+
let node_id = {
819+
let mut key_slice = [0;32];
820+
rng.fill_bytes(&mut key_slice);
821+
SecretKey::from_slice(&secp_ctx, &key_slice).unwrap()
822+
};
823+
let node = ChannelManager::new(node_id.clone(), 0, true, Network::Testnet, feeest.clone(), chan_monitor.clone(), chain_monitor.clone(), tx_broadcaster.clone()).unwrap();
824+
let router = Router::new(PublicKey::from_secret_key(&secp_ctx, &node_id).unwrap());
825+
let msg_handler = MessageHandler { chan_handler: node, route_handler: Arc::new(router) };
826+
let peer = PeerManager::new(msg_handler, node_id);
827+
peers.push(peer);
828+
}
829+
830+
peers
831+
}
832+
833+
fn establish_connection(peer_a: &PeerManager<FileDescriptor>, peer_b: &PeerManager<FileDescriptor>) {
834+
let secp_ctx = Secp256k1::new();
835+
let their_id = PublicKey::from_secret_key(&secp_ctx, &peer_b.our_node_secret).unwrap();
836+
let fd = FileDescriptor { fd: 1};
837+
peer_a.new_inbound_connection(fd.clone());
838+
839+
let mut inbound_peer_encryptor;
840+
{
841+
let our_node_id = SecretKey::from_slice(&secp_ctx, &hex_bytes("2121212121212121212121212121212121212121212121212121212121212121").unwrap()[..]).unwrap();
842+
let our_ephemeral = SecretKey::from_slice(&secp_ctx, &hex_bytes("2222222222222222222222222222222222222222222222222222222222222222").unwrap()[..]).unwrap();
843+
inbound_peer_encryptor = PeerChannelEncryptor::new_inbound(&our_node_id);
844+
let act_one = hex_bytes("00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a").unwrap().to_vec();
845+
inbound_peer_encryptor.process_act_one_with_ephemeral_key(&act_one[..], &our_node_id, our_ephemeral).unwrap();
846+
let act_three = hex_bytes("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap().to_vec();
847+
inbound_peer_encryptor.process_act_three(&act_three[..]).unwrap();
848+
}
849+
if let Some(peer) = peer_a.peers.lock().unwrap().peers.get_mut(&fd) {
850+
peer.channel_encryptor = inbound_peer_encryptor;
851+
}
852+
peer_a.peers.lock().unwrap().node_id_to_descriptor.insert(their_id, fd.clone());
853+
}
854+
855+
#[test]
856+
fn test_disconnect_peer() {
857+
// Simple test which builds a network of PeerManager, connects and brings them to NoiseState::Finished and
858+
// push an DisconnectPeer event to remove the node flagged by id
859+
let peers = create_network(2);
860+
establish_connection(&peers[0], &peers[1]);
861+
assert_eq!(peers[0].peers.lock().unwrap().peers.len(), 1);
862+
863+
let secp_ctx = Secp256k1::new();
864+
let their_id = PublicKey::from_secret_key(&secp_ctx, &peers[1].our_node_secret).unwrap();
865+
peers[0].message_handler.chan_handler.push_event(events::Event::DisconnectPeer {
866+
node_id: their_id,
867+
msg: HandleError { err: "test disconnect peer B by peer A", msg: Some(msgs::ErrorAction::DisconnectPeer)},
868+
});
869+
870+
peers[0].process_events();
871+
assert_eq!(peers[0].peers.lock().unwrap().peers.len(), 0);
872+
}
873+
}

src/util/events.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@ pub enum Event {
100100
BroadcastChannelUpdate {
101101
msg: msgs::ChannelUpdate,
102102
},
103+
// Events indicating the network loop should change the state of peer connection:
104+
/// Used to indicate that the peer connection should be closed with a message holding the reason
105+
DisconnectPeer {
106+
node_id: PublicKey,
107+
msg: msgs::HandleError,
108+
}
103109
}
104110

105111
pub trait EventsProvider {

0 commit comments

Comments
 (0)