mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +01:00
open_command: keep them local to channel
Since this all stays in dualopend/dual_open_control, we can hold onto the openchannel_signed command to wait for a response here locally. Previously we were splitting across the channeld/openingd boundary.
This commit is contained in:
committed by
Christian Decker
parent
f37315c2f8
commit
c6de4138e6
@@ -206,6 +206,7 @@ struct channel *new_channel(struct peer *peer, u64 dbid,
|
||||
channel->dbid = dbid;
|
||||
channel->error = NULL;
|
||||
channel->htlc_timeout = NULL;
|
||||
channel->openchannel_signed_cmd = NULL;
|
||||
if (their_shachain)
|
||||
channel->their_shachain = *their_shachain;
|
||||
else {
|
||||
|
||||
@@ -157,6 +157,9 @@ struct channel {
|
||||
|
||||
/* Last known state_change cause */
|
||||
enum state_change state_change_cause;
|
||||
|
||||
/* Outstanding command for this channel, v2 only */
|
||||
struct command *openchannel_signed_cmd;
|
||||
};
|
||||
|
||||
struct channel *new_channel(struct peer *peer, u64 dbid,
|
||||
|
||||
@@ -1051,23 +1051,22 @@ static void sendfunding_done(struct bitcoind *bitcoind UNUSED,
|
||||
const struct wally_tx *wtx = cs->wtx;
|
||||
struct json_stream *response;
|
||||
struct bitcoin_txid txid;
|
||||
struct open_command *oc;
|
||||
struct amount_sat unused;
|
||||
int num_utxos;
|
||||
struct command *cmd = channel->openchannel_signed_cmd;
|
||||
channel->openchannel_signed_cmd = NULL;
|
||||
|
||||
oc = find_open_command(ld, channel);
|
||||
if (!oc && channel->opener == LOCAL) {
|
||||
if (!cmd && channel->opener == LOCAL)
|
||||
log_broken(channel->log,
|
||||
"No outstanding command for channel %s,"
|
||||
" funding sent was success? %d",
|
||||
type_to_string(tmpctx, struct channel_id,
|
||||
&channel->cid),
|
||||
success);
|
||||
}
|
||||
|
||||
if (!success) {
|
||||
if (oc)
|
||||
was_pending(command_fail(oc->cmd,
|
||||
if (cmd)
|
||||
was_pending(command_fail(cmd,
|
||||
FUNDING_BROADCAST_FAIL,
|
||||
"Error broadcasting funding "
|
||||
"tx: %s. Unsent tx discarded "
|
||||
@@ -1090,24 +1089,24 @@ static void sendfunding_done(struct bitcoind *bitcoind UNUSED,
|
||||
num_utxos = wallet_extract_owned_outputs(ld->wallet,
|
||||
wtx, NULL,
|
||||
&unused);
|
||||
if (num_utxos) {
|
||||
if (num_utxos)
|
||||
wallet_transaction_add(ld->wallet, wtx, 0, 0);
|
||||
}
|
||||
|
||||
if (oc) {
|
||||
response = json_stream_success(oc->cmd);
|
||||
if (cmd) {
|
||||
response = json_stream_success(cmd);
|
||||
wally_txid(wtx, &txid);
|
||||
json_add_hex_talarr(response, "tx", linearize_wtx(tmpctx, wtx));
|
||||
json_add_txid(response, "txid", &txid);
|
||||
json_add_string(response, "channel_id",
|
||||
type_to_string(tmpctx, struct channel_id,
|
||||
&channel->cid));
|
||||
was_pending(command_success(oc->cmd, response));
|
||||
was_pending(command_success(cmd, response));
|
||||
}
|
||||
|
||||
tal_free(cs);
|
||||
}
|
||||
|
||||
|
||||
static void send_funding_tx(struct channel *channel,
|
||||
const struct wally_tx *wtx TAKES)
|
||||
{
|
||||
@@ -1211,6 +1210,10 @@ json_openchannel_signed(struct command *cmd,
|
||||
return command_fail(cmd, LIGHTNINGD,
|
||||
"Already have a finalized PSBT for "
|
||||
"this channel");
|
||||
if (channel->openchannel_signed_cmd)
|
||||
return command_fail(cmd, LIGHTNINGD,
|
||||
"Already sent sigs, waiting for"
|
||||
" peer's");
|
||||
|
||||
/* Verify that the psbt's txid matches that of the
|
||||
* funding txid for this channel */
|
||||
@@ -1247,9 +1250,6 @@ json_openchannel_signed(struct command *cmd,
|
||||
wallet_channel_save(cmd->ld->wallet, channel);
|
||||
channel_watch_funding(cmd->ld, channel);
|
||||
|
||||
/* Return when the transaction is broadcast */
|
||||
register_open_command(cmd->ld, cmd, channel);
|
||||
|
||||
/* Send our tx_sigs to the peer */
|
||||
subd_send_msg(channel->owner,
|
||||
take(towire_dualopend_send_tx_sigs(NULL, channel->psbt)));
|
||||
@@ -1260,6 +1260,7 @@ json_openchannel_signed(struct command *cmd,
|
||||
send_funding_tx(channel, take(wtx));
|
||||
}
|
||||
|
||||
channel->openchannel_signed_cmd = tal_steal(channel, cmd);
|
||||
return command_still_pending(cmd);
|
||||
}
|
||||
|
||||
|
||||
@@ -196,7 +196,6 @@ static struct lightningd *new_lightningd(const tal_t *ctx)
|
||||
list_head_init(&ld->waitsendpay_commands);
|
||||
list_head_init(&ld->sendpay_commands);
|
||||
list_head_init(&ld->close_commands);
|
||||
list_head_init(&ld->open_commands);
|
||||
list_head_init(&ld->ping_commands);
|
||||
list_head_init(&ld->waitblockheight_commands);
|
||||
|
||||
|
||||
@@ -179,8 +179,6 @@ struct lightningd {
|
||||
struct list_head sendpay_commands;
|
||||
/* Outstanding close commands. */
|
||||
struct list_head close_commands;
|
||||
/* Outstanding openchannel_signed commands. */
|
||||
struct list_head open_commands;
|
||||
/* Outstanding ping commands. */
|
||||
struct list_head ping_commands;
|
||||
|
||||
|
||||
@@ -323,68 +323,6 @@ register_close_command(struct lightningd *ld,
|
||||
&close_command_timeout, cc);
|
||||
}
|
||||
|
||||
/* Destroy the open command structure in reaction to the
|
||||
* channel being destroyed. */
|
||||
static void
|
||||
destroy_open_command_on_channel_destroy(struct channel *_ UNUSED,
|
||||
struct open_command *oc)
|
||||
{
|
||||
/* The oc has the command as parent, so resolving the
|
||||
* command destroys the oc and triggers destroy_open_command.
|
||||
* Clear the oc->channel first so that we will not try to
|
||||
* remove a destructor. */
|
||||
oc->channel = NULL;
|
||||
was_pending(command_fail(oc->cmd, LIGHTNINGD,
|
||||
"Channel forgotten before open concluded."));
|
||||
}
|
||||
|
||||
/* Destroy the open command structure. */
|
||||
static void
|
||||
destroy_open_command(struct open_command *oc)
|
||||
{
|
||||
list_del(&oc->list);
|
||||
/* If destroy_close_command_on_channel_destroy was
|
||||
* triggered beforehand, it will have cleared
|
||||
* the channel field, preventing us from removing it
|
||||
* from an already-destroyed channel. */
|
||||
if (!oc->channel)
|
||||
return;
|
||||
tal_del_destructor2(oc->channel,
|
||||
&destroy_open_command_on_channel_destroy,
|
||||
oc);
|
||||
}
|
||||
|
||||
struct open_command *find_open_command(struct lightningd *ld,
|
||||
const struct channel *channel)
|
||||
{
|
||||
struct open_command *oc, *n;
|
||||
|
||||
list_for_each_safe (&ld->open_commands, oc, n, list) {
|
||||
if (oc->channel != channel)
|
||||
continue;
|
||||
return oc;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void register_open_command(struct lightningd *ld,
|
||||
struct command *cmd,
|
||||
struct channel *channel)
|
||||
{
|
||||
struct open_command *oc;
|
||||
assert(channel);
|
||||
|
||||
oc = tal(cmd, struct open_command);
|
||||
list_add_tail(&ld->open_commands, &oc->list);
|
||||
oc->cmd = cmd;
|
||||
oc->channel = channel;
|
||||
tal_add_destructor(oc, &destroy_open_command);
|
||||
tal_add_destructor2(channel,
|
||||
&destroy_open_command_on_channel_destroy,
|
||||
oc);
|
||||
}
|
||||
|
||||
static bool invalid_last_tx(const struct bitcoin_tx *tx)
|
||||
{
|
||||
/* This problem goes back further, but was discovered just before the
|
||||
|
||||
@@ -52,15 +52,6 @@ struct peer {
|
||||
#endif
|
||||
};
|
||||
|
||||
struct open_command {
|
||||
/* Inside struct lightningd open_commands. */
|
||||
struct list_node list;
|
||||
/* Command structure. This is the parent of the open command. */
|
||||
struct command *cmd;
|
||||
/* Channel being opened. */
|
||||
struct channel *channel;
|
||||
};
|
||||
|
||||
struct peer *find_peer_by_dbid(struct lightningd *ld, u64 dbid);
|
||||
|
||||
struct peer *new_peer(struct lightningd *ld, u64 dbid,
|
||||
@@ -99,16 +90,6 @@ void channel_watch_funding(struct lightningd *ld, struct channel *channel);
|
||||
|
||||
struct amount_msat channel_amount_receivable(const struct channel *channel);
|
||||
|
||||
/* Find the open command that was registered for this channel */
|
||||
struct open_command *find_open_command(struct lightningd *ld,
|
||||
const struct channel *channel);
|
||||
|
||||
/* Save an `openchannel_signed` command */
|
||||
void register_open_command(struct lightningd *ld,
|
||||
struct command *cmd,
|
||||
struct channel *channel);
|
||||
|
||||
|
||||
/* Pull peers, channels and HTLCs from db, and wire them up.
|
||||
* Returns any HTLCs we have to resubmit via htlcs_resubmit. */
|
||||
struct htlc_in_map *load_channels_from_wallet(struct lightningd *ld);
|
||||
|
||||
Reference in New Issue
Block a user