Skip to content

Commit a4d42a3

Browse files
committed
Correctly handle sending announcement sigs on public 0conf channels
1 parent 4ea86f8 commit a4d42a3

File tree

3 files changed

+111
-3
lines changed

3 files changed

+111
-3
lines changed

lightning/src/ln/channel.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4662,7 +4662,7 @@ impl<Signer: Sign> Channel<Signer> {
46624662
for &(index_in_block, tx) in txdata.iter() {
46634663
// If we haven't yet sent a funding_locked, but are in FundingSent (ignoring
46644664
// whether they've sent a funding_locked or not), check if we should send one.
4665-
if non_shutdown_state & !(ChannelState::TheirFundingLocked as u32) == ChannelState::FundingSent as u32 {
4665+
if self.funding_tx_confirmation_height == 0 {
46664666
if tx.txid() == funding_txo.txid {
46674667
let txo_idx = funding_txo.index as usize;
46684668
if txo_idx >= tx.output.len() || tx.output[txo_idx].script_pubkey != self.get_funding_redeemscript().to_v0_p2wsh() ||

lightning/src/ln/functional_tests.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9222,7 +9222,9 @@ fn test_duplicate_chan_id() {
92229222

92239223
let funding_created = {
92249224
let mut a_channel_lock = nodes[0].node.channel_state.lock().unwrap();
9225-
let mut as_chan = a_channel_lock.by_id.get_mut(&open_chan_2_msg.temporary_channel_id).unwrap();
9225+
// Note that we drop the channel entirely here as its in a somewhat nonsense state (leaving
9226+
// the channelmanager in a possibly nonsense state instead).
9227+
let mut as_chan = a_channel_lock.by_id.remove(&open_chan_2_msg.temporary_channel_id).unwrap();
92269228
let logger = test_utils::TestLogger::new();
92279229
as_chan.get_outbound_funding_created(tx.clone(), funding_outpoint, &&logger).unwrap()
92289230
};
@@ -9260,7 +9262,7 @@ fn test_duplicate_chan_id() {
92609262
let events_4 = nodes[0].node.get_and_clear_pending_events();
92619263
assert_eq!(events_4.len(), 0);
92629264
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().len(), 1);
9263-
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap()[0].txid(), funding_output.txid);
9265+
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap()[0], tx);
92649266

92659267
let (funding_locked, _) = create_chan_between_nodes_with_value_confirm(&nodes[0], &nodes[1], &tx);
92669268
let (announcement, as_update, bs_update) = create_chan_between_nodes_with_value_b(&nodes[0], &nodes[1], &funding_locked);

lightning/src/ln/priv_short_conf_tests.rs

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,3 +790,109 @@ fn test_0conf_channel_with_async_monitor() {
790790

791791
send_payment(&nodes[0], &[&nodes[1]], 100_000);
792792
}
793+
794+
#[test]
795+
fn test_public_0_conf_channel() {
796+
// Tests that we will announce a public channel (after confirmation) even if its 0conf.
797+
let chanmon_cfgs = create_chanmon_cfgs(2);
798+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
799+
let mut chan_config = test_default_channel_config();
800+
chan_config.manually_accept_inbound_channels = true;
801+
chan_config.channel_options.announced_channel = true;
802+
803+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, Some(chan_config)]);
804+
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
805+
806+
nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100000, 10001, 42, None).unwrap();
807+
let open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
808+
809+
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel);
810+
let events = nodes[1].node.get_and_clear_pending_events();
811+
assert_eq!(events.len(), 1);
812+
match events[0] {
813+
Event::OpenChannelRequest { temporary_channel_id, .. } => {
814+
nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, 0).unwrap();
815+
},
816+
_ => panic!("Unexpected event"),
817+
};
818+
819+
let mut accept_channel = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
820+
assert_eq!(accept_channel.minimum_depth, 0);
821+
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &accept_channel);
822+
823+
let (temporary_channel_id, tx, _) = create_funding_transaction(&nodes[0], 100000, 42);
824+
nodes[0].node.funding_transaction_generated(&temporary_channel_id, tx.clone()).unwrap();
825+
let funding_created = get_event_msg!(nodes[0], MessageSendEvent::SendFundingCreated, nodes[1].node.get_our_node_id());
826+
827+
nodes[1].node.handle_funding_created(&nodes[0].node.get_our_node_id(), &funding_created);
828+
check_added_monitors!(nodes[1], 1);
829+
let bs_signed_locked = nodes[1].node.get_and_clear_pending_msg_events();
830+
assert_eq!(bs_signed_locked.len(), 2);
831+
let as_funding_locked;
832+
match &bs_signed_locked[0] {
833+
MessageSendEvent::SendFundingSigned { node_id, msg } => {
834+
assert_eq!(*node_id, nodes[0].node.get_our_node_id());
835+
nodes[0].node.handle_funding_signed(&nodes[1].node.get_our_node_id(), &msg);
836+
check_added_monitors!(nodes[0], 1);
837+
838+
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().len(), 1);
839+
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0)[0], tx);
840+
841+
as_funding_locked = get_event_msg!(nodes[0], MessageSendEvent::SendFundingLocked, nodes[1].node.get_our_node_id());
842+
}
843+
_ => panic!("Unexpected event"),
844+
}
845+
match &bs_signed_locked[1] {
846+
MessageSendEvent::SendFundingLocked { node_id, msg } => {
847+
assert_eq!(*node_id, nodes[0].node.get_our_node_id());
848+
nodes[0].node.handle_funding_locked(&nodes[1].node.get_our_node_id(), &msg);
849+
}
850+
_ => panic!("Unexpected event"),
851+
}
852+
853+
nodes[1].node.handle_funding_locked(&nodes[0].node.get_our_node_id(), &as_funding_locked);
854+
855+
let as_channel_update = get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
856+
let bs_channel_update = get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id());
857+
858+
nodes[0].node.handle_channel_update(&nodes[1].node.get_our_node_id(), &bs_channel_update);
859+
nodes[1].node.handle_channel_update(&nodes[0].node.get_our_node_id(), &as_channel_update);
860+
861+
assert_eq!(nodes[0].node.list_usable_channels().len(), 1);
862+
assert_eq!(nodes[1].node.list_usable_channels().len(), 1);
863+
864+
// We can use the channel immediately, but we can't announce it until we get 6+ confirmations
865+
send_payment(&nodes[0], &[&nodes[1]], 100_000);
866+
867+
confirm_transaction(&nodes[0], &tx);
868+
let as_announcement_sigs = get_event_msg!(nodes[0], MessageSendEvent::SendAnnouncementSignatures, nodes[1].node.get_our_node_id());
869+
confirm_transaction(&nodes[1], &tx);
870+
let bs_announcement_sigs = get_event_msg!(nodes[1], MessageSendEvent::SendAnnouncementSignatures, nodes[0].node.get_our_node_id());
871+
872+
nodes[1].node.handle_announcement_signatures(&nodes[0].node.get_our_node_id(), &as_announcement_sigs);
873+
nodes[0].node.handle_announcement_signatures(&nodes[1].node.get_our_node_id(), &bs_announcement_sigs);
874+
875+
let bs_announcement = nodes[1].node.get_and_clear_pending_msg_events();
876+
assert_eq!(bs_announcement.len(), 1);
877+
let announcement;
878+
let bs_update;
879+
match bs_announcement[0] {
880+
MessageSendEvent::BroadcastChannelAnnouncement { ref msg, ref update_msg } => {
881+
announcement = msg.clone();
882+
bs_update = update_msg.clone();
883+
},
884+
_ => panic!("Unexpected event"),
885+
};
886+
887+
let as_announcement = nodes[0].node.get_and_clear_pending_msg_events();
888+
assert_eq!(as_announcement.len(), 1);
889+
match as_announcement[0] {
890+
MessageSendEvent::BroadcastChannelAnnouncement { ref msg, ref update_msg } => {
891+
assert!(announcement == *msg);
892+
assert_eq!(update_msg.contents.short_channel_id, announcement.contents.short_channel_id);
893+
assert_eq!(update_msg.contents.short_channel_id, bs_update.contents.short_channel_id);
894+
},
895+
_ => panic!("Unexpected event"),
896+
};
897+
898+
}

0 commit comments

Comments
 (0)