mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 05:12:45 +01:00
df: move to inflights for sigs/openchannel_signed parts of flow
We create an inflight once we get the commitment tx for a channel instead of once we get the funding transaction signatures
This commit is contained in:
parent
8b0e88dfb3
commit
3da2ae4d30
@ -1243,9 +1243,8 @@ static void handle_peer_tx_sigs_sent(struct subd *dualopend,
|
|||||||
const u8 *msg)
|
const u8 *msg)
|
||||||
{
|
{
|
||||||
struct channel *channel = dualopend->channel;
|
struct channel *channel = dualopend->channel;
|
||||||
|
struct channel_inflight *inflight;
|
||||||
const struct wally_tx *wtx;
|
const struct wally_tx *wtx;
|
||||||
/* FIXME: psbt? */
|
|
||||||
struct wally_psbt *psbt = NULL;
|
|
||||||
|
|
||||||
if (!fromwire_dualopend_tx_sigs_sent(msg)) {
|
if (!fromwire_dualopend_tx_sigs_sent(msg)) {
|
||||||
channel_internal_error(channel,
|
channel_internal_error(channel,
|
||||||
@ -1254,21 +1253,28 @@ static void handle_peer_tx_sigs_sent(struct subd *dualopend,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (psbt_finalize(cast_const(struct wally_psbt *, psbt))) {
|
inflight = channel_current_inflight(channel);
|
||||||
wtx = psbt_final_tx(NULL, psbt);
|
if (psbt_finalize(inflight->funding_psbt)
|
||||||
|
&& inflight->remote_tx_sigs) {
|
||||||
|
wtx = psbt_final_tx(NULL, inflight->funding_psbt);
|
||||||
if (!wtx) {
|
if (!wtx) {
|
||||||
|
/* FIXME: what's the ideal error handling here? */
|
||||||
channel_internal_error(channel,
|
channel_internal_error(channel,
|
||||||
"Unable to extract final tx"
|
"Unable to extract final tx"
|
||||||
" from PSBT %s",
|
" from PSBT %s",
|
||||||
type_to_string(tmpctx,
|
type_to_string(tmpctx,
|
||||||
struct wally_psbt,
|
struct wally_psbt,
|
||||||
psbt));
|
inflight->funding_psbt));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
send_funding_tx(channel, take(wtx));
|
send_funding_tx(channel, take(wtx));
|
||||||
|
|
||||||
channel_set_state(channel, DUALOPEND_OPEN_INIT,
|
/* Must be in an "init" state */
|
||||||
|
assert(channel->state == DUALOPEND_OPEN_INIT
|
||||||
|
|| channel->state == DUALOPEND_AWAITING_LOCKIN);
|
||||||
|
|
||||||
|
channel_set_state(channel, channel->state,
|
||||||
DUALOPEND_AWAITING_LOCKIN,
|
DUALOPEND_AWAITING_LOCKIN,
|
||||||
REASON_UNKNOWN,
|
REASON_UNKNOWN,
|
||||||
"Sigs exchanged, waiting for lock-in");
|
"Sigs exchanged, waiting for lock-in");
|
||||||
@ -1513,7 +1519,7 @@ static void handle_peer_tx_sigs_msg(struct subd *dualopend,
|
|||||||
const struct wally_tx *wtx;
|
const struct wally_tx *wtx;
|
||||||
struct lightningd *ld = dualopend->ld;
|
struct lightningd *ld = dualopend->ld;
|
||||||
struct channel *channel = dualopend->channel;
|
struct channel *channel = dualopend->channel;
|
||||||
struct wally_psbt *chan_psbt = NULL;
|
struct channel_inflight *inflight;
|
||||||
|
|
||||||
if (!fromwire_dualopend_funding_sigs(tmpctx, msg, &psbt)) {
|
if (!fromwire_dualopend_funding_sigs(tmpctx, msg, &psbt)) {
|
||||||
channel_internal_error(channel,
|
channel_internal_error(channel,
|
||||||
@ -1522,36 +1528,40 @@ static void handle_peer_tx_sigs_msg(struct subd *dualopend,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inflight = channel_current_inflight(channel);
|
||||||
/* Save that we've gotten their sigs. Sometimes
|
/* Save that we've gotten their sigs. Sometimes
|
||||||
* the peer doesn't send any sigs (no inputs), otherwise
|
* the peer doesn't send any sigs (no inputs), otherwise
|
||||||
* we could just check the PSBT was finalized */
|
* we could just check the PSBT was finalized */
|
||||||
// FIXME: inflight->remote_tx_sigs = true;
|
inflight->remote_tx_sigs = true;
|
||||||
tal_wally_start();
|
tal_wally_start();
|
||||||
if (wally_psbt_combine(chan_psbt, psbt) != WALLY_OK) {
|
if (wally_psbt_combine(inflight->funding_psbt, psbt) != WALLY_OK) {
|
||||||
channel_internal_error(channel,
|
channel_internal_error(channel,
|
||||||
"Unable to combine PSBTs: %s, %s",
|
"Unable to combine PSBTs: %s, %s",
|
||||||
type_to_string(tmpctx,
|
type_to_string(tmpctx,
|
||||||
struct wally_psbt,
|
struct wally_psbt,
|
||||||
chan_psbt),
|
inflight->funding_psbt),
|
||||||
type_to_string(tmpctx,
|
type_to_string(tmpctx,
|
||||||
struct wally_psbt,
|
struct wally_psbt,
|
||||||
psbt));
|
psbt));
|
||||||
tal_wally_end(chan_psbt);
|
tal_wally_end(inflight->funding_psbt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tal_wally_end(chan_psbt);
|
tal_wally_end(inflight->funding_psbt);
|
||||||
|
wallet_inflight_save(ld->wallet, inflight);
|
||||||
|
|
||||||
if (psbt_finalize(cast_const(struct wally_psbt *, chan_psbt))) {
|
if (psbt_finalize(cast_const(struct wally_psbt *, inflight->funding_psbt))) {
|
||||||
wtx = psbt_final_tx(NULL, chan_psbt);
|
wallet_inflight_save(ld->wallet, inflight);
|
||||||
|
wtx = psbt_final_tx(NULL, inflight->funding_psbt);
|
||||||
if (!wtx) {
|
if (!wtx) {
|
||||||
channel_internal_error(channel,
|
channel_internal_error(channel,
|
||||||
"Unable to extract final tx"
|
"Unable to extract final tx"
|
||||||
" from PSBT %s",
|
" from PSBT %s",
|
||||||
type_to_string(tmpctx,
|
type_to_string(tmpctx,
|
||||||
struct wally_psbt,
|
struct wally_psbt,
|
||||||
chan_psbt));
|
inflight->funding_psbt));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
send_funding_tx(channel, take(wtx));
|
send_funding_tx(channel, take(wtx));
|
||||||
|
|
||||||
channel_set_state(channel, DUALOPEND_OPEN_INIT,
|
channel_set_state(channel, DUALOPEND_OPEN_INIT,
|
||||||
@ -1570,10 +1580,9 @@ static void handle_peer_tx_sigs_msg(struct subd *dualopend,
|
|||||||
&channel->remote_funding_locked);
|
&channel->remote_funding_locked);
|
||||||
}
|
}
|
||||||
|
|
||||||
wallet_channel_save(ld->wallet, channel);
|
|
||||||
|
|
||||||
/* Send notification with peer's signed PSBT */
|
/* Send notification with peer's signed PSBT */
|
||||||
notify_openchannel_peer_sigs(ld, &channel->cid, chan_psbt);
|
notify_openchannel_peer_sigs(ld, &channel->cid,
|
||||||
|
inflight->funding_psbt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_validate_rbf(struct subd *dualopend,
|
static void handle_validate_rbf(struct subd *dualopend,
|
||||||
@ -1681,8 +1690,7 @@ json_openchannel_signed(struct command *cmd,
|
|||||||
struct channel_id *cid;
|
struct channel_id *cid;
|
||||||
struct channel *channel;
|
struct channel *channel;
|
||||||
struct bitcoin_txid txid;
|
struct bitcoin_txid txid;
|
||||||
/* FIXME: use inflight? */
|
struct channel_inflight *inflight;
|
||||||
struct wally_psbt *chan_psbt = NULL;
|
|
||||||
|
|
||||||
if (!param(cmd, buffer, params,
|
if (!param(cmd, buffer, params,
|
||||||
p_req("channel_id", param_channel_id, &cid),
|
p_req("channel_id", param_channel_id, &cid),
|
||||||
@ -1716,33 +1724,59 @@ json_openchannel_signed(struct command *cmd,
|
|||||||
type_to_string(tmpctx, struct bitcoin_txid,
|
type_to_string(tmpctx, struct bitcoin_txid,
|
||||||
&txid));
|
&txid));
|
||||||
|
|
||||||
|
inflight = list_tail(&channel->inflights,
|
||||||
|
struct channel_inflight,
|
||||||
|
list);
|
||||||
|
if (!inflight)
|
||||||
|
return command_fail(cmd, LIGHTNINGD,
|
||||||
|
"Open attempt for channel not found");
|
||||||
|
|
||||||
|
if (!bitcoin_txid_eq(&txid, &inflight->funding->txid))
|
||||||
|
return command_fail(cmd, LIGHTNINGD,
|
||||||
|
"Current inflight transaction is %s,"
|
||||||
|
" not %s",
|
||||||
|
type_to_string(tmpctx, struct bitcoin_txid,
|
||||||
|
&txid),
|
||||||
|
type_to_string(tmpctx, struct bitcoin_txid,
|
||||||
|
&inflight->funding->txid));
|
||||||
|
|
||||||
|
if (inflight->funding_psbt && psbt_is_finalized(inflight->funding_psbt))
|
||||||
|
return command_fail(cmd, LIGHTNINGD,
|
||||||
|
"Already have a finalized PSBT for "
|
||||||
|
"this channel");
|
||||||
|
|
||||||
/* Go ahead and try to finalize things, or what we can */
|
/* Go ahead and try to finalize things, or what we can */
|
||||||
psbt_finalize(psbt);
|
psbt_finalize(psbt);
|
||||||
|
|
||||||
/* Check that all of *our* outputs are finalized */
|
/* Check that all of *our* outputs are finalized */
|
||||||
if (!psbt_side_finalized(psbt, TX_INITIATOR))
|
if (!psbt_side_finalized(psbt, channel->opener == LOCAL ?
|
||||||
|
TX_INITIATOR : TX_ACCEPTER))
|
||||||
return command_fail(cmd, FUNDING_PSBT_INVALID,
|
return command_fail(cmd, FUNDING_PSBT_INVALID,
|
||||||
"Local PSBT input(s) not finalized");
|
"Local PSBT input(s) not finalized");
|
||||||
|
|
||||||
/* Now that we've got the signed PSBT, save it */
|
/* Now that we've got the signed PSBT, save it */
|
||||||
tal_wally_start();
|
tal_wally_start();
|
||||||
if (wally_psbt_combine(cast_const(struct wally_psbt *, chan_psbt),
|
if (wally_psbt_combine(cast_const(struct wally_psbt *,
|
||||||
|
inflight->funding_psbt),
|
||||||
psbt) != WALLY_OK) {
|
psbt) != WALLY_OK) {
|
||||||
tal_wally_end(tal_free(psbt));
|
tal_wally_end(tal_free(inflight->funding_psbt));
|
||||||
return command_fail(cmd, FUNDING_PSBT_INVALID,
|
return command_fail(cmd, FUNDING_PSBT_INVALID,
|
||||||
"Failed adding sigs");
|
"Failed adding sigs");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make memleak happy, (otherwise cleaned up with `cmd`) */
|
/* Make memleak happy, (otherwise cleaned up with `cmd`) */
|
||||||
tal_free(psbt);
|
tal_free(psbt);
|
||||||
tal_wally_end(tal_steal(channel, chan_psbt));
|
tal_wally_end(tal_steal(inflight, inflight->funding_psbt));
|
||||||
|
|
||||||
wallet_channel_save(cmd->ld->wallet, channel);
|
/* Update the PSBT on disk */
|
||||||
|
wallet_inflight_save(cmd->ld->wallet, inflight);
|
||||||
|
/* Uses the channel->funding_txid, which we verified above */
|
||||||
channel_watch_funding(cmd->ld, channel);
|
channel_watch_funding(cmd->ld, channel);
|
||||||
|
|
||||||
/* Send our tx_sigs to the peer */
|
/* Send our tx_sigs to the peer */
|
||||||
subd_send_msg(channel->owner,
|
subd_send_msg(channel->owner,
|
||||||
take(towire_dualopend_send_tx_sigs(NULL, chan_psbt)));
|
take(towire_dualopend_send_tx_sigs(NULL,
|
||||||
|
inflight->funding_psbt)));
|
||||||
|
|
||||||
channel->openchannel_signed_cmd = tal_steal(channel, cmd);
|
channel->openchannel_signed_cmd = tal_steal(channel, cmd);
|
||||||
return command_still_pending(cmd);
|
return command_still_pending(cmd);
|
||||||
|
Loading…
Reference in New Issue
Block a user