Skip to content

Commit 6e30722

Browse files
committed
Correctly handle sending announcement sigs on public 0conf channels
1 parent fcb2aa4 commit 6e30722

File tree

3 files changed

+111
-4
lines changed

3 files changed

+111
-4
lines changed

lightning/src/ln/channel.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -4576,12 +4576,11 @@ impl<Signer: Sign> Channel<Signer> {
45764576
pub fn transactions_confirmed<L: Deref>(&mut self, block_hash: &BlockHash, height: u32,
45774577
txdata: &TransactionData, genesis_block_hash: BlockHash, node_pk: PublicKey, logger: &L)
45784578
-> Result<(Option<msgs::FundingLocked>, Option<msgs::AnnouncementSignatures>), ClosureReason> where L::Target: Logger {
4579-
let non_shutdown_state = self.channel_state & (!MULTI_STATE_FLAGS);
45804579
if let Some(funding_txo) = self.get_funding_txo() {
45814580
for &(index_in_block, tx) in txdata.iter() {
45824581
// If we haven't yet sent a funding_locked, but are in FundingSent (ignoring
45834582
// whether they've sent a funding_locked or not), check if we should send one.
4584-
if non_shutdown_state & !(ChannelState::TheirFundingLocked as u32) == ChannelState::FundingSent as u32 {
4583+
if self.funding_tx_confirmation_height == 0 {
45854584
if tx.txid() == funding_txo.txid {
45864585
let txo_idx = funding_txo.index as usize;
45874586
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

+4-2
Original file line numberDiff line numberDiff line change
@@ -9052,7 +9052,9 @@ fn test_duplicate_chan_id() {
90529052

90539053
let funding_created = {
90549054
let mut a_channel_lock = nodes[0].node.channel_state.lock().unwrap();
9055-
let mut as_chan = a_channel_lock.by_id.get_mut(&open_chan_2_msg.temporary_channel_id).unwrap();
9055+
// Note that we drop the channel entirely here as its in a somewhat nonsense state (leaving
9056+
// the channelmanager in a possibly nonsense state instead).
9057+
let mut as_chan = a_channel_lock.by_id.remove(&open_chan_2_msg.temporary_channel_id).unwrap();
90569058
let logger = test_utils::TestLogger::new();
90579059
as_chan.get_outbound_funding_created(tx.clone(), funding_outpoint, &&logger).unwrap()
90589060
};
@@ -9090,7 +9092,7 @@ fn test_duplicate_chan_id() {
90909092
let events_4 = nodes[0].node.get_and_clear_pending_events();
90919093
assert_eq!(events_4.len(), 0);
90929094
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().len(), 1);
9093-
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap()[0].txid(), funding_output.txid);
9095+
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap()[0], tx);
90949096

90959097
let (funding_locked, _) = create_chan_between_nodes_with_value_confirm(&nodes[0], &nodes[1], &tx);
90969098
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

+106
Original file line numberDiff line numberDiff line change
@@ -767,3 +767,109 @@ fn test_0_conf_channel_with_async_monitor() {
767767

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

0 commit comments

Comments
 (0)