|
11 | 11 | //! other behavior that exists only on private channels or with a semi-trusted counterparty (eg
|
12 | 12 | //! LSP).
|
13 | 13 |
|
14 |
| -use chain::Watch; |
| 14 | +use chain::{ChannelMonitorUpdateErr, Watch}; |
15 | 15 | use chain::channelmonitor::ChannelMonitor;
|
16 | 16 | use chain::keysinterface::{Recipient, KeysInterface};
|
17 | 17 | use ln::channelmanager::{ChannelManager, ChannelManagerReadArgs, MIN_CLTV_EXPIRY_DELTA};
|
@@ -619,3 +619,151 @@ fn test_simple_0_conf_channel() {
|
619 | 619 |
|
620 | 620 | send_payment(&nodes[0], &[&nodes[1]], 100_000);
|
621 | 621 | }
|
| 622 | + |
| 623 | +#[test] |
| 624 | +fn test_0_conf_channel_with_async_monitor() { |
| 625 | + // Test that we properly send out funding_locked in (both inbound- and outbound-) zero-conf |
| 626 | + // channels if ChannelMonitor updates return a `TemporaryFailure` during the initial channel |
| 627 | + // negotiation. |
| 628 | + |
| 629 | + let chanmon_cfgs = create_chanmon_cfgs(3); |
| 630 | + let node_cfgs = create_node_cfgs(3, &chanmon_cfgs); |
| 631 | + let mut chan_config = test_default_channel_config(); |
| 632 | + chan_config.manually_accept_inbound_channels = true; |
| 633 | + let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, Some(chan_config), None]); |
| 634 | + let nodes = create_network(3, &node_cfgs, &node_chanmgrs); |
| 635 | + |
| 636 | + create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 1_000_000, 0, InitFeatures::known(), InitFeatures::known()); |
| 637 | + |
| 638 | + chan_config.channel_options.announced_channel = false; |
| 639 | + nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100000, 10001, 42, Some(chan_config)).unwrap(); |
| 640 | + let open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id()); |
| 641 | + |
| 642 | + nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel); |
| 643 | + let events = nodes[1].node.get_and_clear_pending_events(); |
| 644 | + assert_eq!(events.len(), 1); |
| 645 | + match events[0] { |
| 646 | + Event::OpenChannelRequest { temporary_channel_id, .. } => { |
| 647 | + nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, 0).unwrap(); |
| 648 | + }, |
| 649 | + _ => panic!("Unexpected event"), |
| 650 | + }; |
| 651 | + |
| 652 | + let mut accept_channel = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id()); |
| 653 | + assert_eq!(accept_channel.minimum_depth, 0); |
| 654 | + nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &accept_channel); |
| 655 | + |
| 656 | + let (temporary_channel_id, tx, funding_output) = create_funding_transaction(&nodes[0], 100000, 42); |
| 657 | + nodes[0].node.funding_transaction_generated(&temporary_channel_id, tx.clone()).unwrap(); |
| 658 | + let funding_created = get_event_msg!(nodes[0], MessageSendEvent::SendFundingCreated, nodes[1].node.get_our_node_id()); |
| 659 | + |
| 660 | + chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure)); |
| 661 | + nodes[1].node.handle_funding_created(&nodes[0].node.get_our_node_id(), &funding_created); |
| 662 | + check_added_monitors!(nodes[1], 1); |
| 663 | + assert!(nodes[1].node.get_and_clear_pending_events().is_empty()); |
| 664 | + |
| 665 | + let channel_id = funding_output.to_channel_id(); |
| 666 | + nodes[1].chain_monitor.complete_sole_pending_chan_update(&channel_id); |
| 667 | + |
| 668 | + let bs_signed_locked = nodes[1].node.get_and_clear_pending_msg_events(); |
| 669 | + assert_eq!(bs_signed_locked.len(), 2); |
| 670 | + chanmon_cfgs[0].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure)); |
| 671 | + |
| 672 | + match &bs_signed_locked[0] { |
| 673 | + MessageSendEvent::SendFundingSigned { node_id, msg } => { |
| 674 | + assert_eq!(*node_id, nodes[0].node.get_our_node_id()); |
| 675 | + nodes[0].node.handle_funding_signed(&nodes[1].node.get_our_node_id(), &msg); |
| 676 | + check_added_monitors!(nodes[0], 1); |
| 677 | + } |
| 678 | + _ => panic!("Unexpected event"), |
| 679 | + } |
| 680 | + match &bs_signed_locked[1] { |
| 681 | + MessageSendEvent::SendFundingLocked { node_id, msg } => { |
| 682 | + assert_eq!(*node_id, nodes[0].node.get_our_node_id()); |
| 683 | + nodes[0].node.handle_funding_locked(&nodes[1].node.get_our_node_id(), &msg); |
| 684 | + } |
| 685 | + _ => panic!("Unexpected event"), |
| 686 | + } |
| 687 | + |
| 688 | + assert!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().is_empty()); |
| 689 | + |
| 690 | + assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty()); |
| 691 | + nodes[0].chain_monitor.complete_sole_pending_chan_update(&channel_id); |
| 692 | + let as_locked_update = nodes[0].node.get_and_clear_pending_msg_events(); |
| 693 | + |
| 694 | + // Note that the funding transaction is actually released when |
| 695 | + // get_and_clear_pending_msg_events, above, checks for monitor events. |
| 696 | + assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().len(), 1); |
| 697 | + assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0)[0], tx); |
| 698 | + |
| 699 | + match &as_locked_update[0] { |
| 700 | + MessageSendEvent::SendFundingLocked { node_id, msg } => { |
| 701 | + assert_eq!(*node_id, nodes[1].node.get_our_node_id()); |
| 702 | + nodes[1].node.handle_funding_locked(&nodes[0].node.get_our_node_id(), &msg); |
| 703 | + } |
| 704 | + _ => panic!("Unexpected event"), |
| 705 | + } |
| 706 | + let bs_channel_update = get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id()); |
| 707 | + |
| 708 | + let as_channel_update = match &as_locked_update[1] { |
| 709 | + MessageSendEvent::SendChannelUpdate { node_id, msg } => { |
| 710 | + assert_eq!(*node_id, nodes[1].node.get_our_node_id()); |
| 711 | + msg.clone() |
| 712 | + } |
| 713 | + _ => panic!("Unexpected event"), |
| 714 | + }; |
| 715 | + |
| 716 | + chanmon_cfgs[0].persister.set_update_ret(Ok(())); |
| 717 | + chanmon_cfgs[1].persister.set_update_ret(Ok(())); |
| 718 | + |
| 719 | + nodes[0].node.handle_channel_update(&nodes[1].node.get_our_node_id(), &bs_channel_update); |
| 720 | + nodes[1].node.handle_channel_update(&nodes[0].node.get_our_node_id(), &as_channel_update); |
| 721 | + |
| 722 | + assert_eq!(nodes[0].node.list_usable_channels().len(), 1); |
| 723 | + assert_eq!(nodes[1].node.list_usable_channels().len(), 2); |
| 724 | + |
| 725 | + send_payment(&nodes[0], &[&nodes[1]], 100_000); |
| 726 | + |
| 727 | + // Now that we have useful channels, try sending a payment where the we hit a temporary monitor |
| 728 | + // failure before we've ever confirmed the funding transaction. This previously caused a panic. |
| 729 | + let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], 1_000_000); |
| 730 | + |
| 731 | + nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap(); |
| 732 | + check_added_monitors!(nodes[0], 1); |
| 733 | + |
| 734 | + let as_send = SendEvent::from_node(&nodes[0]); |
| 735 | + nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &as_send.msgs[0]); |
| 736 | + nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), &as_send.commitment_msg); |
| 737 | + check_added_monitors!(nodes[1], 1); |
| 738 | + |
| 739 | + let (bs_raa, bs_commitment_signed) = get_revoke_commit_msgs!(nodes[1], nodes[0].node.get_our_node_id()); |
| 740 | + nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_raa); |
| 741 | + check_added_monitors!(nodes[0], 1); |
| 742 | + |
| 743 | + nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &bs_commitment_signed); |
| 744 | + check_added_monitors!(nodes[0], 1); |
| 745 | + |
| 746 | + chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure)); |
| 747 | + nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, nodes[1].node.get_our_node_id())); |
| 748 | + check_added_monitors!(nodes[1], 1); |
| 749 | + assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty()); |
| 750 | + |
| 751 | + chanmon_cfgs[1].persister.set_update_ret(Ok(())); |
| 752 | + let (outpoint, _, latest_update) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&bs_raa.channel_id).unwrap().clone(); |
| 753 | + nodes[1].chain_monitor.chain_monitor.channel_monitor_updated(outpoint, latest_update).unwrap(); |
| 754 | + check_added_monitors!(nodes[1], 0); |
| 755 | + expect_pending_htlcs_forwardable!(nodes[1]); |
| 756 | + check_added_monitors!(nodes[1], 1); |
| 757 | + |
| 758 | + let bs_send = SendEvent::from_node(&nodes[1]); |
| 759 | + nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &bs_send.msgs[0]); |
| 760 | + commitment_signed_dance!(nodes[2], nodes[1], bs_send.commitment_msg, false); |
| 761 | + expect_pending_htlcs_forwardable!(nodes[2]); |
| 762 | + expect_payment_received!(nodes[2], payment_hash, payment_secret, 1_000_000); |
| 763 | + claim_payment(&nodes[0], &[&nodes[1], &nodes[2]], payment_preimage); |
| 764 | + |
| 765 | + confirm_transaction(&nodes[0], &tx); |
| 766 | + confirm_transaction(&nodes[1], &tx); |
| 767 | + |
| 768 | + send_payment(&nodes[0], &[&nodes[1]], 100_000); |
| 769 | +} |
0 commit comments