Skip to content

Commit 2833786

Browse files
committed
Clean up and add shutdown script functional tests
1 parent 69ee486 commit 2833786

File tree

1 file changed

+106
-23
lines changed

1 file changed

+106
-23
lines changed

lightning/src/ln/functional_tests.rs

Lines changed: 106 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7521,24 +7521,69 @@ fn test_upfront_shutdown_script() {
75217521
}
75227522

75237523
#[test]
7524-
fn test_upfront_shutdown_script_unsupport_segwit() {
7525-
// We test that channel is closed early
7526-
// if a segwit program is passed as upfront shutdown script,
7527-
// but the peer does not support segwit.
7524+
fn test_unsupported_anysegwit_upfront_shutdown_script() {
75287525
let chanmon_cfgs = create_chanmon_cfgs(2);
75297526
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
75307527
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
75317528
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
75327529

7530+
// Use a non-v0 segwit script supported by option_shutdown_anysegwit
7531+
let node_features = InitFeatures::known().clear_shutdown_anysegwit();
7532+
let anysegwit_shutdown_script = Builder::new()
7533+
.push_int(16)
7534+
.push_slice(&[0, 40])
7535+
.into_script();
7536+
7537+
// Check script when handling an open_channel message
75337538
nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100000, 10001, 42, None).unwrap();
7539+
let mut open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
7540+
open_channel.shutdown_scriptpubkey = Present(anysegwit_shutdown_script.clone());
7541+
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), node_features.clone(), &open_channel);
75347542

7543+
let events = nodes[1].node.get_and_clear_pending_msg_events();
7544+
assert_eq!(events.len(), 1);
7545+
match events[0] {
7546+
MessageSendEvent::HandleError { action: ErrorAction::SendErrorMessage { ref msg }, node_id } => {
7547+
assert_eq!(node_id, nodes[0].node.get_our_node_id());
7548+
assert!(regex::Regex::new(r"Peer is signaling upfront_shutdown but has provided a non-accepted scriptpubkey format. script: (\([A-Fa-f0-9]+\))").unwrap().is_match(&*msg.data));
7549+
},
7550+
_ => panic!("Unexpected event"),
7551+
}
7552+
7553+
// Check script when handling an accept_channel message
7554+
nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100000, 10001, 42, None).unwrap();
7555+
let open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
7556+
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel);
7557+
let mut accept_channel = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
7558+
accept_channel.shutdown_scriptpubkey = Present(anysegwit_shutdown_script.clone());
7559+
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), node_features, &accept_channel);
7560+
7561+
let events = nodes[0].node.get_and_clear_pending_msg_events();
7562+
assert_eq!(events.len(), 1);
7563+
match events[0] {
7564+
MessageSendEvent::HandleError { action: ErrorAction::SendErrorMessage { ref msg }, node_id } => {
7565+
assert_eq!(node_id, nodes[1].node.get_our_node_id());
7566+
assert!(regex::Regex::new(r"Peer is signaling upfront_shutdown but has provided a non-accepted scriptpubkey format. script: (\([A-Fa-f0-9]+\))").unwrap().is_match(&*msg.data));
7567+
},
7568+
_ => panic!("Unexpected event"),
7569+
}
7570+
}
7571+
7572+
#[test]
7573+
fn test_invalid_upfront_shutdown_script() {
7574+
let chanmon_cfgs = create_chanmon_cfgs(2);
7575+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
7576+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
7577+
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
7578+
7579+
nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100000, 10001, 42, None).unwrap();
7580+
7581+
// Use a segwit v0 script with an unsupported witness program
75357582
let mut open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
7536-
open_channel.shutdown_scriptpubkey = Present(Builder::new().push_int(16)
7583+
open_channel.shutdown_scriptpubkey = Present(Builder::new().push_int(0)
75377584
.push_slice(&[0, 0])
75387585
.into_script());
7539-
7540-
let features = InitFeatures::known().clear_shutdown_anysegwit();
7541-
nodes[0].node.handle_open_channel(&nodes[0].node.get_our_node_id(), features, &open_channel);
7586+
nodes[0].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel);
75427587

75437588
let events = nodes[0].node.get_and_clear_pending_msg_events();
75447589
assert_eq!(events.len(), 1);
@@ -7552,7 +7597,7 @@ fn test_upfront_shutdown_script_unsupport_segwit() {
75527597
}
75537598

75547599
#[test]
7555-
fn test_shutdown_script_any_segwit_allowed() {
7600+
fn test_segwit_v0_shutdown_script() {
75567601
let mut config = UserConfig::default();
75577602
config.channel_options.announced_channel = true;
75587603
config.peer_channel_config_limits.force_announced_channel_preference = false;
@@ -7563,14 +7608,50 @@ fn test_shutdown_script_any_segwit_allowed() {
75637608
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &user_cfgs);
75647609
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
75657610

7566-
//// We test if the remote peer accepts opt_shutdown_anysegwit, a witness program can be used on shutdown
7567-
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 1000000, InitFeatures::known(), InitFeatures::known());
7611+
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
75687612
nodes[1].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id()).unwrap();
7613+
7614+
// Use a segwit v0 script supported even without option_shutdown_anysegwit
7615+
let mut node_0_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
7616+
node_0_shutdown.scriptpubkey = Builder::new().push_int(0)
7617+
.push_slice(&[0; 20])
7618+
.into_script();
7619+
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
7620+
7621+
let events = nodes[0].node.get_and_clear_pending_msg_events();
7622+
assert_eq!(events.len(), 2);
7623+
match events[0] {
7624+
MessageSendEvent::SendShutdown { node_id, .. } => { assert_eq!(node_id, nodes[1].node.get_our_node_id()) }
7625+
_ => panic!("Unexpected event"),
7626+
}
7627+
match events[1] {
7628+
MessageSendEvent::SendClosingSigned { node_id, .. } => { assert_eq!(node_id, nodes[1].node.get_our_node_id()) }
7629+
_ => panic!("Unexpected event"),
7630+
}
7631+
}
7632+
7633+
#[test]
7634+
fn test_anysegwit_shutdown_script() {
7635+
let mut config = UserConfig::default();
7636+
config.channel_options.announced_channel = true;
7637+
config.peer_channel_config_limits.force_announced_channel_preference = false;
7638+
config.channel_options.commit_upfront_shutdown_pubkey = false;
7639+
let user_cfgs = [None, Some(config), None];
7640+
let chanmon_cfgs = create_chanmon_cfgs(3);
7641+
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
7642+
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &user_cfgs);
7643+
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
7644+
7645+
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
7646+
nodes[1].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id()).unwrap();
7647+
7648+
// Use a non-v0 segwit script supported by option_shutdown_anysegwit
75697649
let mut node_0_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
75707650
node_0_shutdown.scriptpubkey = Builder::new().push_int(16)
75717651
.push_slice(&[0, 0])
75727652
.into_script();
75737653
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
7654+
75747655
let events = nodes[0].node.get_and_clear_pending_msg_events();
75757656
assert_eq!(events.len(), 2);
75767657
match events[0] {
@@ -7584,7 +7665,7 @@ fn test_shutdown_script_any_segwit_allowed() {
75847665
}
75857666

75867667
#[test]
7587-
fn test_shutdown_script_any_segwit_not_allowed() {
7668+
fn test_unsupported_anysegwit_shutdown_script() {
75887669
let mut config = UserConfig::default();
75897670
config.channel_options.announced_channel = true;
75907671
config.peer_channel_config_limits.force_announced_channel_preference = false;
@@ -7595,30 +7676,31 @@ fn test_shutdown_script_any_segwit_not_allowed() {
75957676
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &user_cfgs);
75967677
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
75977678

7598-
//// We test that if the remote peer does not accept opt_shutdown_anysegwit, the witness program cannot be used on shutdown
7599-
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 1000000, InitFeatures::known(), InitFeatures::known());
7679+
let node_features = InitFeatures::known().clear_shutdown_anysegwit();
7680+
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), node_features.clone());
76007681
nodes[1].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id()).unwrap();
7682+
7683+
// Use a non-v0 segwit script supported by option_shutdown_anysegwit
76017684
let mut node_0_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
7602-
// Make an any segwit version script
76037685
node_0_shutdown.scriptpubkey = Builder::new().push_int(16)
7604-
.push_slice(&[0, 0])
7686+
.push_slice(&[0, 40])
76057687
.into_script();
7606-
let flags_no = InitFeatures::known().clear_shutdown_anysegwit();
7607-
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &flags_no, &node_0_shutdown);
7688+
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &node_features, &node_0_shutdown);
7689+
76087690
let events = nodes[0].node.get_and_clear_pending_msg_events();
76097691
assert_eq!(events.len(), 2);
76107692
match events[1] {
76117693
MessageSendEvent::HandleError { action: ErrorAction::SendErrorMessage { ref msg }, node_id } => {
76127694
assert_eq!(node_id, nodes[1].node.get_our_node_id());
7613-
assert_eq!(msg.data, "Got a nonstandard scriptpubkey (60020000) from remote peer".to_owned())
7695+
assert_eq!(msg.data, "Got a nonstandard scriptpubkey (60020028) from remote peer".to_owned());
76147696
},
76157697
_ => panic!("Unexpected event"),
76167698
}
76177699
check_added_monitors!(nodes[0], 1);
76187700
}
76197701

76207702
#[test]
7621-
fn test_shutdown_script_segwit_but_not_anysegwit() {
7703+
fn test_invalid_shutdown_script() {
76227704
let mut config = UserConfig::default();
76237705
config.channel_options.announced_channel = true;
76247706
config.peer_channel_config_limits.force_announced_channel_preference = false;
@@ -7629,15 +7711,16 @@ fn test_shutdown_script_segwit_but_not_anysegwit() {
76297711
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &user_cfgs);
76307712
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
76317713

7632-
//// We test that if shutdown any segwit is supported and we send a witness script with 0 version, this is not accepted
7633-
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 1000000, InitFeatures::known(), InitFeatures::known());
7714+
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
76347715
nodes[1].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id()).unwrap();
7716+
7717+
// Use a segwit v0 script with an unsupported witness program
76357718
let mut node_0_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
7636-
// Make a segwit script that is not a valid as any segwit
76377719
node_0_shutdown.scriptpubkey = Builder::new().push_int(0)
76387720
.push_slice(&[0, 0])
76397721
.into_script();
76407722
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
7723+
76417724
let events = nodes[0].node.get_and_clear_pending_msg_events();
76427725
assert_eq!(events.len(), 2);
76437726
match events[1] {

0 commit comments

Comments
 (0)