Browse Source

dual-fund: don't kill dualopend after commitments exchanged

We're going to handle the funding tx sigs here, so we keep dualopend
open still, so we can get them in/out before moving on
ppa
niftynei 4 years ago
committed by Christian Decker
parent
commit
e0a7907d79
  1. 61
      lightningd/dual_open_control.c
  2. 234
      openingd/dualopend.c
  3. 4
      openingd/dualopend_wire.csv
  4. 18
      openingd/dualopend_wiregen.c
  5. 6
      openingd/dualopend_wiregen.h

61
lightningd/dual_open_control.c

@ -722,16 +722,15 @@ static void accepter_commit_received(struct subd *dualopend,
struct bitcoin_signature remote_commit_sig; struct bitcoin_signature remote_commit_sig;
struct channel_id cid; struct channel_id cid;
struct bitcoin_txid funding_txid; struct bitcoin_txid funding_txid;
struct per_peer_state *pps;
u16 funding_outnum; u16 funding_outnum;
u32 feerate; u32 feerate;
struct amount_sat total_funding, funding_ours; struct amount_sat total_funding, funding_ours;
u8 channel_flags, *remote_upfront_shutdown_script, u8 channel_flags, *remote_upfront_shutdown_script,
*local_upfront_shutdown_script, *commitment_msg; *local_upfront_shutdown_script;
struct penalty_base *pbase; struct penalty_base *pbase;
struct wally_psbt *psbt; struct wally_psbt *psbt;
payload = tal(uc, struct openchannel2_psbt_payload); payload = tal(dualopend, struct openchannel2_psbt_payload);
payload->rcvd = tal(payload, struct commit_rcvd); payload->rcvd = tal(payload, struct commit_rcvd);
/* This is a new channel_info.their_config so set its ID to 0 */ /* This is a new channel_info.their_config so set its ID to 0 */
@ -744,7 +743,6 @@ static void accepter_commit_received(struct subd *dualopend,
&remote_commit_sig, &remote_commit_sig,
&psbt, &psbt,
&cid, &cid,
&pps,
&channel_info.theirbase.revocation, &channel_info.theirbase.revocation,
&channel_info.theirbase.payment, &channel_info.theirbase.payment,
&channel_info.theirbase.htlc, &channel_info.theirbase.htlc,
@ -757,23 +755,20 @@ static void accepter_commit_received(struct subd *dualopend,
&funding_ours, &funding_ours,
&channel_flags, &channel_flags,
&feerate, &feerate,
&commitment_msg,
&uc->our_config.channel_reserve, &uc->our_config.channel_reserve,
&local_upfront_shutdown_script, &local_upfront_shutdown_script,
&remote_upfront_shutdown_script)) { &remote_upfront_shutdown_script)) {
log_broken(uc->log, "bad WIRE_DUALOPEND_COMMIT_RCVD %s", log_broken(uc->log, "bad WIRE_DUALOPEND_COMMIT_RCVD %s",
tal_hex(msg, msg)); tal_hex(msg, msg));
uncommitted_channel_disconnect(uc, LOG_BROKEN, "bad WIRE_DUALOPEND_COMMIT_RCVD"); uncommitted_channel_disconnect(uc, LOG_BROKEN, "bad"
close(fds[0]); " WIRE_DUALOPEND_COMMIT_RCVD");
close(fds[1]);
close(fds[3]);
goto failed; goto failed;
} }
per_peer_state_set_fds_arr(pps, fds); payload->dualopend = dualopend;
tal_add_destructor2(dualopend, openchannel2_psbt_remove_dualopend,
payload);
payload->psbt = tal_steal(payload, psbt); payload->psbt = tal_steal(payload, psbt);
payload->rcvd->pps = tal_steal(payload, pps);
payload->rcvd->commitment_msg = tal_steal(payload, commitment_msg);
payload->ld = ld; payload->ld = ld;
if (peer_active_channel(uc->peer)) { if (peer_active_channel(uc->peer)) {
@ -812,22 +807,19 @@ static void accepter_commit_received(struct subd *dualopend,
payload->rcvd->channel->dbid, payload->rcvd->channel->dbid,
pbase); pbase);
/* dualopend is going away! */ subd_swap_channel(uc->open_daemon, payload->rcvd->channel,
/* We steal onto `NULL` because `payload` is tal'd off of `uc`; channel_errmsg, channel_set_billboard);
* we free `uc` at the end though */ payload->rcvd->channel->owner = dualopend;
payload->rcvd->uc = tal_steal(NULL, uc); /* We don't have a command, so set to NULL here */
payload->rcvd->channel->openchannel_signed_cmd = NULL;
uc->open_daemon = NULL;
tal_free(uc);
/* We call out to our hook friend who will provide signatures for us! */ /* We call out to our hook friend who will provide signatures for us! */
plugin_hook_call_openchannel2_sign(ld, payload); plugin_hook_call_openchannel2_sign(ld, payload);
/* We release the things here; dualopend is going away ?? */
subd_release_channel(dualopend, uc);
uc->open_daemon = NULL;
return; return;
failed: failed:
subd_release_channel(dualopend, uc);
uc->open_daemon = NULL;
tal_free(uc); tal_free(uc);
} }
@ -842,13 +834,12 @@ static void opener_commit_received(struct subd *dualopend,
struct bitcoin_signature remote_commit_sig; struct bitcoin_signature remote_commit_sig;
struct channel_id cid; struct channel_id cid;
struct bitcoin_txid funding_txid; struct bitcoin_txid funding_txid;
struct per_peer_state *pps;
struct json_stream *response; struct json_stream *response;
u16 funding_outnum; u16 funding_outnum;
u32 feerate; u32 feerate;
struct amount_sat total_funding, funding_ours; struct amount_sat total_funding, funding_ours;
u8 channel_flags, *remote_upfront_shutdown_script, u8 channel_flags, *remote_upfront_shutdown_script,
*local_upfront_shutdown_script, *commitment_msg; *local_upfront_shutdown_script;
struct penalty_base *pbase; struct penalty_base *pbase;
struct wally_psbt *psbt; struct wally_psbt *psbt;
struct channel *channel; struct channel *channel;
@ -864,7 +855,6 @@ static void opener_commit_received(struct subd *dualopend,
&remote_commit_sig, &remote_commit_sig,
&psbt, &psbt,
&cid, &cid,
&pps,
&channel_info.theirbase.revocation, &channel_info.theirbase.revocation,
&channel_info.theirbase.payment, &channel_info.theirbase.payment,
&channel_info.theirbase.htlc, &channel_info.theirbase.htlc,
@ -877,7 +867,6 @@ static void opener_commit_received(struct subd *dualopend,
&funding_ours, &funding_ours,
&channel_flags, &channel_flags,
&feerate, &feerate,
&commitment_msg,
&uc->our_config.channel_reserve, &uc->our_config.channel_reserve,
&local_upfront_shutdown_script, &local_upfront_shutdown_script,
&remote_upfront_shutdown_script)) { &remote_upfront_shutdown_script)) {
@ -885,20 +874,12 @@ static void opener_commit_received(struct subd *dualopend,
tal_hex(msg, msg)); tal_hex(msg, msg));
err_reason = "bad WIRE_DUALOPEND_COMMIT_RCVD"; err_reason = "bad WIRE_DUALOPEND_COMMIT_RCVD";
uncommitted_channel_disconnect(uc, LOG_BROKEN, err_reason); uncommitted_channel_disconnect(uc, LOG_BROKEN, err_reason);
close(fds[0]);
close(fds[1]);
close(fds[3]);
goto failed; goto failed;
} }
/* We shouldn't have a commitment message, this is an
* accepter flow item */
assert(!commitment_msg);
/* old_remote_per_commit not valid yet, copy valid one. */ /* old_remote_per_commit not valid yet, copy valid one. */
channel_info.old_remote_per_commit = channel_info.remote_per_commit; channel_info.old_remote_per_commit = channel_info.remote_per_commit;
per_peer_state_set_fds_arr(pps, fds);
if (peer_active_channel(uc->peer)) { if (peer_active_channel(uc->peer)) {
err_reason = "already have active channel"; err_reason = "already have active channel";
uncommitted_channel_disconnect(uc, LOG_BROKEN, err_reason); uncommitted_channel_disconnect(uc, LOG_BROKEN, err_reason);
@ -944,17 +925,19 @@ static void opener_commit_received(struct subd *dualopend,
channel->psbt = tal_steal(channel, psbt); channel->psbt = tal_steal(channel, psbt);
wallet_channel_save(uc->fc->cmd->ld->wallet, channel); wallet_channel_save(uc->fc->cmd->ld->wallet, channel);
peer_start_channeld(channel, pps,
NULL, false);
was_pending(command_success(uc->fc->cmd, response)); was_pending(command_success(uc->fc->cmd, response));
subd_swap_channel(uc->open_daemon, channel,
channel_errmsg, channel_set_billboard);
channel->owner = dualopend;
goto cleanup; goto cleanup;
failed: failed:
was_pending(command_fail(uc->fc->cmd, LIGHTNINGD, was_pending(command_fail(uc->fc->cmd, LIGHTNINGD,
"%s", err_reason)); "%s", err_reason));
cleanup:
subd_release_channel(dualopend, uc); subd_release_channel(dualopend, uc);
cleanup:
uc->open_daemon = NULL; uc->open_daemon = NULL;
tal_free(uc); tal_free(uc);
} }
@ -1493,8 +1476,6 @@ static unsigned int dual_opend_msg(struct subd *dualopend,
accepter_psbt_changed(dualopend, msg); accepter_psbt_changed(dualopend, msg);
return 0; return 0;
case WIRE_DUALOPEND_COMMIT_RCVD: case WIRE_DUALOPEND_COMMIT_RCVD:
if (tal_count(fds) != 3)
return 3;
if (uc->fc) { if (uc->fc) {
if (!uc->fc->cmd) { if (!uc->fc->cmd) {
log_unusual(dualopend->log, log_unusual(dualopend->log,

234
openingd/dualopend.c

@ -146,10 +146,10 @@ struct state {
bool funding_locked[NUM_SIDES]; bool funding_locked[NUM_SIDES];
/* PSBT of the funding tx */
struct wally_psbt *psbt; struct wally_psbt *psbt;
}; };
#if EXPERIMENTAL_FEATURES
/* psbt_changeset_get_next - Get next message to send /* psbt_changeset_get_next - Get next message to send
* *
* This generates the next message to send from a changeset for the * This generates the next message to send from a changeset for the
@ -1307,12 +1307,11 @@ static bool run_tx_interactive(struct state *state,
return true; return true;
} }
static u8 *accepter_start(struct state *state, const u8 *oc2_msg) static void accepter_start(struct state *state, const u8 *oc2_msg)
{ {
struct bitcoin_blkid chain_hash; struct bitcoin_blkid chain_hash;
struct tlv_opening_tlvs *open_tlv; struct tlv_opening_tlvs *open_tlv;
u8 channel_flags; u8 channel_flags;
struct wally_psbt *psbt;
char *err_reason; char *err_reason;
const u8 *wscript; const u8 *wscript;
struct channel_id cid; struct channel_id cid;
@ -1373,7 +1372,7 @@ static u8 *accepter_start(struct state *state, const u8 *oc2_msg)
type_to_string(tmpctx, type_to_string(tmpctx,
struct bitcoin_blkid, struct bitcoin_blkid,
&chain_hash)); &chain_hash));
return NULL; return;
} }
/* BOLT #2: /* BOLT #2:
@ -1390,7 +1389,7 @@ static u8 *accepter_start(struct state *state, const u8 *oc2_msg)
"opener's funding_satoshis %s too large", "opener's funding_satoshis %s too large",
type_to_string(tmpctx, struct amount_sat, type_to_string(tmpctx, struct amount_sat,
&state->opener_funding)); &state->opener_funding));
return NULL; return;
} }
/* We can figure out the channel id now */ /* We can figure out the channel id now */
@ -1424,17 +1423,17 @@ static u8 *accepter_start(struct state *state, const u8 *oc2_msg)
u8 *errmsg = towire_errorfmt(tmpctx, &state->channel_id, u8 *errmsg = towire_errorfmt(tmpctx, &state->channel_id,
"%s", err_reason); "%s", err_reason);
sync_crypto_write(state->pps, take(errmsg)); sync_crypto_write(state->pps, take(errmsg));
return NULL; return;
} }
if (!fromwire_dualopend_got_offer_reply(state, msg, if (!fromwire_dualopend_got_offer_reply(state, msg,
&state->accepter_funding, &state->accepter_funding,
&state->feerate_per_kw_funding, &state->feerate_per_kw_funding,
&psbt, &state->psbt,
&state->upfront_shutdown_script[LOCAL])) &state->upfront_shutdown_script[LOCAL]))
master_badmsg(WIRE_DUALOPEND_GOT_OFFER_REPLY, msg); master_badmsg(WIRE_DUALOPEND_GOT_OFFER_REPLY, msg);
if (!psbt) if (!state->psbt)
psbt = create_psbt(state, 0, 0, state->tx_locktime); state->psbt = create_psbt(state, 0, 0, state->tx_locktime);
/* Check that total funding doesn't overflow */ /* Check that total funding doesn't overflow */
if (!amount_sat_add(&total, state->opener_funding, if (!amount_sat_add(&total, state->opener_funding,
@ -1462,11 +1461,11 @@ static u8 *accepter_start(struct state *state, const u8 *oc2_msg)
"total funding_satoshis %s too large", "total funding_satoshis %s too large",
type_to_string(tmpctx, struct amount_sat, type_to_string(tmpctx, struct amount_sat,
&total)); &total));
return NULL; return;
} }
/* Add all of our inputs/outputs to the changeset */ /* Add all of our inputs/outputs to the changeset */
init_changeset(state, psbt); init_changeset(state, state->psbt);
/* Now that we know the total of the channel, we can set the reserve */ /* Now that we know the total of the channel, we can set the reserve */
set_reserve(state, total); set_reserve(state, total);
@ -1481,7 +1480,7 @@ static u8 *accepter_start(struct state *state, const u8 *oc2_msg)
true, /* v2 means we use anchor outputs */ true, /* v2 means we use anchor outputs */
&err_reason)) { &err_reason)) {
negotiation_failed(state, false, "%s", err_reason); negotiation_failed(state, false, "%s", err_reason);
return NULL; return;
} }
/* If we have an upfront shutdown script, send it to our peer */ /* If we have an upfront shutdown script, send it to our peer */
@ -1519,26 +1518,29 @@ static u8 *accepter_start(struct state *state, const u8 *oc2_msg)
* to an invalid number, 1 (initiator sets; valid is even) */ * to an invalid number, 1 (initiator sets; valid is even) */
state->funding_serial = 1; state->funding_serial = 1;
/* Figure out what the funding transaction looks like! */ /* Figure out what the funding transaction looks like! */
if (!run_tx_interactive(state, &psbt, TX_ACCEPTER)) if (!run_tx_interactive(state, &state->psbt, TX_ACCEPTER))
return NULL; return;
/* Find the funding transaction txid */ /* Find the funding transaction txid */
psbt_txid(NULL, psbt, &state->funding_txid, NULL); psbt_txid(NULL, state->psbt, &state->funding_txid, NULL);
wscript = bitcoin_redeem_2of2(state, wscript = bitcoin_redeem_2of2(state,
&state->our_funding_pubkey, &state->our_funding_pubkey,
&state->their_funding_pubkey); &state->their_funding_pubkey);
/* Figure out the txout */ /* Figure out the txout */
if (!find_txout(psbt, scriptpubkey_p2wsh(tmpctx, wscript), &state->funding_txout)) if (!find_txout(state->psbt,
scriptpubkey_p2wsh(tmpctx, wscript),
&state->funding_txout))
peer_failed(state->pps, &state->channel_id, peer_failed(state->pps, &state->channel_id,
"Expected output %s not found on funding tx %s", "Expected output %s not found on funding tx %s",
tal_hex(tmpctx, scriptpubkey_p2wsh(tmpctx, wscript)), tal_hex(tmpctx, scriptpubkey_p2wsh(tmpctx, wscript)),
type_to_string(tmpctx, struct wally_psbt, psbt)); type_to_string(tmpctx, struct wally_psbt,
state->psbt));
/* Check tx funds are sane */ /* Check tx funds are sane */
err_reason = check_balances(tmpctx, state, err_reason = check_balances(tmpctx, state,
psbt, state->psbt,
state->feerate_per_kw_funding); state->feerate_per_kw_funding);
if (err_reason) if (err_reason)
negotiation_failed(state, false, negotiation_failed(state, false,
@ -1547,12 +1549,12 @@ static u8 *accepter_start(struct state *state, const u8 *oc2_msg)
err_reason, err_reason,
type_to_string(tmpctx, type_to_string(tmpctx,
struct wally_psbt, struct wally_psbt,
psbt)); state->psbt));
/* Wait for the peer to send us our commitment tx signature */ /* Wait for the peer to send us our commitment tx signature */
msg = opening_negotiate_msg(tmpctx, state, false); msg = opening_negotiate_msg(tmpctx, state, false);
if (!msg) if (!msg)
return NULL; return;
remote_sig.sighash_type = SIGHASH_ALL; remote_sig.sighash_type = SIGHASH_ALL;
if (!fromwire_commitment_signed(tmpctx, msg, &cid, if (!fromwire_commitment_signed(tmpctx, msg, &cid,
@ -1602,7 +1604,7 @@ static u8 *accepter_start(struct state *state, const u8 *oc2_msg)
negotiation_failed(state, false, negotiation_failed(state, false,
"Could not meet our fees and reserve: %s", "Could not meet our fees and reserve: %s",
err_reason); err_reason);
return NULL; return;
} }
/* BOLT #2: /* BOLT #2:
@ -1641,7 +1643,7 @@ static u8 *accepter_start(struct state *state, const u8 *oc2_msg)
type_to_string(tmpctx, struct bitcoin_txid, type_to_string(tmpctx, struct bitcoin_txid,
&state->funding_txid), &state->funding_txid),
type_to_string(tmpctx, struct wally_psbt, type_to_string(tmpctx, struct wally_psbt,
psbt)); state->psbt));
} }
/* Create commitment tx signatures for remote */ /* Create commitment tx signatures for remote */
@ -1652,7 +1654,7 @@ static u8 *accepter_start(struct state *state, const u8 *oc2_msg)
if (!remote_commit) { if (!remote_commit) {
negotiation_failed(state, false, negotiation_failed(state, false,
"Could not meet their fees and reserve: %s", err_reason); "Could not meet their fees and reserve: %s", err_reason);
return NULL; return;
} }
/* Make HSM sign it */ /* Make HSM sign it */
@ -1668,46 +1670,56 @@ static u8 *accepter_start(struct state *state, const u8 *oc2_msg)
"Bad sign_tx_reply %s", tal_hex(tmpctx, msg)); "Bad sign_tx_reply %s", tal_hex(tmpctx, msg));
assert(local_sig.sighash_type == SIGHASH_ALL); assert(local_sig.sighash_type == SIGHASH_ALL);
msg = towire_commitment_signed(tmpctx, &state->channel_id,
&local_sig.s,
NULL);
if (direct_outputs[LOCAL]) if (direct_outputs[LOCAL])
pbase = penalty_base_new(tmpctx, 0, remote_commit, pbase = penalty_base_new(tmpctx, 0, remote_commit,
direct_outputs[LOCAL]); direct_outputs[LOCAL]);
else else
pbase = NULL; pbase = NULL;
/* Send the commitment_signed controller; will save to db /* Send the commitment_signed controller; will save to db,
* and pass messages along to channeld to send along! */ * then wait to get our sigs back */
return towire_dualopend_commit_rcvd(state, msg = towire_dualopend_commit_rcvd(state,
&state->remoteconf, &state->remoteconf,
remote_commit, remote_commit,
pbase, pbase,
&remote_sig, &remote_sig,
psbt, state->psbt,
&state->channel_id, &state->channel_id,
state->pps, &state->their_points.revocation,
&state->their_points.revocation, &state->their_points.payment,
&state->their_points.payment, &state->their_points.htlc,
&state->their_points.htlc, &state->their_points.delayed_payment,
&state->their_points.delayed_payment, &state->first_per_commitment_point[REMOTE],
&state->first_per_commitment_point[REMOTE], &state->their_funding_pubkey,
&state->their_funding_pubkey, &state->funding_txid,
&state->funding_txid, state->funding_txout,
state->funding_txout, total,
total, state->accepter_funding,
state->accepter_funding, channel_flags,
channel_flags, state->feerate_per_kw_commitment,
state->feerate_per_kw_commitment, state->localconf.channel_reserve,
msg, state->upfront_shutdown_script[LOCAL],
state->localconf.channel_reserve, state->upfront_shutdown_script[REMOTE]);
state->upfront_shutdown_script[LOCAL], /* Normally we would end dualopend here (and in fact this
state->upfront_shutdown_script[REMOTE]); * is where openingd ends). However, now we wait for both our peer
* to send us the tx sigs *and* for master to send us the tx sigs. */
wire_sync_write(REQ_FD, take(msg));
msg = wire_sync_read(tmpctx, REQ_FD);
if (fromwire_peektype(msg) != WIRE_DUALOPEND_SEND_TX_SIGS)
master_badmsg(WIRE_DUALOPEND_SEND_TX_SIGS, msg);
/* Send our commitment sigs over now */
sync_crypto_write(state->pps,
take(towire_commitment_signed(NULL,
&state->channel_id,
&local_sig.s, NULL)));
/* Finally, send our funding tx sigs */
handle_send_tx_sigs(state, msg);
} }
#endif /* EXPERIMENTAL_FEATURES */
static u8 *opener_start(struct state *state, u8 *msg) static void opener_start(struct state *state, u8 *msg)
{ {
struct tlv_opening_tlvs *open_tlv; struct tlv_opening_tlvs *open_tlv;
struct tlv_accept_tlvs *a_tlv; struct tlv_accept_tlvs *a_tlv;
@ -1715,7 +1727,6 @@ static u8 *opener_start(struct state *state, u8 *msg)
char *err_reason; char *err_reason;
struct amount_sat total; struct amount_sat total;
struct amount_msat our_msats; struct amount_msat our_msats;
struct wally_psbt *psbt;
struct wally_psbt_output *funding_out; struct wally_psbt_output *funding_out;
struct sha256 podle; struct sha256 podle;
struct wally_tx_output *direct_outputs[NUM_SIDES]; struct wally_tx_output *direct_outputs[NUM_SIDES];
@ -1728,7 +1739,7 @@ static u8 *opener_start(struct state *state, u8 *msg)
u32 feerate_min, feerate_max, feerate_best; u32 feerate_min, feerate_max, feerate_best;
if (!fromwire_dualopend_opener_init(state, msg, if (!fromwire_dualopend_opener_init(state, msg,
&psbt, &state->psbt,
&state->opener_funding, &state->opener_funding,
&state->upfront_shutdown_script[LOCAL], &state->upfront_shutdown_script[LOCAL],
&state->feerate_per_kw_commitment, &state->feerate_per_kw_commitment,
@ -1737,7 +1748,7 @@ static u8 *opener_start(struct state *state, u8 *msg)
master_badmsg(WIRE_DUALOPEND_OPENER_INIT, msg); master_badmsg(WIRE_DUALOPEND_OPENER_INIT, msg);
state->our_role = TX_INITIATOR; state->our_role = TX_INITIATOR;
state->tx_locktime = psbt->tx->locktime; state->tx_locktime = state->psbt->tx->locktime;
open_tlv = tlv_opening_tlvs_new(tmpctx); open_tlv = tlv_opening_tlvs_new(tmpctx);
feerate_min = state->min_feerate; feerate_min = state->min_feerate;
@ -1803,7 +1814,7 @@ static u8 *opener_start(struct state *state, u8 *msg)
/* ... since their reply should be immediate. */ /* ... since their reply should be immediate. */
msg = opening_negotiate_msg(tmpctx, state, true); msg = opening_negotiate_msg(tmpctx, state, true);
if (!msg) if (!msg)
return NULL; return;
/* Set a cid default value, so on failure it's populated */ /* Set a cid default value, so on failure it's populated */
memset(&cid, 0xFF, sizeof(cid)); memset(&cid, 0xFF, sizeof(cid));
@ -1886,7 +1897,7 @@ static u8 *opener_start(struct state *state, u8 *msg)
"total funding_satoshis %s too large", "total funding_satoshis %s too large",
type_to_string(tmpctx, struct amount_sat, type_to_string(tmpctx, struct amount_sat,
&total)); &total));
return NULL; return;
} }
/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2: /* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
@ -1898,16 +1909,19 @@ static u8 *opener_start(struct state *state, u8 *msg)
wscript = bitcoin_redeem_2of2(state, wscript = bitcoin_redeem_2of2(state,
&state->our_funding_pubkey, &state->our_funding_pubkey,
&state->their_funding_pubkey); &state->their_funding_pubkey);
funding_out = psbt_append_output(psbt, funding_out = psbt_append_output(state->psbt,
scriptpubkey_p2wsh(tmpctx, scriptpubkey_p2wsh(tmpctx,
wscript), wscript),
total); total);
/* Add a serial_id for this output */ /* Add a serial_id for this output */
state->funding_serial = psbt_new_input_serial(psbt, TX_INITIATOR); state->funding_serial = psbt_new_input_serial(state->psbt,
psbt_output_set_serial_id(psbt, funding_out, state->funding_serial); TX_INITIATOR);
psbt_output_set_serial_id(state->psbt,
funding_out,
state->funding_serial);
/* Add all of our inputs/outputs to the changeset */ /* Add all of our inputs/outputs to the changeset */
init_changeset(state, psbt); init_changeset(state, state->psbt);
/* Now that we know the total of the channel, we can /* Now that we know the total of the channel, we can
* set the reserve */ * set the reserve */
@ -1922,31 +1936,31 @@ static u8 *opener_start(struct state *state, u8 *msg)
true, true, /* v2 means we use anchor outputs */ true, true, /* v2 means we use anchor outputs */
&err_reason)) { &err_reason)) {
negotiation_failed(state, false, "%s", err_reason); negotiation_failed(state, false, "%s", err_reason);
return NULL; return;
} }
/* Send our first message, we're opener we initiate here */ /* Send our first message, we're opener we initiate here */
if (!send_next(state, &psbt)) if (!send_next(state, &state->psbt))
negotiation_failed(state, true, negotiation_failed(state, true,
"Peer error, no updates to send"); "Peer error, no updates to send");
/* Figure out what the funding transaction looks like! */ /* Figure out what the funding transaction looks like! */
if (!run_tx_interactive(state, &psbt, TX_INITIATOR)) if (!run_tx_interactive(state, &state->psbt, TX_INITIATOR))
return NULL; return;
psbt_txid(NULL, psbt, &state->funding_txid, NULL); psbt_txid(NULL, state->psbt, &state->funding_txid, NULL);
/* Figure out the txout */ /* Figure out the txout */
if (!find_txout(psbt, scriptpubkey_p2wsh(tmpctx, wscript), if (!find_txout(state->psbt, scriptpubkey_p2wsh(tmpctx, wscript),
&state->funding_txout)) &state->funding_txout))
peer_failed(state->pps, &state->channel_id, peer_failed(state->pps, &state->channel_id,
"Expected output %s not found on funding tx %s", "Expected output %s not found on funding tx %s",
tal_hex(tmpctx, scriptpubkey_p2wsh(tmpctx, wscript)), tal_hex(tmpctx, scriptpubkey_p2wsh(tmpctx, wscript)),
type_to_string(tmpctx, struct wally_psbt, psbt)); type_to_string(tmpctx, struct wally_psbt,
state->psbt));
/* Check tx funds are sane */ /* Check tx funds are sane */
err_reason = check_balances(tmpctx, state, err_reason = check_balances(tmpctx, state, state->psbt,
psbt,
state->feerate_per_kw_funding); state->feerate_per_kw_funding);
if (err_reason) if (err_reason)
negotiation_failed(state, true, negotiation_failed(state, true,
@ -1955,7 +1969,7 @@ static u8 *opener_start(struct state *state, u8 *msg)
err_reason, err_reason,
type_to_string(tmpctx, type_to_string(tmpctx,
struct wally_psbt, struct wally_psbt,
psbt)); state->psbt));
if (!amount_sat_to_msat(&our_msats, state->opener_funding)) if (!amount_sat_to_msat(&our_msats, state->opener_funding))
status_failed(STATUS_FAIL_INTERNAL_ERROR, status_failed(STATUS_FAIL_INTERNAL_ERROR,
@ -1993,7 +2007,7 @@ static u8 *opener_start(struct state *state, u8 *msg)
negotiation_failed(state, true, negotiation_failed(state, true,
"Could not meet their fees and reserve: %s", "Could not meet their fees and reserve: %s",
err_reason); err_reason);
return NULL; return;
} }
@ -2031,7 +2045,7 @@ static u8 *opener_start(struct state *state, u8 *msg)
/* Wait for the peer to send us our commitment tx signature */ /* Wait for the peer to send us our commitment tx signature */
msg = opening_negotiate_msg(tmpctx, state, true); msg = opening_negotiate_msg(tmpctx, state, true);
if (!msg) if (!msg)
return NULL; return;
remote_sig.sighash_type = SIGHASH_ALL; remote_sig.sighash_type = SIGHASH_ALL;
if (!fromwire_commitment_signed(tmpctx, msg, &cid, if (!fromwire_commitment_signed(tmpctx, msg, &cid,
@ -2057,7 +2071,7 @@ static u8 *opener_start(struct state *state, u8 *msg)
negotiation_failed(state, false, negotiation_failed(state, false,
"Could not meet our fees and reserve: %s", "Could not meet our fees and reserve: %s",
err_reason); err_reason);
return NULL; return;
} }
/* BOLT #2: /* BOLT #2:
@ -2096,7 +2110,7 @@ static u8 *opener_start(struct state *state, u8 *msg)
type_to_string(tmpctx, struct bitcoin_txid, type_to_string(tmpctx, struct bitcoin_txid,
&state->funding_txid), &state->funding_txid),
type_to_string(tmpctx, struct wally_psbt, type_to_string(tmpctx, struct wally_psbt,
psbt)); state->psbt));
} }
if (direct_outputs[LOCAL]) if (direct_outputs[LOCAL])
@ -2107,31 +2121,34 @@ static u8 *opener_start(struct state *state, u8 *msg)
peer_billboard(false, "channel open: commitment received, " peer_billboard(false, "channel open: commitment received, "
"sending to lightningd to save"); "sending to lightningd to save");
return towire_dualopend_commit_rcvd(state,
&state->remoteconf,
remote_commit,
pbase,
&remote_sig,
psbt,
&state->channel_id,
state->pps,
&state->their_points.revocation,
&state->their_points.payment,
&state->their_points.htlc,
&state->their_points.delayed_payment,
&state->first_per_commitment_point[REMOTE],
&state->their_funding_pubkey,
&state->funding_txid,
state->funding_txout,
total,
state->opener_funding,
channel_flags,
state->feerate_per_kw_commitment,
NULL,
state->localconf.channel_reserve,
state->upfront_shutdown_script[LOCAL],
state->upfront_shutdown_script[REMOTE]);
msg = towire_dualopend_commit_rcvd(NULL,
&state->remoteconf,
remote_commit,
pbase,
&remote_sig,
state->psbt,
&state->channel_id,
&state->their_points.revocation,
&state->their_points.payment,
&state->their_points.htlc,
&state->their_points.delayed_payment,
&state->first_per_commitment_point[REMOTE],
&state->their_funding_pubkey,
&state->funding_txid,
state->funding_txout,
total,
state->opener_funding,
channel_flags,
state->feerate_per_kw_commitment,
state->localconf.channel_reserve,
state->upfront_shutdown_script[LOCAL],
state->upfront_shutdown_script[REMOTE]);
/* Normally we would end dualopend here (and in fact this
* is where openingd ends). However, now we wait for both our peer
* to send us the tx sigs *and* for master to send us the tx sigs. */
wire_sync_write(REQ_FD, take(msg));
} }
/*~ If we see the gossip_fd readable, we read a whole message. Sure, we might /*~ If we see the gossip_fd readable, we read a whole message. Sure, we might
@ -2187,9 +2204,11 @@ static u8 *handle_master_in(struct state *state)
#endif #endif
return NULL; return NULL;
case WIRE_DUALOPEND_OPENER_INIT: case WIRE_DUALOPEND_OPENER_INIT:
return opener_start(state, msg); opener_start(state, msg);
return NULL;
case WIRE_DUALOPEND_SEND_TX_SIGS: case WIRE_DUALOPEND_SEND_TX_SIGS:
return handle_send_tx_sigs(state, msg); handle_send_tx_sigs(state, msg);
return NULL;
/* mostly handled inline */ /* mostly handled inline */
case WIRE_DUALOPEND_INIT: case WIRE_DUALOPEND_INIT:
case WIRE_DUALOPEND_FUNDING_SIGS: case WIRE_DUALOPEND_FUNDING_SIGS:
@ -2231,9 +2250,10 @@ static u8 *handle_peer_in(struct state *state)
enum peer_wire t = fromwire_peektype(msg); enum peer_wire t = fromwire_peektype(msg);
struct channel_id channel_id; struct channel_id channel_id;
if (t == WIRE_OPEN_CHANNEL2) if (t == WIRE_OPEN_CHANNEL2) {
return accepter_start(state, msg); accepter_start(state, msg);
if (t == WIRE_TX_SIGNATURES) { return NULL;
} else if (t == WIRE_TX_SIGNATURES) {
handle_tx_sigs(state, msg); handle_tx_sigs(state, msg);
return NULL; return NULL;
} }

4
openingd/dualopend_wire.csv

@ -64,7 +64,6 @@ msgdata,dualopend_commit_rcvd,pbase,?penalty_base,
msgdata,dualopend_commit_rcvd,first_commit_sig,bitcoin_signature, msgdata,dualopend_commit_rcvd,first_commit_sig,bitcoin_signature,
msgdata,dualopend_commit_rcvd,psbt,wally_psbt, msgdata,dualopend_commit_rcvd,psbt,wally_psbt,
msgdata,dualopend_commit_rcvd,channel_id,channel_id, msgdata,dualopend_commit_rcvd,channel_id,channel_id,
msgdata,dualopend_commit_rcvd,pps,per_peer_state,
msgdata,dualopend_commit_rcvd,revocation_basepoint,pubkey, msgdata,dualopend_commit_rcvd,revocation_basepoint,pubkey,
msgdata,dualopend_commit_rcvd,payment_basepoint,pubkey, msgdata,dualopend_commit_rcvd,payment_basepoint,pubkey,
msgdata,dualopend_commit_rcvd,htlc_basepoint,pubkey, msgdata,dualopend_commit_rcvd,htlc_basepoint,pubkey,
@ -77,9 +76,6 @@ msgdata,dualopend_commit_rcvd,funding_satoshis,amount_sat,
msgdata,dualopend_commit_rcvd,our_funding_sats,amount_sat, msgdata,dualopend_commit_rcvd,our_funding_sats,amount_sat,
msgdata,dualopend_commit_rcvd,channel_flags,u8, msgdata,dualopend_commit_rcvd,channel_flags,u8,
msgdata,dualopend_commit_rcvd,feerate_per_kw,u32, msgdata,dualopend_commit_rcvd,feerate_per_kw,u32,
# our commitment signatures, for the peer
msgdata,dualopend_commit_rcvd,msglen,u16,
msgdata,dualopend_commit_rcvd,commitment_msg,u8,msglen
msgdata,dualopend_commit_rcvd,our_channel_reserve_satoshis,amount_sat, msgdata,dualopend_commit_rcvd,our_channel_reserve_satoshis,amount_sat,
msgdata,dualopend_commit_rcvd,local_shutdown_len,u16, msgdata,dualopend_commit_rcvd,local_shutdown_len,u16,
msgdata,dualopend_commit_rcvd,local_shutdown_scriptpubkey,u8,local_shutdown_len msgdata,dualopend_commit_rcvd,local_shutdown_scriptpubkey,u8,local_shutdown_len

Can't render this file because it has a wrong number of fields in line 11.

18
openingd/dualopend_wiregen.c

@ -223,9 +223,8 @@ bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct
/* WIRE: DUALOPEND_COMMIT_RCVD */ /* WIRE: DUALOPEND_COMMIT_RCVD */
/* dualopend->master: ready to commit channel open to database and */ /* dualopend->master: ready to commit channel open to database and */
/* get some signatures for the funding_tx. */ /* get some signatures for the funding_tx. */
u8 *towire_dualopend_commit_rcvd(const tal_t *ctx, const struct channel_config *their_config, const struct bitcoin_tx *remote_first_commit, const struct penalty_base *pbase, const struct bitcoin_signature *first_commit_sig, const struct wally_psbt *psbt, const struct channel_id *channel_id, const struct per_peer_state *pps, const struct pubkey *revocation_basepoint, const struct pubkey *payment_basepoint, const struct pubkey *htlc_basepoint, const struct pubkey *delayed_payment_basepoint, const struct pubkey *their_per_commit_point, const struct pubkey *remote_fundingkey, const struct bitcoin_txid *funding_txid, u16 funding_txout, struct amount_sat funding_satoshis, struct amount_sat our_funding_sats, u8 channel_flags, u32 feerate_per_kw, const u8 *commitment_msg, struct amount_sat our_channel_reserve_satoshis, const u8 *local_shutdown_scriptpubkey, const u8 *remote_shutdown_scriptpubkey) u8 *towire_dualopend_commit_rcvd(const tal_t *ctx, const struct channel_config *their_config, const struct bitcoin_tx *remote_first_commit, const struct penalty_base *pbase, const struct bitcoin_signature *first_commit_sig, const struct wally_psbt *psbt, const struct channel_id *channel_id, const struct pubkey *revocation_basepoint, const struct pubkey *payment_basepoint, const struct pubkey *htlc_basepoint, const struct pubkey *delayed_payment_basepoint, const struct pubkey *their_per_commit_point, const struct pubkey *remote_fundingkey, const struct bitcoin_txid *funding_txid, u16 funding_txout, struct amount_sat funding_satoshis, struct amount_sat our_funding_sats, u8 channel_flags, u32 feerate_per_kw, struct amount_sat our_channel_reserve_satoshis, const u8 *local_shutdown_scriptpubkey, const u8 *remote_shutdown_scriptpubkey)
{ {
u16 msglen = tal_count(commitment_msg);
u16 local_shutdown_len = tal_count(local_shutdown_scriptpubkey); u16 local_shutdown_len = tal_count(local_shutdown_scriptpubkey);
u16 remote_shutdown_len = tal_count(remote_shutdown_scriptpubkey); u16 remote_shutdown_len = tal_count(remote_shutdown_scriptpubkey);
u8 *p = tal_arr(ctx, u8, 0); u8 *p = tal_arr(ctx, u8, 0);
@ -242,7 +241,6 @@ u8 *towire_dualopend_commit_rcvd(const tal_t *ctx, const struct channel_config *
towire_bitcoin_signature(&p, first_commit_sig); towire_bitcoin_signature(&p, first_commit_sig);
towire_wally_psbt(&p, psbt); towire_wally_psbt(&p, psbt);
towire_channel_id(&p, channel_id); towire_channel_id(&p, channel_id);
towire_per_peer_state(&p, pps);
towire_pubkey(&p, revocation_basepoint); towire_pubkey(&p, revocation_basepoint);
towire_pubkey(&p, payment_basepoint); towire_pubkey(&p, payment_basepoint);
towire_pubkey(&p, htlc_basepoint); towire_pubkey(&p, htlc_basepoint);
@ -255,9 +253,6 @@ u8 *towire_dualopend_commit_rcvd(const tal_t *ctx, const struct channel_config *
towire_amount_sat(&p, our_funding_sats); towire_amount_sat(&p, our_funding_sats);
towire_u8(&p, channel_flags); towire_u8(&p, channel_flags);
towire_u32(&p, feerate_per_kw); towire_u32(&p, feerate_per_kw);
/* our commitment signatures */
towire_u16(&p, msglen);
towire_u8_array(&p, commitment_msg, msglen);
towire_amount_sat(&p, our_channel_reserve_satoshis); towire_amount_sat(&p, our_channel_reserve_satoshis);
towire_u16(&p, local_shutdown_len); towire_u16(&p, local_shutdown_len);
towire_u8_array(&p, local_shutdown_scriptpubkey, local_shutdown_len); towire_u8_array(&p, local_shutdown_scriptpubkey, local_shutdown_len);
@ -266,9 +261,8 @@ u8 *towire_dualopend_commit_rcvd(const tal_t *ctx, const struct channel_config *
return memcheck(p, tal_count(p)); return memcheck(p, tal_count(p));
} }
bool fromwire_dualopend_commit_rcvd(const tal_t *ctx, const void *p, struct channel_config *their_config, struct bitcoin_tx **remote_first_commit, struct penalty_base **pbase, struct bitcoin_signature *first_commit_sig, struct wally_psbt **psbt, struct channel_id *channel_id, struct per_peer_state **pps, struct pubkey *revocation_basepoint, struct pubkey *payment_basepoint, struct pubkey *htlc_basepoint, struct pubkey *delayed_payment_basepoint, struct pubkey *their_per_commit_point, struct pubkey *remote_fundingkey, struct bitcoin_txid *funding_txid, u16 *funding_txout, struct amount_sat *funding_satoshis, struct amount_sat *our_funding_sats, u8 *channel_flags, u32 *feerate_per_kw, u8 **commitment_msg, struct amount_sat *our_channel_reserve_satoshis, u8 **local_shutdown_scriptpubkey, u8 **remote_shutdown_scriptpubkey) bool fromwire_dualopend_commit_rcvd(const tal_t *ctx, const void *p, struct channel_config *their_config, struct bitcoin_tx **remote_first_commit, struct penalty_base **pbase, struct bitcoin_signature *first_commit_sig, struct wally_psbt **psbt, struct channel_id *channel_id, struct pubkey *revocation_basepoint, struct pubkey *payment_basepoint, struct pubkey *htlc_basepoint, struct pubkey *delayed_payment_basepoint, struct pubkey *their_per_commit_point, struct pubkey *remote_fundingkey, struct bitcoin_txid *funding_txid, u16 *funding_txout, struct amount_sat *funding_satoshis, struct amount_sat *our_funding_sats, u8 *channel_flags, u32 *feerate_per_kw, struct amount_sat *our_channel_reserve_satoshis, u8 **local_shutdown_scriptpubkey, u8 **remote_shutdown_scriptpubkey)
{ {
u16 msglen;
u16 local_shutdown_len; u16 local_shutdown_len;
u16 remote_shutdown_len; u16 remote_shutdown_len;
@ -288,7 +282,6 @@ bool fromwire_dualopend_commit_rcvd(const tal_t *ctx, const void *p, struct chan
fromwire_bitcoin_signature(&cursor, &plen, first_commit_sig); fromwire_bitcoin_signature(&cursor, &plen, first_commit_sig);
*psbt = fromwire_wally_psbt(ctx, &cursor, &plen); *psbt = fromwire_wally_psbt(ctx, &cursor, &plen);
fromwire_channel_id(&cursor, &plen, channel_id); fromwire_channel_id(&cursor, &plen, channel_id);
*pps = fromwire_per_peer_state(ctx, &cursor, &plen);
fromwire_pubkey(&cursor, &plen, revocation_basepoint); fromwire_pubkey(&cursor, &plen, revocation_basepoint);
fromwire_pubkey(&cursor, &plen, payment_basepoint); fromwire_pubkey(&cursor, &plen, payment_basepoint);
fromwire_pubkey(&cursor, &plen, htlc_basepoint); fromwire_pubkey(&cursor, &plen, htlc_basepoint);
@ -301,11 +294,6 @@ bool fromwire_dualopend_commit_rcvd(const tal_t *ctx, const void *p, struct chan
*our_funding_sats = fromwire_amount_sat(&cursor, &plen); *our_funding_sats = fromwire_amount_sat(&cursor, &plen);
*channel_flags = fromwire_u8(&cursor, &plen); *channel_flags = fromwire_u8(&cursor, &plen);
*feerate_per_kw = fromwire_u32(&cursor, &plen); *feerate_per_kw = fromwire_u32(&cursor, &plen);
/* our commitment signatures */
msglen = fromwire_u16(&cursor, &plen);
// 2nd case commitment_msg
*commitment_msg = msglen ? tal_arr(ctx, u8, msglen) : NULL;
fromwire_u8_array(&cursor, &plen, *commitment_msg, msglen);
*our_channel_reserve_satoshis = fromwire_amount_sat(&cursor, &plen); *our_channel_reserve_satoshis = fromwire_amount_sat(&cursor, &plen);
local_shutdown_len = fromwire_u16(&cursor, &plen); local_shutdown_len = fromwire_u16(&cursor, &plen);
// 2nd case local_shutdown_scriptpubkey // 2nd case local_shutdown_scriptpubkey
@ -533,4 +521,4 @@ bool fromwire_dualopend_dev_memleak_reply(const void *p, bool *leak)
*leak = fromwire_bool(&cursor, &plen); *leak = fromwire_bool(&cursor, &plen);
return cursor != NULL; return cursor != NULL;
} }
// SHA256STAMP:b050a7cf375aa2cfbc25f86556d06acaa7f1ed96170adaa912e5ba994a2879c2 // SHA256STAMP:b209a8683f1e9cbdc9f64302b70b86b2d66ac8fa917e3f1e482fda64f92c20a2

6
openingd/dualopend_wiregen.h

@ -74,8 +74,8 @@ bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct
/* WIRE: DUALOPEND_COMMIT_RCVD */ /* WIRE: DUALOPEND_COMMIT_RCVD */
/* dualopend->master: ready to commit channel open to database and */ /* dualopend->master: ready to commit channel open to database and */
/* get some signatures for the funding_tx. */ /* get some signatures for the funding_tx. */
u8 *towire_dualopend_commit_rcvd(const tal_t *ctx, const struct channel_config *their_config, const struct bitcoin_tx *remote_first_commit, const struct penalty_base *pbase, const struct bitcoin_signature *first_commit_sig, const struct wally_psbt *psbt, const struct channel_id *channel_id, const struct per_peer_state *pps, const struct pubkey *revocation_basepoint, const struct pubkey *payment_basepoint, const struct pubkey *htlc_basepoint, const struct pubkey *delayed_payment_basepoint, const struct pubkey *their_per_commit_point, const struct pubkey *remote_fundingkey, const struct bitcoin_txid *funding_txid, u16 funding_txout, struct amount_sat funding_satoshis, struct amount_sat our_funding_sats, u8 channel_flags, u32 feerate_per_kw, const u8 *commitment_msg, struct amount_sat our_channel_reserve_satoshis, const u8 *local_shutdown_scriptpubkey, const u8 *remote_shutdown_scriptpubkey); u8 *towire_dualopend_commit_rcvd(const tal_t *ctx, const struct channel_config *their_config, const struct bitcoin_tx *remote_first_commit, const struct penalty_base *pbase, const struct bitcoin_signature *first_commit_sig, const struct wally_psbt *psbt, const struct channel_id *channel_id, const struct pubkey *revocation_basepoint, const struct pubkey *payment_basepoint, const struct pubkey *htlc_basepoint, const struct pubkey *delayed_payment_basepoint, const struct pubkey *their_per_commit_point, const struct pubkey *remote_fundingkey, const struct bitcoin_txid *funding_txid, u16 funding_txout, struct amount_sat funding_satoshis, struct amount_sat our_funding_sats, u8 channel_flags, u32 feerate_per_kw, struct amount_sat our_channel_reserve_satoshis, const u8 *local_shutdown_scriptpubkey, const u8 *remote_shutdown_scriptpubkey);
bool fromwire_dualopend_commit_rcvd(const tal_t *ctx, const void *p, struct channel_config *their_config, struct bitcoin_tx **remote_first_commit, struct penalty_base **pbase, struct bitcoin_signature *first_commit_sig, struct wally_psbt **psbt, struct channel_id *channel_id, struct per_peer_state **pps, struct pubkey *revocation_basepoint, struct pubkey *payment_basepoint, struct pubkey *htlc_basepoint, struct pubkey *delayed_payment_basepoint, struct pubkey *their_per_commit_point, struct pubkey *remote_fundingkey, struct bitcoin_txid *funding_txid, u16 *funding_txout, struct amount_sat *funding_satoshis, struct amount_sat *our_funding_sats, u8 *channel_flags, u32 *feerate_per_kw, u8 **commitment_msg, struct amount_sat *our_channel_reserve_satoshis, u8 **local_shutdown_scriptpubkey, u8 **remote_shutdown_scriptpubkey); bool fromwire_dualopend_commit_rcvd(const tal_t *ctx, const void *p, struct channel_config *their_config, struct bitcoin_tx **remote_first_commit, struct penalty_base **pbase, struct bitcoin_signature *first_commit_sig, struct wally_psbt **psbt, struct channel_id *channel_id, struct pubkey *revocation_basepoint, struct pubkey *payment_basepoint, struct pubkey *htlc_basepoint, struct pubkey *delayed_payment_basepoint, struct pubkey *their_per_commit_point, struct pubkey *remote_fundingkey, struct bitcoin_txid *funding_txid, u16 *funding_txout, struct amount_sat *funding_satoshis, struct amount_sat *our_funding_sats, u8 *channel_flags, u32 *feerate_per_kw, struct amount_sat *our_channel_reserve_satoshis, u8 **local_shutdown_scriptpubkey, u8 **remote_shutdown_scriptpubkey);
/* WIRE: DUALOPEND_PSBT_CHANGED */ /* WIRE: DUALOPEND_PSBT_CHANGED */
/* dualopend->master: peer updated the psbt */ /* dualopend->master: peer updated the psbt */
@ -123,4 +123,4 @@ bool fromwire_dualopend_dev_memleak_reply(const void *p, bool *leak);
#endif /* LIGHTNING_OPENINGD_DUALOPEND_WIREGEN_H */ #endif /* LIGHTNING_OPENINGD_DUALOPEND_WIREGEN_H */
// SHA256STAMP:b050a7cf375aa2cfbc25f86556d06acaa7f1ed96170adaa912e5ba994a2879c2 // SHA256STAMP:b209a8683f1e9cbdc9f64302b70b86b2d66ac8fa917e3f1e482fda64f92c20a2

Loading…
Cancel
Save