X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Fshutdown_tests.rs;h=28831e5b23eea0a6fa5a8b2f092a017cac120dab;hb=ca1d5693566b8a44cdf4739bb61f0b102436e172;hp=0fcf4175280f5dcd0ab778e0a1526a7bbe299da8;hpb=101c09f9bf04783b5d1f5b77bc50ed6735800828;p=rust-lightning diff --git a/lightning/src/ln/shutdown_tests.rs b/lightning/src/ln/shutdown_tests.rs index 0fcf4175..28831e5b 100644 --- a/lightning/src/ln/shutdown_tests.rs +++ b/lightning/src/ln/shutdown_tests.rs @@ -31,9 +31,9 @@ use bitcoin::util::address::WitnessVersion; use regex; use core::default::Default; +use std::convert::TryFrom; use crate::ln::functional_test_utils::*; -use crate::ln::msgs::OptionalField::Present; #[test] fn pre_funding_lock_shutdown_test() { @@ -517,7 +517,7 @@ fn test_unsupported_anysegwit_upfront_shutdown_script() { // Check script when handling an open_channel message nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100000, 10001, 42, None).unwrap(); let mut open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id()); - open_channel.shutdown_scriptpubkey = Present(anysegwit_shutdown_script.clone()); + open_channel.shutdown_scriptpubkey = Some(anysegwit_shutdown_script.clone()); nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), &open_channel); let events = nodes[1].node.get_and_clear_pending_msg_events(); @@ -542,7 +542,7 @@ fn test_unsupported_anysegwit_upfront_shutdown_script() { let open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id()); nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), &open_channel); let mut accept_channel = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id()); - accept_channel.shutdown_scriptpubkey = Present(anysegwit_shutdown_script.clone()); + accept_channel.shutdown_scriptpubkey = Some(anysegwit_shutdown_script.clone()); nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), &accept_channel); let events = nodes[0].node.get_and_clear_pending_msg_events(); @@ -568,7 +568,7 @@ fn test_invalid_upfront_shutdown_script() { // Use a segwit v0 script with an unsupported witness program let mut open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id()); - open_channel.shutdown_scriptpubkey = Present(Builder::new().push_int(0) + open_channel.shutdown_scriptpubkey = Some(Builder::new().push_int(0) .push_slice(&[0, 0]) .into_script()); nodes[0].node.handle_open_channel(&nodes[1].node.get_our_node_id(), &open_channel); @@ -723,6 +723,58 @@ fn test_invalid_shutdown_script() { "Got a nonstandard scriptpubkey (00020000) from remote peer"); } +#[test] +fn test_user_shutdown_script() { + let mut config = test_default_channel_config(); + config.channel_handshake_config.announced_channel = true; + config.channel_handshake_limits.force_announced_channel_preference = false; + config.channel_handshake_config.commit_upfront_shutdown_pubkey = false; + let user_cfgs = [None, Some(config), None]; + let chanmon_cfgs = create_chanmon_cfgs(3); + let node_cfgs = create_node_cfgs(3, &chanmon_cfgs); + let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &user_cfgs); + let nodes = create_network(3, &node_cfgs, &node_chanmgrs); + + // Segwit v0 script of the form OP_0 <20-byte hash> + let script = Builder::new().push_int(0) + .push_slice(&[0; 20]) + .into_script(); + + let shutdown_script = ShutdownScript::try_from(script.clone()).unwrap(); + + let chan = create_announced_chan_between_nodes(&nodes, 0, 1); + nodes[1].node.close_channel_with_feerate_and_script(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(), &nodes[0].node.get_our_node_id(), None, Some(shutdown_script)).unwrap(); + check_added_monitors!(nodes[1], 1); + + let mut node_0_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id()); + + assert_eq!(node_0_shutdown.scriptpubkey, script); +} + +#[test] +fn test_already_set_user_shutdown_script() { + let mut config = test_default_channel_config(); + config.channel_handshake_config.announced_channel = true; + config.channel_handshake_limits.force_announced_channel_preference = false; + let user_cfgs = [None, Some(config), None]; + let chanmon_cfgs = create_chanmon_cfgs(3); + let node_cfgs = create_node_cfgs(3, &chanmon_cfgs); + let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &user_cfgs); + let nodes = create_network(3, &node_cfgs, &node_chanmgrs); + + // Segwit v0 script of the form OP_0 <20-byte hash> + let script = Builder::new().push_int(0) + .push_slice(&[0; 20]) + .into_script(); + + let shutdown_script = ShutdownScript::try_from(script).unwrap(); + + let chan = create_announced_chan_between_nodes(&nodes, 0, 1); + let result = nodes[1].node.close_channel_with_feerate_and_script(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(), &nodes[0].node.get_our_node_id(), None, Some(shutdown_script)); + + assert_eq!(result, Err(APIError::APIMisuseError { err: "Cannot override shutdown script for a channel with one already set".to_string() })); +} + #[derive(PartialEq)] enum TimeoutStep { AfterShutdown, @@ -891,9 +943,9 @@ fn simple_target_feerate_shutdown() { let chan = create_announced_chan_between_nodes(&nodes, 0, 1); let chan_id = OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(); - nodes[0].node.close_channel_with_target_feerate(&chan_id, &nodes[1].node.get_our_node_id(), 253 * 10).unwrap(); + nodes[0].node.close_channel_with_feerate_and_script(&chan_id, &nodes[1].node.get_our_node_id(), Some(253 * 10), None).unwrap(); let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id()); - nodes[1].node.close_channel_with_target_feerate(&chan_id, &nodes[0].node.get_our_node_id(), 253 * 5).unwrap(); + nodes[1].node.close_channel_with_feerate_and_script(&chan_id, &nodes[0].node.get_our_node_id(), Some(253 * 5), None).unwrap(); let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id()); nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &node_0_shutdown);