use lightning::chain::chaininterface;
use lightning::chain::transaction::OutPoint;
use lightning::chain::chaininterface::{BroadcasterInterface,ConfirmationTarget,ChainListener,FeeEstimator,ChainWatchInterfaceUtil};
-use lightning::chain::keysinterface::{InMemoryChannelKeys, KeysInterface};
+use lightning::chain::keysinterface::{KeysInterface, InMemoryChannelKeys};
use lightning::ln::channelmonitor;
use lightning::ln::channelmonitor::{ChannelMonitor, ChannelMonitorUpdateErr, HTLCUpdate};
use lightning::ln::channelmanager::{ChannelManager, PaymentHash, PaymentPreimage, ChannelManagerReadArgs};
use lightning::ln::router::{Route, RouteHop};
-use lightning::ln::msgs::{CommitmentUpdate, ChannelMessageHandler, ErrorAction, LightningError, UpdateAddHTLC, LocalFeatures};
+use lightning::ln::features::InitFeatures;
+use lightning::ln::msgs::{CommitmentUpdate, ChannelMessageHandler, ErrorAction, UpdateAddHTLC};
+use lightning::util::enforcing_trait_impls::EnforcingChannelKeys;
use lightning::util::events;
use lightning::util::logger::Logger;
use lightning::util::config::UserConfig;
channel_id: atomic::AtomicU8,
}
impl KeysInterface for KeyProvider {
- type ChanKeySigner = InMemoryChannelKeys;
+ type ChanKeySigner = EnforcingChannelKeys;
fn get_node_secret(&self) -> SecretKey {
SecretKey::from_slice(&[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, self.node_id]).unwrap()
PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[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, self.node_id]).unwrap())
}
- fn get_channel_keys(&self, _inbound: bool) -> InMemoryChannelKeys {
- InMemoryChannelKeys {
+ fn get_channel_keys(&self, _inbound: bool) -> EnforcingChannelKeys {
+ EnforcingChannelKeys::new(InMemoryChannelKeys {
funding_key: SecretKey::from_slice(&[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, self.node_id]).unwrap(),
revocation_base_key: SecretKey::from_slice(&[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, self.node_id]).unwrap(),
payment_base_key: SecretKey::from_slice(&[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, self.node_id]).unwrap(),
delayed_payment_base_key: SecretKey::from_slice(&[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, self.node_id]).unwrap(),
htlc_base_key: SecretKey::from_slice(&[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, 8, self.node_id]).unwrap(),
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, 9, self.node_id],
- }
+ remote_funding_pubkey: None,
+ })
}
fn get_onion_rand(&self) -> (SecretKey, [u8; 32]) {
monitor.latest_good_update.lock().unwrap().insert(outpoint, monitor_ser);
}
let mut monitor_refs = HashMap::new();
- for (outpoint, monitor) in monitors.iter() {
+ for (outpoint, monitor) in monitors.iter_mut() {
monitor_refs.insert(*outpoint, monitor);
}
tx_broadcaster: broadcast.clone(),
logger,
default_config: config,
- channel_monitors: &monitor_refs,
+ channel_monitors: &mut monitor_refs,
};
- let res = (<(Sha256d, ChannelManager<InMemoryChannelKeys>)>::read(&mut Cursor::new(&$ser.0), read_args).expect("Failed to read manager").1, monitor);
+ let res = (<(Sha256d, ChannelManager<EnforcingChannelKeys>)>::read(&mut Cursor::new(&$ser.0), read_args).expect("Failed to read manager").1, monitor);
for (_, was_good) in $old_monitors.latest_updates_good_at_last_ser.lock().unwrap().iter() {
if !was_good {
// If the last time we updated a monitor we didn't successfully update (and we
} else { panic!("Wrong event type"); }
};
- $dest.handle_open_channel(&$source.get_our_node_id(), LocalFeatures::new(), &open_channel).unwrap();
+ $dest.handle_open_channel(&$source.get_our_node_id(), InitFeatures::supported(), &open_channel);
let accept_channel = {
let events = $dest.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
} else { panic!("Wrong event type"); }
};
- $source.handle_accept_channel(&$dest.get_our_node_id(), LocalFeatures::new(), &accept_channel).unwrap();
+ $source.handle_accept_channel(&$dest.get_our_node_id(), InitFeatures::supported(), &accept_channel);
{
let events = $source.get_and_clear_pending_events();
assert_eq!(events.len(), 1);
msg.clone()
} else { panic!("Wrong event type"); }
};
- $dest.handle_funding_created(&$source.get_our_node_id(), &funding_created).unwrap();
+ $dest.handle_funding_created(&$source.get_our_node_id(), &funding_created);
let funding_signed = {
let events = $dest.get_and_clear_pending_msg_events();
msg.clone()
} else { panic!("Wrong event type"); }
};
- $source.handle_funding_signed(&$dest.get_our_node_id(), &funding_signed).unwrap();
+ $source.handle_funding_signed(&$dest.get_our_node_id(), &funding_signed);
{
let events = $source.get_and_clear_pending_events();
if let events::MessageSendEvent::SendFundingLocked { ref node_id, ref msg } = event {
for node in $nodes.iter() {
if node.get_our_node_id() == *node_id {
- node.handle_funding_locked(&$nodes[idx].get_our_node_id(), msg).unwrap();
+ node.handle_funding_locked(&$nodes[idx].get_our_node_id(), msg);
}
}
} else { panic!("Wrong event type"); }
let mut node_c_ser = VecWriter(Vec::new());
nodes[2].write(&mut node_c_ser).unwrap();
- macro_rules! test_err {
- ($res: expr) => {
- match $res {
- Ok(()) => {},
- Err(LightningError { action: ErrorAction::IgnoreError, .. }) => { },
- _ => { $res.unwrap() },
- }
- }
- }
-
macro_rules! test_return {
() => { {
assert_eq!(nodes[0].list_channels().len(), 1);
assert!(update_fee.is_none());
for update_add in update_add_htlcs {
if !$corrupt_forward {
- test_err!(dest.handle_update_add_htlc(&nodes[$node].get_our_node_id(), &update_add));
+ dest.handle_update_add_htlc(&nodes[$node].get_our_node_id(), &update_add);
} else {
// Corrupt the update_add_htlc message so that its HMAC
// check will fail and we generate a
let mut msg_ser = update_add.encode();
msg_ser[1000] ^= 0xff;
let new_msg = UpdateAddHTLC::read(&mut Cursor::new(&msg_ser)).unwrap();
- test_err!(dest.handle_update_add_htlc(&nodes[$node].get_our_node_id(), &new_msg));
+ dest.handle_update_add_htlc(&nodes[$node].get_our_node_id(), &new_msg);
}
}
for update_fulfill in update_fulfill_htlcs {
- test_err!(dest.handle_update_fulfill_htlc(&nodes[$node].get_our_node_id(), &update_fulfill));
+ dest.handle_update_fulfill_htlc(&nodes[$node].get_our_node_id(), &update_fulfill);
}
for update_fail in update_fail_htlcs {
- test_err!(dest.handle_update_fail_htlc(&nodes[$node].get_our_node_id(), &update_fail));
+ dest.handle_update_fail_htlc(&nodes[$node].get_our_node_id(), &update_fail);
}
for update_fail_malformed in update_fail_malformed_htlcs {
- test_err!(dest.handle_update_fail_malformed_htlc(&nodes[$node].get_our_node_id(), &update_fail_malformed));
+ dest.handle_update_fail_malformed_htlc(&nodes[$node].get_our_node_id(), &update_fail_malformed);
}
- test_err!(dest.handle_commitment_signed(&nodes[$node].get_our_node_id(), &commitment_signed));
+ dest.handle_commitment_signed(&nodes[$node].get_our_node_id(), &commitment_signed);
}
}
},
events::MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
for dest in nodes.iter() {
if dest.get_our_node_id() == *node_id {
- test_err!(dest.handle_revoke_and_ack(&nodes[$node].get_our_node_id(), msg));
+ dest.handle_revoke_and_ack(&nodes[$node].get_our_node_id(), msg);
}
}
},
events::MessageSendEvent::SendChannelReestablish { ref node_id, ref msg } => {
for dest in nodes.iter() {
if dest.get_our_node_id() == *node_id {
- test_err!(dest.handle_channel_reestablish(&nodes[$node].get_our_node_id(), msg));
+ dest.handle_channel_reestablish(&nodes[$node].get_our_node_id(), msg);
}
}
},
// Can be generated due to a payment forward being rejected due to a
// channel having previously failed a monitor update
},
+ events::MessageSendEvent::HandleError { action: ErrorAction::IgnoreError, .. } => {
+ // Can be generated at any processing step to send back an error, disconnect
+ // peer or just ignore
+ },
_ => panic!("Unhandled message event"),
}
}
events::MessageSendEvent::SendChannelReestablish { .. } => {},
events::MessageSendEvent::SendFundingLocked { .. } => {},
events::MessageSendEvent::PaymentFailureNetworkUpdate { .. } => {},
+ events::MessageSendEvent::HandleError { action: ErrorAction::IgnoreError, .. } => {},
_ => panic!("Unhandled message event"),
}
}
events::MessageSendEvent::SendChannelReestablish { .. } => {},
events::MessageSendEvent::SendFundingLocked { .. } => {},
events::MessageSendEvent::PaymentFailureNetworkUpdate { .. } => {},
+ events::MessageSendEvent::HandleError { action: ErrorAction::IgnoreError, .. } => {},
_ => panic!("Unhandled message event"),
}
}
},
events::MessageSendEvent::SendFundingLocked { .. } => false,
events::MessageSendEvent::PaymentFailureNetworkUpdate { .. } => false,
+ events::MessageSendEvent::HandleError { action: ErrorAction::IgnoreError, .. } => false,
_ => panic!("Unhandled message event"),
};
if push { msg_sink.push(event); }