Skip to content

Commit 0d40d8d

Browse files
committed
Correctly handle sending announcement sigs on public 0conf channels
1 parent e368496 commit 0d40d8d

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
@@ -4648,7 +4648,7 @@ impl<Signer: Sign> Channel<Signer> {
46484648
for &(index_in_block, tx) in txdata.iter() {
46494649
// If we haven't yet sent a funding_locked, but are in FundingSent (ignoring
46504650
// whether they've sent a funding_locked or not), check if we should send one.
4651-
if non_shutdown_state & !(ChannelState::TheirFundingLocked as u32) == ChannelState::FundingSent as u32 {
4651+
if self.funding_tx_confirmation_height == 0 {
46524652
if tx.txid() == funding_txo.txid {
46534653
let txo_idx = funding_txo.index as usize;
46544654
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
@@ -9146,7 +9146,9 @@ fn test_duplicate_chan_id() {
91469146

91479147
let funding_created = {
91489148
let mut a_channel_lock = nodes[0].node.channel_state.lock().unwrap();
9149-
let mut as_chan = a_channel_lock.by_id.get_mut(&open_chan_2_msg.temporary_channel_id).unwrap();
9149+
// Note that we drop the channel entirely here as its in a somewhat nonsense state (leaving
9150+
// the channelmanager in a possibly nonsense state instead).
9151+
let mut as_chan = a_channel_lock.by_id.remove(&open_chan_2_msg.temporary_channel_id).unwrap();
91509152
let logger = test_utils::TestLogger::new();
91519153
as_chan.get_outbound_funding_created(tx.clone(), funding_outpoint, &&logger).unwrap()
91529154
};
@@ -9184,7 +9186,7 @@ fn test_duplicate_chan_id() {
91849186
let events_4 = nodes[0].node.get_and_clear_pending_events();
91859187
assert_eq!(events_4.len(), 0);
91869188
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().len(), 1);
9187-
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap()[0].txid(), funding_output.txid);
9189+
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap()[0], tx);
91889190

91899191
let (funding_locked, _) = create_chan_between_nodes_with_value_confirm(&nodes[0], &nodes[1], &tx);
91909192
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
@@ -782,3 +782,109 @@ fn test_0_conf_channel_with_async_monitor() {
782782

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

0 commit comments

Comments
 (0)