use crate::chain::chaininterface::LowerBoundedFeeEstimator;
use crate::chain::chainmonitor::ChainMonitor;
use crate::chain::channelmonitor::{ChannelMonitor, MonitorEvent, ANTI_REORG_DELAY};
use crate::chain::transaction::OutPoint;
use crate::chain::{ChannelMonitorUpdateStatus, Listen, Watch};
use crate::events::{ClosureReason, Event, HTLCHandlingFailureType, PaymentPurpose};
use crate::ln::channel::AnnouncementSigsState;
use crate::ln::channelmanager::{PaymentId, RAACommitmentOrder, RecipientOnionFields, Retry};
use crate::ln::msgs;
use crate::ln::msgs::{
BaseMessageHandler, ChannelMessageHandler, MessageSendEvent, RoutingMessageHandler,
};
use crate::ln::types::ChannelId;
use crate::routing::router::{PaymentParameters, RouteParameters};
use crate::sign::NodeSigner;
use crate::util::native_async::FutureQueue;
use crate::util::persist::{
MonitorName, MonitorUpdatingPersisterAsync, CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE,
CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE,
CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE,
};
use crate::util::ser::{ReadableArgs, Writeable};
use crate::util::test_channel_signer::TestChannelSigner;
use crate::util::test_utils::TestBroadcaster;
use bitcoin::constants::genesis_block;
use bitcoin::hash_types::BlockHash;
use bitcoin::network::Network;
use crate::ln::functional_test_utils::*;
use crate::util::test_utils;
use crate::prelude::*;
use crate::sync::{Arc, Mutex};
use bitcoin::hashes::Hash;
#[test]
fn test_monitor_and_persister_update_fail() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
send_payment(&nodes[0], &[&nodes[1]], 10_000_000);
let (preimage, payment_hash, ..) = route_payment(&nodes[0], &[&nodes[1]], 9_000_000);
let chain_source = test_utils::TestChainSource::new(Network::Testnet);
let logger = test_utils::TestLogger::with_id(format!("node {}", 0));
let persister = test_utils::TestPersister::new();
let tx_broadcaster = TestBroadcaster {
txn_broadcasted: Mutex::new(Vec::new()),
blocks: Arc::new(Mutex::new(vec![(genesis_block(Network::Testnet), 200); 200])),
};
let chain_mon = {
let new_monitor = {
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(chan.2).unwrap();
let (_, new_monitor) = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(
&mut &monitor.encode()[..],
(nodes[0].keys_manager, nodes[0].keys_manager),
)
.unwrap();
assert!(new_monitor == *monitor);
new_monitor
};
let chain_mon = test_utils::TestChainMonitor::new(
Some(&chain_source),
&tx_broadcaster,
&logger,
&chanmon_cfgs[0].fee_estimator,
&persister,
&node_cfgs[0].keys_manager,
);
assert_eq!(
chain_mon.watch_channel(chan.2, new_monitor),
Ok(ChannelMonitorUpdateStatus::Completed)
);
chain_mon
};
chain_mon
.chain_monitor
.block_connected(&create_dummy_block(BlockHash::all_zeros(), 42, Vec::new()), 200);
nodes[1].node.claim_funds(preimage);
expect_payment_claimed!(nodes[1], payment_hash, 9_000_000);
check_added_monitors!(nodes[1], 1);
let mut updates = get_htlc_update_msgs!(nodes[1], node_a_id);
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
nodes[0].node.handle_update_fulfill_htlc(node_b_id, updates.update_fulfill_htlcs.remove(0));
{
let mut per_peer_lock;
let mut peer_state_lock;
let chan_opt = get_channel_ref!(nodes[0], nodes[1], per_peer_lock, peer_state_lock, chan.2);
if let Some(channel) = chan_opt.as_funded_mut() {
assert_eq!(updates.commitment_signed.len(), 1);
let feeest = LowerBoundedFeeEstimator::new(&chanmon_cfgs[0].fee_estimator);
if let Ok(Some(update)) = channel.commitment_signed(
&updates.commitment_signed[0],
&feeest,
&node_cfgs[0].logger,
) {
if let ChannelMonitorUpdateStatus::InProgress =
chain_mon.chain_monitor.update_channel(chan.2, &update)
{
} else {
panic!("Expected monitor paused");
}
logger.assert_log_regex(
"lightning::chain::chainmonitor",
regex::Regex::new("Failed to update ChannelMonitor for channel [0-9a-f]*.")
.unwrap(),
1,
);
assert_eq!(
nodes[0].chain_monitor.update_channel(chan.2, &update),
ChannelMonitorUpdateStatus::Completed
);
} else {
assert!(false);
}
} else {
assert!(false);
}
}
check_added_monitors!(nodes[0], 1);
expect_payment_sent(&nodes[0], preimage, None, false, false);
}
fn do_test_simple_monitor_temporary_update_fail(disconnect: bool) {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let user_channel_id = nodes[1].node.list_channels()[0].user_channel_id;
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) =
get_route_and_payment_hash!(&nodes[0], nodes[1], 1000000);
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let onion = RecipientOnionFields::secret_only(payment_secret_1);
let id = PaymentId(payment_hash_1.0);
nodes[0].node.send_payment_with_route(route, payment_hash_1, onion, id).unwrap();
check_added_monitors!(nodes[0], 1);
assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
assert_eq!(nodes[0].node.list_channels().len(), 1);
if disconnect {
nodes[0].node.peer_disconnected(node_b_id);
nodes[1].node.peer_disconnected(node_a_id);
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
reconnect_args.send_channel_ready = (true, true);
reconnect_args.send_announcement_sigs = (true, true);
reconnect_nodes(reconnect_args);
}
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[0].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[0].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
check_added_monitors!(nodes[0], 0);
let mut events_2 = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events_2.len(), 1);
let payment_event = SendEvent::from_event(events_2.pop().unwrap());
assert_eq!(payment_event.node_id, node_b_id);
nodes[1].node.handle_update_add_htlc(node_a_id, &payment_event.msgs[0]);
commitment_signed_dance!(nodes[1], nodes[0], payment_event.commitment_msg, false);
expect_and_process_pending_htlcs(&nodes[1], false);
let events_3 = nodes[1].node.get_and_clear_pending_events();
assert_eq!(events_3.len(), 1);
match events_3[0] {
Event::PaymentClaimable {
ref payment_hash,
ref purpose,
amount_msat,
receiver_node_id,
ref receiving_channel_ids,
..
} => {
assert_eq!(payment_hash_1, *payment_hash);
assert_eq!(amount_msat, 1_000_000);
assert_eq!(receiver_node_id.unwrap(), node_b_id);
assert_eq!(*receiving_channel_ids, &[(channel_id, Some(user_channel_id))]);
match &purpose {
PaymentPurpose::Bolt11InvoicePayment {
payment_preimage, payment_secret, ..
} => {
assert!(payment_preimage.is_none());
assert_eq!(payment_secret_1, *payment_secret);
},
_ => panic!("expected PaymentPurpose::Bolt11InvoicePayment"),
}
},
_ => panic!("Unexpected event"),
}
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
let (route, payment_hash_2, _, payment_secret_2) =
get_route_and_payment_hash!(&nodes[0], nodes[1], 1000000);
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let onion = RecipientOnionFields::secret_only(payment_secret_2);
let id = PaymentId(payment_hash_2.0);
nodes[0].node.send_payment_with_route(route, payment_hash_2, onion, id).unwrap();
check_added_monitors!(nodes[0], 1);
assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
assert_eq!(nodes[0].node.list_channels().len(), 1);
if disconnect {
nodes[0].node.peer_disconnected(node_b_id);
nodes[1].node.peer_disconnected(node_a_id);
reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
}
let message = "Channel force-closed".to_owned();
let reason = ClosureReason::HolderForceClosed {
broadcasted_latest_txn: Some(true),
message: message.clone(),
};
nodes[0].node.force_close_broadcasting_latest_txn(&channel_id, &node_b_id, message).unwrap();
check_added_monitors!(nodes[0], 1);
check_closed_broadcast!(nodes[0], true);
assert_eq!(nodes[0].node.list_channels().len(), 0);
check_closed_event!(nodes[0], 1, reason, [node_b_id], 100000);
}
#[test]
fn test_simple_monitor_temporary_update_fail() {
do_test_simple_monitor_temporary_update_fail(false);
do_test_simple_monitor_temporary_update_fail(true);
}
fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
let disconnect_flags = 8 | 16;
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let user_channel_id = nodes[1].node.list_channels()[0].user_channel_id;
let (payment_preimage_1, payment_hash_1, ..) =
route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) =
get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let onion = RecipientOnionFields::secret_only(payment_secret_2);
let id = PaymentId(payment_hash_2.0);
nodes[0].node.send_payment_with_route(route, payment_hash_2, onion, id).unwrap();
check_added_monitors!(nodes[0], 1);
assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
assert_eq!(nodes[0].node.list_channels().len(), 1);
nodes[1].node.claim_funds(payment_preimage_1);
check_added_monitors!(nodes[1], 1);
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
let events_2 = nodes[1].node.get_and_clear_pending_msg_events();
assert_eq!(events_2.len(), 1);
let (bs_initial_fulfill, bs_initial_commitment_signed) = match events_2[0] {
MessageSendEvent::UpdateHTLCs {
ref node_id,
channel_id: _,
updates:
msgs::CommitmentUpdate {
ref update_add_htlcs,
ref update_fulfill_htlcs,
ref update_fail_htlcs,
ref update_fail_malformed_htlcs,
ref update_fee,
ref commitment_signed,
},
} => {
assert_eq!(*node_id, node_a_id);
assert!(update_add_htlcs.is_empty());
assert_eq!(update_fulfill_htlcs.len(), 1);
assert!(update_fail_htlcs.is_empty());
assert!(update_fail_malformed_htlcs.is_empty());
assert!(update_fee.is_none());
if (disconnect_count & 16) == 0 {
let fulfill_msg = update_fulfill_htlcs[0].clone();
nodes[0].node.handle_update_fulfill_htlc(node_b_id, fulfill_msg);
let events_3 = nodes[0].node.get_and_clear_pending_events();
assert_eq!(events_3.len(), 1);
match events_3[0] {
Event::PaymentSent { ref payment_preimage, ref payment_hash, .. } => {
assert_eq!(*payment_preimage, payment_preimage_1);
assert_eq!(*payment_hash, payment_hash_1);
},
_ => panic!("Unexpected event"),
}
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, commitment_signed);
check_added_monitors!(nodes[0], 1);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
}
(update_fulfill_htlcs[0].clone(), commitment_signed.clone())
},
_ => panic!("Unexpected event"),
};
if disconnect_count & !disconnect_flags > 0 {
nodes[0].node.peer_disconnected(node_b_id);
nodes[1].node.peer_disconnected(node_a_id);
}
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[0].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[0].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
check_added_monitors!(nodes[0], 0);
macro_rules! disconnect_reconnect_peers {
() => {{
nodes[0].node.peer_disconnected(node_b_id);
nodes[1].node.peer_disconnected(node_a_id);
let init_msg = msgs::Init {
features: nodes[1].node.init_features(),
networks: None,
remote_network_address: None,
};
nodes[0].node.peer_connected(node_b_id, &init_msg, true).unwrap();
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
assert_eq!(reestablish_1.len(), 1);
nodes[1].node.peer_connected(node_a_id, &init_msg, false).unwrap();
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
assert_eq!(reestablish_2.len(), 1);
nodes[0].node.handle_channel_reestablish(node_b_id, &reestablish_2[0]);
let as_resp = handle_chan_reestablish_msgs!(nodes[0], nodes[1]);
nodes[1].node.handle_channel_reestablish(node_a_id, &reestablish_1[0]);
let bs_resp = handle_chan_reestablish_msgs!(nodes[1], nodes[0]);
assert!(as_resp.0.is_none());
assert!(bs_resp.0.is_none());
(reestablish_1, reestablish_2, as_resp, bs_resp)
}};
}
let (payment_event, initial_revoke_and_ack) = if disconnect_count & !disconnect_flags > 0 {
assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
let init_msg = msgs::Init {
features: nodes[1].node.init_features(),
networks: None,
remote_network_address: None,
};
nodes[0].node.peer_connected(node_b_id, &init_msg, true).unwrap();
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
assert_eq!(reestablish_1.len(), 1);
nodes[1].node.peer_connected(node_a_id, &init_msg, false).unwrap();
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
assert_eq!(reestablish_2.len(), 1);
nodes[0].node.handle_channel_reestablish(node_b_id, &reestablish_2[0]);
check_added_monitors!(nodes[0], 0);
let mut as_resp = handle_chan_reestablish_msgs!(nodes[0], nodes[1]);
nodes[1].node.handle_channel_reestablish(node_a_id, &reestablish_1[0]);
check_added_monitors!(nodes[1], 0);
let mut bs_resp = handle_chan_reestablish_msgs!(nodes[1], nodes[0]);
assert!(as_resp.0.is_none());
assert!(bs_resp.0.is_none());
assert!(bs_resp.1.is_none());
if (disconnect_count & 16) == 0 {
assert!(bs_resp.2.is_none());
assert!(as_resp.1.is_some());
assert!(as_resp.2.is_some());
assert_eq!(as_resp.3, RAACommitmentOrder::CommitmentFirst);
} else {
assert!(bs_resp.2.as_ref().unwrap().update_add_htlcs.is_empty());
assert!(bs_resp.2.as_ref().unwrap().update_fail_htlcs.is_empty());
assert!(bs_resp.2.as_ref().unwrap().update_fail_malformed_htlcs.is_empty());
assert!(bs_resp.2.as_ref().unwrap().update_fee.is_none());
assert_eq!(bs_resp.2.as_ref().unwrap().update_fulfill_htlcs, [bs_initial_fulfill]);
assert_eq!(bs_resp.2.as_ref().unwrap().commitment_signed, bs_initial_commitment_signed);
assert!(as_resp.1.is_none());
nodes[0].node.handle_update_fulfill_htlc(
node_b_id,
bs_resp.2.as_ref().unwrap().update_fulfill_htlcs[0].clone(),
);
let events_3 = nodes[0].node.get_and_clear_pending_events();
assert_eq!(events_3.len(), 1);
match events_3[0] {
Event::PaymentSent { ref payment_preimage, ref payment_hash, .. } => {
assert_eq!(*payment_preimage, payment_preimage_1);
assert_eq!(*payment_hash, payment_hash_1);
},
_ => panic!("Unexpected event"),
}
nodes[0].node.handle_commitment_signed_batch_test(
node_b_id,
&bs_resp.2.as_ref().unwrap().commitment_signed,
);
let as_resp_raa =
get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
check_added_monitors!(nodes[0], 1);
as_resp.1 = Some(as_resp_raa);
bs_resp.2 = None;
}
if disconnect_count & !disconnect_flags > 1 {
let (second_reestablish_1, second_reestablish_2, second_as_resp, second_bs_resp) =
disconnect_reconnect_peers!();
if (disconnect_count & 16) == 0 {
assert_eq!(reestablish_1, second_reestablish_1);
assert_eq!(reestablish_2, second_reestablish_2);
}
assert_eq!(as_resp, second_as_resp);
assert_eq!(bs_resp, second_bs_resp);
}
(
SendEvent::from_commitment_update(node_b_id, channel_id, as_resp.2.unwrap()),
as_resp.1.unwrap(),
)
} else {
let mut events_4 = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events_4.len(), 2);
(
SendEvent::from_event(events_4.remove(0)),
match events_4[0] {
MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
assert_eq!(*node_id, node_b_id);
msg.clone()
},
_ => panic!("Unexpected event"),
},
)
};
assert_eq!(payment_event.node_id, node_b_id);
nodes[1].node.handle_update_add_htlc(node_a_id, &payment_event.msgs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &payment_event.commitment_msg);
let bs_revoke_and_ack = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, node_a_id);
check_added_monitors!(nodes[1], 1);
if disconnect_count & !disconnect_flags > 2 {
let (_, _, as_resp, bs_resp) = disconnect_reconnect_peers!();
assert_eq!(as_resp.1.unwrap(), initial_revoke_and_ack);
assert_eq!(bs_resp.1.unwrap(), bs_revoke_and_ack);
assert!(as_resp.2.is_none());
assert!(bs_resp.2.is_none());
}
let as_commitment_update;
let bs_second_commitment_update;
macro_rules! handle_bs_raa {
() => {
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_revoke_and_ack);
as_commitment_update = get_htlc_update_msgs!(nodes[0], node_b_id);
assert!(as_commitment_update.update_add_htlcs.is_empty());
assert!(as_commitment_update.update_fulfill_htlcs.is_empty());
assert!(as_commitment_update.update_fail_htlcs.is_empty());
assert!(as_commitment_update.update_fail_malformed_htlcs.is_empty());
assert!(as_commitment_update.update_fee.is_none());
check_added_monitors!(nodes[0], 1);
};
}
macro_rules! handle_initial_raa {
() => {
nodes[1].node.handle_revoke_and_ack(node_a_id, &initial_revoke_and_ack);
bs_second_commitment_update = get_htlc_update_msgs!(nodes[1], node_a_id);
assert!(bs_second_commitment_update.update_add_htlcs.is_empty());
assert!(bs_second_commitment_update.update_fulfill_htlcs.is_empty());
assert!(bs_second_commitment_update.update_fail_htlcs.is_empty());
assert!(bs_second_commitment_update.update_fail_malformed_htlcs.is_empty());
assert!(bs_second_commitment_update.update_fee.is_none());
check_added_monitors!(nodes[1], 1);
};
}
if (disconnect_count & 8) == 0 {
handle_bs_raa!();
if disconnect_count & !disconnect_flags > 3 {
let (_, _, as_resp, bs_resp) = disconnect_reconnect_peers!();
assert_eq!(as_resp.1.unwrap(), initial_revoke_and_ack);
assert!(bs_resp.1.is_none());
assert_eq!(as_resp.2.unwrap(), as_commitment_update);
assert!(bs_resp.2.is_none());
assert_eq!(as_resp.3, RAACommitmentOrder::RevokeAndACKFirst);
}
handle_initial_raa!();
if disconnect_count & !disconnect_flags > 4 {
let (_, _, as_resp, bs_resp) = disconnect_reconnect_peers!();
assert!(as_resp.1.is_none());
assert!(bs_resp.1.is_none());
assert_eq!(as_resp.2.unwrap(), as_commitment_update);
assert_eq!(bs_resp.2.unwrap(), bs_second_commitment_update);
}
} else {
handle_initial_raa!();
if disconnect_count & !disconnect_flags > 3 {
let (_, _, as_resp, bs_resp) = disconnect_reconnect_peers!();
assert!(as_resp.1.is_none());
assert_eq!(bs_resp.1.unwrap(), bs_revoke_and_ack);
assert!(as_resp.2.is_none());
assert_eq!(bs_resp.2.unwrap(), bs_second_commitment_update);
assert_eq!(bs_resp.3, RAACommitmentOrder::RevokeAndACKFirst);
}
handle_bs_raa!();
if disconnect_count & !disconnect_flags > 4 {
let (_, _, as_resp, bs_resp) = disconnect_reconnect_peers!();
assert!(as_resp.1.is_none());
assert!(bs_resp.1.is_none());
assert_eq!(as_resp.2.unwrap(), as_commitment_update);
assert_eq!(bs_resp.2.unwrap(), bs_second_commitment_update);
}
}
nodes[0].node.handle_commitment_signed_batch_test(
node_b_id,
&bs_second_commitment_update.commitment_signed,
);
let as_revoke_and_ack = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
check_added_monitors!(nodes[0], 1);
nodes[1]
.node
.handle_commitment_signed_batch_test(node_a_id, &as_commitment_update.commitment_signed);
let bs_second_revoke_and_ack =
get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, node_a_id);
check_added_monitors!(nodes[1], 1);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_revoke_and_ack);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[1], 1);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_second_revoke_and_ack);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[0], 1);
expect_payment_path_successful!(nodes[0]);
expect_and_process_pending_htlcs(&nodes[1], false);
let events_5 = nodes[1].node.get_and_clear_pending_events();
assert_eq!(events_5.len(), 1);
match events_5[0] {
Event::PaymentClaimable {
ref payment_hash,
ref purpose,
amount_msat,
receiver_node_id,
ref receiving_channel_ids,
..
} => {
assert_eq!(payment_hash_2, *payment_hash);
assert_eq!(amount_msat, 1_000_000);
assert_eq!(receiver_node_id.unwrap(), node_b_id);
assert_eq!(*receiving_channel_ids, [(channel_id, Some(user_channel_id))]);
match &purpose {
PaymentPurpose::Bolt11InvoicePayment {
payment_preimage, payment_secret, ..
} => {
assert!(payment_preimage.is_none());
assert_eq!(payment_secret_2, *payment_secret);
},
_ => panic!("expected PaymentPurpose::Bolt11InvoicePayment"),
}
},
_ => panic!("Unexpected event"),
}
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_2);
}
#[test]
fn test_monitor_temporary_update_fail_a() {
do_test_monitor_temporary_update_fail(0);
do_test_monitor_temporary_update_fail(1);
do_test_monitor_temporary_update_fail(2);
do_test_monitor_temporary_update_fail(3);
do_test_monitor_temporary_update_fail(4);
do_test_monitor_temporary_update_fail(5);
}
#[test]
fn test_monitor_temporary_update_fail_b() {
do_test_monitor_temporary_update_fail(2 | 8);
do_test_monitor_temporary_update_fail(3 | 8);
do_test_monitor_temporary_update_fail(4 | 8);
do_test_monitor_temporary_update_fail(5 | 8);
}
#[test]
fn test_monitor_temporary_update_fail_c() {
do_test_monitor_temporary_update_fail(1 | 16);
do_test_monitor_temporary_update_fail(2 | 16);
do_test_monitor_temporary_update_fail(3 | 16);
do_test_monitor_temporary_update_fail(2 | 8 | 16);
do_test_monitor_temporary_update_fail(3 | 8 | 16);
}
#[test]
fn test_monitor_update_fail_cs() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let user_channel_id = nodes[1].node.list_channels()[0].user_channel_id;
let (route, our_payment_hash, payment_preimage, our_payment_secret) =
get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
let onion = RecipientOnionFields::secret_only(our_payment_secret);
let id = PaymentId(our_payment_hash.0);
nodes[0].node.send_payment_with_route(route, our_payment_hash, onion, id).unwrap();
check_added_monitors!(nodes[0], 1);
let send_event =
SendEvent::from_event(nodes[0].node.get_and_clear_pending_msg_events().remove(0));
nodes[1].node.handle_update_add_htlc(node_a_id, &send_event.msgs[0]);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &send_event.commitment_msg);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
check_added_monitors!(nodes[1], 0);
let responses = nodes[1].node.get_and_clear_pending_msg_events();
assert_eq!(responses.len(), 2);
match responses[0] {
MessageSendEvent::SendRevokeAndACK { ref msg, ref node_id } => {
assert_eq!(*node_id, node_a_id);
nodes[0].node.handle_revoke_and_ack(node_b_id, &msg);
check_added_monitors!(nodes[0], 1);
},
_ => panic!("Unexpected event"),
}
match responses[1] {
MessageSendEvent::UpdateHTLCs { ref updates, ref node_id, channel_id: _ } => {
assert!(updates.update_add_htlcs.is_empty());
assert!(updates.update_fulfill_htlcs.is_empty());
assert!(updates.update_fail_htlcs.is_empty());
assert!(updates.update_fail_malformed_htlcs.is_empty());
assert!(updates.update_fee.is_none());
assert_eq!(*node_id, node_a_id);
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[0]
.node
.handle_commitment_signed_batch_test(node_b_id, &updates.commitment_signed);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[0], 1);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
},
_ => panic!("Unexpected event"),
}
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[0].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[0].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
check_added_monitors!(nodes[0], 0);
let final_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_revoke_and_ack(node_a_id, &final_raa);
check_added_monitors!(nodes[1], 1);
expect_and_process_pending_htlcs(&nodes[1], false);
let events = nodes[1].node.get_and_clear_pending_events();
assert_eq!(events.len(), 1);
match events[0] {
Event::PaymentClaimable {
payment_hash,
ref purpose,
amount_msat,
receiver_node_id,
ref receiving_channel_ids,
..
} => {
assert_eq!(payment_hash, our_payment_hash);
assert_eq!(amount_msat, 1_000_000);
assert_eq!(receiver_node_id.unwrap(), node_b_id);
assert_eq!(*receiving_channel_ids, [(channel_id, Some(user_channel_id))]);
match &purpose {
PaymentPurpose::Bolt11InvoicePayment {
payment_preimage, payment_secret, ..
} => {
assert!(payment_preimage.is_none());
assert_eq!(our_payment_secret, *payment_secret);
},
_ => panic!("expected PaymentPurpose::Bolt11InvoicePayment"),
}
},
_ => panic!("Unexpected event"),
};
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage);
}
#[test]
fn test_monitor_update_fail_no_rebroadcast() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let (route, our_payment_hash, payment_preimage_1, payment_secret_1) =
get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
let onion = RecipientOnionFields::secret_only(payment_secret_1);
let id = PaymentId(our_payment_hash.0);
nodes[0].node.send_payment_with_route(route, our_payment_hash, onion, id).unwrap();
check_added_monitors!(nodes[0], 1);
let send_event =
SendEvent::from_event(nodes[0].node.get_and_clear_pending_msg_events().remove(0));
nodes[1].node.handle_update_add_htlc(node_a_id, &send_event.msgs[0]);
let commitment = send_event.commitment_msg;
let bs_raa = commitment_signed_dance!(nodes[1], nodes[0], commitment, false, true, false, true);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.handle_revoke_and_ack(node_a_id, &bs_raa);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
check_added_monitors!(nodes[1], 1);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[1], 0);
expect_and_process_pending_htlcs(&nodes[1], false);
let events = nodes[1].node.get_and_clear_pending_events();
assert_eq!(events.len(), 1);
match events[0] {
Event::PaymentClaimable { payment_hash, .. } => {
assert_eq!(payment_hash, our_payment_hash);
},
_ => panic!("Unexpected event"),
}
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
}
#[test]
fn test_monitor_update_raa_while_paused() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1).2;
send_payment(&nodes[0], &[&nodes[1]], 5000000);
let (route, our_payment_hash_1, payment_preimage_1, our_payment_secret_1) =
get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
let onion = RecipientOnionFields::secret_only(our_payment_secret_1);
let id = PaymentId(our_payment_hash_1.0);
nodes[0].node.send_payment_with_route(route, our_payment_hash_1, onion, id).unwrap();
check_added_monitors!(nodes[0], 1);
let send_event_1 =
SendEvent::from_event(nodes[0].node.get_and_clear_pending_msg_events().remove(0));
let (route, our_payment_hash_2, payment_preimage_2, our_payment_secret_2) =
get_route_and_payment_hash!(nodes[1], nodes[0], 1000000);
let onion_2 = RecipientOnionFields::secret_only(our_payment_secret_2);
let id_2 = PaymentId(our_payment_hash_2.0);
nodes[1].node.send_payment_with_route(route, our_payment_hash_2, onion_2, id_2).unwrap();
check_added_monitors!(nodes[1], 1);
let send_event_2 =
SendEvent::from_event(nodes[1].node.get_and_clear_pending_msg_events().remove(0));
nodes[1].node.handle_update_add_htlc(node_a_id, &send_event_1.msgs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &send_event_1.commitment_msg);
check_added_monitors!(nodes[1], 1);
let bs_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, node_a_id);
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[0].node.handle_update_add_htlc(node_b_id, &send_event_2.msgs[0]);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &send_event_2.commitment_msg);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[0], 1);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_raa);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[0], 1);
let (latest_update, _) = nodes[0].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[0].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
check_added_monitors!(nodes[0], 0);
let as_update_raa = get_revoke_commit_msgs!(nodes[0], node_b_id);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_update_raa.0);
check_added_monitors!(nodes[1], 1);
let bs_cs = get_htlc_update_msgs!(nodes[1], node_a_id);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &as_update_raa.1);
check_added_monitors!(nodes[1], 1);
let bs_second_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, node_a_id);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &bs_cs.commitment_signed);
check_added_monitors!(nodes[0], 1);
let as_second_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_second_raa);
check_added_monitors!(nodes[0], 1);
expect_and_process_pending_htlcs(&nodes[0], false);
expect_payment_claimable!(nodes[0], our_payment_hash_2, our_payment_secret_2, 1000000);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_second_raa);
check_added_monitors!(nodes[1], 1);
expect_and_process_pending_htlcs(&nodes[1], false);
expect_payment_claimable!(nodes[1], our_payment_hash_1, our_payment_secret_1, 1000000);
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
claim_payment(&nodes[1], &[&nodes[0]], payment_preimage_2);
}
fn do_test_monitor_update_fail_raa(test_ignore_second_cs: bool) {
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
create_announced_chan_between_nodes(&nodes, 0, 1);
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2);
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 5000000);
let (_, payment_hash_1, ..) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1000000);
nodes[2].node.fail_htlc_backwards(&payment_hash_1);
expect_and_process_pending_htlcs_and_htlc_handling_failed(
&nodes[2],
&[HTLCHandlingFailureType::Receive { payment_hash: payment_hash_1 }],
);
check_added_monitors!(nodes[2], 1);
let updates = get_htlc_update_msgs!(nodes[2], node_b_id);
assert!(updates.update_add_htlcs.is_empty());
assert!(updates.update_fulfill_htlcs.is_empty());
assert_eq!(updates.update_fail_htlcs.len(), 1);
assert!(updates.update_fail_malformed_htlcs.is_empty());
assert!(updates.update_fee.is_none());
nodes[1].node.handle_update_fail_htlc(node_c_id, &updates.update_fail_htlcs[0]);
let commitment = updates.commitment_signed;
let bs_revoke_and_ack =
commitment_signed_dance!(nodes[1], nodes[2], commitment, false, true, false, true);
check_added_monitors!(nodes[0], 0);
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) =
get_route_and_payment_hash!(nodes[0], nodes[2], 1000000);
let onion_2 = RecipientOnionFields::secret_only(payment_secret_2);
let id_2 = PaymentId(payment_hash_2.0);
nodes[0].node.send_payment_with_route(route, payment_hash_2, onion_2, id_2).unwrap();
check_added_monitors!(nodes[0], 1);
let mut send_event =
SendEvent::from_event(nodes[0].node.get_and_clear_pending_msg_events().remove(0));
nodes[1].node.handle_update_add_htlc(node_a_id, &send_event.msgs[0]);
commitment_signed_dance!(nodes[1], nodes[0], send_event.commitment_msg, false);
expect_and_process_pending_htlcs(&nodes[1], false);
check_added_monitors!(nodes[1], 0);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.handle_revoke_and_ack(node_c_id, &bs_revoke_and_ack);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[1], 1);
let (route, payment_hash_3, _, payment_secret_3) =
get_route_and_payment_hash!(nodes[0], nodes[2], 1000000);
let onion_3 = RecipientOnionFields::secret_only(payment_secret_3);
let id_3 = PaymentId(payment_hash_3.0);
nodes[0].node.send_payment_with_route(route, payment_hash_3, onion_3, id_3).unwrap();
check_added_monitors!(nodes[0], 1);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed); send_event = SendEvent::from_event(nodes[0].node.get_and_clear_pending_msg_events().remove(0));
nodes[1].node.handle_update_add_htlc(node_a_id, &send_event.msgs[0]);
commitment_signed_dance!(nodes[1], nodes[0], send_event.commitment_msg, false, true);
check_added_monitors!(nodes[1], 0);
expect_and_process_pending_htlcs(&nodes[1], false);
check_added_monitors!(nodes[1], 0);
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
let (payment_preimage_4, payment_hash_4) = if test_ignore_second_cs {
let (route, payment_hash_4, payment_preimage_4, payment_secret_4) =
get_route_and_payment_hash!(nodes[2], nodes[0], 1000000);
let onion_4 = RecipientOnionFields::secret_only(payment_secret_4);
let id_4 = PaymentId(payment_hash_4.0);
nodes[2].node.send_payment_with_route(route, payment_hash_4, onion_4, id_4).unwrap();
check_added_monitors!(nodes[2], 1);
send_event =
SendEvent::from_event(nodes[2].node.get_and_clear_pending_msg_events().remove(0));
nodes[1].node.handle_update_add_htlc(node_c_id, &send_event.msgs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_c_id, &send_event.commitment_msg);
check_added_monitors!(nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
(Some(payment_preimage_4), Some(payment_hash_4))
} else {
(None, None)
};
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(chan_2.2);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(chan_2.2, latest_update);
check_added_monitors!(nodes[1], 0);
expect_and_process_pending_htlcs_and_htlc_handling_failed(
&nodes[1],
&[HTLCHandlingFailureType::Forward { node_id: Some(node_c_id), channel_id: chan_2.2 }],
);
check_added_monitors!(nodes[1], 1);
let mut events_3 = nodes[1].node.get_and_clear_pending_msg_events();
if test_ignore_second_cs {
assert_eq!(events_3.len(), 3);
} else {
assert_eq!(events_3.len(), 2);
}
let nodes_0_event = remove_first_msg_event_to_node(&node_a_id, &mut events_3);
let messages_a = match nodes_0_event {
MessageSendEvent::UpdateHTLCs { node_id, mut updates, channel_id: _ } => {
assert_eq!(node_id, node_a_id);
assert!(updates.update_fulfill_htlcs.is_empty());
assert_eq!(updates.update_fail_htlcs.len(), 1);
assert!(updates.update_fail_malformed_htlcs.is_empty());
assert!(updates.update_add_htlcs.is_empty());
assert!(updates.update_fee.is_none());
(updates.update_fail_htlcs.remove(0), updates.commitment_signed)
},
_ => panic!("Unexpected event type!"),
};
let nodes_2_event = remove_first_msg_event_to_node(&node_c_id, &mut events_3);
let send_event_b = SendEvent::from_event(nodes_2_event);
assert_eq!(send_event_b.node_id, node_c_id);
let raa = if test_ignore_second_cs {
let nodes_2_event = remove_first_msg_event_to_node(&node_c_id, &mut events_3);
match nodes_2_event {
MessageSendEvent::SendRevokeAndACK { node_id, msg } => {
assert_eq!(node_id, node_c_id);
Some(msg.clone())
},
_ => panic!("Unexpected event"),
}
} else {
None
};
nodes[0].node.handle_update_fail_htlc(node_b_id, &messages_a.0);
commitment_signed_dance!(nodes[0], nodes[1], messages_a.1, false);
expect_payment_failed!(nodes[0], payment_hash_1, true);
nodes[2].node.handle_update_add_htlc(node_b_id, &send_event_b.msgs[0]);
let as_cs;
if test_ignore_second_cs {
nodes[2].node.handle_commitment_signed_batch_test(node_b_id, &send_event_b.commitment_msg);
check_added_monitors!(nodes[2], 1);
let bs_revoke_and_ack =
get_event_msg!(nodes[2], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[2].node.handle_revoke_and_ack(node_b_id, &raa.unwrap());
check_added_monitors!(nodes[2], 1);
let bs_cs = get_htlc_update_msgs!(nodes[2], node_b_id);
assert!(bs_cs.update_add_htlcs.is_empty());
assert!(bs_cs.update_fail_htlcs.is_empty());
assert!(bs_cs.update_fail_malformed_htlcs.is_empty());
assert!(bs_cs.update_fulfill_htlcs.is_empty());
assert!(bs_cs.update_fee.is_none());
nodes[1].node.handle_revoke_and_ack(node_c_id, &bs_revoke_and_ack);
check_added_monitors!(nodes[1], 1);
as_cs = get_htlc_update_msgs!(nodes[1], node_c_id);
nodes[1].node.handle_commitment_signed_batch_test(node_c_id, &bs_cs.commitment_signed);
check_added_monitors!(nodes[1], 1);
} else {
nodes[2].node.handle_commitment_signed_batch_test(node_b_id, &send_event_b.commitment_msg);
check_added_monitors!(nodes[2], 1);
let bs_revoke_and_commit = nodes[2].node.get_and_clear_pending_msg_events();
assert_eq!(bs_revoke_and_commit.len(), 2);
match bs_revoke_and_commit[0] {
MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
assert_eq!(*node_id, node_b_id);
nodes[1].node.handle_revoke_and_ack(node_c_id, &msg);
check_added_monitors!(nodes[1], 1);
},
_ => panic!("Unexpected event"),
}
as_cs = get_htlc_update_msgs!(nodes[1], node_c_id);
match bs_revoke_and_commit[1] {
MessageSendEvent::UpdateHTLCs { ref node_id, channel_id: _, ref updates } => {
assert_eq!(*node_id, node_b_id);
assert!(updates.update_add_htlcs.is_empty());
assert!(updates.update_fail_htlcs.is_empty());
assert!(updates.update_fail_malformed_htlcs.is_empty());
assert!(updates.update_fulfill_htlcs.is_empty());
assert!(updates.update_fee.is_none());
nodes[1]
.node
.handle_commitment_signed_batch_test(node_c_id, &updates.commitment_signed);
check_added_monitors!(nodes[1], 1);
},
_ => panic!("Unexpected event"),
}
}
assert_eq!(as_cs.update_add_htlcs.len(), 1);
assert!(as_cs.update_fail_htlcs.is_empty());
assert!(as_cs.update_fail_malformed_htlcs.is_empty());
assert!(as_cs.update_fulfill_htlcs.is_empty());
assert!(as_cs.update_fee.is_none());
let as_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, node_c_id);
nodes[2].node.handle_update_add_htlc(node_b_id, &as_cs.update_add_htlcs[0]);
nodes[2].node.handle_commitment_signed_batch_test(node_b_id, &as_cs.commitment_signed);
check_added_monitors!(nodes[2], 1);
let bs_second_raa = get_event_msg!(nodes[2], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[2].node.handle_revoke_and_ack(node_b_id, &as_raa);
check_added_monitors!(nodes[2], 1);
let bs_second_cs = get_htlc_update_msgs!(nodes[2], node_b_id);
nodes[1].node.handle_revoke_and_ack(node_c_id, &bs_second_raa);
check_added_monitors!(nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
nodes[1].node.handle_commitment_signed_batch_test(node_c_id, &bs_second_cs.commitment_signed);
check_added_monitors!(nodes[1], 1);
let as_second_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, node_c_id);
nodes[2].node.handle_revoke_and_ack(node_b_id, &as_second_raa);
check_added_monitors!(nodes[2], 1);
assert!(nodes[2].node.get_and_clear_pending_msg_events().is_empty());
expect_and_process_pending_htlcs(&nodes[2], false);
let events_6 = nodes[2].node.get_and_clear_pending_events();
assert_eq!(events_6.len(), 2);
match events_6[0] {
Event::PaymentClaimable { payment_hash, .. } => {
assert_eq!(payment_hash, payment_hash_2);
},
_ => panic!("Unexpected event"),
};
match events_6[1] {
Event::PaymentClaimable { payment_hash, .. } => {
assert_eq!(payment_hash, payment_hash_3);
},
_ => panic!("Unexpected event"),
};
if test_ignore_second_cs {
expect_and_process_pending_htlcs(&nodes[1], false);
check_added_monitors!(nodes[1], 1);
send_event = SendEvent::from_node(&nodes[1]);
assert_eq!(send_event.node_id, node_a_id);
assert_eq!(send_event.msgs.len(), 1);
nodes[0].node.handle_update_add_htlc(node_b_id, &send_event.msgs[0]);
commitment_signed_dance!(nodes[0], nodes[1], send_event.commitment_msg, false);
expect_and_process_pending_htlcs(&nodes[0], false);
let events_9 = nodes[0].node.get_and_clear_pending_events();
assert_eq!(events_9.len(), 1);
match events_9[0] {
Event::PaymentClaimable { payment_hash, .. } => {
assert_eq!(payment_hash, payment_hash_4.unwrap())
},
_ => panic!("Unexpected event"),
};
claim_payment(&nodes[2], &[&nodes[1], &nodes[0]], payment_preimage_4.unwrap());
}
claim_payment(&nodes[0], &[&nodes[1], &nodes[2]], payment_preimage_2);
}
#[test]
fn test_monitor_update_fail_raa() {
do_test_monitor_update_fail_raa(false);
do_test_monitor_update_fail_raa(true);
}
#[test]
fn test_monitor_update_fail_reestablish() {
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1);
create_announced_chan_between_nodes(&nodes, 1, 2);
let (payment_preimage, payment_hash, ..) =
route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1_000_000);
nodes[1].node.peer_disconnected(node_a_id);
nodes[0].node.peer_disconnected(node_b_id);
nodes[2].node.claim_funds(payment_preimage);
check_added_monitors!(nodes[2], 1);
expect_payment_claimed!(nodes[2], payment_hash, 1_000_000);
let mut updates = get_htlc_update_msgs!(nodes[2], node_b_id);
assert!(updates.update_add_htlcs.is_empty());
assert!(updates.update_fail_htlcs.is_empty());
assert!(updates.update_fail_malformed_htlcs.is_empty());
assert!(updates.update_fee.is_none());
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
nodes[1].node.handle_update_fulfill_htlc(node_c_id, updates.update_fulfill_htlcs.remove(0));
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(1000), false, false);
check_added_monitors!(nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
commitment_signed_dance!(nodes[1], nodes[2], updates.commitment_signed, false);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let init_msg = msgs::Init {
features: nodes[1].node.init_features(),
networks: None,
remote_network_address: None,
};
nodes[0].node.peer_connected(node_b_id, &init_msg, true).unwrap();
nodes[1].node.peer_connected(node_a_id, &init_msg, false).unwrap();
let as_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
nodes[0].node.handle_channel_reestablish(node_b_id, &bs_reestablish);
nodes[1].node.handle_channel_reestablish(node_a_id, &as_reestablish);
let as_channel_upd = get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, node_b_id);
assert_eq!(as_channel_upd.contents.channel_flags & 2, 0);
nodes[1].node.get_and_clear_pending_msg_events(); check_added_monitors!(nodes[1], 1);
nodes[1].node.peer_disconnected(node_a_id);
nodes[0].node.peer_disconnected(node_b_id);
nodes[0].node.peer_connected(node_b_id, &init_msg, true).unwrap();
nodes[1].node.peer_connected(node_a_id, &init_msg, false).unwrap();
assert_eq!(get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap(), as_reestablish);
assert_eq!(get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap(), bs_reestablish);
nodes[0].node.handle_channel_reestablish(node_b_id, &bs_reestablish);
let as_channel_upd = get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, node_b_id);
assert_eq!(as_channel_upd.contents.channel_flags & 2, 0);
nodes[1].node.handle_channel_reestablish(node_a_id, &as_reestablish);
check_added_monitors!(nodes[1], 0);
let bs_channel_upd = get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, node_a_id);
assert_eq!(bs_channel_upd.contents.channel_flags & 2, 0);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(chan_1.2);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(chan_1.2, latest_update);
check_added_monitors!(nodes[1], 0);
updates = get_htlc_update_msgs!(nodes[1], node_a_id);
assert!(updates.update_add_htlcs.is_empty());
assert!(updates.update_fail_htlcs.is_empty());
assert!(updates.update_fail_malformed_htlcs.is_empty());
assert!(updates.update_fee.is_none());
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
nodes[0].node.handle_update_fulfill_htlc(node_b_id, updates.update_fulfill_htlcs.remove(0));
commitment_signed_dance!(nodes[0], nodes[1], updates.commitment_signed, false);
expect_payment_sent!(nodes[0], payment_preimage);
}
#[test]
fn raa_no_response_awaiting_raa_state() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) =
get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
let (payment_preimage_2, payment_hash_2, payment_secret_2) =
get_payment_preimage_hash!(nodes[1]);
let (payment_preimage_3, payment_hash_3, payment_secret_3) =
get_payment_preimage_hash!(nodes[1]);
let onion_1 = RecipientOnionFields::secret_only(payment_secret_1);
let id_1 = PaymentId(payment_hash_1.0);
nodes[0].node.send_payment_with_route(route.clone(), payment_hash_1, onion_1, id_1).unwrap();
check_added_monitors!(nodes[0], 1);
let onion_2 = RecipientOnionFields::secret_only(payment_secret_2);
let id_2 = PaymentId(payment_hash_2.0);
nodes[0].node.send_payment_with_route(route.clone(), payment_hash_2, onion_2, id_2).unwrap();
check_added_monitors!(nodes[0], 0);
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let payment_event = SendEvent::from_event(events.pop().unwrap());
nodes[1].node.handle_update_add_htlc(node_a_id, &payment_event.msgs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &payment_event.commitment_msg);
check_added_monitors!(nodes[1], 1);
let bs_responses = get_revoke_commit_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_responses.0);
check_added_monitors!(nodes[0], 1);
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let payment_event = SendEvent::from_event(events.pop().unwrap());
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &bs_responses.1);
check_added_monitors!(nodes[0], 1);
let as_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.handle_update_add_htlc(node_a_id, &payment_event.msgs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &payment_event.commitment_msg);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_raa);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[1], 1);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
check_added_monitors!(nodes[1], 0);
let bs_responses = get_revoke_commit_msgs!(nodes[1], node_a_id);
expect_and_process_pending_htlcs(&nodes[1], false);
expect_payment_claimable!(nodes[1], payment_hash_1, payment_secret_1, 1000000);
let onion_3 = RecipientOnionFields::secret_only(payment_secret_3);
let id_3 = PaymentId(payment_hash_3.0);
nodes[0].node.send_payment_with_route(route, payment_hash_3, onion_3, id_3).unwrap();
check_added_monitors!(nodes[0], 0);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_responses.0);
check_added_monitors!(nodes[0], 1);
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let payment_event = SendEvent::from_event(events.pop().unwrap());
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &bs_responses.1);
check_added_monitors!(nodes[0], 1);
let as_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_update_add_htlc(node_a_id, &payment_event.msgs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &payment_event.commitment_msg);
check_added_monitors!(nodes[1], 1);
let bs_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, node_a_id);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_raa);
check_added_monitors!(nodes[1], 1);
expect_and_process_pending_htlcs(&nodes[1], false);
expect_payment_claimable!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
let bs_update = get_htlc_update_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_raa);
check_added_monitors!(nodes[0], 1);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &bs_update.commitment_signed);
check_added_monitors!(nodes[0], 1);
let as_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_raa);
check_added_monitors!(nodes[1], 1);
expect_and_process_pending_htlcs(&nodes[1], false);
expect_payment_claimable!(nodes[1], payment_hash_3, payment_secret_3, 1000000);
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_2);
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_3);
}
#[test]
fn claim_while_disconnected_monitor_update_fail() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let (payment_preimage_1, payment_hash_1, ..) =
route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
nodes[0].node.peer_disconnected(node_b_id);
nodes[1].node.peer_disconnected(node_a_id);
nodes[1].node.claim_funds(payment_preimage_1);
check_added_monitors!(nodes[1], 1);
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
let init_msg = msgs::Init {
features: nodes[1].node.init_features(),
networks: None,
remote_network_address: None,
};
nodes[0].node.peer_connected(node_b_id, &init_msg, true).unwrap();
nodes[1].node.peer_connected(node_a_id, &init_msg, false).unwrap();
let as_reconnect = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
let bs_reconnect = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
nodes[0].node.handle_channel_reestablish(node_b_id, &bs_reconnect);
let _as_channel_update =
get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, node_b_id);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.handle_channel_reestablish(node_a_id, &as_reconnect);
let _bs_channel_update =
get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, node_a_id);
check_added_monitors!(nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) =
get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
let onion_2 = RecipientOnionFields::secret_only(payment_secret_2);
let id_2 = PaymentId(payment_hash_2.0);
nodes[0].node.send_payment_with_route(route, payment_hash_2, onion_2, id_2).unwrap();
check_added_monitors!(nodes[0], 1);
let as_updates = get_htlc_update_msgs!(nodes[0], node_b_id);
nodes[1].node.handle_update_add_htlc(node_a_id, &as_updates.update_add_htlcs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &as_updates.commitment_signed);
check_added_monitors!(nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
check_added_monitors!(nodes[1], 0);
let mut bs_msgs = nodes[1].node.get_and_clear_pending_msg_events();
assert_eq!(bs_msgs.len(), 2);
match bs_msgs.remove(0) {
MessageSendEvent::UpdateHTLCs { node_id, channel_id: _, mut updates } => {
assert_eq!(node_id, node_a_id);
let update_fulfill = updates.update_fulfill_htlcs.remove(0);
nodes[0].node.handle_update_fulfill_htlc(node_b_id, update_fulfill);
expect_payment_sent(&nodes[0], payment_preimage_1, None, false, false);
nodes[0]
.node
.handle_commitment_signed_batch_test(node_b_id, &updates.commitment_signed);
check_added_monitors!(nodes[0], 1);
let as_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_raa);
check_added_monitors!(nodes[1], 1);
},
_ => panic!("Unexpected event"),
}
match bs_msgs[0] {
MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
assert_eq!(*node_id, node_a_id);
nodes[0].node.handle_revoke_and_ack(node_b_id, msg);
check_added_monitors!(nodes[0], 1);
},
_ => panic!("Unexpected event"),
}
let as_commitment = get_htlc_update_msgs!(nodes[0], node_b_id);
let bs_commitment = get_htlc_update_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &bs_commitment.commitment_signed);
check_added_monitors!(nodes[0], 1);
let as_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &as_commitment.commitment_signed);
check_added_monitors!(nodes[1], 1);
let bs_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, node_a_id);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_raa);
check_added_monitors!(nodes[1], 1);
expect_and_process_pending_htlcs(&nodes[1], false);
expect_payment_claimable!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_raa);
check_added_monitors!(nodes[0], 1);
expect_payment_path_successful!(nodes[0]);
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_2);
}
#[test]
fn monitor_failed_no_reestablish_response() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1).2;
{
let mut per_peer_lock;
let mut peer_state_lock;
get_channel_ref!(nodes[0], nodes[1], per_peer_lock, peer_state_lock, channel_id)
.context_mut()
.announcement_sigs_state = AnnouncementSigsState::PeerReceived;
}
{
let mut per_peer_lock;
let mut peer_state_lock;
get_channel_ref!(nodes[1], nodes[0], per_peer_lock, peer_state_lock, channel_id)
.context_mut()
.announcement_sigs_state = AnnouncementSigsState::PeerReceived;
}
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) =
get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
let onion = RecipientOnionFields::secret_only(payment_secret_1);
let id = PaymentId(payment_hash_1.0);
nodes[0].node.send_payment_with_route(route, payment_hash_1, onion, id).unwrap();
check_added_monitors!(nodes[0], 1);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let payment_event = SendEvent::from_event(events.pop().unwrap());
nodes[1].node.handle_update_add_htlc(node_a_id, &payment_event.msgs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &payment_event.commitment_msg);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[1], 1);
nodes[0].node.peer_disconnected(node_b_id);
nodes[1].node.peer_disconnected(node_a_id);
let init_msg = msgs::Init {
features: nodes[1].node.init_features(),
networks: None,
remote_network_address: None,
};
nodes[0].node.peer_connected(node_b_id, &init_msg, true).unwrap();
nodes[1].node.peer_connected(node_a_id, &init_msg, false).unwrap();
let as_reconnect = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
let bs_reconnect = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
nodes[1].node.handle_channel_reestablish(node_a_id, &as_reconnect);
let _bs_channel_update =
get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, node_a_id);
nodes[0].node.handle_channel_reestablish(node_b_id, &bs_reconnect);
let _as_channel_update =
get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, node_b_id);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
check_added_monitors!(nodes[1], 0);
let bs_responses = get_revoke_commit_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_responses.0);
check_added_monitors!(nodes[0], 1);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &bs_responses.1);
check_added_monitors!(nodes[0], 1);
let as_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_raa);
check_added_monitors!(nodes[1], 1);
expect_and_process_pending_htlcs(&nodes[1], false);
expect_payment_claimable!(nodes[1], payment_hash_1, payment_secret_1, 1000000);
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
}
#[test]
fn first_message_on_recv_ordering() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) =
get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
let onion_1 = RecipientOnionFields::secret_only(payment_secret_1);
let id_1 = PaymentId(payment_hash_1.0);
nodes[0].node.send_payment_with_route(route, payment_hash_1, onion_1, id_1).unwrap();
check_added_monitors!(nodes[0], 1);
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let payment_event = SendEvent::from_event(events.pop().unwrap());
assert_eq!(payment_event.node_id, node_b_id);
nodes[1].node.handle_update_add_htlc(node_a_id, &payment_event.msgs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &payment_event.commitment_msg);
check_added_monitors!(nodes[1], 1);
let bs_responses = get_revoke_commit_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_responses.0);
check_added_monitors!(nodes[0], 1);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &bs_responses.1);
check_added_monitors!(nodes[0], 1);
let as_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) =
get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
let onion_2 = RecipientOnionFields::secret_only(payment_secret_2);
let id_2 = PaymentId(payment_hash_2.0);
nodes[0].node.send_payment_with_route(route, payment_hash_2, onion_2, id_2).unwrap();
check_added_monitors!(nodes[0], 1);
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let payment_event = SendEvent::from_event(events.pop().unwrap());
assert_eq!(payment_event.node_id, node_b_id);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_raa);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[1], 1);
nodes[1].node.handle_update_add_htlc(node_a_id, &payment_event.msgs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &payment_event.commitment_msg);
check_added_monitors!(nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
check_added_monitors!(nodes[1], 0);
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
expect_and_process_pending_htlcs(&nodes[1], false);
expect_payment_claimable!(nodes[1], payment_hash_1, payment_secret_1, 1000000);
let bs_responses = get_revoke_commit_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_responses.0);
check_added_monitors!(nodes[0], 1);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &bs_responses.1);
check_added_monitors!(nodes[0], 1);
let as_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_raa);
check_added_monitors!(nodes[1], 1);
expect_and_process_pending_htlcs(&nodes[1], false);
expect_payment_claimable!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_2);
}
#[test]
fn test_monitor_update_fail_claim() {
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1);
create_announced_chan_between_nodes(&nodes, 1, 2);
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 5000000);
let (payment_preimage_1, payment_hash_1, ..) =
route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.claim_funds(payment_preimage_1);
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[1], 1);
let (route, payment_hash_2, _, payment_secret_2) =
get_route_and_payment_hash!(nodes[2], nodes[0], 1_000_000);
let onion_2 = RecipientOnionFields::secret_only(payment_secret_2);
let id_2 = PaymentId(payment_hash_2.0);
nodes[2].node.send_payment_with_route(route.clone(), payment_hash_2, onion_2, id_2).unwrap();
check_added_monitors!(nodes[2], 1);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let mut events = nodes[2].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let payment_event = SendEvent::from_event(events.pop().unwrap());
nodes[1].node.handle_update_add_htlc(node_c_id, &payment_event.msgs[0]);
let events = nodes[1].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 0);
commitment_signed_dance!(nodes[1], nodes[2], payment_event.commitment_msg, false, true);
expect_htlc_failure_conditions(nodes[1].node.get_and_clear_pending_events(), &[]);
let (_, payment_hash_3, payment_secret_3) = get_payment_preimage_hash!(nodes[0]);
let id_3 = PaymentId(payment_hash_3.0);
let onion_3 = RecipientOnionFields::secret_only(payment_secret_3);
nodes[2].node.send_payment_with_route(route, payment_hash_3, onion_3, id_3).unwrap();
check_added_monitors!(nodes[2], 1);
let mut events = nodes[2].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let payment_event = SendEvent::from_event(events.pop().unwrap());
nodes[1].node.handle_update_add_htlc(node_c_id, &payment_event.msgs[0]);
let events = nodes[1].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 0);
commitment_signed_dance!(nodes[1], nodes[2], payment_event.commitment_msg, false, true);
let channel_id = chan_1.2;
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
check_added_monitors!(nodes[1], 0);
let mut bs_fulfill = get_htlc_update_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_update_fulfill_htlc(node_b_id, bs_fulfill.update_fulfill_htlcs.remove(0));
commitment_signed_dance!(nodes[0], nodes[1], bs_fulfill.commitment_signed, false);
expect_payment_sent!(nodes[0], payment_preimage_1);
nodes[1].node.process_pending_htlc_forwards();
check_added_monitors!(nodes[1], 1);
let bs_forward_update = get_htlc_update_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_update_add_htlc(node_b_id, &bs_forward_update.update_add_htlcs[0]);
nodes[0].node.handle_update_add_htlc(node_b_id, &bs_forward_update.update_add_htlcs[1]);
commitment_signed_dance!(nodes[0], nodes[1], bs_forward_update.commitment_signed, false);
expect_and_process_pending_htlcs(&nodes[0], false);
let events = nodes[0].node.get_and_clear_pending_events();
assert_eq!(events.len(), 2);
match events[0] {
Event::PaymentClaimable {
ref payment_hash,
ref purpose,
amount_msat,
receiver_node_id,
ref receiving_channel_ids,
..
} => {
assert_eq!(payment_hash_2, *payment_hash);
assert_eq!(1_000_000, amount_msat);
assert_eq!(receiver_node_id.unwrap(), node_a_id);
assert_eq!(*receiving_channel_ids.last().unwrap(), (channel_id, Some(42)));
match &purpose {
PaymentPurpose::Bolt11InvoicePayment {
payment_preimage, payment_secret, ..
} => {
assert!(payment_preimage.is_none());
assert_eq!(payment_secret_2, *payment_secret);
},
_ => panic!("expected PaymentPurpose::Bolt11InvoicePayment"),
}
},
_ => panic!("Unexpected event"),
}
match events[1] {
Event::PaymentClaimable {
ref payment_hash,
ref purpose,
amount_msat,
receiver_node_id,
ref receiving_channel_ids,
..
} => {
assert_eq!(payment_hash_3, *payment_hash);
assert_eq!(1_000_000, amount_msat);
assert_eq!(receiver_node_id.unwrap(), node_a_id);
assert_eq!(*receiving_channel_ids, [(channel_id, Some(42))]);
match &purpose {
PaymentPurpose::Bolt11InvoicePayment {
payment_preimage, payment_secret, ..
} => {
assert!(payment_preimage.is_none());
assert_eq!(payment_secret_3, *payment_secret);
},
_ => panic!("expected PaymentPurpose::Bolt11InvoicePayment"),
}
},
_ => panic!("Unexpected event"),
}
}
#[test]
fn test_monitor_update_on_pending_forwards() {
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1);
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2);
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 5000000);
let (_, payment_hash_1, ..) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1000000);
nodes[2].node.fail_htlc_backwards(&payment_hash_1);
expect_and_process_pending_htlcs_and_htlc_handling_failed(
&nodes[2],
&[HTLCHandlingFailureType::Receive { payment_hash: payment_hash_1 }],
);
check_added_monitors!(nodes[2], 1);
let cs_fail_update = get_htlc_update_msgs!(nodes[2], node_b_id);
nodes[1].node.handle_update_fail_htlc(node_c_id, &cs_fail_update.update_fail_htlcs[0]);
commitment_signed_dance!(nodes[1], nodes[2], cs_fail_update.commitment_signed, true, true);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) =
get_route_and_payment_hash!(nodes[2], nodes[0], 1000000);
let onion = RecipientOnionFields::secret_only(payment_secret_2);
let id = PaymentId(payment_hash_2.0);
nodes[2].node.send_payment_with_route(route, payment_hash_2, onion, id).unwrap();
check_added_monitors!(nodes[2], 1);
let mut events = nodes[2].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let payment_event = SendEvent::from_event(events.pop().unwrap());
nodes[1].node.handle_update_add_htlc(node_c_id, &payment_event.msgs[0]);
commitment_signed_dance!(nodes[1], nodes[2], payment_event.commitment_msg, false);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
expect_and_process_pending_htlcs_and_htlc_handling_failed(
&nodes[1],
&[HTLCHandlingFailureType::Forward { node_id: Some(node_c_id), channel_id: chan_2.2 }],
);
check_added_monitors!(nodes[1], 1);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(chan_1.2);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(chan_1.2, latest_update);
check_added_monitors!(nodes[1], 0);
let bs_updates = get_htlc_update_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_update_fail_htlc(node_b_id, &bs_updates.update_fail_htlcs[0]);
nodes[0].node.handle_update_add_htlc(node_b_id, &bs_updates.update_add_htlcs[0]);
commitment_signed_dance!(nodes[0], nodes[1], bs_updates.commitment_signed, false, true);
let events = nodes[0].node.get_and_clear_pending_events();
assert_eq!(events.len(), 2);
if let Event::PaymentPathFailed { payment_hash, payment_failed_permanently, .. } = events[0] {
assert_eq!(payment_hash, payment_hash_1);
assert!(payment_failed_permanently);
} else {
panic!("Unexpected event!");
}
match events[1] {
Event::PaymentFailed { payment_hash, .. } => {
assert_eq!(payment_hash, Some(payment_hash_1));
},
_ => panic!("Unexpected event"),
}
nodes[0].node.process_pending_htlc_forwards();
expect_payment_claimable!(nodes[0], payment_hash_2, payment_secret_2, 1000000);
claim_payment(&nodes[2], &[&nodes[1], &nodes[0]], payment_preimage_2);
}
#[test]
fn monitor_update_claim_fail_no_response() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let (payment_preimage_1, payment_hash_1, ..) =
route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) =
get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
let onion = RecipientOnionFields::secret_only(payment_secret_2);
let id = PaymentId(payment_hash_2.0);
nodes[0].node.send_payment_with_route(route, payment_hash_2, onion, id).unwrap();
check_added_monitors!(nodes[0], 1);
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let payment_event = SendEvent::from_event(events.pop().unwrap());
nodes[1].node.handle_update_add_htlc(node_a_id, &payment_event.msgs[0]);
let commitment = payment_event.commitment_msg;
let as_raa = commitment_signed_dance!(nodes[1], nodes[0], commitment, false, true, false, true);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.claim_funds(payment_preimage_1);
check_added_monitors!(nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
check_added_monitors!(nodes[1], 0);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_raa);
check_added_monitors!(nodes[1], 1);
expect_and_process_pending_htlcs(&nodes[1], false);
expect_payment_claimable!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
let mut bs_updates = get_htlc_update_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_update_fulfill_htlc(node_b_id, bs_updates.update_fulfill_htlcs.remove(0));
commitment_signed_dance!(nodes[0], nodes[1], bs_updates.commitment_signed, false);
expect_payment_sent!(nodes[0], payment_preimage_1);
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_2);
}
fn do_during_funding_monitor_fail(
confirm_a_first: bool, restore_b_before_conf: bool, restore_b_before_lock: bool,
) {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
nodes[0].node.create_channel(node_b_id, 100000, 10001, 43, None, None).unwrap();
nodes[1].node.handle_open_channel(
node_a_id,
&get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, node_b_id),
);
nodes[0].node.handle_accept_channel(
node_b_id,
&get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, node_a_id),
);
let (temporary_channel_id, funding_tx, funding_output) =
create_funding_transaction(&nodes[0], &node_b_id, 100000, 43);
nodes[0]
.node
.funding_transaction_generated(temporary_channel_id, node_b_id, funding_tx.clone())
.unwrap();
check_added_monitors!(nodes[0], 0);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let funding_created_msg =
get_event_msg!(nodes[0], MessageSendEvent::SendFundingCreated, node_b_id);
let channel_id = ChannelId::v1_from_funding_txid(
funding_created_msg.funding_txid.as_byte_array(),
funding_created_msg.funding_output_index,
);
nodes[1].node.handle_funding_created(node_a_id, &funding_created_msg);
check_added_monitors!(nodes[1], 1);
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[0].node.handle_funding_signed(
node_b_id,
&get_event_msg!(nodes[1], MessageSendEvent::SendFundingSigned, node_a_id),
);
check_added_monitors!(nodes[0], 1);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[0].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[0].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
check_added_monitors!(nodes[0], 0);
expect_channel_pending_event(&nodes[0], &node_b_id);
let events = nodes[0].node.get_and_clear_pending_events();
assert_eq!(events.len(), 0);
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().len(), 1);
assert_eq!(
nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0)[0].compute_txid(),
funding_output.txid
);
if confirm_a_first {
confirm_transaction(&nodes[0], &funding_tx);
nodes[1].node.handle_channel_ready(
node_a_id,
&get_event_msg!(nodes[0], MessageSendEvent::SendChannelReady, node_b_id),
);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
} else {
assert!(!restore_b_before_conf);
confirm_transaction(&nodes[1], &funding_tx);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
}
nodes[0].node.peer_disconnected(node_b_id);
nodes[1].node.peer_disconnected(node_a_id);
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
reconnect_args.send_channel_ready.1 = confirm_a_first;
reconnect_nodes(reconnect_args);
expect_channel_pending_event(&nodes[1], &node_a_id);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
if !restore_b_before_conf {
confirm_transaction(&nodes[1], &funding_tx);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
}
if !confirm_a_first && !restore_b_before_lock {
confirm_transaction(&nodes[0], &funding_tx);
nodes[1].node.handle_channel_ready(
node_a_id,
&get_event_msg!(nodes[0], MessageSendEvent::SendChannelReady, node_b_id),
);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
}
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
check_added_monitors!(nodes[1], 0);
let (channel_id, (announcement, as_update, bs_update)) = if !confirm_a_first {
if !restore_b_before_lock {
let (channel_ready, channel_id) =
create_chan_between_nodes_with_value_confirm_second(&nodes[0], &nodes[1]);
(
channel_id,
create_chan_between_nodes_with_value_b(&nodes[1], &nodes[0], &channel_ready),
)
} else {
nodes[0].node.handle_channel_ready(
node_b_id,
&get_event_msg!(nodes[1], MessageSendEvent::SendChannelReady, node_a_id),
);
confirm_transaction(&nodes[0], &funding_tx);
let (channel_ready, channel_id) =
create_chan_between_nodes_with_value_confirm_second(&nodes[1], &nodes[0]);
(
channel_id,
create_chan_between_nodes_with_value_b(&nodes[0], &nodes[1], &channel_ready),
)
}
} else {
if restore_b_before_conf {
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
confirm_transaction(&nodes[1], &funding_tx);
}
let (channel_ready, channel_id) =
create_chan_between_nodes_with_value_confirm_second(&nodes[0], &nodes[1]);
(channel_id, create_chan_between_nodes_with_value_b(&nodes[1], &nodes[0], &channel_ready))
};
for (i, node) in nodes.iter().enumerate() {
let counterparty_node_id = nodes[(i + 1) % 2].node.get_our_node_id();
assert!(node
.gossip_sync
.handle_channel_announcement(Some(counterparty_node_id), &announcement)
.unwrap());
node.gossip_sync.handle_channel_update(Some(counterparty_node_id), &as_update).unwrap();
node.gossip_sync.handle_channel_update(Some(counterparty_node_id), &bs_update).unwrap();
}
if !restore_b_before_lock {
expect_channel_ready_event(&nodes[1], &node_a_id);
} else {
expect_channel_ready_event(&nodes[0], &node_b_id);
}
send_payment(&nodes[0], &[&nodes[1]], 8000000);
close_channel(&nodes[0], &nodes[1], &channel_id, funding_tx, true);
let reason_a = ClosureReason::CounterpartyInitiatedCooperativeClosure;
check_closed_event!(nodes[0], 1, reason_a, [node_b_id], 100000);
let reason_b = ClosureReason::LocallyInitiatedCooperativeClosure;
check_closed_event!(nodes[1], 1, reason_b, [node_a_id], 100000);
}
#[test]
fn during_funding_monitor_fail() {
do_during_funding_monitor_fail(true, true, false);
do_during_funding_monitor_fail(true, false, false);
do_during_funding_monitor_fail(false, false, false);
do_during_funding_monitor_fail(false, false, true);
}
#[test]
fn test_path_paused_mpp() {
let chanmon_cfgs = create_chanmon_cfgs(4);
let node_cfgs = create_node_cfgs(4, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
let mut nodes = create_network(4, &node_cfgs, &node_chanmgrs);
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let chan_1_id = create_announced_chan_between_nodes(&nodes, 0, 1).0.contents.short_channel_id;
let (chan_2_ann, _, chan_2_id, _) = create_announced_chan_between_nodes(&nodes, 0, 2);
let chan_3_id = create_announced_chan_between_nodes(&nodes, 1, 3).0.contents.short_channel_id;
let chan_4_id = create_announced_chan_between_nodes(&nodes, 2, 3).0.contents.short_channel_id;
let (mut route, payment_hash, payment_preimage, payment_secret) =
get_route_and_payment_hash!(&nodes[0], nodes[3], 100000);
let path = route.paths[0].clone();
route.paths.push(path);
route.paths[0].hops[0].pubkey = node_b_id;
route.paths[0].hops[0].short_channel_id = chan_1_id;
route.paths[0].hops[1].short_channel_id = chan_3_id;
route.paths[1].hops[0].pubkey = node_c_id;
route.paths[1].hops[0].short_channel_id = chan_2_ann.contents.short_channel_id;
route.paths[1].hops[1].short_channel_id = chan_4_id;
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let onion = RecipientOnionFields::secret_only(payment_secret);
let id = PaymentId(payment_hash.0);
nodes[0].node.send_payment_with_route(route, payment_hash, onion, id).unwrap();
check_added_monitors!(nodes[0], 2);
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let path_1 = &[&nodes[1], &nodes[3]];
let ev = events.pop().unwrap();
pass_along_path(&nodes[0], path_1, 0, payment_hash, Some(payment_secret), ev, false, None);
let (latest_update, _) = nodes[0].chain_monitor.get_latest_mon_update_id(chan_2_id);
nodes[0].chain_monitor.chain_monitor.force_channel_monitor_updated(chan_2_id, latest_update);
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
let path_2 = &[&nodes[2], &nodes[3]];
let ev = events.pop().unwrap();
pass_along_path(&nodes[0], path_2, 200_000, payment_hash, Some(payment_secret), ev, true, None);
claim_payment_along_route(ClaimAlongRouteArgs::new(
&nodes[0],
&[path_1, path_2],
payment_preimage,
));
}
#[test]
fn test_pending_update_fee_ack_on_reconnect() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
create_announced_chan_between_nodes(&nodes, 0, 1);
send_payment(&nodes[0], &[&nodes[1]], 100_000_00);
let (route, payment_hash, payment_preimage, payment_secret) =
get_route_and_payment_hash!(&nodes[1], nodes[0], 1_000_000);
let onion = RecipientOnionFields::secret_only(payment_secret);
let id = PaymentId(payment_hash.0);
nodes[1].node.send_payment_with_route(route, payment_hash, onion, id).unwrap();
check_added_monitors!(nodes[1], 1);
let bs_initial_send_msgs = get_htlc_update_msgs!(nodes[1], node_a_id);
{
let mut feerate_lock = chanmon_cfgs[0].fee_estimator.sat_per_kw.lock().unwrap();
*feerate_lock *= 2;
}
nodes[0].node.timer_tick_occurred();
check_added_monitors!(nodes[0], 1);
let as_update_fee_msgs = get_htlc_update_msgs!(nodes[0], node_b_id);
assert!(as_update_fee_msgs.update_fee.is_some());
nodes[1].node.handle_update_fee(node_a_id, as_update_fee_msgs.update_fee.as_ref().unwrap());
nodes[1]
.node
.handle_commitment_signed_batch_test(node_a_id, &as_update_fee_msgs.commitment_signed);
check_added_monitors!(nodes[1], 1);
let bs_first_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, node_a_id);
nodes[0].node.peer_disconnected(node_b_id);
nodes[1].node.peer_disconnected(node_a_id);
let init_msg = msgs::Init {
features: nodes[1].node.init_features(),
networks: None,
remote_network_address: None,
};
nodes[0].node.peer_connected(node_b_id, &init_msg, true).unwrap();
let as_connect_msg = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
nodes[1].node.peer_connected(node_a_id, &init_msg, false).unwrap();
let bs_connect_msg = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
nodes[1].node.handle_channel_reestablish(node_a_id, &as_connect_msg);
let bs_resend_msgs = nodes[1].node.get_and_clear_pending_msg_events();
assert_eq!(bs_resend_msgs.len(), 3);
if let MessageSendEvent::UpdateHTLCs { ref updates, .. } = bs_resend_msgs[0] {
assert_eq!(*updates, bs_initial_send_msgs);
} else {
panic!();
}
if let MessageSendEvent::SendRevokeAndACK { ref msg, .. } = bs_resend_msgs[1] {
assert_eq!(*msg, bs_first_raa);
} else {
panic!();
}
if let MessageSendEvent::SendChannelUpdate { .. } = bs_resend_msgs[2] {
} else {
panic!();
}
nodes[0].node.handle_channel_reestablish(node_b_id, &bs_connect_msg);
get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, node_b_id);
nodes[0].node.handle_update_add_htlc(node_b_id, &bs_initial_send_msgs.update_add_htlcs[0]);
nodes[0]
.node
.handle_commitment_signed_batch_test(node_b_id, &bs_initial_send_msgs.commitment_signed);
check_added_monitors!(nodes[0], 1);
nodes[1].node.handle_revoke_and_ack(
node_a_id,
&get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id),
);
check_added_monitors!(nodes[1], 1);
let bs_second_cs = get_htlc_update_msgs!(nodes[1], node_a_id).commitment_signed;
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_first_raa);
check_added_monitors!(nodes[0], 1);
nodes[1].node.handle_commitment_signed_batch_test(
node_a_id,
&get_htlc_update_msgs!(nodes[0], node_b_id).commitment_signed,
);
check_added_monitors!(nodes[1], 1);
let bs_third_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, node_a_id);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &bs_second_cs);
check_added_monitors!(nodes[0], 1);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_third_raa);
check_added_monitors!(nodes[0], 1);
nodes[1].node.handle_revoke_and_ack(
node_a_id,
&get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id),
);
check_added_monitors!(nodes[1], 1);
expect_and_process_pending_htlcs(&nodes[0], false);
expect_payment_claimable!(nodes[0], payment_hash, payment_secret, 1_000_000);
claim_payment(&nodes[1], &[&nodes[0]], payment_preimage);
}
#[test]
fn test_fail_htlc_on_broadcast_after_claim() {
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
create_announced_chan_between_nodes(&nodes, 0, 1);
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2).2;
let (payment_preimage, payment_hash, ..) =
route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 2000);
let bs_txn = get_local_commitment_txn!(nodes[2], chan_id_2);
assert_eq!(bs_txn.len(), 1);
nodes[2].node.claim_funds(payment_preimage);
check_added_monitors!(nodes[2], 1);
expect_payment_claimed!(nodes[2], payment_hash, 2000);
let mut cs_updates = get_htlc_update_msgs!(nodes[2], node_b_id);
nodes[1].node.handle_update_fulfill_htlc(node_c_id, cs_updates.update_fulfill_htlcs.remove(0));
let mut bs_updates = get_htlc_update_msgs!(nodes[1], node_a_id);
check_added_monitors!(nodes[1], 1);
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(1000), false, false);
mine_transaction(&nodes[1], &bs_txn[0]);
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed, [node_c_id], 100000);
check_closed_broadcast!(nodes[1], true);
connect_blocks(&nodes[1], ANTI_REORG_DELAY - 1);
check_added_monitors!(nodes[1], 1);
expect_and_process_pending_htlcs_and_htlc_handling_failed(
&nodes[1],
&[HTLCHandlingFailureType::Forward { node_id: Some(node_c_id), channel_id: chan_id_2 }],
);
nodes[0].node.handle_update_fulfill_htlc(node_b_id, bs_updates.update_fulfill_htlcs.remove(0));
expect_payment_sent(&nodes[0], payment_preimage, None, false, false);
commitment_signed_dance!(nodes[0], nodes[1], bs_updates.commitment_signed, true, true);
expect_payment_path_successful!(nodes[0]);
}
fn do_update_fee_resend_test(deliver_update: bool, parallel_updates: bool) {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
create_announced_chan_between_nodes(&nodes, 0, 1);
send_payment(&nodes[0], &[&nodes[1]], 1000);
{
let mut feerate_lock = chanmon_cfgs[0].fee_estimator.sat_per_kw.lock().unwrap();
*feerate_lock += 20;
}
nodes[0].node.timer_tick_occurred();
check_added_monitors!(nodes[0], 1);
let update_msgs = get_htlc_update_msgs!(nodes[0], node_b_id);
assert!(update_msgs.update_fee.is_some());
if deliver_update {
nodes[1].node.handle_update_fee(node_a_id, update_msgs.update_fee.as_ref().unwrap());
}
if parallel_updates {
{
let mut feerate_lock = chanmon_cfgs[0].fee_estimator.sat_per_kw.lock().unwrap();
*feerate_lock += 20;
}
nodes[0].node.timer_tick_occurred();
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
}
nodes[0].node.peer_disconnected(node_b_id);
nodes[1].node.peer_disconnected(node_a_id);
let init_msg = msgs::Init {
features: nodes[1].node.init_features(),
networks: None,
remote_network_address: None,
};
nodes[0].node.peer_connected(node_b_id, &init_msg, true).unwrap();
let as_connect_msg = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
nodes[1].node.peer_connected(node_a_id, &init_msg, false).unwrap();
let bs_connect_msg = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
nodes[1].node.handle_channel_reestablish(node_a_id, &as_connect_msg);
get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, node_a_id);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
nodes[0].node.handle_channel_reestablish(node_b_id, &bs_connect_msg);
let mut as_reconnect_msgs = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(as_reconnect_msgs.len(), 2);
if let MessageSendEvent::SendChannelUpdate { .. } = as_reconnect_msgs.pop().unwrap() {
} else {
panic!();
}
let update_msgs =
if let MessageSendEvent::UpdateHTLCs { updates, .. } = as_reconnect_msgs.pop().unwrap() {
updates
} else {
panic!();
};
assert!(update_msgs.update_fee.is_some());
nodes[1].node.handle_update_fee(node_a_id, update_msgs.update_fee.as_ref().unwrap());
if parallel_updates {
nodes[1]
.node
.handle_commitment_signed_batch_test(node_a_id, &update_msgs.commitment_signed);
check_added_monitors!(nodes[1], 1);
let (bs_first_raa, bs_first_cs) = get_revoke_commit_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_first_raa);
check_added_monitors!(nodes[0], 1);
let as_second_update = get_htlc_update_msgs!(nodes[0], node_b_id);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &bs_first_cs);
check_added_monitors!(nodes[0], 1);
let as_first_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_update_fee(node_a_id, as_second_update.update_fee.as_ref().unwrap());
nodes[1]
.node
.handle_commitment_signed_batch_test(node_a_id, &as_second_update.commitment_signed);
check_added_monitors!(nodes[1], 1);
let bs_second_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, node_a_id);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_first_raa);
let bs_second_cs = get_htlc_update_msgs!(nodes[1], node_a_id);
check_added_monitors!(nodes[1], 1);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_second_raa);
check_added_monitors!(nodes[0], 1);
nodes[0]
.node
.handle_commitment_signed_batch_test(node_b_id, &bs_second_cs.commitment_signed);
check_added_monitors!(nodes[0], 1);
let as_second_raa = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_second_raa);
check_added_monitors!(nodes[1], 1);
} else {
commitment_signed_dance!(nodes[1], nodes[0], update_msgs.commitment_signed, false);
}
send_payment(&nodes[0], &[&nodes[1]], 1000);
}
#[test]
fn update_fee_resend_test() {
do_update_fee_resend_test(false, false);
do_update_fee_resend_test(true, false);
do_update_fee_resend_test(false, true);
do_update_fee_resend_test(true, true);
}
fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let persister;
let new_chain_mon;
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let nodes_0_reload;
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let chan_id =
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 15_000_000, 7_000_000_000).2;
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) =
get_route_and_payment_hash!(&nodes[0], nodes[1], 100000);
let (payment_preimage_2, payment_hash_2, payment_secret_2) =
get_payment_preimage_hash!(&nodes[1]);
let (payment_preimage_0, payment_hash_0, ..) = route_payment(&nodes[1], &[&nodes[0]], 100_000);
let onion_1 = RecipientOnionFields::secret_only(payment_secret_1);
let id_1 = PaymentId(payment_hash_1.0);
nodes[0].node.send_payment_with_route(route.clone(), payment_hash_1, onion_1, id_1).unwrap();
check_added_monitors!(nodes[0], 1);
let send = SendEvent::from_node(&nodes[0]);
assert_eq!(send.msgs.len(), 1);
let onion_2 = RecipientOnionFields::secret_only(payment_secret_2);
let id_2 = PaymentId(payment_hash_2.0);
nodes[0].node.send_payment_with_route(route, payment_hash_2, onion_2, id_2).unwrap();
check_added_monitors!(nodes[0], 0);
let chan_0_monitor_serialized = get_monitor!(nodes[0], chan_id).encode();
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[0].node.claim_funds(payment_preimage_0);
check_added_monitors!(nodes[0], 1);
nodes[1].node.handle_update_add_htlc(node_a_id, &send.msgs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &send.commitment_msg);
check_added_monitors!(nodes[1], 1);
let (raa, cs) = get_revoke_commit_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_revoke_and_ack(node_b_id, &raa);
check_added_monitors!(nodes[0], 1);
if disconnect {
if reload_a {
let node_ser = nodes[0].node.encode();
let mons = &[&chan_0_monitor_serialized[..]];
reload_node!(nodes[0], &node_ser, mons, persister, new_chain_mon, nodes_0_reload);
persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
} else {
nodes[0].node.peer_disconnected(node_b_id);
}
nodes[1].node.peer_disconnected(node_a_id);
let init_msg = msgs::Init {
features: nodes[1].node.init_features(),
networks: None,
remote_network_address: None,
};
nodes[0].node.peer_connected(node_b_id, &init_msg, true).unwrap();
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
assert_eq!(reestablish_1.len(), 1);
nodes[1].node.peer_connected(node_a_id, &init_msg, false).unwrap();
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
assert_eq!(reestablish_2.len(), 1);
nodes[1].node.handle_channel_reestablish(node_a_id, &reestablish_1[0]);
let resp_1 = handle_chan_reestablish_msgs!(nodes[1], nodes[0]);
check_added_monitors!(nodes[1], 0);
nodes[0].node.handle_channel_reestablish(node_b_id, &reestablish_2[0]);
let resp_0 = handle_chan_reestablish_msgs!(nodes[0], nodes[1]);
assert!(resp_0.0.is_none());
assert!(resp_0.1.is_none());
assert!(resp_0.2.is_none());
assert!(resp_1.0.is_none());
assert!(resp_1.1.is_none());
if let Some(pending_cs) = resp_1.2 {
assert!(pending_cs.update_add_htlcs.is_empty());
assert!(pending_cs.update_fail_htlcs.is_empty());
assert!(pending_cs.update_fulfill_htlcs.is_empty());
assert_eq!(pending_cs.commitment_signed, cs);
} else {
panic!();
}
if reload_a {
check_added_monitors(&nodes[0], 2);
} else {
check_added_monitors(&nodes[0], 0);
}
check_added_monitors(&nodes[1], 0);
}
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (mon_id, _) = nodes[0].chain_monitor.get_latest_mon_update_id(chan_id);
nodes[0].chain_monitor.chain_monitor.force_channel_monitor_updated(chan_id, mon_id);
expect_payment_claimed!(nodes[0], payment_hash_0, 100_000);
check_added_monitors!(nodes[0], 0);
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
check_added_monitors!(nodes[0], 1);
assert_eq!(events.len(), 1);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &cs);
check_added_monitors!(nodes[0], 1);
let commitment_msg = match events.pop().unwrap() {
MessageSendEvent::UpdateHTLCs { node_id, channel_id: _, mut updates } => {
assert_eq!(node_id, node_b_id);
assert!(updates.update_fail_htlcs.is_empty());
assert!(updates.update_fail_malformed_htlcs.is_empty());
assert!(updates.update_fee.is_none());
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
let update_fulfill = updates.update_fulfill_htlcs.remove(0);
nodes[1].node.handle_update_fulfill_htlc(node_a_id, update_fulfill);
expect_payment_sent(&nodes[1], payment_preimage_0, None, false, false);
assert_eq!(updates.update_add_htlcs.len(), 1);
nodes[1].node.handle_update_add_htlc(node_a_id, &updates.update_add_htlcs[0]);
updates.commitment_signed
},
_ => panic!("Unexpected event type!"),
};
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &commitment_msg);
check_added_monitors!(nodes[1], 1);
let as_revoke_and_ack = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_revoke_and_ack);
expect_and_process_pending_htlcs(&nodes[1], false);
expect_payment_claimable!(nodes[1], payment_hash_1, payment_secret_1, 100000);
check_added_monitors!(nodes[1], 1);
commitment_signed_dance!(nodes[1], nodes[0], (), false, true, false, false);
let events = nodes[1].node.get_and_clear_pending_events();
assert_eq!(events.len(), 1);
match events[0] {
Event::PaymentPathSuccessful { .. } => {},
_ => panic!("Unexpected event"),
};
nodes[1].node.process_pending_htlc_forwards();
expect_payment_claimable!(nodes[1], payment_hash_2, payment_secret_2, 100000);
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_2);
}
#[test]
fn channel_holding_cell_serialize() {
do_channel_holding_cell_serialize(true, true);
do_channel_holding_cell_serialize(true, false);
do_channel_holding_cell_serialize(false, true); }
#[derive(PartialEq)]
enum HTLCStatusAtDupClaim {
Received,
HoldingCell,
Cleared,
}
fn do_test_reconnect_dup_htlc_claims(htlc_status: HTLCStatusAtDupClaim, second_fails: bool) {
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
create_announced_chan_between_nodes(&nodes, 0, 1);
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2).2;
let (payment_preimage, payment_hash, ..) =
route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100_000);
let mut as_raa = None;
if htlc_status == HTLCStatusAtDupClaim::HoldingCell {
let (route, second_payment_hash, _, second_payment_secret) =
get_route_and_payment_hash!(nodes[0], nodes[1], 100_000);
let onion_2 = RecipientOnionFields::secret_only(second_payment_secret);
let id_2 = PaymentId(second_payment_hash.0);
nodes[0].node.send_payment_with_route(route, second_payment_hash, onion_2, id_2).unwrap();
check_added_monitors!(nodes[0], 1);
let send_event =
SendEvent::from_event(nodes[0].node.get_and_clear_pending_msg_events().remove(0));
nodes[1].node.handle_update_add_htlc(node_a_id, &send_event.msgs[0]);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &send_event.commitment_msg);
check_added_monitors!(nodes[1], 1);
let (bs_raa, bs_cs) = get_revoke_commit_msgs!(nodes[1], node_a_id);
nodes[0].node.handle_revoke_and_ack(node_b_id, &bs_raa);
check_added_monitors!(nodes[0], 1);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &bs_cs);
check_added_monitors!(nodes[0], 1);
as_raa = Some(get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, node_b_id));
}
let mut fulfill_msg = msgs::UpdateFulfillHTLC {
channel_id: chan_id_2,
htlc_id: 0,
payment_preimage,
attribution_data: None,
};
if second_fails {
nodes[2].node.fail_htlc_backwards(&payment_hash);
expect_and_process_pending_htlcs_and_htlc_handling_failed(
&nodes[2],
&[HTLCHandlingFailureType::Receive { payment_hash }],
);
check_added_monitors!(nodes[2], 1);
get_htlc_update_msgs!(nodes[2], node_b_id);
} else {
nodes[2].node.claim_funds(payment_preimage);
check_added_monitors!(nodes[2], 1);
expect_payment_claimed!(nodes[2], payment_hash, 100_000);
let cs_updates = get_htlc_update_msgs!(nodes[2], node_b_id);
assert_eq!(cs_updates.update_fulfill_htlcs.len(), 1);
assert_eq!(fulfill_msg.channel_id, cs_updates.update_fulfill_htlcs[0].channel_id);
assert_eq!(fulfill_msg.htlc_id, cs_updates.update_fulfill_htlcs[0].htlc_id);
assert_eq!(
fulfill_msg.payment_preimage,
cs_updates.update_fulfill_htlcs[0].payment_preimage
);
fulfill_msg.attribution_data = cs_updates.update_fulfill_htlcs[0].attribution_data.clone();
}
nodes[1].node.handle_update_fulfill_htlc(node_c_id, fulfill_msg);
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(1000), false, false);
check_added_monitors!(nodes[1], 1);
let mut bs_updates = None;
if htlc_status != HTLCStatusAtDupClaim::HoldingCell {
bs_updates = Some(get_htlc_update_msgs!(nodes[1], node_a_id));
assert_eq!(bs_updates.as_ref().unwrap().update_fulfill_htlcs.len(), 1);
nodes[0].node.handle_update_fulfill_htlc(
node_b_id,
bs_updates.as_mut().unwrap().update_fulfill_htlcs.remove(0),
);
expect_payment_sent(&nodes[0], payment_preimage, None, false, false);
if htlc_status == HTLCStatusAtDupClaim::Cleared {
commitment_signed_dance!(
nodes[0],
nodes[1],
&bs_updates.as_ref().unwrap().commitment_signed,
false
);
expect_payment_path_successful!(nodes[0]);
}
} else {
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
}
nodes[1].node.peer_disconnected(node_c_id);
nodes[2].node.peer_disconnected(node_b_id);
if second_fails {
let mut reconnect_args = ReconnectArgs::new(&nodes[1], &nodes[2]);
reconnect_args.pending_htlc_fails.0 = 1;
reconnect_nodes(reconnect_args);
expect_and_process_pending_htlcs_and_htlc_handling_failed(
&nodes[1],
&[HTLCHandlingFailureType::Forward { node_id: Some(node_c_id), channel_id: chan_id_2 }],
);
} else {
let mut reconnect_args = ReconnectArgs::new(&nodes[1], &nodes[2]);
reconnect_args.pending_htlc_claims.0 = 1;
reconnect_nodes(reconnect_args);
}
if htlc_status == HTLCStatusAtDupClaim::HoldingCell {
nodes[1].node.handle_revoke_and_ack(node_a_id, &as_raa.unwrap());
check_added_monitors!(nodes[1], 1);
expect_htlc_failure_conditions(nodes[1].node.get_and_clear_pending_events(), &[]);
bs_updates = Some(get_htlc_update_msgs!(nodes[1], node_a_id));
assert_eq!(bs_updates.as_ref().unwrap().update_fulfill_htlcs.len(), 1);
nodes[0].node.handle_update_fulfill_htlc(
node_b_id,
bs_updates.as_mut().unwrap().update_fulfill_htlcs.remove(0),
);
expect_payment_sent(&nodes[0], payment_preimage, None, false, false);
}
if htlc_status != HTLCStatusAtDupClaim::Cleared {
commitment_signed_dance!(
nodes[0],
nodes[1],
&bs_updates.as_ref().unwrap().commitment_signed,
false
);
expect_payment_path_successful!(nodes[0]);
}
}
#[test]
fn test_reconnect_dup_htlc_claims() {
do_test_reconnect_dup_htlc_claims(HTLCStatusAtDupClaim::Received, false);
do_test_reconnect_dup_htlc_claims(HTLCStatusAtDupClaim::HoldingCell, false);
do_test_reconnect_dup_htlc_claims(HTLCStatusAtDupClaim::Cleared, false);
do_test_reconnect_dup_htlc_claims(HTLCStatusAtDupClaim::Received, true);
do_test_reconnect_dup_htlc_claims(HTLCStatusAtDupClaim::HoldingCell, true);
do_test_reconnect_dup_htlc_claims(HTLCStatusAtDupClaim::Cleared, true);
}
#[test]
fn test_temporary_error_during_shutdown() {
let mut config = test_default_channel_config();
config.channel_handshake_config.commit_upfront_shutdown_pubkey = false;
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[Some(config.clone()), Some(config)]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let (_, _, channel_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1);
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[0].node.close_channel(&channel_id, &node_b_id).unwrap();
nodes[1].node.handle_shutdown(
node_a_id,
&get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, node_b_id),
);
check_added_monitors!(nodes[1], 1);
nodes[0].node.handle_shutdown(
node_b_id,
&get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, node_a_id),
);
check_added_monitors!(nodes[0], 1);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[0].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[0].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
nodes[1].node.handle_closing_signed(
node_a_id,
&get_event_msg!(nodes[0], MessageSendEvent::SendClosingSigned, node_b_id),
);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update);
nodes[0].node.handle_closing_signed(
node_b_id,
&get_event_msg!(nodes[1], MessageSendEvent::SendClosingSigned, node_a_id),
);
let (_, closing_signed_a) = get_closing_signed_broadcast!(nodes[0].node, node_b_id);
let txn_a = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
nodes[1].node.handle_closing_signed(node_a_id, &closing_signed_a.unwrap());
let (_, none_b) = get_closing_signed_broadcast!(nodes[1].node, node_a_id);
assert!(none_b.is_none());
let txn_b = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
assert_eq!(txn_a, txn_b);
assert_eq!(txn_a.len(), 1);
check_spends!(txn_a[0], funding_tx);
let reason_b = ClosureReason::CounterpartyInitiatedCooperativeClosure;
check_closed_event!(nodes[1], 1, reason_b, [node_a_id], 100000);
let reason_a = ClosureReason::LocallyInitiatedCooperativeClosure;
check_closed_event!(nodes[0], 1, reason_a, [node_b_id], 100000);
}
#[test]
fn double_temp_error() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let (_, _, channel_id, _) = create_announced_chan_between_nodes(&nodes, 0, 1);
let (payment_preimage_1, payment_hash_1, ..) =
route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
let (payment_preimage_2, payment_hash_2, ..) =
route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.claim_funds(payment_preimage_1);
check_added_monitors(&nodes[1], 1);
let (latest_update_1, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.claim_funds(payment_preimage_2);
check_added_monitors!(nodes[1], 1);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
let (latest_update_2, _) = nodes[1].chain_monitor.get_latest_mon_update_id(channel_id);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update_1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[1], 0);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(channel_id, latest_update_2);
let msg_events = nodes[1].node.get_and_clear_pending_msg_events();
let events = nodes[1].node.get_and_clear_pending_events();
assert_eq!(events.len(), 2);
match events[0] {
Event::PaymentClaimed { amount_msat: 1_000_000, payment_hash, .. } => {
assert_eq!(payment_hash, payment_hash_1)
},
_ => panic!("Unexpected Event: {:?}", events[0]),
}
match events[1] {
Event::PaymentClaimed { amount_msat: 1_000_000, payment_hash, .. } => {
assert_eq!(payment_hash, payment_hash_2)
},
_ => panic!("Unexpected Event: {:?}", events[1]),
}
assert_eq!(msg_events.len(), 1);
let (update_fulfill_1, commitment_signed_b1, node_id) = {
match &msg_events[0] {
&MessageSendEvent::UpdateHTLCs {
ref node_id,
channel_id: _,
updates:
msgs::CommitmentUpdate {
ref update_add_htlcs,
ref update_fulfill_htlcs,
ref update_fail_htlcs,
ref update_fail_malformed_htlcs,
ref update_fee,
ref commitment_signed,
},
} => {
assert!(update_add_htlcs.is_empty());
assert_eq!(update_fulfill_htlcs.len(), 1);
assert!(update_fail_htlcs.is_empty());
assert!(update_fail_malformed_htlcs.is_empty());
assert!(update_fee.is_none());
(update_fulfill_htlcs[0].clone(), commitment_signed.clone(), node_id.clone())
},
_ => panic!("Unexpected event"),
}
};
assert_eq!(node_id, node_a_id);
nodes[0].node.handle_update_fulfill_htlc(node_b_id, update_fulfill_1);
check_added_monitors!(nodes[0], 0);
expect_payment_sent(&nodes[0], payment_preimage_1, None, false, false);
nodes[0].node.handle_commitment_signed_batch_test(node_b_id, &commitment_signed_b1);
check_added_monitors!(nodes[0], 1);
nodes[0].node.process_pending_htlc_forwards();
let (raa_a1, commitment_signed_a1) = get_revoke_commit_msgs!(nodes[0], node_b_id);
check_added_monitors!(nodes[1], 0);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
nodes[1].node.handle_revoke_and_ack(node_a_id, &raa_a1);
check_added_monitors!(nodes[1], 1);
nodes[1].node.handle_commitment_signed_batch_test(node_a_id, &commitment_signed_a1);
check_added_monitors!(nodes[1], 1);
let ((update_fulfill_2, commitment_signed_b2), raa_b2) = {
let events = nodes[1].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 2);
(
match &events[0] {
MessageSendEvent::UpdateHTLCs { node_id, channel_id: _, updates } => {
assert_eq!(*node_id, node_a_id);
assert!(updates.update_add_htlcs.is_empty());
assert!(updates.update_fail_htlcs.is_empty());
assert!(updates.update_fail_malformed_htlcs.is_empty());
assert!(updates.update_fee.is_none());
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
(updates.update_fulfill_htlcs[0].clone(), updates.commitment_signed.clone())
},
_ => panic!("Unexpected event"),
},
match events[1] {
MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
assert_eq!(*node_id, node_a_id);
(*msg).clone()
},
_ => panic!("Unexpected event"),
},
)
};
nodes[0].node.handle_revoke_and_ack(node_b_id, &raa_b2);
check_added_monitors!(nodes[0], 1);
expect_payment_path_successful!(nodes[0]);
nodes[0].node.handle_update_fulfill_htlc(node_b_id, update_fulfill_2);
check_added_monitors!(nodes[0], 0);
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
commitment_signed_dance!(nodes[0], nodes[1], commitment_signed_b2, false);
expect_payment_sent!(nodes[0], payment_preimage_2);
}
fn do_test_outbound_reload_without_init_mon(use_0conf: bool) {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let persister;
let new_chain_monitor;
let mut chan_config = test_default_channel_config();
chan_config.manually_accept_inbound_channels = true;
chan_config.channel_handshake_limits.trust_own_funding_0conf = true;
let node_chanmgrs =
create_node_chanmgrs(2, &node_cfgs, &[Some(chan_config.clone()), Some(chan_config)]);
let node_a_reload;
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
nodes[0].node.create_channel(node_b_id, 100000, 10001, 43, None, None).unwrap();
nodes[1].node.handle_open_channel(
node_a_id,
&get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, node_b_id),
);
let events = nodes[1].node.get_and_clear_pending_events();
assert_eq!(events.len(), 1);
match events[0] {
Event::OpenChannelRequest { temporary_channel_id: chan_id, .. } => {
if use_0conf {
nodes[1]
.node
.accept_inbound_channel_from_trusted_peer_0conf(&chan_id, &node_a_id, 0, None)
.unwrap();
} else {
nodes[1].node.accept_inbound_channel(&chan_id, &node_a_id, 0, None).unwrap();
}
},
_ => panic!("Unexpected event"),
};
nodes[0].node.handle_accept_channel(
node_b_id,
&get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, node_a_id),
);
let (temporary_channel_id, funding_tx, ..) =
create_funding_transaction(&nodes[0], &node_b_id, 100000, 43);
nodes[0]
.node
.funding_transaction_generated(temporary_channel_id, node_b_id, funding_tx.clone())
.unwrap();
check_added_monitors!(nodes[0], 0);
let funding_created_msg =
get_event_msg!(nodes[0], MessageSendEvent::SendFundingCreated, node_b_id);
nodes[1].node.handle_funding_created(node_a_id, &funding_created_msg);
check_added_monitors!(nodes[1], 1);
expect_channel_pending_event(&nodes[1], &node_a_id);
let bs_signed_locked = nodes[1].node.get_and_clear_pending_msg_events();
assert_eq!(bs_signed_locked.len(), if use_0conf { 2 } else { 1 });
match &bs_signed_locked[0] {
MessageSendEvent::SendFundingSigned { msg, .. } => {
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[0].node.handle_funding_signed(node_b_id, &msg);
check_added_monitors!(nodes[0], 1);
},
_ => panic!("Unexpected event"),
}
if use_0conf {
match &bs_signed_locked[1] {
MessageSendEvent::SendChannelReady { msg, .. } => {
nodes[0].node.handle_channel_ready(node_b_id, &msg);
},
_ => panic!("Unexpected event"),
}
}
assert!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().is_empty());
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
nodes[0].chain_source.watched_txn.lock().unwrap().clear();
nodes[0].chain_source.watched_outputs.lock().unwrap().clear();
let node_a_ser = nodes[0].node.encode();
reload_node!(nodes[0], &node_a_ser, &[], persister, new_chain_monitor, node_a_reload);
check_closed_event!(nodes[0], 1, ClosureReason::DisconnectedPeer, [node_b_id], 100000);
assert!(nodes[0].node.list_channels().is_empty());
}
#[test]
fn test_outbound_reload_without_init_mon() {
do_test_outbound_reload_without_init_mon(true);
do_test_outbound_reload_without_init_mon(false);
}
fn do_test_inbound_reload_without_init_mon(use_0conf: bool, lock_commitment: bool) {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let persister;
let new_chain_monitor;
let mut chan_config = test_default_channel_config();
chan_config.manually_accept_inbound_channels = true;
chan_config.channel_handshake_limits.trust_own_funding_0conf = true;
let node_chanmgrs =
create_node_chanmgrs(2, &node_cfgs, &[Some(chan_config.clone()), Some(chan_config)]);
let node_b_reload;
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
nodes[0].node.create_channel(node_b_id, 100000, 10001, 43, None, None).unwrap();
nodes[1].node.handle_open_channel(
node_a_id,
&get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, node_b_id),
);
let events = nodes[1].node.get_and_clear_pending_events();
assert_eq!(events.len(), 1);
match events[0] {
Event::OpenChannelRequest { temporary_channel_id: chan_id, .. } => {
if use_0conf {
nodes[1]
.node
.accept_inbound_channel_from_trusted_peer_0conf(&chan_id, &node_a_id, 0, None)
.unwrap();
} else {
nodes[1].node.accept_inbound_channel(&chan_id, &node_a_id, 0, None).unwrap();
}
},
_ => panic!("Unexpected event"),
};
nodes[0].node.handle_accept_channel(
node_b_id,
&get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, node_a_id),
);
let (temporary_channel_id, funding_tx, ..) =
create_funding_transaction(&nodes[0], &node_b_id, 100000, 43);
nodes[0]
.node
.funding_transaction_generated(temporary_channel_id, node_b_id, funding_tx.clone())
.unwrap();
check_added_monitors!(nodes[0], 0);
let funding_created_msg =
get_event_msg!(nodes[0], MessageSendEvent::SendFundingCreated, node_b_id);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.handle_funding_created(node_a_id, &funding_created_msg);
check_added_monitors!(nodes[1], 1);
let funding_signed_msg =
get_event_msg!(nodes[1], MessageSendEvent::SendFundingSigned, node_a_id);
nodes[0].node.handle_funding_signed(node_b_id, &funding_signed_msg);
check_added_monitors!(nodes[0], 1);
expect_channel_pending_event(&nodes[0], &node_b_id);
let as_funding_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
if lock_commitment {
confirm_transaction(&nodes[0], &as_funding_tx[0]);
confirm_transaction(&nodes[1], &as_funding_tx[0]);
}
if use_0conf || lock_commitment {
let as_ready = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReady, node_b_id);
nodes[1].node.handle_channel_ready(node_a_id, &as_ready);
}
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
nodes[1].chain_source.watched_txn.lock().unwrap().clear();
nodes[1].chain_source.watched_outputs.lock().unwrap().clear();
let node_b_ser = nodes[1].node.encode();
reload_node!(nodes[1], &node_b_ser, &[], persister, new_chain_monitor, node_b_reload);
check_closed_event!(nodes[1], 1, ClosureReason::DisconnectedPeer, [node_a_id], 100000);
assert!(nodes[1].node.list_channels().is_empty());
}
#[test]
fn test_inbound_reload_without_init_mon() {
do_test_inbound_reload_without_init_mon(true, true);
do_test_inbound_reload_without_init_mon(true, false);
do_test_inbound_reload_without_init_mon(false, true);
do_test_inbound_reload_without_init_mon(false, false);
}
#[derive(PartialEq, Eq)]
enum BlockedUpdateComplMode {
Async,
AtReload,
Sync,
}
fn do_test_blocked_chan_preimage_release(completion_mode: BlockedUpdateComplMode) {
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let persister;
let new_chain_mon;
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let nodes_1_reload;
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let chan_id_1 = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2).2;
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 5_000_000);
let (payment_preimage_1, payment_hash_1, ..) =
route_payment(&nodes[1], &[&nodes[2]], 1_000_000);
let (payment_preimage_2, payment_hash_2, ..) =
route_payment(&nodes[2], &[&nodes[1], &nodes[0]], 1_000_000);
nodes[2].node.claim_funds(payment_preimage_1);
check_added_monitors(&nodes[2], 1);
expect_payment_claimed!(nodes[2], payment_hash_1, 1_000_000);
let mut cs_htlc_fulfill = get_htlc_update_msgs!(nodes[2], node_b_id);
nodes[1]
.node
.handle_update_fulfill_htlc(node_c_id, cs_htlc_fulfill.update_fulfill_htlcs.remove(0));
let commitment = cs_htlc_fulfill.commitment_signed;
do_commitment_signed_dance(&nodes[1], &nodes[2], &commitment, false, false);
check_added_monitors(&nodes[1], 0);
nodes[0].node.claim_funds(payment_preimage_2);
check_added_monitors(&nodes[0], 1);
expect_payment_claimed!(nodes[0], payment_hash_2, 1_000_000);
let mut as_htlc_fulfill = get_htlc_update_msgs!(nodes[0], node_b_id);
if completion_mode != BlockedUpdateComplMode::Sync {
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
}
nodes[1]
.node
.handle_update_fulfill_htlc(node_a_id, as_htlc_fulfill.update_fulfill_htlcs.remove(0));
check_added_monitors(&nodes[1], 1); assert!(get_monitor!(nodes[1], chan_id_2).get_stored_preimages().contains_key(&payment_hash_2));
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
if completion_mode == BlockedUpdateComplMode::AtReload {
let node_ser = nodes[1].node.encode();
let chan_mon_0 = get_monitor!(nodes[1], chan_id_1).encode();
let chan_mon_1 = get_monitor!(nodes[1], chan_id_2).encode();
let mons = &[&chan_mon_0[..], &chan_mon_1[..]];
reload_node!(nodes[1], &node_ser, mons, persister, new_chain_mon, nodes_1_reload);
nodes[0].node.peer_disconnected(node_b_id);
nodes[2].node.peer_disconnected(node_b_id);
let mut a_b_reconnect = ReconnectArgs::new(&nodes[0], &nodes[1]);
a_b_reconnect.pending_htlc_claims.1 = 1;
reconnect_nodes(a_b_reconnect);
reconnect_nodes(ReconnectArgs::new(&nodes[2], &nodes[1]));
} else if completion_mode == BlockedUpdateComplMode::Async {
let (latest_update, _) = nodes[1].chain_monitor.get_latest_mon_update_id(chan_id_2);
nodes[1]
.chain_monitor
.chain_monitor
.channel_monitor_updated(chan_id_2, latest_update)
.unwrap();
}
if completion_mode != BlockedUpdateComplMode::AtReload {
nodes[1]
.node
.handle_commitment_signed_batch_test(node_a_id, &as_htlc_fulfill.commitment_signed);
check_added_monitors(&nodes[1], 1);
let (a, raa) = do_main_commitment_signed_dance(&nodes[1], &nodes[0], false);
assert!(a.is_none());
nodes[1].node.handle_revoke_and_ack(node_a_id, &raa);
check_added_monitors(&nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
}
let events = nodes[1].node.get_and_clear_pending_events();
assert_eq!(events.len(), 3, "{events:?}");
if let Event::PaymentSent { .. } = events[0] {
} else {
panic!();
}
if let Event::PaymentPathSuccessful { .. } = events[2] {
} else {
panic!();
}
if let Event::PaymentForwarded { .. } = events[1] {
} else {
panic!();
}
check_added_monitors(&nodes[1], 1);
let mut bs_htlc_fulfill = get_htlc_update_msgs!(nodes[1], node_c_id);
check_added_monitors(&nodes[1], 1);
nodes[2]
.node
.handle_update_fulfill_htlc(node_b_id, bs_htlc_fulfill.update_fulfill_htlcs.remove(0));
let commitment = bs_htlc_fulfill.commitment_signed;
do_commitment_signed_dance(&nodes[2], &nodes[1], &commitment, false, false);
expect_payment_sent(&nodes[2], payment_preimage_2, None, true, true);
}
#[test]
fn test_blocked_chan_preimage_release() {
do_test_blocked_chan_preimage_release(BlockedUpdateComplMode::AtReload);
do_test_blocked_chan_preimage_release(BlockedUpdateComplMode::Sync);
do_test_blocked_chan_preimage_release(BlockedUpdateComplMode::Async);
}
fn do_test_inverted_mon_completion_order(
with_latest_manager: bool, complete_bc_commitment_dance: bool,
) {
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let persister;
let chain_mon;
let node_b_reload;
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let chan_id_ab = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let chan_id_bc = create_announced_chan_between_nodes(&nodes, 1, 2).2;
let (payment_preimage, payment_hash, ..) =
route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100_000);
let mon_ab = get_monitor!(nodes[1], chan_id_ab).encode();
let mut manager_b = Vec::new();
if !with_latest_manager {
manager_b = nodes[1].node.encode();
}
nodes[2].node.claim_funds(payment_preimage);
check_added_monitors(&nodes[2], 1);
expect_payment_claimed!(nodes[2], payment_hash, 100_000);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let mut cs_updates = get_htlc_update_msgs(&nodes[2], &node_b_id);
nodes[1].node.handle_update_fulfill_htlc(node_c_id, cs_updates.update_fulfill_htlcs.remove(0));
check_added_monitors(&nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
nodes[1].node.handle_commitment_signed_batch_test(node_c_id, &cs_updates.commitment_signed);
check_added_monitors(&nodes[1], 1);
if complete_bc_commitment_dance {
let (bs_revoke_and_ack, bs_commitment_signed) =
get_revoke_commit_msgs!(nodes[1], node_c_id);
nodes[2].node.handle_revoke_and_ack(node_b_id, &bs_revoke_and_ack);
check_added_monitors(&nodes[2], 1);
nodes[2].node.handle_commitment_signed_batch_test(node_b_id, &bs_commitment_signed);
check_added_monitors(&nodes[2], 1);
let cs_raa = get_event_msg!(nodes[2], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_revoke_and_ack(node_c_id, &cs_raa);
check_added_monitors(&nodes[1], 0);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
}
if with_latest_manager {
manager_b = nodes[1].node.encode();
}
let mon_bc = get_monitor!(nodes[1], chan_id_bc).encode();
reload_node!(nodes[1], &manager_b, &[&mon_ab, &mon_bc], persister, chain_mon, node_b_reload);
nodes[0].node.peer_disconnected(node_b_id);
nodes[2].node.peer_disconnected(node_b_id);
if with_latest_manager {
persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.timer_tick_occurred();
check_added_monitors(&nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
if complete_bc_commitment_dance {
reconnect_nodes(ReconnectArgs::new(&nodes[1], &nodes[2]));
} else {
let mut reconnect_args = ReconnectArgs::new(&nodes[1], &nodes[2]);
reconnect_args.pending_responding_commitment_signed.1 = true;
reconnect_args.pending_responding_commitment_signed_dup_monitor.1 = true;
reconnect_args.pending_raa = (false, true);
reconnect_nodes(reconnect_args);
}
reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
let (_, ab_update_id) = nodes[1].chain_monitor.get_latest_mon_update_id(chan_id_ab);
nodes[1]
.chain_monitor
.chain_monitor
.channel_monitor_updated(chan_id_ab, ab_update_id)
.unwrap();
} else {
check_added_monitors(&nodes[1], 0);
persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let reason = ClosureReason::OutdatedChannelManager;
check_closed_event(&nodes[1], 1, reason, false, &[node_c_id], 100_000);
check_added_monitors(&nodes[1], 2);
nodes[1].node.timer_tick_occurred();
check_added_monitors(&nodes[1], 0);
reconnect_nodes(ReconnectArgs::new(&nodes[0], &nodes[1]));
let (_, ab_update_id) = nodes[1].chain_monitor.get_latest_mon_update_id(chan_id_ab);
nodes[1]
.chain_monitor
.chain_monitor
.channel_monitor_updated(chan_id_ab, ab_update_id)
.unwrap();
}
let mut bs_updates = get_htlc_update_msgs(&nodes[1], &node_a_id);
check_added_monitors(&nodes[1], 1);
nodes[0].node.handle_update_fulfill_htlc(node_b_id, bs_updates.update_fulfill_htlcs.remove(0));
do_commitment_signed_dance(&nodes[0], &nodes[1], &bs_updates.commitment_signed, false, false);
expect_payment_forwarded!(
nodes[1],
&nodes[0],
&nodes[2],
Some(1_000),
false,
!with_latest_manager
);
expect_payment_sent(&nodes[0], payment_preimage, None, true, true);
}
#[test]
fn test_inverted_mon_completion_order() {
do_test_inverted_mon_completion_order(true, true);
do_test_inverted_mon_completion_order(true, false);
do_test_inverted_mon_completion_order(false, true);
do_test_inverted_mon_completion_order(false, false);
}
fn do_test_durable_preimages_on_closed_channel(
close_chans_before_reload: bool, close_only_a: bool, hold_post_reload_mon_update: bool,
) {
if !close_chans_before_reload && close_only_a {
panic!();
}
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let persister;
let chain_mon;
let node_b_reload;
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let chan_id_ab = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let chan_id_bc = create_announced_chan_between_nodes(&nodes, 1, 2).2;
let (payment_preimage, payment_hash, ..) =
route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1_000_000);
let mon_ab = get_monitor!(nodes[1], chan_id_ab).encode();
nodes[2].node.claim_funds(payment_preimage);
check_added_monitors(&nodes[2], 1);
expect_payment_claimed!(nodes[2], payment_hash, 1_000_000);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let mut cs_updates = get_htlc_update_msgs(&nodes[2], &node_b_id);
nodes[1].node.handle_update_fulfill_htlc(node_c_id, cs_updates.update_fulfill_htlcs.remove(0));
check_added_monitors(&nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
nodes[1].node.handle_commitment_signed_batch_test(node_c_id, &cs_updates.commitment_signed);
check_added_monitors(&nodes[1], 1);
let _ = get_revoke_commit_msgs!(nodes[1], node_c_id);
let mon_bc = get_monitor!(nodes[1], chan_id_bc).encode();
if close_chans_before_reload {
if !close_only_a {
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let message = "Channel force-closed".to_owned();
nodes[1]
.node
.force_close_broadcasting_latest_txn(&chan_id_bc, &node_c_id, message.clone())
.unwrap();
check_closed_broadcast(&nodes[1], 1, true);
let reason =
ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
check_closed_event(&nodes[1], 1, reason, false, &[node_c_id], 100000);
}
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let message = "Channel force-closed".to_owned();
nodes[1]
.node
.force_close_broadcasting_latest_txn(&chan_id_ab, &node_a_id, message.clone())
.unwrap();
check_closed_broadcast(&nodes[1], 1, true);
let reason =
ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
check_closed_event(&nodes[1], 1, reason, false, &[node_a_id], 100000);
}
let manager_b = nodes[1].node.encode();
reload_node!(nodes[1], &manager_b, &[&mon_ab, &mon_bc], persister, chain_mon, node_b_reload);
nodes[0].node.peer_disconnected(node_b_id);
nodes[2].node.peer_disconnected(node_b_id);
if close_chans_before_reload {
let bs_close_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
if close_only_a {
assert_eq!(bs_close_txn.len(), 2);
} else {
assert_eq!(bs_close_txn.len(), 3);
}
}
let err_msg = "Channel force-closed".to_owned();
let reason = ClosureReason::HolderForceClosed {
broadcasted_latest_txn: Some(true),
message: err_msg.clone(),
};
nodes[0].node.force_close_broadcasting_latest_txn(&chan_id_ab, &node_b_id, err_msg).unwrap();
check_closed_event(&nodes[0], 1, reason, false, &[node_b_id], 100000);
check_added_monitors(&nodes[0], 1);
let as_closing_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
assert_eq!(as_closing_tx.len(), 1);
mine_transaction_without_consistency_checks(&nodes[1], &as_closing_tx[0]);
check_added_monitors(&nodes[1], 0);
let mons_added = if close_chans_before_reload {
if !close_only_a {
4
} else {
3
}
} else {
2
};
if hold_post_reload_mon_update {
for _ in 0..mons_added {
persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
}
}
if !close_chans_before_reload {
check_closed_broadcast(&nodes[1], 1, false);
let reason = ClosureReason::CommitmentTxConfirmed;
check_closed_event(&nodes[1], 1, reason, false, &[node_a_id], 100000);
}
nodes[1].node.timer_tick_occurred();
check_added_monitors(&nodes[1], mons_added);
let bs_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
assert_eq!(bs_txn.len(), if close_chans_before_reload && !close_only_a { 2 } else { 1 });
let bs_preimage_tx = bs_txn
.iter()
.find(|tx| tx.input[0].previous_output.txid == as_closing_tx[0].compute_txid())
.unwrap();
check_spends!(bs_preimage_tx, as_closing_tx[0]);
mine_transactions(&nodes[0], &[&as_closing_tx[0], bs_preimage_tx]);
check_closed_broadcast(&nodes[0], 1, false);
expect_payment_sent(&nodes[0], payment_preimage, None, true, true);
if !close_chans_before_reload || close_only_a {
let mut reconnect_args = ReconnectArgs::new(&nodes[1], &nodes[2]);
reconnect_args.pending_responding_commitment_signed.1 = true;
reconnect_args.pending_responding_commitment_signed_dup_monitor.1 = true;
reconnect_args.pending_raa.1 = true;
reconnect_nodes(reconnect_args);
}
let (_, ab_update_id) = nodes[1].chain_monitor.get_latest_mon_update_id(chan_id_ab);
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(chan_id_ab, ab_update_id);
let evs = nodes[1].node.get_and_clear_pending_events();
assert_eq!(evs.len(), if close_chans_before_reload { 2 } else { 1 });
for ev in evs {
if let Event::PaymentForwarded { .. } = ev {
} else {
panic!();
}
}
if !close_chans_before_reload || close_only_a {
check_added_monitors(&nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
send_payment(&nodes[1], &[&nodes[2]], 100_000);
}
}
#[test]
fn test_durable_preimages_on_closed_channel() {
do_test_durable_preimages_on_closed_channel(true, true, true);
do_test_durable_preimages_on_closed_channel(true, true, false);
do_test_durable_preimages_on_closed_channel(true, false, true);
do_test_durable_preimages_on_closed_channel(true, false, false);
do_test_durable_preimages_on_closed_channel(false, false, true);
do_test_durable_preimages_on_closed_channel(false, false, false);
}
fn do_test_reload_mon_update_completion_actions(close_during_reload: bool) {
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let persister;
let chain_mon;
let node_b_reload;
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let chan_id_ab = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let chan_id_bc = create_announced_chan_between_nodes(&nodes, 1, 2).2;
let (payment_preimage, payment_hash, ..) =
route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1_000_000);
nodes[2].node.claim_funds(payment_preimage);
check_added_monitors(&nodes[2], 1);
expect_payment_claimed!(nodes[2], payment_hash, 1_000_000);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
let mut cs_updates = get_htlc_update_msgs(&nodes[2], &node_b_id);
nodes[1].node.handle_update_fulfill_htlc(node_c_id, cs_updates.update_fulfill_htlcs.remove(0));
check_added_monitors(&nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
nodes[1].node.handle_commitment_signed_batch_test(node_c_id, &cs_updates.commitment_signed);
check_added_monitors(&nodes[1], 1);
let (bs_raa, bs_cs) = get_revoke_commit_msgs!(nodes[1], node_c_id);
nodes[2].node.handle_revoke_and_ack(node_b_id, &bs_raa);
check_added_monitors(&nodes[2], 1);
nodes[2].node.handle_commitment_signed_batch_test(node_b_id, &bs_cs);
check_added_monitors(&nodes[2], 1);
let cs_final_raa = get_event_msg!(nodes[2], MessageSendEvent::SendRevokeAndACK, node_b_id);
nodes[1].node.handle_revoke_and_ack(node_c_id, &cs_final_raa);
check_added_monitors(&nodes[1], 0);
let mon_ab = get_monitor!(nodes[1], chan_id_ab).encode();
let mon_bc = get_monitor!(nodes[1], chan_id_bc).encode();
let manager_b = nodes[1].node.encode();
reload_node!(nodes[1], &manager_b, &[&mon_ab, &mon_bc], persister, chain_mon, node_b_reload);
let msg = "Channel force-closed".to_owned();
if close_during_reload {
let reason = ClosureReason::HolderForceClosed {
broadcasted_latest_txn: Some(true),
message: msg.clone(),
};
nodes[0].node.force_close_broadcasting_latest_txn(&chan_id_ab, &node_b_id, msg).unwrap();
check_added_monitors!(nodes[0], 1);
check_closed_broadcast!(nodes[0], true);
check_closed_event(&nodes[0], 1, reason, false, &[node_b_id], 100_000);
let as_closing_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
mine_transaction_without_consistency_checks(&nodes[1], &as_closing_tx[0]);
}
let (_, bc_update_id) = nodes[1].chain_monitor.get_latest_mon_update_id(chan_id_bc);
let mut events = nodes[1].node.get_and_clear_pending_events();
assert_eq!(events.len(), if close_during_reload { 2 } else { 1 });
expect_payment_forwarded(
events.remove(0),
&nodes[1],
&nodes[0],
&nodes[2],
Some(1000),
None,
close_during_reload,
false,
false,
);
if close_during_reload {
match events[0] {
Event::ChannelClosed { .. } => {},
_ => panic!(),
}
check_closed_broadcast(&nodes[1], 1, false);
}
check_added_monitors(&nodes[1], if close_during_reload { 2 } else { 1 });
let (_, post_ev_bc_update_id) = nodes[1].chain_monitor.get_latest_mon_update_id(chan_id_bc);
assert!(bc_update_id != post_ev_bc_update_id);
nodes[2].node.peer_disconnected(node_b_id);
reconnect_nodes(ReconnectArgs::new(&nodes[1], &nodes[2]));
send_payment(&nodes[1], &[&nodes[2]], 100_000);
}
#[test]
fn test_reload_mon_update_completion_actions() {
do_test_reload_mon_update_completion_actions(true);
do_test_reload_mon_update_completion_actions(false);
}
fn do_test_glacial_peer_cant_hang(hold_chan_a: bool) {
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let chan_id_ab = create_announced_chan_between_nodes(&nodes, 0, 1).2;
let _chan_id_bc = create_announced_chan_between_nodes(&nodes, 1, 2).2;
let (payment_preimage, payment_hash, ..) =
route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1_000_000);
nodes[2].node.claim_funds(payment_preimage);
check_added_monitors(&nodes[2], 1);
expect_payment_claimed!(nodes[2], payment_hash, 1_000_000);
let mut cs_updates = get_htlc_update_msgs(&nodes[2], &node_b_id);
if hold_chan_a {
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
}
nodes[1].node.handle_update_fulfill_htlc(node_c_id, cs_updates.update_fulfill_htlcs.remove(0));
check_added_monitors(&nodes[1], 1);
if !hold_chan_a {
let mut bs_updates = get_htlc_update_msgs(&nodes[1], &node_a_id);
let mut update_fulfill = bs_updates.update_fulfill_htlcs.remove(0);
nodes[0].node.handle_update_fulfill_htlc(node_b_id, update_fulfill);
commitment_signed_dance!(nodes[0], nodes[1], bs_updates.commitment_signed, false);
expect_payment_sent!(&nodes[0], payment_preimage);
}
nodes[1].node.peer_disconnected(node_c_id);
nodes[2].node.peer_disconnected(node_b_id);
let mut reconnect = ReconnectArgs::new(&nodes[1], &nodes[2]);
reconnect.pending_htlc_claims = (1, 0);
reconnect_nodes(reconnect);
if !hold_chan_a {
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(1000), false, false);
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100_000);
} else {
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) =
get_route_and_payment_hash!(&nodes[1], nodes[2], 1_000_000);
let onion_2 = RecipientOnionFields::secret_only(payment_secret_2);
let id_2 = PaymentId(payment_hash_2.0);
nodes[1].node.send_payment_with_route(route, payment_hash_2, onion_2, id_2).unwrap();
check_added_monitors(&nodes[1], 0);
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
let (ab_update_id, _) = nodes[1].chain_monitor.get_latest_mon_update_id(chan_id_ab);
assert!(nodes[1]
.chain_monitor
.chain_monitor
.channel_monitor_updated(chan_id_ab, ab_update_id)
.is_ok());
let mut msg_events = nodes[1].node.get_and_clear_pending_msg_events();
assert_eq!(msg_events.len(), 2);
check_added_monitors(&nodes[1], 2);
let mut c_update = msg_events
.iter()
.filter(
|ev| matches!(ev, MessageSendEvent::UpdateHTLCs { node_id, .. } if *node_id == node_c_id),
)
.cloned()
.collect::<Vec<_>>();
let a_filtermap = |ev| {
if let MessageSendEvent::UpdateHTLCs { node_id, channel_id: _, updates } = ev {
if node_id == node_a_id {
Some(updates)
} else {
None
}
} else {
None
}
};
let a_update = msg_events.drain(..).filter_map(|ev| a_filtermap(ev)).collect::<Vec<_>>();
assert_eq!(a_update.len(), 1);
assert_eq!(c_update.len(), 1);
let update_fulfill = a_update[0].update_fulfill_htlcs[0].clone();
nodes[0].node.handle_update_fulfill_htlc(node_b_id, update_fulfill);
commitment_signed_dance!(nodes[0], nodes[1], a_update[0].commitment_signed, false);
expect_payment_sent(&nodes[0], payment_preimage, None, true, true);
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(1000), false, false);
pass_along_path(
&nodes[1],
&[&nodes[2]],
1_000_000,
payment_hash_2,
Some(payment_secret_2),
c_update.pop().unwrap(),
true,
None,
);
claim_payment(&nodes[1], &[&nodes[2]], payment_preimage_2);
}
}
#[test]
fn test_glacial_peer_cant_hang() {
do_test_glacial_peer_cant_hang(false);
do_test_glacial_peer_cant_hang(true);
}
fn do_test_partial_claim_mon_update_compl_actions(reload_a: bool, reload_b: bool) {
let chanmon_cfgs = create_chanmon_cfgs(4);
let node_cfgs = create_node_cfgs(4, &chanmon_cfgs);
let (persister, persister_2, persister_3);
let (new_chain_mon, new_chain_mon_2, new_chain_mon_3);
let (nodes_3_reload, nodes_3_reload_2, nodes_3_reload_3);
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
let mut nodes = create_network(4, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let node_d_id = nodes[3].node.get_our_node_id();
let chan_1_scid = create_announced_chan_between_nodes(&nodes, 0, 1).0.contents.short_channel_id;
let chan_2_scid = create_announced_chan_between_nodes(&nodes, 0, 2).0.contents.short_channel_id;
let (chan_3_update, _, chan_3_id, ..) = create_announced_chan_between_nodes(&nodes, 1, 3);
let chan_3_scid = chan_3_update.contents.short_channel_id;
let (chan_4_update, _, chan_4_id, ..) = create_announced_chan_between_nodes(&nodes, 2, 3);
let chan_4_scid = chan_4_update.contents.short_channel_id;
let (mut route, payment_hash, preimage, payment_secret) =
get_route_and_payment_hash!(&nodes[0], nodes[3], 100000);
let path = route.paths[0].clone();
route.paths.push(path);
route.paths[0].hops[0].pubkey = node_b_id;
route.paths[0].hops[0].short_channel_id = chan_1_scid;
route.paths[0].hops[1].short_channel_id = chan_3_scid;
route.paths[1].hops[0].pubkey = node_c_id;
route.paths[1].hops[0].short_channel_id = chan_2_scid;
route.paths[1].hops[1].short_channel_id = chan_4_scid;
let paths = &[&[&nodes[1], &nodes[3]][..], &[&nodes[2], &nodes[3]][..]];
send_along_route_with_secret(&nodes[0], route, paths, 200_000, payment_hash, payment_secret);
let chan_4_monitor_serialized = get_monitor!(nodes[3], chan_4_id).encode();
chanmon_cfgs[3].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
chanmon_cfgs[3].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[3].node.claim_funds(preimage);
assert_eq!(nodes[3].node.get_and_clear_pending_msg_events(), Vec::new());
assert_eq!(nodes[3].node.get_and_clear_pending_events(), Vec::new());
check_added_monitors(&nodes[3], 2);
nodes[3].chain_monitor.complete_sole_pending_chan_update(&chan_3_id);
let payment_claimed = nodes[3].node.get_and_clear_pending_events();
assert_eq!(payment_claimed.len(), 1, "{payment_claimed:?}");
if let Event::PaymentClaimed { payment_hash: ev_hash, .. } = &payment_claimed[0] {
assert_eq!(*ev_hash, payment_hash);
} else {
panic!("{payment_claimed:?}");
}
let mut updates = get_htlc_update_msgs(&nodes[3], &node_b_id);
nodes[1].node.handle_update_fulfill_htlc(node_d_id, updates.update_fulfill_htlcs.remove(0));
check_added_monitors(&nodes[1], 1);
expect_payment_forwarded!(nodes[1], nodes[0], nodes[3], Some(1000), false, false);
let _bs_updates_for_a = get_htlc_update_msgs(&nodes[1], &node_a_id);
nodes[1].node.handle_commitment_signed_batch_test(node_d_id, &updates.commitment_signed);
check_added_monitors(&nodes[1], 1);
let (bs_raa, bs_cs) = get_revoke_commit_msgs(&nodes[1], &node_d_id);
nodes[3].node.handle_revoke_and_ack(node_b_id, &bs_raa);
check_added_monitors(&nodes[3], 0);
nodes[3].node.handle_commitment_signed_batch_test(node_b_id, &bs_cs);
check_added_monitors(&nodes[3], 0);
assert!(nodes[3].node.get_and_clear_pending_msg_events().is_empty());
if reload_a {
let node_ser = nodes[3].node.encode();
let chan_3_monitor_serialized = get_monitor!(nodes[3], chan_3_id).encode();
let mons = &[&chan_3_monitor_serialized[..], &chan_4_monitor_serialized[..]];
reload_node!(nodes[3], &node_ser, mons, persister, new_chain_mon, nodes_3_reload);
persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
assert!(nodes[3].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors(&nodes[3], 1);
let second_payment_claimed = nodes[3].node.get_and_clear_pending_events();
assert_eq!(payment_claimed, second_payment_claimed);
nodes[1].node.peer_disconnected(node_d_id);
nodes[2].node.peer_disconnected(node_d_id);
reconnect_nodes(ReconnectArgs::new(&nodes[1], &nodes[3]));
reconnect_nodes(ReconnectArgs::new(&nodes[2], &nodes[3]));
assert!(nodes[3].node.get_and_clear_pending_msg_events().is_empty());
}
assert!(get_monitor!(nodes[3], chan_3_id).get_stored_preimages().contains_key(&payment_hash));
assert!(nodes[3].node.get_and_clear_pending_events().is_empty());
nodes[3].chain_monitor.complete_sole_pending_chan_update(&chan_4_id);
let mut ds_msgs = nodes[3].node.get_and_clear_pending_msg_events();
assert_eq!(ds_msgs.len(), 2, "{ds_msgs:?}");
check_added_monitors(&nodes[3], 2);
match remove_first_msg_event_to_node(&node_b_id, &mut ds_msgs) {
MessageSendEvent::SendRevokeAndACK { msg, .. } => {
nodes[1].node.handle_revoke_and_ack(node_d_id, &msg);
check_added_monitors(&nodes[1], 1);
},
_ => panic!(),
}
match remove_first_msg_event_to_node(&node_c_id, &mut ds_msgs) {
MessageSendEvent::UpdateHTLCs { mut updates, .. } => {
let update_fulfill = updates.update_fulfill_htlcs.remove(0);
nodes[2].node.handle_update_fulfill_htlc(node_d_id, update_fulfill);
check_added_monitors(&nodes[2], 1);
expect_payment_forwarded!(nodes[2], nodes[0], nodes[3], Some(1000), false, false);
let _cs_updates_for_a = get_htlc_update_msgs(&nodes[2], &node_a_id);
nodes[2]
.node
.handle_commitment_signed_batch_test(node_d_id, &updates.commitment_signed);
check_added_monitors(&nodes[2], 1);
},
_ => panic!(),
}
let (cs_raa, cs_cs) = get_revoke_commit_msgs(&nodes[2], &node_d_id);
nodes[3].node.handle_revoke_and_ack(node_c_id, &cs_raa);
check_added_monitors(&nodes[3], 1);
nodes[3].node.handle_commitment_signed_batch_test(node_c_id, &cs_cs);
check_added_monitors(&nodes[3], 1);
let ds_raa = get_event_msg!(nodes[3], MessageSendEvent::SendRevokeAndACK, node_c_id);
nodes[2].node.handle_revoke_and_ack(node_d_id, &ds_raa);
check_added_monitors(&nodes[2], 1);
assert!(get_monitor!(nodes[3], chan_3_id).get_stored_preimages().contains_key(&payment_hash));
assert!(get_monitor!(nodes[3], chan_4_id).get_stored_preimages().contains_key(&payment_hash));
if reload_b {
let node_ser = nodes[3].node.encode();
let chan_3_monitor_serialized = get_monitor!(nodes[3], chan_3_id).encode();
let chan_4_monitor_serialized = get_monitor!(nodes[3], chan_4_id).encode();
let mons = &[&chan_3_monitor_serialized[..], &chan_4_monitor_serialized[..]];
reload_node!(nodes[3], &node_ser, mons, persister_2, new_chain_mon_2, nodes_3_reload_2);
check_added_monitors(&nodes[3], 0);
nodes[1].node.peer_disconnected(node_d_id);
nodes[2].node.peer_disconnected(node_d_id);
reconnect_nodes(ReconnectArgs::new(&nodes[1], &nodes[3]));
reconnect_nodes(ReconnectArgs::new(&nodes[2], &nodes[3]));
assert!(nodes[3].node.get_and_clear_pending_msg_events().is_empty());
let third_payment_claimed = nodes[3].node.get_and_clear_pending_events();
assert_eq!(payment_claimed, third_payment_claimed);
}
send_payment(&nodes[1], &[&nodes[3]], 100_000);
assert!(!get_monitor!(nodes[3], chan_3_id).get_stored_preimages().contains_key(&payment_hash));
if reload_b {
let node_ser = nodes[3].node.encode();
let chan_3_monitor_serialized = get_monitor!(nodes[3], chan_3_id).encode();
let chan_4_monitor_serialized = get_monitor!(nodes[3], chan_4_id).encode();
let mons = &[&chan_3_monitor_serialized[..], &chan_4_monitor_serialized[..]];
reload_node!(nodes[3], &node_ser, mons, persister_3, new_chain_mon_3, nodes_3_reload_3);
check_added_monitors(&nodes[3], 0);
nodes[1].node.peer_disconnected(node_d_id);
nodes[2].node.peer_disconnected(node_d_id);
reconnect_nodes(ReconnectArgs::new(&nodes[1], &nodes[3]));
reconnect_nodes(ReconnectArgs::new(&nodes[2], &nodes[3]));
assert!(nodes[3].node.get_and_clear_pending_msg_events().is_empty());
let mut events = nodes[3].node.get_and_clear_pending_events();
assert_eq!(events.len(), 2);
events.retain(|ev| *ev != payment_claimed[0]);
assert_eq!(events.len(), 1);
if let Event::PaymentClaimed { payment_id: original_payment_id, .. } = &payment_claimed[0] {
assert!(original_payment_id.is_some());
if let Event::PaymentClaimed { amount_msat, payment_id, .. } = &events[0] {
assert!(payment_id.is_some());
assert_ne!(original_payment_id, payment_id);
assert_eq!(*amount_msat, 100_000);
} else {
panic!("{events:?}");
}
} else {
panic!("{events:?}");
}
send_payment(&nodes[1], &[&nodes[3]], 100_000);
}
send_payment(&nodes[2], &[&nodes[3]], 100_000);
assert!(!get_monitor!(nodes[3], chan_4_id).get_stored_preimages().contains_key(&payment_hash));
}
#[test]
fn test_partial_claim_mon_update_compl_actions() {
do_test_partial_claim_mon_update_compl_actions(true, true);
do_test_partial_claim_mon_update_compl_actions(true, false);
do_test_partial_claim_mon_update_compl_actions(false, true);
do_test_partial_claim_mon_update_compl_actions(false, false);
}
#[test]
fn test_claim_to_closed_channel_blocks_forwarded_preimage_removal() {
let chanmon_cfgs = create_chanmon_cfgs(3);
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let chan_a =
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000);
let chan_b =
create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 1_000_000, 500_000_000);
let (payment_preimage, payment_hash, ..) =
route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1_000_000);
let message = "Channel force-closed".to_owned();
nodes[0]
.node
.force_close_broadcasting_latest_txn(&chan_a.2, &node_b_id, message.clone())
.unwrap();
check_added_monitors!(nodes[0], 1);
let a_reason = ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
check_closed_event!(nodes[0], 1, a_reason, [node_b_id], 1000000);
check_closed_broadcast!(nodes[0], true);
let as_commit_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
assert_eq!(as_commit_tx.len(), 1);
mine_transaction(&nodes[1], &as_commit_tx[0]);
check_closed_broadcast!(nodes[1], true);
check_added_monitors!(nodes[1], 1);
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed, [node_a_id], 1000000);
nodes[2].node.claim_funds(payment_preimage);
check_added_monitors!(nodes[2], 1);
expect_payment_claimed!(nodes[2], payment_hash, 1_000_000);
let mut updates = get_htlc_update_msgs!(nodes[2], node_b_id);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.handle_update_fulfill_htlc(node_c_id, updates.update_fulfill_htlcs.remove(0));
check_added_monitors!(nodes[1], 1);
commitment_signed_dance!(nodes[1], nodes[2], updates.commitment_signed, false);
assert!(get_monitor!(nodes[1], chan_b.2)
.get_all_current_outbound_htlcs()
.iter()
.any(|(_, (_, preimage))| *preimage == Some(payment_preimage)));
check_added_monitors!(nodes[1], 0);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
nodes[1].chain_monitor.complete_sole_pending_chan_update(&chan_a.2);
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
check_added_monitors!(nodes[1], 1);
assert!(!get_monitor!(nodes[1], chan_b.2)
.get_all_current_outbound_htlcs()
.iter()
.any(|(_, (_, preimage))| *preimage == Some(payment_preimage)));
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], None, true, false);
}
#[test]
fn test_claim_to_closed_channel_blocks_claimed_event() {
let chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let node_a_id = nodes[0].node.get_our_node_id();
let node_b_id = nodes[1].node.get_our_node_id();
let chan_a =
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000);
let (payment_preimage, payment_hash, ..) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
let message = "Channel force-closed".to_owned();
nodes[0]
.node
.force_close_broadcasting_latest_txn(&chan_a.2, &node_b_id, message.clone())
.unwrap();
check_added_monitors!(nodes[0], 1);
let a_reason = ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
check_closed_event!(nodes[0], 1, a_reason, [node_b_id], 1000000);
check_closed_broadcast!(nodes[0], true);
let as_commit_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
assert_eq!(as_commit_tx.len(), 1);
mine_transaction(&nodes[1], &as_commit_tx[0]);
check_closed_broadcast!(nodes[1], true);
check_added_monitors!(nodes[1], 1);
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed, [node_a_id], 1000000);
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[1].node.claim_funds(payment_preimage);
check_added_monitors!(nodes[1], 1);
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
nodes[1].chain_monitor.complete_sole_pending_chan_update(&chan_a.2);
expect_payment_claimed!(nodes[1], payment_hash, 1_000_000);
}
#[test]
#[cfg(all(feature = "std", not(target_os = "windows")))]
fn test_single_channel_multiple_mpp() {
use std::sync::atomic::{AtomicBool, Ordering};
let chanmon_cfgs = create_chanmon_cfgs(9);
let node_cfgs = create_node_cfgs(9, &chanmon_cfgs);
let configs = [None, None, None, None, None, None, None, None, None];
let node_chanmgrs = create_node_chanmgrs(9, &node_cfgs, &configs);
let mut nodes = create_network(9, &node_cfgs, &node_chanmgrs);
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let node_d_id = nodes[3].node.get_our_node_id();
let node_e_id = nodes[4].node.get_our_node_id();
let node_f_id = nodes[5].node.get_our_node_id();
let node_g_id = nodes[6].node.get_our_node_id();
let node_h_id = nodes[7].node.get_our_node_id();
let node_i_id = nodes[8].node.get_our_node_id();
const MAX_THREAD_INIT_TIME: std::time::Duration = std::time::Duration::from_secs(1);
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 0, 2, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 0, 3, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 0, 4, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 0, 5, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 0, 6, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 1, 7, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 2, 7, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 3, 7, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 4, 7, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 5, 7, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 6, 7, 100_000, 0);
create_announced_chan_between_nodes_with_value(&nodes, 7, 8, 1_000_000, 0);
let (mut route, payment_hash, payment_preimage, payment_secret) =
get_route_and_payment_hash!(&nodes[0], nodes[8], 50_000_000);
send_along_route_with_secret(
&nodes[0],
route,
&[
&[&nodes[1], &nodes[7], &nodes[8]],
&[&nodes[2], &nodes[7], &nodes[8]],
&[&nodes[3], &nodes[7], &nodes[8]],
&[&nodes[4], &nodes[7], &nodes[8]],
&[&nodes[5], &nodes[7], &nodes[8]],
&[&nodes[6], &nodes[7], &nodes[8]],
],
50_000_000,
payment_hash,
payment_secret,
);
let (do_a_write, blocker) = std::sync::mpsc::sync_channel(0);
*nodes[8].chain_monitor.write_blocker.lock().unwrap() = Some(blocker);
let claim_node: &'static TestChannelManager<'static, 'static> =
unsafe { std::mem::transmute(nodes[8].node as &TestChannelManager) };
let thrd = std::thread::spawn(move || {
claim_node.claim_funds(payment_preimage);
});
do_a_write.send(()).unwrap();
let event_node: &'static TestChannelManager<'static, 'static> =
unsafe { std::mem::transmute(nodes[8].node as &TestChannelManager) };
let thrd_event = std::thread::spawn(move || {
let mut have_event = false;
while !have_event {
let mut events = event_node.get_and_clear_pending_events();
assert!(events.len() == 1 || events.len() == 0);
if events.len() == 1 {
if let Event::PaymentClaimed { .. } = events[0] {
} else {
panic!("Unexpected event {events:?}");
}
have_event = true;
}
}
});
let do_a_write_background = do_a_write.clone();
let block_thrd2 = AtomicBool::new(true);
let block_thrd2_read: &'static AtomicBool = unsafe { std::mem::transmute(&block_thrd2) };
let thrd2 = std::thread::spawn(move || {
while block_thrd2_read.load(Ordering::Acquire) {
std::thread::yield_now();
}
std::thread::sleep(MAX_THREAD_INIT_TIME);
do_a_write_background.send(()).unwrap();
std::thread::sleep(MAX_THREAD_INIT_TIME);
do_a_write_background.send(()).unwrap();
});
block_thrd2.store(false, Ordering::Release);
let mut first_updates = get_htlc_update_msgs(&nodes[8], &node_h_id);
thrd2.join().unwrap();
thrd_event.join().unwrap();
nodes[7].node.peer_disconnected(node_b_id);
nodes[7].node.peer_disconnected(node_c_id);
nodes[7].node.peer_disconnected(node_d_id);
nodes[7].node.peer_disconnected(node_e_id);
nodes[7].node.peer_disconnected(node_f_id);
nodes[7].node.peer_disconnected(node_g_id);
let first_update_fulfill = first_updates.update_fulfill_htlcs.remove(0);
nodes[7].node.handle_update_fulfill_htlc(node_i_id, first_update_fulfill);
check_added_monitors(&nodes[7], 1);
expect_payment_forwarded!(nodes[7], nodes[1], nodes[8], Some(1000), false, false);
nodes[7].node.handle_commitment_signed_batch_test(node_i_id, &first_updates.commitment_signed);
check_added_monitors(&nodes[7], 1);
let (raa, cs) = get_revoke_commit_msgs(&nodes[7], &node_i_id);
let do_a_write_background = do_a_write.clone();
let block_thrd3 = AtomicBool::new(true);
let block_thrd3_read: &'static AtomicBool = unsafe { std::mem::transmute(&block_thrd3) };
let thrd3 = std::thread::spawn(move || {
while block_thrd3_read.load(Ordering::Acquire) {
std::thread::yield_now();
}
std::thread::sleep(MAX_THREAD_INIT_TIME);
do_a_write_background.send(()).unwrap();
std::thread::sleep(MAX_THREAD_INIT_TIME);
do_a_write_background.send(()).unwrap();
});
block_thrd3.store(false, Ordering::Release);
nodes[8].node.handle_revoke_and_ack(node_h_id, &raa);
thrd3.join().unwrap();
assert!(!thrd.is_finished());
let thrd4 = std::thread::spawn(move || {
do_a_write.send(()).unwrap();
do_a_write.send(()).unwrap();
});
thrd4.join().unwrap();
thrd.join().unwrap();
check_added_monitors(&nodes[8], 7);
*nodes[8].chain_monitor.write_blocker.lock().unwrap() = None;
nodes[8].node.handle_commitment_signed_batch_test(node_h_id, &cs);
check_added_monitors(&nodes[8], 1);
let (mut updates, raa) = get_updates_and_revoke(&nodes[8], &node_h_id);
nodes[7].node.handle_update_fulfill_htlc(node_i_id, updates.update_fulfill_htlcs.remove(0));
expect_payment_forwarded!(nodes[7], nodes[2], nodes[8], Some(1000), false, false);
nodes[7].node.handle_update_fulfill_htlc(node_i_id, updates.update_fulfill_htlcs.remove(0));
expect_payment_forwarded!(nodes[7], nodes[3], nodes[8], Some(1000), false, false);
let mut next_source = 4;
if let Some(update) = updates.update_fulfill_htlcs.get(0) {
nodes[7].node.handle_update_fulfill_htlc(node_i_id, update.clone());
expect_payment_forwarded!(nodes[7], nodes[4], nodes[8], Some(1000), false, false);
next_source += 1;
}
nodes[7].node.handle_commitment_signed_batch_test(node_i_id, &updates.commitment_signed);
nodes[7].node.handle_revoke_and_ack(node_i_id, &raa);
if updates.update_fulfill_htlcs.get(0).is_some() {
check_added_monitors(&nodes[7], 5);
} else {
check_added_monitors(&nodes[7], 4);
}
let (raa, cs) = get_revoke_commit_msgs(&nodes[7], &node_i_id);
nodes[8].node.handle_revoke_and_ack(node_h_id, &raa);
nodes[8].node.handle_commitment_signed_batch_test(node_h_id, &cs);
check_added_monitors(&nodes[8], 2);
let (mut updates, raa) = get_updates_and_revoke(&nodes[8], &node_h_id);
nodes[7].node.handle_update_fulfill_htlc(node_i_id, updates.update_fulfill_htlcs.remove(0));
expect_payment_forwarded!(nodes[7], nodes[next_source], nodes[8], Some(1000), false, false);
next_source += 1;
nodes[7].node.handle_update_fulfill_htlc(node_i_id, updates.update_fulfill_htlcs.remove(0));
expect_payment_forwarded!(nodes[7], nodes[next_source], nodes[8], Some(1000), false, false);
next_source += 1;
if let Some(update) = updates.update_fulfill_htlcs.get(0) {
nodes[7].node.handle_update_fulfill_htlc(node_i_id, update.clone());
expect_payment_forwarded!(nodes[7], nodes[next_source], nodes[8], Some(1000), false, false);
}
nodes[7].node.handle_commitment_signed_batch_test(node_i_id, &updates.commitment_signed);
nodes[7].node.handle_revoke_and_ack(node_i_id, &raa);
if updates.update_fulfill_htlcs.get(0).is_some() {
check_added_monitors(&nodes[7], 5);
} else {
check_added_monitors(&nodes[7], 4);
}
let (raa, cs) = get_revoke_commit_msgs(&nodes[7], &node_i_id);
nodes[8].node.handle_revoke_and_ack(node_h_id, &raa);
nodes[8].node.handle_commitment_signed_batch_test(node_h_id, &cs);
check_added_monitors(&nodes[8], 2);
let raa = get_event_msg!(nodes[8], MessageSendEvent::SendRevokeAndACK, node_h_id);
nodes[7].node.handle_revoke_and_ack(node_i_id, &raa);
check_added_monitors(&nodes[7], 1);
}
#[test]
fn native_async_persist() {
let (monitor, updates);
let mut chanmon_cfgs = create_chanmon_cfgs(2);
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
let (_, _, chan_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1);
monitor = get_monitor!(nodes[0], chan_id).clone();
send_payment(&nodes[0], &[&nodes[1]], 1_000_000);
let mon_updates =
nodes[0].chain_monitor.monitor_updates.lock().unwrap().remove(&chan_id).unwrap();
updates = mon_updates.into_iter().collect::<Vec<_>>();
assert!(updates.len() >= 4, "The test below needs at least four updates");
core::mem::drop(nodes);
core::mem::drop(node_chanmgrs);
core::mem::drop(node_cfgs);
let node_0_utils = chanmon_cfgs.remove(0);
let (logger, keys_manager, tx_broadcaster, fee_estimator) = (
node_0_utils.logger,
node_0_utils.keys_manager,
node_0_utils.tx_broadcaster,
node_0_utils.fee_estimator,
);
let logger = Arc::new(logger);
let keys_manager = Arc::new(keys_manager);
let tx_broadcaster = Arc::new(tx_broadcaster);
let fee_estimator = Arc::new(fee_estimator);
let kv_store = Arc::new(test_utils::TestStore::new(false));
let persist_futures = Arc::new(FutureQueue::new());
let native_async_persister = MonitorUpdatingPersisterAsync::new(
Arc::clone(&kv_store),
Arc::clone(&persist_futures),
Arc::clone(&logger),
42,
Arc::clone(&keys_manager),
Arc::clone(&keys_manager),
Arc::clone(&tx_broadcaster),
Arc::clone(&fee_estimator),
);
let chain_source = test_utils::TestChainSource::new(Network::Testnet);
let async_chain_monitor = ChainMonitor::new_async_beta(
Some(&chain_source),
tx_broadcaster,
logger,
fee_estimator,
native_async_persister,
Arc::clone(&keys_manager),
keys_manager.get_peer_storage_key(),
);
let write_status = async_chain_monitor.watch_channel(chan_id, monitor).unwrap();
assert_eq!(write_status, ChannelMonitorUpdateStatus::InProgress);
assert_eq!(persist_futures.pending_futures(), 1);
persist_futures.poll_futures();
assert_eq!(persist_futures.pending_futures(), 1);
let funding_txo = OutPoint { txid: funding_tx.compute_txid(), index: 0 };
let key = MonitorName::V1Channel(funding_txo).to_string();
let pending_writes = kv_store.list_pending_async_writes(
CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE,
CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE,
&key,
);
assert_eq!(pending_writes.len(), 1);
kv_store.complete_all_async_writes();
assert_eq!(persist_futures.pending_futures(), 1);
assert_eq!(async_chain_monitor.release_pending_monitor_events().len(), 0);
assert_eq!(persist_futures.pending_futures(), 1);
persist_futures.poll_futures();
assert_eq!(persist_futures.pending_futures(), 0);
let completed_persist = async_chain_monitor.release_pending_monitor_events();
assert_eq!(completed_persist.len(), 1);
assert_eq!(completed_persist[0].2.len(), 1);
assert!(matches!(completed_persist[0].2[0], MonitorEvent::Completed { .. }));
let update_status = async_chain_monitor.update_channel(chan_id, &updates[0]);
assert_eq!(update_status, ChannelMonitorUpdateStatus::InProgress);
let update_status = async_chain_monitor.update_channel(chan_id, &updates[1]);
assert_eq!(update_status, ChannelMonitorUpdateStatus::InProgress);
persist_futures.poll_futures();
assert_eq!(async_chain_monitor.release_pending_monitor_events().len(), 0);
let pending_writes = kv_store.list_pending_async_writes(
CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE,
&key,
"1",
);
assert_eq!(pending_writes.len(), 1);
let pending_writes = kv_store.list_pending_async_writes(
CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE,
&key,
"2",
);
assert_eq!(pending_writes.len(), 1);
kv_store.complete_async_writes_through(
CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE,
&key,
"1",
usize::MAX,
);
persist_futures.poll_futures();
assert!(async_chain_monitor.release_pending_monitor_events().is_empty());
kv_store.complete_async_writes_through(
CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE,
&key,
"2",
usize::MAX,
);
persist_futures.poll_futures();
let completed_persist = async_chain_monitor.release_pending_monitor_events();
assert_eq!(completed_persist.len(), 1);
assert_eq!(completed_persist[0].2.len(), 1);
assert!(matches!(completed_persist[0].2[0], MonitorEvent::Completed { .. }));
let update_status = async_chain_monitor.update_channel(chan_id, &updates[2]);
assert_eq!(update_status, ChannelMonitorUpdateStatus::InProgress);
let update_status = async_chain_monitor.update_channel(chan_id, &updates[3]);
assert_eq!(update_status, ChannelMonitorUpdateStatus::InProgress);
persist_futures.poll_futures();
assert_eq!(async_chain_monitor.release_pending_monitor_events().len(), 0);
let pending_writes = kv_store.list_pending_async_writes(
CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE,
&key,
"3",
);
assert_eq!(pending_writes.len(), 1);
let pending_writes = kv_store.list_pending_async_writes(
CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE,
&key,
"4",
);
assert_eq!(pending_writes.len(), 1);
kv_store.complete_async_writes_through(
CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE,
&key,
"4",
usize::MAX,
);
persist_futures.poll_futures();
assert_eq!(async_chain_monitor.release_pending_monitor_events().len(), 0);
kv_store.complete_async_writes_through(
CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE,
&key,
"3",
usize::MAX,
);
persist_futures.poll_futures();
let completed_persist = async_chain_monitor.release_pending_monitor_events();
assert_eq!(completed_persist.len(), 1);
assert_eq!(completed_persist[0].2.len(), 1);
if let MonitorEvent::Completed { monitor_update_id, .. } = &completed_persist[0].2[0] {
assert_eq!(*monitor_update_id, 4);
} else {
panic!();
}
}
#[test]
fn test_mpp_claim_to_holding_cell() {
let chanmon_cfgs = create_chanmon_cfgs(4);
let node_cfgs = create_node_cfgs(4, &chanmon_cfgs);
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
let nodes = create_network(4, &node_cfgs, &node_chanmgrs);
let node_b_id = nodes[1].node.get_our_node_id();
let node_c_id = nodes[2].node.get_our_node_id();
let node_d_id = nodes[3].node.get_our_node_id();
let chan_1_scid = create_announced_chan_between_nodes(&nodes, 0, 1).0.contents.short_channel_id;
let chan_2_scid = create_announced_chan_between_nodes(&nodes, 0, 2).0.contents.short_channel_id;
let (chan_3_update, _, chan_3_id, ..) = create_announced_chan_between_nodes(&nodes, 1, 3);
let chan_3_scid = chan_3_update.contents.short_channel_id;
let (chan_4_update, _, chan_4_id, ..) = create_announced_chan_between_nodes(&nodes, 2, 3);
let chan_4_scid = chan_4_update.contents.short_channel_id;
let (mut route, paymnt_hash_1, preimage_1, payment_secret) =
get_route_and_payment_hash!(&nodes[0], nodes[3], 500_000);
let path = route.paths[0].clone();
route.paths.push(path);
route.paths[0].hops[0].pubkey = node_b_id;
route.paths[0].hops[0].short_channel_id = chan_1_scid;
route.paths[0].hops[1].short_channel_id = chan_3_scid;
route.paths[0].hops[1].fee_msat = 250_000;
route.paths[1].hops[0].pubkey = node_c_id;
route.paths[1].hops[0].short_channel_id = chan_2_scid;
route.paths[1].hops[1].short_channel_id = chan_4_scid;
route.paths[1].hops[1].fee_msat = 250_000;
let paths = &[&[&nodes[1], &nodes[3]][..], &[&nodes[2], &nodes[3]][..]];
send_along_route_with_secret(&nodes[0], route, paths, 500_000, paymnt_hash_1, payment_secret);
let (preimage_2, paymnt_hash_2, payment_secret_2) = get_payment_preimage_hash!(nodes[3]);
let onion = RecipientOnionFields::secret_only(payment_secret_2);
let id = PaymentId([42; 32]);
let pay_params = PaymentParameters::from_node_id(node_d_id, TEST_FINAL_CLTV);
let route_params = RouteParameters::from_payment_params_and_value(pay_params, 400_000);
nodes[2].node.send_payment(paymnt_hash_2, onion, id, route_params, Retry::Attempts(0)).unwrap();
check_added_monitors(&nodes[2], 1);
let mut payment_event = SendEvent::from_node(&nodes[2]);
nodes[3].node.handle_update_add_htlc(node_c_id, &payment_event.msgs[0]);
nodes[3].node.handle_commitment_signed_batch_test(node_c_id, &payment_event.commitment_msg);
check_added_monitors(&nodes[3], 1);
let (raa, cs) = get_revoke_commit_msgs(&nodes[3], &node_c_id);
nodes[2].node.handle_revoke_and_ack(node_d_id, &raa);
check_added_monitors(&nodes[2], 1);
nodes[2].node.handle_commitment_signed_batch_test(node_d_id, &cs);
check_added_monitors(&nodes[2], 1);
let cs_raa = get_event_msg!(nodes[2], MessageSendEvent::SendRevokeAndACK, node_d_id);
chanmon_cfgs[3].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
chanmon_cfgs[3].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
nodes[3].node.claim_funds(preimage_1);
check_added_monitors(&nodes[3], 2);
let (latest_id, _) = nodes[3].chain_monitor.get_latest_mon_update_id(chan_3_id);
nodes[3].chain_monitor.chain_monitor.channel_monitor_updated(chan_3_id, latest_id).unwrap();
let mut b_claim = get_htlc_update_msgs(&nodes[3], &node_b_id);
nodes[3].node.handle_revoke_and_ack(node_c_id, &cs_raa);
check_added_monitors(&nodes[3], 0);
let (latest_id, _) = nodes[3].chain_monitor.get_latest_mon_update_id(chan_4_id);
nodes[3].chain_monitor.chain_monitor.channel_monitor_updated(chan_4_id, latest_id).unwrap();
expect_payment_claimed!(nodes[3], paymnt_hash_1, 500_000);
check_added_monitors(&nodes[3], 1);
let mut c_claim = get_htlc_update_msgs(&nodes[3], &node_c_id);
check_added_monitors(&nodes[3], 1);
let path = [&[&nodes[1], &nodes[3]][..], &[&nodes[2], &nodes[3]][..]];
let mut args = ClaimAlongRouteArgs::new(&nodes[0], &path[..], preimage_1);
let b_claim_msgs = (b_claim.update_fulfill_htlcs.pop().unwrap(), b_claim.commitment_signed);
let c_claim_msgs = (c_claim.update_fulfill_htlcs.pop().unwrap(), c_claim.commitment_signed);
let claims = vec![(b_claim_msgs, node_b_id), (c_claim_msgs, node_c_id)];
pass_claimed_payment_along_route_from_ev(250_000, claims, args);
expect_payment_sent(&nodes[0], preimage_1, None, true, true);
expect_and_process_pending_htlcs(&nodes[3], false);
expect_payment_claimable!(nodes[3], paymnt_hash_2, payment_secret_2, 400_000);
claim_payment(&nodes[2], &[&nodes[3]], preimage_2);
}