mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 09:54:16 +01:00
dual-fund: patch in channel_type logic
There's no reason not to use the channel-types (same as v1s) for v2 opens. Brings us into compliance with ACINQ's implementation afaict
This commit is contained in:
parent
4fe8e1eccf
commit
df4bd6287a
@ -61,6 +61,10 @@ struct channel_type *default_channel_type(const tal_t *ctx,
|
||||
if (feature_negotiated(our_features, their_features,
|
||||
OPT_ANCHOR_OUTPUTS))
|
||||
return channel_type_anchor_outputs(ctx);
|
||||
else if (feature_negotiated(our_features, their_features,
|
||||
OPT_DUAL_FUND))
|
||||
/* OPT_DUAL_FUND implies static remotekey */
|
||||
return channel_type_static_remotekey(ctx);
|
||||
/* BOLT #2:
|
||||
* - otherwise, if `option_static_remotekey` was negotiated:
|
||||
* - the `channel_type` is `option_static_remotekey` (bit 12)
|
||||
|
@ -254,10 +254,6 @@ struct channel *new_unsaved_channel(struct peer *peer,
|
||||
channel->static_remotekey_start[LOCAL]
|
||||
= channel->static_remotekey_start[REMOTE] = 0;
|
||||
|
||||
channel->type = default_channel_type(channel,
|
||||
peer->ld->our_features,
|
||||
peer->their_features);
|
||||
|
||||
channel->future_per_commitment_point = NULL;
|
||||
|
||||
channel->lease_commit_sig = NULL;
|
||||
|
@ -1199,7 +1199,8 @@ wallet_commit_channel(struct lightningd *ld,
|
||||
const struct amount_sat lease_fee,
|
||||
secp256k1_ecdsa_signature *lease_commit_sig STEALS,
|
||||
const u32 lease_chan_max_msat,
|
||||
const u16 lease_chan_max_ppt)
|
||||
const u16 lease_chan_max_ppt,
|
||||
const struct channel_type *type)
|
||||
{
|
||||
struct amount_msat our_msat, lease_fee_msat;
|
||||
struct channel_inflight *inflight;
|
||||
@ -1256,7 +1257,9 @@ wallet_commit_channel(struct lightningd *ld,
|
||||
channel->scb->funding = *funding;
|
||||
channel->scb->cid = channel->cid;
|
||||
channel->scb->funding_sats = total_funding;
|
||||
channel->scb->type = channel_type_dup(channel->scb, channel->type);
|
||||
|
||||
channel->type = channel_type_dup(channel, type);
|
||||
channel->scb->type = channel_type_dup(channel->scb, type);
|
||||
|
||||
if (our_upfront_shutdown_script)
|
||||
channel->shutdown_scriptpubkey[LOCAL]
|
||||
@ -2915,6 +2918,7 @@ static void handle_commit_received(struct subd *dualopend,
|
||||
struct openchannel2_psbt_payload *payload;
|
||||
struct channel_inflight *inflight;
|
||||
struct command *cmd = oa->cmd;
|
||||
struct channel_type *channel_type;
|
||||
secp256k1_ecdsa_signature *lease_commit_sig;
|
||||
|
||||
if (!fromwire_dualopend_commit_rcvd(tmpctx, msg,
|
||||
@ -2942,7 +2946,8 @@ static void handle_commit_received(struct subd *dualopend,
|
||||
&lease_fee,
|
||||
&lease_commit_sig,
|
||||
&lease_chan_max_msat,
|
||||
&lease_chan_max_ppt)) {
|
||||
&lease_chan_max_ppt,
|
||||
&channel_type)) {
|
||||
channel_internal_error(channel,
|
||||
"Bad WIRE_DUALOPEND_COMMIT_RCVD: %s",
|
||||
tal_hex(msg, msg));
|
||||
@ -2976,7 +2981,8 @@ static void handle_commit_received(struct subd *dualopend,
|
||||
lease_fee,
|
||||
lease_commit_sig,
|
||||
lease_chan_max_msat,
|
||||
lease_chan_max_ppt))) {
|
||||
lease_chan_max_ppt,
|
||||
channel_type))) {
|
||||
channel_internal_error(channel,
|
||||
"wallet_commit_channel failed"
|
||||
" (chan %s)",
|
||||
@ -3524,7 +3530,8 @@ bool peer_restart_dualopend(struct peer *peer,
|
||||
inflight->lease_chan_max_msat,
|
||||
inflight->lease_chan_max_ppt,
|
||||
/* FIXME: requested lease? */
|
||||
NULL);
|
||||
NULL,
|
||||
channel->type);
|
||||
|
||||
subd_send_msg(channel->owner, take(msg));
|
||||
return true;
|
||||
|
@ -192,6 +192,9 @@ struct state {
|
||||
* channeld-specific as initial channels never have HTLCs. */
|
||||
struct channel *channel;
|
||||
|
||||
/* Channel type we agreed on (even before channel populated) */
|
||||
struct channel_type *channel_type;
|
||||
|
||||
struct feature_set *our_features;
|
||||
|
||||
/* Tally of which sides are locked, or not */
|
||||
@ -1671,7 +1674,6 @@ static void revert_channel_state(struct state *state)
|
||||
struct amount_sat total;
|
||||
struct amount_msat our_msats;
|
||||
enum side opener = state->our_role == TX_INITIATOR ? LOCAL : REMOTE;
|
||||
const struct channel_type *type;
|
||||
|
||||
/* We've already checked this */
|
||||
if (!amount_sat_add(&total, tx_state->opener_funding,
|
||||
@ -1686,8 +1688,6 @@ static void revert_channel_state(struct state *state)
|
||||
abort();
|
||||
|
||||
tal_free(state->channel);
|
||||
type = default_channel_type(NULL,
|
||||
state->our_features, state->their_features);
|
||||
state->channel = new_initial_channel(state,
|
||||
&state->channel_id,
|
||||
&tx_state->funding,
|
||||
@ -1706,7 +1706,7 @@ static void revert_channel_state(struct state *state)
|
||||
&state->their_points,
|
||||
&state->our_funding_pubkey,
|
||||
&state->their_funding_pubkey,
|
||||
take(type),
|
||||
state->channel_type,
|
||||
feature_offered(state->their_features,
|
||||
OPT_LARGE_CHANNELS),
|
||||
opener);
|
||||
@ -1729,7 +1729,6 @@ static u8 *accepter_commits(struct state *state,
|
||||
const u8 *wscript;
|
||||
u8 *msg;
|
||||
char *error;
|
||||
const struct channel_type *type;
|
||||
|
||||
/* Find the funding transaction txid */
|
||||
psbt_txid(NULL, tx_state->psbt, &tx_state->funding.txid, NULL);
|
||||
@ -1786,9 +1785,6 @@ static u8 *accepter_commits(struct state *state,
|
||||
"Overflow converting accepter_funding "
|
||||
"to msats");
|
||||
|
||||
type = default_channel_type(NULL,
|
||||
state->our_features, state->their_features);
|
||||
|
||||
/*~ Report the channel parameters to the signer. */
|
||||
msg = towire_hsmd_ready_channel(NULL,
|
||||
false, /* is_outbound */
|
||||
@ -1803,7 +1799,7 @@ static u8 *accepter_commits(struct state *state,
|
||||
&state->their_funding_pubkey,
|
||||
tx_state->remoteconf.to_self_delay,
|
||||
state->upfront_shutdown_script[REMOTE],
|
||||
type);
|
||||
state->channel_type);
|
||||
wire_sync_write(HSM_FD, take(msg));
|
||||
msg = wire_sync_read(tmpctx, HSM_FD);
|
||||
if (!fromwire_hsmd_ready_channel_reply(msg))
|
||||
@ -1830,7 +1826,7 @@ static u8 *accepter_commits(struct state *state,
|
||||
&state->their_points,
|
||||
&state->our_funding_pubkey,
|
||||
&state->their_funding_pubkey,
|
||||
take(type),
|
||||
state->channel_type,
|
||||
feature_offered(state->their_features,
|
||||
OPT_LARGE_CHANNELS),
|
||||
REMOTE);
|
||||
@ -1959,7 +1955,8 @@ static u8 *accepter_commits(struct state *state,
|
||||
tx_state->lease_fee,
|
||||
tx_state->lease_commit_sig,
|
||||
tx_state->lease_chan_max_msat,
|
||||
tx_state->lease_chan_max_ppt);
|
||||
tx_state->lease_chan_max_ppt,
|
||||
state->channel_type);
|
||||
|
||||
wire_sync_write(REQ_FD, take(msg));
|
||||
msg = wire_sync_read(tmpctx, REQ_FD);
|
||||
@ -2085,6 +2082,30 @@ static void accepter_start(struct state *state, const u8 *oc2_msg)
|
||||
type_to_string(tmpctx, struct channel_id,
|
||||
&cid));
|
||||
|
||||
/* BOLT #2:
|
||||
* The receiving node MUST fail the channel if:
|
||||
*...
|
||||
* - It supports `channel_type` and `channel_type` was set:
|
||||
* - if `type` is not suitable.
|
||||
* - if `type` includes `option_zeroconf` and it does not trust the sender to open an unconfirmed channel.
|
||||
*/
|
||||
if (open_tlv->channel_type) {
|
||||
state->channel_type =
|
||||
channel_type_accept(state,
|
||||
open_tlv->channel_type,
|
||||
state->our_features,
|
||||
state->their_features);
|
||||
if (!state->channel_type)
|
||||
negotiation_failed(state,
|
||||
"Did not support channel_type %s",
|
||||
fmt_featurebits(tmpctx,
|
||||
open_tlv->channel_type));
|
||||
} else
|
||||
state->channel_type
|
||||
= default_channel_type(state,
|
||||
state->our_features,
|
||||
state->their_features);
|
||||
|
||||
/* Since anchor outputs are optional, we
|
||||
* only support liquidity ads if those are enabled. */
|
||||
if (open_tlv->request_funds &&
|
||||
@ -2296,6 +2317,12 @@ static void accepter_start(struct state *state, const u8 *oc2_msg)
|
||||
0);
|
||||
}
|
||||
|
||||
/* BOLT #2:
|
||||
* - if `option_channel_type` was negotiated:
|
||||
* - MUST set `channel_type` to the `channel_type` from `open_channel`
|
||||
*/
|
||||
a_tlv->channel_type = state->channel_type->features;
|
||||
|
||||
/* BOLT- #2:
|
||||
* The accepting node:
|
||||
* ...
|
||||
@ -2392,7 +2419,6 @@ static u8 *opener_commits(struct state *state,
|
||||
u8 *msg;
|
||||
char *error;
|
||||
struct amount_msat their_msats;
|
||||
const struct channel_type *type;
|
||||
|
||||
wscript = bitcoin_redeem_2of2(tmpctx, &state->our_funding_pubkey,
|
||||
&state->their_funding_pubkey);
|
||||
@ -2442,10 +2468,6 @@ static u8 *opener_commits(struct state *state,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Ok, we're mostly good now? Let's do this */
|
||||
type = default_channel_type(NULL,
|
||||
state->our_features, state->their_features);
|
||||
|
||||
/*~ Report the channel parameters to the signer. */
|
||||
msg = towire_hsmd_ready_channel(NULL,
|
||||
true, /* is_outbound */
|
||||
@ -2460,7 +2482,7 @@ static u8 *opener_commits(struct state *state,
|
||||
&state->their_funding_pubkey,
|
||||
tx_state->remoteconf.to_self_delay,
|
||||
state->upfront_shutdown_script[REMOTE],
|
||||
type);
|
||||
state->channel_type);
|
||||
wire_sync_write(HSM_FD, take(msg));
|
||||
msg = wire_sync_read(tmpctx, HSM_FD);
|
||||
if (!fromwire_hsmd_ready_channel_reply(msg))
|
||||
@ -2485,7 +2507,7 @@ static u8 *opener_commits(struct state *state,
|
||||
&state->their_points,
|
||||
&state->our_funding_pubkey,
|
||||
&state->their_funding_pubkey,
|
||||
take(type),
|
||||
state->channel_type,
|
||||
feature_offered(state->their_features,
|
||||
OPT_LARGE_CHANNELS),
|
||||
/* Opener is local */
|
||||
@ -2664,8 +2686,8 @@ static u8 *opener_commits(struct state *state,
|
||||
tx_state->lease_fee,
|
||||
tx_state->lease_commit_sig,
|
||||
tx_state->lease_chan_max_msat,
|
||||
tx_state->lease_chan_max_ppt);
|
||||
|
||||
tx_state->lease_chan_max_ppt,
|
||||
state->channel_type);
|
||||
}
|
||||
|
||||
static void opener_start(struct state *state, u8 *msg)
|
||||
@ -2696,8 +2718,22 @@ static void opener_start(struct state *state, u8 *msg)
|
||||
|
||||
state->our_role = TX_INITIATOR;
|
||||
tx_state->tx_locktime = tx_state->psbt->tx->locktime;
|
||||
|
||||
open_tlv = tlv_opening_tlvs_new(tmpctx);
|
||||
|
||||
/* BOLT #2:
|
||||
* - if it includes `channel_type`:
|
||||
* - MUST set it to a defined type representing the type it wants.
|
||||
* - MUST use the smallest bitmap possible to represent the channel
|
||||
* type.
|
||||
* - SHOULD NOT set it to a type containing a feature which was not
|
||||
* negotiated.
|
||||
*/
|
||||
state->channel_type = default_channel_type(state,
|
||||
state->our_features,
|
||||
state->their_features);
|
||||
open_tlv->channel_type = state->channel_type->features;
|
||||
|
||||
if (requested_lease)
|
||||
state->requested_lease = tal_steal(state, requested_lease);
|
||||
|
||||
@ -2829,6 +2865,19 @@ static void opener_start(struct state *state, u8 *msg)
|
||||
open_err_warn(state, "%s", "Abort requested");
|
||||
}
|
||||
|
||||
/* BOLT #2:
|
||||
* - if `channel_type` is set, and `channel_type` was set in
|
||||
* `open_channel`, and they are not equal types:
|
||||
* - MUST reject the channel.
|
||||
*/
|
||||
if (a_tlv->channel_type
|
||||
&& !featurebits_eq(a_tlv->channel_type,
|
||||
state->channel_type->features))
|
||||
negotiation_failed(state,
|
||||
"Return unoffered channel_type: %s",
|
||||
fmt_featurebits(tmpctx,
|
||||
a_tlv->channel_type));
|
||||
|
||||
/* If we've requested funds and they've failed to provide
|
||||
* to lease us (or give them to us for free?!) then we fail.
|
||||
* This isn't spec'd but it makes the UX predictable */
|
||||
@ -3867,7 +3916,6 @@ int main(int argc, char *argv[])
|
||||
u8 *msg;
|
||||
struct amount_sat total_funding, *requested_lease;
|
||||
struct amount_msat our_msat;
|
||||
const struct channel_type *type;
|
||||
|
||||
subdaemon_setup(argc, argv);
|
||||
|
||||
@ -3911,7 +3959,6 @@ int main(int argc, char *argv[])
|
||||
|
||||
/* No lease requested at start! */
|
||||
state->requested_lease = NULL;
|
||||
|
||||
} else if (fromwire_dualopend_reinit(state, msg,
|
||||
&chainparams,
|
||||
&state->our_features,
|
||||
@ -3948,16 +3995,13 @@ int main(int argc, char *argv[])
|
||||
&state->tx_state->lease_commit_sig,
|
||||
&state->tx_state->lease_chan_max_msat,
|
||||
&state->tx_state->lease_chan_max_ppt,
|
||||
&requested_lease)) {
|
||||
&requested_lease,
|
||||
&state->channel_type)) {
|
||||
|
||||
bool ok;
|
||||
|
||||
/*~ We only reconnect on channels that the
|
||||
* saved the the database (exchanged commitment sigs) */
|
||||
type = default_channel_type(NULL,
|
||||
state->our_features,
|
||||
state->their_features);
|
||||
|
||||
if (requested_lease)
|
||||
state->requested_lease = tal_steal(state, requested_lease);
|
||||
else
|
||||
@ -3979,7 +4023,7 @@ int main(int argc, char *argv[])
|
||||
&state->their_points,
|
||||
&state->our_funding_pubkey,
|
||||
&state->their_funding_pubkey,
|
||||
take(type),
|
||||
state->channel_type,
|
||||
feature_offered(state->their_features,
|
||||
OPT_LARGE_CHANNELS),
|
||||
opener);
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <common/cryptomsg.h>
|
||||
#include <common/channel_config.h>
|
||||
#include <common/channel_id.h>
|
||||
#include <common/channel_type.h>
|
||||
#include <common/derive_basepoints.h>
|
||||
#include <common/features.h>
|
||||
#include <common/fee_states.h>
|
||||
@ -68,6 +69,7 @@ msgdata,dualopend_reinit,lease_commit_sig,?secp256k1_ecdsa_signature,
|
||||
msgdata,dualopend_reinit,lease_chan_max_msat,u32,
|
||||
msgdata,dualopend_reinit,lease_chan_max_ppt,u16,
|
||||
msgdata,dualopend_reinit,requested_lease,?amount_sat,
|
||||
msgdata,dualopend_reinit,channel_type,channel_type,
|
||||
|
||||
# dualopend->master: they offered channel, should we continue?
|
||||
msgtype,dualopend_got_offer,7005
|
||||
@ -155,6 +157,7 @@ msgdata,dualopend_commit_rcvd,lease_fee,amount_sat,
|
||||
msgdata,dualopend_commit_rcvd,lease_commit_sig,?secp256k1_ecdsa_signature,
|
||||
msgdata,dualopend_commit_rcvd,lease_chan_max_msat,u32,
|
||||
msgdata,dualopend_commit_rcvd,lease_chan_max_ppt,u16,
|
||||
msgdata,dualopend_commit_rcvd,channel_type,channel_type,
|
||||
|
||||
# dualopend->master: peer updated the psbt
|
||||
msgtype,dualopend_psbt_changed,7107
|
||||
|
Can't render this file because it has a wrong number of fields in line 15.
|
Loading…
Reference in New Issue
Block a user