Browse Source

df-open: use channel_id for openchannel_update and openchannel_signed

Be as specific as possible is a good rule for things, I think
travis-experimental
niftynei 4 years ago
committed by Rusty Russell
parent
commit
b696ec89a5
  1. 1
      common/jsonrpc_errors.h
  2. 10
      doc/lightning-openchannel_signed.7
  3. 6
      doc/lightning-openchannel_signed.7.md
  4. 12
      doc/lightning-openchannel_update.7
  5. 8
      doc/lightning-openchannel_update.7.md
  6. 30
      lightningd/channel.c
  7. 5
      lightningd/channel.h
  8. 58
      lightningd/dual_open_control.c
  9. 2
      lightningd/opening_common.c
  10. 4
      lightningd/opening_common.h
  11. 5
      tests/plugins/df_opener.py

1
common/jsonrpc_errors.h

@ -54,6 +54,7 @@ static const errcode_t FUNDING_NOTHING_TO_CANCEL = 307;
static const errcode_t FUNDING_CANCEL_NOT_SAFE = 308;
static const errcode_t FUNDING_PSBT_INVALID = 309;
static const errcode_t FUNDING_V2_NOT_SUPPORTED = 310;
static const errcode_t FUNDING_UNKNOWN_CHANNEL = 311;
/* `connect` errors */
static const errcode_t CONNECT_NO_KNOWN_ADDRESS = 400;

10
doc/lightning-openchannel_signed.7

@ -3,7 +3,7 @@
lightning-openchannel_signed - Command to conclude a channel open
.SH SYNOPSIS
\fBopenchannel_signed\fR \fIid\fR \fIsigned_psbt\fR
\fBopenchannel_signed\fR \fIchannel_id\fR \fIsigned_psbt\fR
.SH DESCRIPTION
@ -20,7 +20,7 @@ This command will broadcast the finalized funding transaction,
if we receive valid signatures from the peer\.
\fIid\fR is the node id of the remote peer\.
\fIchannel_id\fR is the id of the channel\.
\fIsigned_psbt\fR is the PSBT returned from \fBopenchannel_update\fR (where
@ -45,9 +45,9 @@ with \fBcode\fR being one of the following:
.IP \[bu]
303: Funding transaction broadcast failed\.
.IP \[bu]
306: Unknown peer id\.
.IP \[bu]
309: PSBT missing required fields\.
.IP \[bu]
311: Unknown channel id\.
.RE
.SH SEE ALSO
@ -65,4 +65,4 @@ lightning-fundchannel_\fBstart\fR(7), lightning-fundchannel_\fBcomplete\fR(7),
Main web site: \fIhttps://github.com/ElementsProject/lightning\fR
\" SHA256STAMP:68fb78430a5ee3707fdb1324ba46373dd3dfaf325fe4e1bd3dcdc1589d80435c
\" SHA256STAMP:93ad9dfed532d0de1481a2f5d3b2030dbaf2f67df69dfcc3724e934d86d332b5

6
doc/lightning-openchannel_signed.7.md

@ -4,7 +4,7 @@ lightning-openchannel\_signed -- Command to conclude a channel open
SYNOPSIS
--------
**openchannel_signed** *id* *signed_psbt*
**openchannel_signed** *channel_id* *signed_psbt*
DESCRIPTION
-----------
@ -19,7 +19,7 @@ This command should be called after `openchannel_update` returns
This command will broadcast the finalized funding transaction,
if we receive valid signatures from the peer.
*id* is the node id of the remote peer.
*channel_id* is the id of the channel.
*signed_psbt* is the PSBT returned from `openchannel_update` (where
*commitments_secured* was true) with partial signatures or finalized
@ -38,8 +38,8 @@ with `code` being one of the following:
- -32602: If the given parameters are wrong.
- -1: Catchall nonspecific error.
- 303: Funding transaction broadcast failed.
- 306: Unknown peer id.
- 309: PSBT missing required fields.
- 311: Unknown channel id.
SEE ALSO
--------

12
doc/lightning-openchannel_update.7

@ -3,12 +3,12 @@
lightning-openchannel_update - Command to update a collab channel open
.SH SYNOPSIS
\fBopenchannel_update\fR \fIid\fR \fIpsbt\fR
\fBopenchannel_update\fR \fIchannel_id\fR \fIpsbt\fR
.SH DESCRIPTION
\fBopenchannel_update\fR is a low level RPC command which continues an open
channel with peer, as specified by \fIid\fR\. An updated \fIpsbt\fR is passed in; any
channel, as specified by \fIchannel_id\fR\. An updated \fIpsbt\fR is passed in; any
changes from the PSBT last returned (either from \fBopenchannel_init\fR or
a previous call to \fBopenchannel_update\fR) will be communicated to the peer\.
@ -21,7 +21,7 @@ Must be called until \fIcommitments_secured\fR is returned as true, at which poi
returned by the last call to \fBopenchannel_update\fR\.
\fIid\fR is the node id of the remote peer\.
\fIchannel_id\fR is the id of the channel\.
\fIpsbt\fR is the updated PSBT to be sent to the peer\. May be identical to
@ -43,9 +43,9 @@ returned PSBT and calling \fBopenchannel_signed\fR to complete the channel open\
.IP \[bu]
305: Peer is not connected\.
.IP \[bu]
306: Unknown peer id\.
.IP \[bu]
309: PSBT missing required fields
.IP \[bu]
311: Unknown channel id\.
.RE
.SH SEE ALSO
@ -63,4 +63,4 @@ lightning-fundchannel_\fBstart\fR(7), lightning-fundchannel_\fBcomplete\fR(7),
Main web site: \fIhttps://github.com/ElementsProject/lightning\fR
\" SHA256STAMP:dcf253e7b1658e71a9721fccee76a6bb07af7579ca4b0413428d2a1e8c9613bc
\" SHA256STAMP:ab3d19be91c8b2e651a6f4a23552f21323c4f0096ceda8026bb2450c2f9c616c

8
doc/lightning-openchannel_update.7.md

@ -4,13 +4,13 @@ lightning-openchannel\_update -- Command to update a collab channel open
SYNOPSIS
--------
**openchannel_update** *id* *psbt*
**openchannel_update** *channel_id* *psbt*
DESCRIPTION
-----------
`openchannel_update` is a low level RPC command which continues an open
channel with peer, as specified by *id*. An updated *psbt* is passed in; any
channel, as specified by *channel_id*. An updated *psbt* is passed in; any
changes from the PSBT last returned (either from `openchannel_init` or
a previous call to `openchannel_update`) will be communicated to the peer.
@ -20,7 +20,7 @@ Must be called until *commitments_secured* is returned as true, at which point
`openchannel_signed` should be called with a signed version of the PSBT
returned by the last call to `openchannel_update`.
*id* is the node id of the remote peer.
*channel_id* is the id of the channel.
*psbt* is the updated PSBT to be sent to the peer. May be identical to
the PSBT last returned by either `openchannel_init` or `openchannel_update`.
@ -37,8 +37,8 @@ returned PSBT and calling `openchannel_signed` to complete the channel open.
- -32602: If the given parameters are wrong.
- -1: Catchall nonspecific error.
- 305: Peer is not connected.
- 306: Unknown peer id.
- 309: PSBT missing required fields
- 311: Unknown channel id.
SEE ALSO
--------

30
lightningd/channel.c

@ -20,6 +20,7 @@
#include <lightningd/log.h>
#include <lightningd/notification.h>
#include <lightningd/opening_control.h>
#include <lightningd/opening_common.h>
#include <lightningd/peer_control.h>
#include <lightningd/subd.h>
#include <wire/wire_sync.h>
@ -376,6 +377,35 @@ struct channel *channel_by_dbid(struct lightningd *ld, const u64 dbid)
return NULL;
}
struct channel *channel_by_cid(struct lightningd *ld,
const struct channel_id *cid,
struct uncommitted_channel **uc)
{
struct peer *p;
struct channel *channel;
list_for_each(&ld->peers, p, list) {
if (p->uncommitted_channel) {
if (channel_id_eq(&p->uncommitted_channel->cid, cid)) {
if (uc)
*uc = p->uncommitted_channel;
return NULL;
}
}
list_for_each(&p->channels, channel, list) {
if (channel_id_eq(&channel->cid, cid)) {
if (uc)
*uc = p->uncommitted_channel;
return channel;
}
}
}
if (uc)
*uc = NULL;
return NULL;
}
void channel_set_last_tx(struct channel *channel,
struct bitcoin_tx *tx,
const struct bitcoin_signature *sig,

5
lightningd/channel.h

@ -253,6 +253,11 @@ struct channel *channel_by_dbid(struct lightningd *ld, const u64 dbid);
struct channel *active_channel_by_scid(struct lightningd *ld,
const struct short_channel_id *scid);
/* Get channel by channel_id, optionally returning uncommitted_channel. */
struct channel *channel_by_cid(struct lightningd *ld,
const struct channel_id *cid,
struct uncommitted_channel **uc);
void channel_set_last_tx(struct channel *channel,
struct bitcoin_tx *tx,
const struct bitcoin_signature *sig,

58
lightningd/dual_open_control.c

@ -699,6 +699,7 @@ static void opener_psbt_changed(struct subd *dualopend,
json_add_psbt(response, "psbt", psbt);
json_add_bool(response, "commitments_secured", false);
uc->cid = cid;
uc->fc->inflight = true;
uc->fc->cmd = NULL;
was_pending(command_success(cmd, response));
@ -1009,32 +1010,25 @@ static struct command_result *json_open_channel_signed(struct command *cmd,
const jsmntok_t *params)
{
struct wally_psbt *psbt;
struct node_id *id;
struct peer *peer;
struct channel_id *cid;
struct channel *channel;
struct bitcoin_txid txid;
if (!param(cmd, buffer, params,
p_req("id", param_node_id, &id),
p_req("channel_id", param_channel_id, &cid),
p_req("signed_psbt", param_psbt, &psbt),
NULL))
return command_param_failed();
peer = peer_by_id(cmd->ld, id);
if (!peer)
return command_fail(cmd, FUNDING_UNKNOWN_PEER, "Unknown peer");
channel = peer_active_channel(peer);
channel = channel_by_cid(cmd->ld, cid, NULL);
if (!channel)
return command_fail(cmd, LIGHTNINGD,
"Peer has no active channel");
return command_fail(cmd, FUNDING_UNKNOWN_CHANNEL,
"Unknown channel");
if (!channel->pps)
return command_fail(cmd, LIGHTNINGD,
"Missing per-peer-state for channel, "
"are you in the right state to call "
"this method?");
if (channel->psbt)
return command_fail(cmd, LIGHTNINGD,
"Already have a finalized PSBT for "
@ -1053,7 +1047,6 @@ static struct command_result *json_open_channel_signed(struct command *cmd,
type_to_string(tmpctx, struct bitcoin_txid,
&txid));
/* Go ahead and try to finalize things, or what we can */
psbt_finalize(psbt);
@ -1082,47 +1075,48 @@ static struct command_result *json_open_channel_update(struct command *cmd,
const jsmntok_t *params)
{
struct wally_psbt *psbt;
struct node_id *id;
struct peer *peer;
struct channel_id *cid;
struct channel *channel;
struct uncommitted_channel *uc;
u8 *msg;
if (!param(cmd, buffer, params,
p_req("id", param_node_id, &id),
p_req("channel_id", param_channel_id, &cid),
p_req("psbt", param_psbt, &psbt),
NULL))
return command_param_failed();
peer = peer_by_id(cmd->ld, id);
if (!peer)
return command_fail(cmd, FUNDING_UNKNOWN_PEER, "Unknown peer");
channel = peer_active_channel(peer);
/* We expect this to return NULL, as the channel hasn't been
* created yet. Instead, the uncommitted channel is populated */
channel = channel_by_cid(cmd->ld, cid, &uc);
if (channel)
return command_fail(cmd, LIGHTNINGD, "Peer already %s",
return command_fail(cmd, LIGHTNINGD, "Channel already %s",
channel_state_name(channel));
if (!peer->uncommitted_channel)
return command_fail(cmd, FUNDING_PEER_NOT_CONNECTED,
"Peer not connected");
if (!uc)
return command_fail(cmd, FUNDING_UNKNOWN_CHANNEL,
"Unknown channel");
if (!peer->uncommitted_channel->fc || !peer->uncommitted_channel->fc->inflight)
return command_fail(cmd, LIGHTNINGD, "No channel funding in progress");
if (!uc->fc || !uc->fc->inflight)
return command_fail(cmd, LIGHTNINGD,
"No channel funding in progress");
if (peer->uncommitted_channel->fc->cmd)
return command_fail(cmd, LIGHTNINGD, "Channel funding in progress");
if (uc->fc->cmd)
return command_fail(cmd, LIGHTNINGD,
"Channel funding in progress");
/* Add serials to PSBT */
psbt_add_serials(psbt, TX_INITIATOR);
if (!psbt_has_required_fields(psbt))
return command_fail(cmd, FUNDING_PSBT_INVALID,
"PSBT is missing required fields %s",
type_to_string(tmpctx, struct wally_psbt, psbt));
type_to_string(tmpctx, struct wally_psbt,
psbt));
peer->uncommitted_channel->fc->cmd = cmd;
uc->fc->cmd = cmd;
msg = towire_dual_open_psbt_updated(NULL, psbt);
subd_send_msg(peer->uncommitted_channel->open_daemon, take(msg));
subd_send_msg(uc->open_daemon, take(msg));
return command_still_pending(cmd);
}

2
lightningd/opening_common.c

@ -47,6 +47,8 @@ new_uncommitted_channel(struct peer *peer)
uc->fc = NULL;
uc->our_config.id = 0;
memset(&uc->cid, 0xFF, sizeof(uc->cid));
get_channel_basepoints(ld, &uc->peer->id, uc->dbid,
&uc->local_basepoints, &uc->local_funding_pubkey);

4
lightningd/opening_common.h

@ -4,6 +4,7 @@
#include <bitcoin/pubkey.h>
#include <common/amount.h>
#include <common/channel_config.h>
#include <common/channel_id.h>
#include <common/derive_basepoints.h>
#include <common/status_levels.h>
@ -27,6 +28,9 @@ struct uncommitted_channel {
/* Reserved dbid for if we become a real struct channel */
u64 dbid;
/* Channel id, v2 opens only */
struct channel_id cid;
/* For logging */
struct log *log;

5
tests/plugins/df_opener.py

@ -69,14 +69,15 @@ def openchannel_v2(plugin, node_id, amount):
commitment_feerate=feerate,
funding_feerate=feerate)
cid = resp['channel_id']
# We don't have an updates, so we send update until our peer is also
# finished
while not resp['commitments_secured']:
resp = plugin.rpc.openchannel_update(node_id, resp['psbt'])
resp = plugin.rpc.openchannel_update(cid, resp['psbt'])
# fixme: pass in array of our input indexes to signonly
signed = plugin.rpc.signpsbt(resp['psbt'])
return plugin.rpc.openchannel_signed(node_id, signed['signed_psbt'])
return plugin.rpc.openchannel_signed(cid, signed['signed_psbt'])
@plugin.init()

Loading…
Cancel
Save