From 72f914a2954a1e8f542429deecfe9f3a1cae7764 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 Oct 2023 09:29:52 +1030 Subject: [PATCH] lightningd: simplify funding_depth_cb now it only handles main funding tx. We make dualopend_tell_depth static, which means we move it higher in the file. Signed-off-by: Rusty Russell --- lightningd/dual_open_control.c | 84 +++++----- lightningd/dual_open_control.h | 4 - lightningd/peer_control.c | 163 +++----------------- lightningd/test/run-invoice-select-inchan.c | 9 -- wallet/test/run-wallet.c | 5 - 5 files changed, 66 insertions(+), 199 deletions(-) diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index ac582fef0e97..a4dd72b50522 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -953,6 +953,48 @@ openchannel2_signed_deserialize(struct openchannel2_psbt_payload *payload, return true; } +static void dualopend_tell_depth(struct channel *channel, + const struct bitcoin_txid *txid, + u32 depth) +{ + const u8 *msg; + u32 to_go; + + if (!channel->owner) { + log_debug(channel->log, + "Funding tx %s confirmed, but peer disconnected", + type_to_string(tmpctx, struct bitcoin_txid, txid)); + return; + } + + log_debug(channel->log, + "Funding tx %s confirmed, telling peer", + type_to_string(tmpctx, struct bitcoin_txid, txid)); + if (depth < channel->minimum_depth) { + to_go = channel->minimum_depth - depth; + } else + to_go = 0; + + /* Are we there yet? */ + if (to_go == 0) { + assert(channel->scid); + assert(bitcoin_txid_eq(&channel->funding.txid, txid)); + + channel_set_billboard(channel, false, + tal_fmt(tmpctx, "Funding depth reached" + " %d confirmations, alerting peer" + " we're locked-in.", + to_go)); + + msg = towire_dualopend_depth_reached(NULL, depth); + subd_send_msg(channel->owner, take(msg)); + } else + channel_set_billboard(channel, false, + tal_fmt(tmpctx, "Funding needs %d more" + " confirmations to be ready.", + to_go)); +} + static enum watch_result opening_depth_cb(struct lightningd *ld, const struct bitcoin_txid *txid, const struct bitcoin_tx *tx, @@ -1905,48 +1947,6 @@ static void handle_channel_locked(struct subd *dualopend, return; } -void dualopend_tell_depth(struct channel *channel, - const struct bitcoin_txid *txid, - u32 depth) -{ - const u8 *msg; - u32 to_go; - - if (!channel->owner) { - log_debug(channel->log, - "Funding tx %s confirmed, but peer disconnected", - type_to_string(tmpctx, struct bitcoin_txid, txid)); - return; - } - - log_debug(channel->log, - "Funding tx %s confirmed, telling peer", - type_to_string(tmpctx, struct bitcoin_txid, txid)); - if (depth < channel->minimum_depth) { - to_go = channel->minimum_depth - depth; - } else - to_go = 0; - - /* Are we there yet? */ - if (to_go == 0) { - assert(channel->scid); - assert(bitcoin_txid_eq(&channel->funding.txid, txid)); - - channel_set_billboard(channel, false, - tal_fmt(tmpctx, "Funding depth reached" - " %d confirmations, alerting peer" - " we're locked-in.", - to_go)); - - msg = towire_dualopend_depth_reached(NULL, depth); - subd_send_msg(channel->owner, take(msg)); - } else - channel_set_billboard(channel, false, - tal_fmt(tmpctx, "Funding needs %d more" - " confirmations to be ready.", - to_go)); -} - static void rbf_got_offer(struct subd *dualopend, const u8 *msg) { /* We expect the channel to still exist?! */ diff --git a/lightningd/dual_open_control.h b/lightningd/dual_open_control.h index 80a2d7ab1faa..e7b7989a0194 100644 --- a/lightningd/dual_open_control.h +++ b/lightningd/dual_open_control.h @@ -14,10 +14,6 @@ bool peer_restart_dualopend(struct peer *peer, struct channel *channel, bool from_abort); -void dualopend_tell_depth(struct channel *channel, - const struct bitcoin_txid *txid, - u32 depth); - void watch_opening_inflight(struct lightningd *ld, struct channel_inflight *inflight); diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index b931edd67e1b..c7417e449e14 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -1787,61 +1787,6 @@ void peer_disconnect_done(struct lightningd *ld, const u8 *msg) maybe_delete_peer(p); } -static bool check_funding_details(const struct bitcoin_tx *tx, - const u8 *wscript, - struct amount_sat funding, - u32 funding_outnum) -{ - struct amount_asset asset; - - if (funding_outnum >= tx->wtx->num_outputs) - return false; - - asset = bitcoin_tx_output_get_amount(tx, funding_outnum); - - if (!amount_asset_is_main(&asset)) - return false; - - if (!amount_sat_eq(amount_asset_to_sat(&asset), funding)) - return false; - - return scripteq(scriptpubkey_p2wsh(tmpctx, wscript), - bitcoin_tx_output_get_script(tmpctx, tx, - funding_outnum)); -} - - -/* FIXME: Unify our watch code so we get notified by txout, instead, like - * the wallet code does. */ -static bool check_funding_tx(const struct bitcoin_tx *tx, - const struct channel *channel) -{ - struct channel_inflight *inflight; - const u8 *wscript; - wscript = bitcoin_redeem_2of2(tmpctx, - &channel->local_funding_pubkey, - &channel->channel_info.remote_fundingkey); - - /* Since we've enabled "RBF" for funding transactions, - * it's possible that it's one of "inflights". - * Worth noting that this check was added to prevent - * a peer from sending us a 'bogus' transaction id (that didn't - * actually contain the funding output). As of v2 (where - * RBF is introduced), this isn't a problem so much as - * both sides have full access to the funding transaction */ - if (check_funding_details(tx, wscript, channel->funding_sats, - channel->funding.n)) - return true; - - list_for_each(&channel->inflights, inflight, list) { - if (check_funding_details(tx, wscript, - inflight->funding->total_funds, - inflight->funding->outpoint.n)) - return true; - } - return false; -} - void update_channel_from_inflight(struct lightningd *ld, struct channel *channel, const struct channel_inflight *inflight) @@ -1897,36 +1842,6 @@ void update_channel_from_inflight(struct lightningd *ld, wallet_channel_save(ld->wallet, channel); } -static void subd_tell_depth(struct channel *channel, - const struct bitcoin_txid *txid, - unsigned int depth) -{ - /* We always tell every owner who's interested about the depth */ - switch (channel->state) { - case AWAITING_UNILATERAL: - case CHANNELD_SHUTTING_DOWN: - case CLOSINGD_SIGEXCHANGE: - case CLOSINGD_COMPLETE: - case FUNDING_SPEND_SEEN: - case ONCHAIN: - case CLOSED: - case DUALOPEND_OPEN_INIT: - case DUALOPEND_OPEN_COMMITTED: - return; - - case CHANNELD_NORMAL: - case CHANNELD_AWAITING_LOCKIN: - case CHANNELD_AWAITING_SPLICE: - channeld_tell_depth(channel, txid, depth); - return; - - case DUALOPEND_AWAITING_LOCKIN: - dualopend_tell_depth(channel, txid, depth); - return; - } - abort(); -} - static enum watch_result funding_depth_cb(struct lightningd *ld, const struct bitcoin_txid *txid, const struct bitcoin_tx *tx, @@ -1937,15 +1852,8 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, if (is_stub_scid(channel->scid)) return DELETE_WATCH; - /* Sanity check */ - if (!check_funding_tx(tx, channel)) { - channel_internal_error(channel, "Bad tx %s: %s", - type_to_string(tmpctx, - struct bitcoin_txid, txid), - type_to_string(tmpctx, - struct bitcoin_tx, tx)); - return DELETE_WATCH; - } + /* We only use this to watch the current funding tx */ + assert(bitcoin_txid_eq(txid, &channel->funding.txid)); channel->depth = depth; @@ -1957,17 +1865,24 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, if (depth == 0) { /* That's not entirely unexpected in early states */ switch (channel->state) { - case CHANNELD_AWAITING_SPLICE: case DUALOPEND_AWAITING_LOCKIN: - case CHANNELD_AWAITING_LOCKIN: case DUALOPEND_OPEN_INIT: case DUALOPEND_OPEN_COMMITTED: + /* Shouldn't be here! */ + channel_internal_error(channel, + "Bad %s state: %s", + __func__, + channel_state_name(channel)); + return DELETE_WATCH; + case CHANNELD_AWAITING_LOCKIN: + /* That's not entirely unexpected in early states */ log_debug(channel->log, "Funding tx %s reorganized out!", type_to_string(tmpctx, struct bitcoin_txid, txid)); channel->scid = tal_free(channel->scid); return KEEP_WATCHING; /* But it's often Bad News in later states */ + case CHANNELD_AWAITING_SPLICE: case CHANNELD_NORMAL: /* If we opened, or it's zero-conf, we trust them anyway. */ if (channel->opener == LOCAL @@ -2004,14 +1919,13 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, if (!depthcb_update_scid(channel, txid, &channel->funding)) return DELETE_WATCH; - /* Always tell owner about depth change */ - subd_tell_depth(channel, txid, depth); - - /* Have we not reached minimum depth? */ - if (depth < channel->minimum_depth) - return KEEP_WATCHING; - switch (channel->state) { + /* We should not be in the callback! */ + case DUALOPEND_AWAITING_LOCKIN: + case DUALOPEND_OPEN_INIT: + case DUALOPEND_OPEN_COMMITTED: + abort(); + case AWAITING_UNILATERAL: case CHANNELD_SHUTTING_DOWN: case CLOSINGD_SIGEXCHANGE: @@ -2027,48 +1941,19 @@ static enum watch_result funding_depth_cb(struct lightningd *ld, return DELETE_WATCH; case CHANNELD_AWAITING_LOCKIN: - if (channel->remote_channel_ready) + if (depth >= channel->minimum_depth + && channel->remote_channel_ready) { lockin_complete(channel, CHANNELD_AWAITING_LOCKIN); - return KEEP_WATCHING; - + } + /* Fall thru */ case CHANNELD_NORMAL: - if (depth < ANNOUNCE_MIN_DEPTH) + case CHANNELD_AWAITING_SPLICE: + channeld_tell_depth(channel, txid, depth); + if (depth < ANNOUNCE_MIN_DEPTH || depth < channel->minimum_depth) return KEEP_WATCHING; /* Normal state and past announce depth? Stop bothering us! */ return DELETE_WATCH; - - case DUALOPEND_OPEN_INIT: - case DUALOPEND_OPEN_COMMITTED: - /* You cannot be watching yet */ - abort(); - - case DUALOPEND_AWAITING_LOCKIN: - /* Update the channel's info to the correct tx, if needed to - * It's possible an 'inflight' has reached depth */ - if (!list_empty(&channel->inflights)) { - struct channel_inflight *inf; - - inf = channel_inflight_find(channel, txid); - if (!inf) { - log_debug(channel->log, - "Ignoring event for txid %s for channel" - " not found in inflights.", - type_to_string(tmpctx, - struct bitcoin_txid, - txid)); - return DELETE_WATCH; - } - update_channel_from_inflight(ld, channel, inf); - } - return KEEP_WATCHING; - - case CHANNELD_AWAITING_SPLICE: - /* Once we're waiting for splice, don't watch original any more */ - if (bitcoin_txid_eq(txid, &channel->funding.txid)) - return true; - return KEEP_WATCHING; } - abort(); } diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index 418762514d52..bd6080970094 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -89,10 +89,6 @@ struct htlc_in *channel_has_htlc_in(struct channel *channel UNNEEDED) /* Generated stub for channel_has_htlc_out */ struct htlc_out *channel_has_htlc_out(struct channel *channel UNNEEDED) { fprintf(stderr, "channel_has_htlc_out called!\n"); abort(); } -/* Generated stub for channel_inflight_find */ -struct channel_inflight *channel_inflight_find(struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED) -{ fprintf(stderr, "channel_inflight_find called!\n"); abort(); } /* Generated stub for channel_internal_error */ void channel_internal_error(struct channel *channel UNNEEDED, const char *fmt UNNEEDED, ...) { fprintf(stderr, "channel_internal_error called!\n"); abort(); } @@ -206,11 +202,6 @@ bool depthcb_update_scid(struct channel *channel UNNEEDED, /* Generated stub for dev_disconnect_permanent */ bool dev_disconnect_permanent(struct lightningd *ld UNNEEDED) { fprintf(stderr, "dev_disconnect_permanent called!\n"); abort(); } -/* Generated stub for dualopend_tell_depth */ -void dualopend_tell_depth(struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED, - u32 depth UNNEEDED) -{ fprintf(stderr, "dualopend_tell_depth called!\n"); abort(); } /* Generated stub for encode_scriptpubkey_to_addr */ char *encode_scriptpubkey_to_addr(const tal_t *ctx UNNEEDED, const struct chainparams *chainparams UNNEEDED, diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index 813869a78299..c76624d8b90c 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -151,11 +151,6 @@ void derive_channel_id(struct channel_id *channel_id UNNEEDED, /* Generated stub for dev_disconnect_permanent */ bool dev_disconnect_permanent(struct lightningd *ld UNNEEDED) { fprintf(stderr, "dev_disconnect_permanent called!\n"); abort(); } -/* Generated stub for dualopend_tell_depth */ -void dualopend_tell_depth(struct channel *channel UNNEEDED, - const struct bitcoin_txid *txid UNNEEDED, - u32 depth UNNEEDED) -{ fprintf(stderr, "dualopend_tell_depth called!\n"); abort(); } /* Generated stub for ecdh */ void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED) { fprintf(stderr, "ecdh called!\n"); abort(); }