mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-22 00:24:19 +01:00
close: param to force-close a leased channel
By default, we won't close a channel that we leased to a peer. You can override this with the `force_lease_closed` flag. Changelog-Added: JSON-RPC: close now has parameter to force close a leased channel (option_will_fund)
This commit is contained in:
@@ -1997,6 +1997,9 @@ static void handle_peer_shutdown(struct peer *peer, const u8 *shutdown)
|
|||||||
peer_failed_warn(peer->pps, &peer->channel_id,
|
peer_failed_warn(peer->pps, &peer->channel_id,
|
||||||
"Bad shutdown %s", tal_hex(peer, shutdown));
|
"Bad shutdown %s", tal_hex(peer, shutdown));
|
||||||
|
|
||||||
|
/* FIXME: We shouldn't let them initiate a shutdown while the
|
||||||
|
* channel is active (if we leased funds) */
|
||||||
|
|
||||||
/* BOLT #2:
|
/* BOLT #2:
|
||||||
*
|
*
|
||||||
* - if both nodes advertised the `option_upfront_shutdown_script`
|
* - if both nodes advertised the `option_upfront_shutdown_script`
|
||||||
|
|||||||
@@ -515,17 +515,23 @@ class LightningRpc(UnixDomainSocketRpc):
|
|||||||
payload.update({k: v for k, v in kwargs.items()})
|
payload.update({k: v for k, v in kwargs.items()})
|
||||||
return self.call("check", payload)
|
return self.call("check", payload)
|
||||||
|
|
||||||
def close(self, peer_id, unilateraltimeout=None, destination=None, fee_negotiation_step=None):
|
def close(self, peer_id, unilateraltimeout=None, destination=None, fee_negotiation_step=None, force_lease_closed=False):
|
||||||
"""
|
"""
|
||||||
Close the channel with peer {id}, forcing a unilateral
|
Close the channel with peer {id}, forcing a unilateral
|
||||||
close after {unilateraltimeout} seconds if non-zero, and
|
close after {unilateraltimeout} seconds if non-zero, and
|
||||||
the to-local output will be sent to {destination}.
|
the to-local output will be sent to {destination}.
|
||||||
|
|
||||||
|
If channel funds have been leased to the peer and the
|
||||||
|
lease has not yet expired, you can force a close with
|
||||||
|
{force_lease_closed}. Note that your funds will still be
|
||||||
|
locked until the lease expires.
|
||||||
"""
|
"""
|
||||||
payload = {
|
payload = {
|
||||||
"id": peer_id,
|
"id": peer_id,
|
||||||
"unilateraltimeout": unilateraltimeout,
|
"unilateraltimeout": unilateraltimeout,
|
||||||
"destination": destination,
|
"destination": destination,
|
||||||
"fee_negotiation_step": fee_negotiation_step
|
"fee_negotiation_step": fee_negotiation_step,
|
||||||
|
"force_lease_closed": force_lease_closed,
|
||||||
}
|
}
|
||||||
return self.call("close", payload)
|
return self.call("close", payload)
|
||||||
|
|
||||||
|
|||||||
9
doc/lightning-close.7
generated
9
doc/lightning-close.7
generated
@@ -3,7 +3,7 @@
|
|||||||
lightning-close - Command for closing channels with direct peers
|
lightning-close - Command for closing channels with direct peers
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
|
||||||
\fBclose\fR \fIid\fR [\fIunilateraltimeout\fR] [\fIdestination\fR] [\fIfee_negotiation_step\fR] [\fIwrong_funding\\\fR]
|
\fBclose\fR \fIid\fR [\fIunilateraltimeout\fR] [\fIdestination\fR] [\fIfee_negotiation_step\fR] [\fIwrong_funding\fR] [\fIforce_lease_closed\fR]
|
||||||
|
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
|
|
||||||
@@ -67,6 +67,11 @@ allowed if this peer opened the channel and the channel is unused: it
|
|||||||
can rescue openings which have been manually miscreated\.
|
can rescue openings which have been manually miscreated\.
|
||||||
|
|
||||||
|
|
||||||
|
\fIforce_lease_closed\fR if the channel has funds leased to the peer
|
||||||
|
(option_will_fund), we prevent initiation of a mutual close
|
||||||
|
unless this flag is passed in\. Defaults to false\.
|
||||||
|
|
||||||
|
|
||||||
The peer needs to be live and connected in order to negotiate a mutual
|
The peer needs to be live and connected in order to negotiate a mutual
|
||||||
close\. The default of unilaterally closing after 48 hours is usually a
|
close\. The default of unilaterally closing after 48 hours is usually a
|
||||||
reasonable indication that you can no longer contact the peer\.
|
reasonable indication that you can no longer contact the peer\.
|
||||||
@@ -123,4 +128,4 @@ ZmnSCPxj \fI<ZmnSCPxj@protonmail.com\fR> is mainly responsible\.
|
|||||||
|
|
||||||
Main web site: \fIhttps://github.com/ElementsProject/lightning\fR
|
Main web site: \fIhttps://github.com/ElementsProject/lightning\fR
|
||||||
|
|
||||||
\" SHA256STAMP:03f1e6937a88aad4bdcd29d010da9ced148e3498ea19b388e8cbfde25276482d
|
\" SHA256STAMP:c36a8ba48c3d2826344e23f880c21e0183942df8523da94394e5786dec874083
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ lightning-close -- Command for closing channels with direct peers
|
|||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
|
|
||||||
**close** *id* \[*unilateraltimeout*\] \[*destination*\] \[*fee_negotiation_step*\] \[*wrong_funding\*]
|
**close** *id* \[*unilateraltimeout*\] \[*destination*\] \[*fee_negotiation_step*\] \[*wrong_funding*\] \[*force_lease_closed*\]
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
@@ -56,6 +56,11 @@ shutdown transaction will spend this output instead. This is only
|
|||||||
allowed if this peer opened the channel and the channel is unused: it
|
allowed if this peer opened the channel and the channel is unused: it
|
||||||
can rescue openings which have been manually miscreated.
|
can rescue openings which have been manually miscreated.
|
||||||
|
|
||||||
|
*force_lease_closed* if the channel has funds leased to the peer
|
||||||
|
(option_will_fund), we prevent initiation of a mutual close
|
||||||
|
unless this flag is passed in. Defaults to false.
|
||||||
|
|
||||||
|
|
||||||
The peer needs to be live and connected in order to negotiate a mutual
|
The peer needs to be live and connected in order to negotiate a mutual
|
||||||
close. The default of unilaterally closing after 48 hours is usually a
|
close. The default of unilaterally closing after 48 hours is usually a
|
||||||
reasonable indication that you can no longer contact the peer.
|
reasonable indication that you can no longer contact the peer.
|
||||||
|
|||||||
@@ -1671,7 +1671,7 @@ static struct command_result *json_close(struct command *cmd,
|
|||||||
struct channel *channel COMPILER_WANTS_INIT("gcc 7.3.0 fails, 8.3 OK");
|
struct channel *channel COMPILER_WANTS_INIT("gcc 7.3.0 fails, 8.3 OK");
|
||||||
unsigned int *timeout;
|
unsigned int *timeout;
|
||||||
const u8 *close_to_script = NULL;
|
const u8 *close_to_script = NULL;
|
||||||
bool close_script_set, wrong_funding_changed;
|
bool close_script_set, wrong_funding_changed, *force_lease_close;
|
||||||
const char *fee_negotiation_step_str;
|
const char *fee_negotiation_step_str;
|
||||||
struct bitcoin_outpoint *wrong_funding;
|
struct bitcoin_outpoint *wrong_funding;
|
||||||
char* end;
|
char* end;
|
||||||
@@ -1685,6 +1685,8 @@ static struct command_result *json_close(struct command *cmd,
|
|||||||
p_opt("fee_negotiation_step", param_string,
|
p_opt("fee_negotiation_step", param_string,
|
||||||
&fee_negotiation_step_str),
|
&fee_negotiation_step_str),
|
||||||
p_opt("wrong_funding", param_outpoint, &wrong_funding),
|
p_opt("wrong_funding", param_outpoint, &wrong_funding),
|
||||||
|
p_opt_def("force_lease_closed", param_bool,
|
||||||
|
&force_lease_close, false),
|
||||||
NULL))
|
NULL))
|
||||||
return command_param_failed();
|
return command_param_failed();
|
||||||
|
|
||||||
@@ -1714,6 +1716,15 @@ static struct command_result *json_close(struct command *cmd,
|
|||||||
"Peer has no active channel");
|
"Peer has no active channel");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!*force_lease_close && channel->opener != LOCAL
|
||||||
|
&& get_block_height(cmd->ld->topology) < channel->lease_expiry)
|
||||||
|
return command_fail(cmd, LIGHTNINGD,
|
||||||
|
"Peer leased this channel from us, we"
|
||||||
|
" shouldn't close until lease has expired"
|
||||||
|
" (lease expires block %u,"
|
||||||
|
" current block %u)",
|
||||||
|
channel->lease_expiry,
|
||||||
|
get_block_height(cmd->ld->topology));
|
||||||
|
|
||||||
/* If we've set a local shutdown script for this peer, and it's not the
|
/* If we've set a local shutdown script for this peer, and it's not the
|
||||||
* default upfront script, try to close to a different channel.
|
* default upfront script, try to close to a different channel.
|
||||||
|
|||||||
Reference in New Issue
Block a user