channeld: enforce option_upfront_shutdown_script.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2019-05-01 10:17:11 +09:30
parent cfebe66762
commit 99a0345ca8
3 changed files with 28 additions and 2 deletions

View File

@ -62,6 +62,8 @@ channel_init,,reached_announce_depth,bool
channel_init,,last_remote_secret,struct secret
channel_init,,lflen,u16
channel_init,,localfeatures,lflen*u8
channel_init,,upfront_shutdown_script_len,u16
channel_init,,upfront_shutdown_script,upfront_shutdown_script_len*u8
# master->channeld funding hit new depth(funding locked if >= lock depth)
channel_funding_depth,1002

1 #include <common/cryptomsg.h>
62 channel_init,,lflen,u16
63 channel_init,,localfeatures,lflen*u8
64 # master->channeld funding hit new depth(funding locked if >= lock depth) channel_init,,upfront_shutdown_script_len,u16
65 channel_init,,upfront_shutdown_script,upfront_shutdown_script_len*u8
66 # master->channeld funding hit new depth(funding locked if >= lock depth)
67 channel_funding_depth,1002
68 channel_funding_depth,,short_channel_id,?struct short_channel_id
69 channel_funding_depth,,depth,u32

View File

@ -158,6 +158,9 @@ struct peer {
/* Additional confirmations need for local lockin. */
u32 depth_togo;
/* Non-empty if they specified a fixed shutdown script */
u8 *remote_upfront_shutdown_script;
/* Empty commitments. Spec violation, but a minor one. */
u64 last_empty_commitment;
};
@ -1716,6 +1719,25 @@ static void handle_peer_shutdown(struct peer *peer, const u8 *shutdown)
&peer->channel_id,
"Bad shutdown %s", tal_hex(peer, shutdown));
/* BOLT #2:
*
* - if both nodes advertised the `option_upfront_shutdown_script`
* feature, and the receiving node received a non-zero-length
* `shutdown_scriptpubkey` in `open_channel` or `accept_channel`, and
* that `shutdown_scriptpubkey` is not equal to `scriptpubkey`:
* - MUST fail the connection.
*/
/* openingd only sets this if feature was negotiated at opening. */
if (tal_count(peer->remote_upfront_shutdown_script)
&& !memeq(scriptpubkey, tal_count(scriptpubkey),
peer->remote_upfront_shutdown_script,
tal_count(peer->remote_upfront_shutdown_script)))
peer_failed(&peer->cs,
&peer->channel_id,
"scriptpubkey %s is not as agreed upfront (%s)",
tal_hex(peer, scriptpubkey),
tal_hex(peer, peer->remote_upfront_shutdown_script));
/* Tell master: we don't have to wait because on reconnect other end
* will re-send anyway. */
wire_sync_write(MASTER_FD,
@ -2853,7 +2875,8 @@ static void init_channel(struct peer *peer)
&funding_signed,
&peer->announce_depth_reached,
&last_remote_per_commit_secret,
&peer->localfeatures)) {
&peer->localfeatures,
&peer->remote_upfront_shutdown_script)) {
master_badmsg(WIRE_CHANNEL_INIT, msg);
}

View File

@ -392,7 +392,8 @@ void peer_start_channeld(struct channel *channel,
funding_signed,
reached_announce_depth,
&last_remote_per_commit_secret,
channel->peer->localfeatures);
channel->peer->localfeatures,
channel->remote_upfront_shutdown_script);
/* We don't expect a response: we are triggered by funding_depth_cb. */
subd_send_msg(channel->owner, take(initmsg));