Skip to content

Commit 1653afb

Browse files
author
Antoine Riard
committed
Refactor handle_open_channel to wrapper error handling function
1 parent c91c4be commit 1653afb

File tree

1 file changed

+57
-32
lines changed

1 file changed

+57
-32
lines changed

src/ln/channelmanager.rs

Lines changed: 57 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,6 +1361,41 @@ impl ChannelManager {
13611361
pub fn test_restore_channel_monitor(&self) {
13621362
unimplemented!();
13631363
}
1364+
1365+
fn internal_open_channel(&self, their_node_id: &PublicKey, msg: &msgs::OpenChannel) -> Result<msgs::AcceptChannel, HandleError> {
1366+
if msg.chain_hash != self.genesis_hash {
1367+
return Err(HandleError{err: "Unknown genesis block hash", action: Some(msgs::ErrorAction::IgnoreError)});
1368+
}
1369+
let mut channel_state = self.channel_state.lock().unwrap();
1370+
if channel_state.by_id.contains_key(&msg.temporary_channel_id) {
1371+
return Err(HandleError{err: "temporary_channel_id collision!", action: Some(msgs::ErrorAction::SendErrorMessage { msg: msgs::ErrorMessage { channel_id: msg.temporary_channel_id, data: String::new()}})});
1372+
}
1373+
1374+
let chan_keys = if cfg!(feature = "fuzztarget") {
1375+
ChannelKeys {
1376+
funding_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]).unwrap(),
1377+
revocation_base_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0]).unwrap(),
1378+
payment_base_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0]).unwrap(),
1379+
delayed_payment_base_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0]).unwrap(),
1380+
htlc_base_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0]).unwrap(),
1381+
channel_close_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0]).unwrap(),
1382+
channel_monitor_claim_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0]).unwrap(),
1383+
commitment_seed: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
1384+
}
1385+
} else {
1386+
let mut key_seed = [0u8; 32];
1387+
rng::fill_bytes(&mut key_seed);
1388+
match ChannelKeys::new_from_seed(&key_seed) {
1389+
Ok(key) => key,
1390+
Err(_) => panic!("RNG is busted!")
1391+
}
1392+
};
1393+
1394+
let channel = Channel::new_from_req(&*self.fee_estimator, chan_keys, their_node_id.clone(), msg, 0, false, self.announce_channels_publicly, Arc::clone(&self.logger))?;
1395+
let accept_msg = channel.get_accept_channel()?;
1396+
channel_state.by_id.insert(channel.channel_id(), channel);
1397+
Ok(accept_msg)
1398+
}
13641399
}
13651400

13661401
impl events::EventsProvider for ChannelManager {
@@ -1487,41 +1522,31 @@ impl ChainListener for ChannelManager {
14871522
}
14881523
}
14891524

1525+
macro_rules! handle_error {
1526+
($self: ident, $internal: expr, $channel_id: expr) => {
1527+
match $internal {
1528+
Ok(msg) => Ok(msg),
1529+
Err(e) => {
1530+
match e.action {
1531+
Some(msgs::ErrorAction::DisconnectPeer { msg: _ }) => {
1532+
$self.force_close_channel(&$channel_id);
1533+
},
1534+
Some(msgs::ErrorAction::IgnoreError) => {},
1535+
Some(msgs::ErrorAction::SendErrorMessage { msg: _ }) => {
1536+
$self.force_close_channel(&$channel_id);
1537+
},
1538+
None => {},
1539+
}
1540+
return Err(e);
1541+
},
1542+
}
1543+
}
1544+
}
1545+
14901546
impl ChannelMessageHandler for ChannelManager {
14911547
//TODO: Handle errors and close channel (or so)
14921548
fn handle_open_channel(&self, their_node_id: &PublicKey, msg: &msgs::OpenChannel) -> Result<msgs::AcceptChannel, HandleError> {
1493-
if msg.chain_hash != self.genesis_hash {
1494-
return Err(HandleError{err: "Unknown genesis block hash", action: None});
1495-
}
1496-
let mut channel_state = self.channel_state.lock().unwrap();
1497-
if channel_state.by_id.contains_key(&msg.temporary_channel_id) {
1498-
return Err(HandleError{err: "temporary_channel_id collision!", action: None});
1499-
}
1500-
1501-
let chan_keys = if cfg!(feature = "fuzztarget") {
1502-
ChannelKeys {
1503-
funding_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]).unwrap(),
1504-
revocation_base_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0]).unwrap(),
1505-
payment_base_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0]).unwrap(),
1506-
delayed_payment_base_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0]).unwrap(),
1507-
htlc_base_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0]).unwrap(),
1508-
channel_close_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0]).unwrap(),
1509-
channel_monitor_claim_key: SecretKey::from_slice(&self.secp_ctx, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0]).unwrap(),
1510-
commitment_seed: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
1511-
}
1512-
} else {
1513-
let mut key_seed = [0u8; 32];
1514-
rng::fill_bytes(&mut key_seed);
1515-
match ChannelKeys::new_from_seed(&key_seed) {
1516-
Ok(key) => key,
1517-
Err(_) => panic!("RNG is busted!")
1518-
}
1519-
};
1520-
1521-
let channel = Channel::new_from_req(&*self.fee_estimator, chan_keys, their_node_id.clone(), msg, 0, false, self.announce_channels_publicly, Arc::clone(&self.logger))?;
1522-
let accept_msg = channel.get_accept_channel()?;
1523-
channel_state.by_id.insert(channel.channel_id(), channel);
1524-
Ok(accept_msg)
1549+
handle_error!(self, self.internal_open_channel(their_node_id, msg), msg.temporary_channel_id)
15251550
}
15261551

15271552
fn handle_accept_channel(&self, their_node_id: &PublicKey, msg: &msgs::AcceptChannel) -> Result<(), HandleError> {

0 commit comments

Comments
 (0)