Browse Source
We're going to reuse all this code for dualopend, which is coming soon.bump-pyln-proto
committed by
Rusty Russell
8 changed files with 271 additions and 217 deletions
@ -0,0 +1,146 @@ |
|||
#include <ccan/ccan/tal/str/str.h> |
|||
#include <common/json_command.h> |
|||
#include <common/jsonrpc_errors.h> |
|||
#include <connectd/connectd_wiregen.h> |
|||
#include <lightningd/channel.h> |
|||
#include <lightningd/log.h> |
|||
#include <lightningd/notification.h> |
|||
#include <lightningd/opening_common.h> |
|||
#include <lightningd/peer_control.h> |
|||
#include <lightningd/subd.h> |
|||
#include <wallet/wallet.h> |
|||
|
|||
static void destroy_uncommitted_channel(struct uncommitted_channel *uc) |
|||
{ |
|||
if (uc->open_daemon) { |
|||
struct subd *open_daemon= uc->open_daemon; |
|||
uc->open_daemon = NULL; |
|||
subd_release_channel(open_daemon, uc); |
|||
} |
|||
|
|||
/* This is how shutdown_subdaemons tells us not to delete from db! */ |
|||
if (!uc->peer->uncommitted_channel) |
|||
return; |
|||
|
|||
uc->peer->uncommitted_channel = NULL; |
|||
|
|||
maybe_delete_peer(uc->peer); |
|||
} |
|||
|
|||
struct uncommitted_channel * |
|||
new_uncommitted_channel(struct peer *peer) |
|||
{ |
|||
struct lightningd *ld = peer->ld; |
|||
struct uncommitted_channel *uc = tal(ld, struct uncommitted_channel); |
|||
|
|||
uc->peer = peer; |
|||
assert(!peer->uncommitted_channel); |
|||
|
|||
uc->transient_billboard = NULL; |
|||
uc->dbid = wallet_get_channel_dbid(ld->wallet); |
|||
|
|||
uc->log = new_log(uc, ld->log_book, &uc->peer->id, |
|||
"chan#%"PRIu64, uc->dbid); |
|||
|
|||
uc->fc = NULL; |
|||
uc->our_config.id = 0; |
|||
|
|||
get_channel_basepoints(ld, &uc->peer->id, uc->dbid, |
|||
&uc->local_basepoints, &uc->local_funding_pubkey); |
|||
|
|||
uc->peer->uncommitted_channel = uc; |
|||
tal_add_destructor(uc, destroy_uncommitted_channel); |
|||
|
|||
return uc; |
|||
} |
|||
|
|||
void opend_channel_errmsg(struct uncommitted_channel *uc, |
|||
struct per_peer_state *pps, |
|||
const struct channel_id *channel_id UNUSED, |
|||
const char *desc, |
|||
bool soft_error UNUSED, |
|||
const u8 *err_for_them UNUSED) |
|||
{ |
|||
/* Close fds, if any. */ |
|||
tal_free(pps); |
|||
uncommitted_channel_disconnect(uc, LOG_INFORM, desc); |
|||
tal_free(uc); |
|||
} |
|||
|
|||
/* There's nothing permanent in an unconfirmed transaction */ |
|||
void opend_channel_set_billboard(struct uncommitted_channel *uc, |
|||
bool perm UNUSED, |
|||
const char *happenings TAKES) |
|||
{ |
|||
uc->transient_billboard = tal_free(uc->transient_billboard); |
|||
if (happenings) |
|||
uc->transient_billboard = tal_strdup(uc, happenings); |
|||
} |
|||
|
|||
|
|||
void uncommitted_channel_disconnect(struct uncommitted_channel *uc, |
|||
enum log_level level, |
|||
const char *desc) |
|||
{ |
|||
u8 *msg = towire_connectd_peer_disconnected(tmpctx, &uc->peer->id); |
|||
log_(uc->log, level, NULL, false, "%s", desc); |
|||
subd_send_msg(uc->peer->ld->connectd, msg); |
|||
if (uc->fc && uc->fc->cmd) |
|||
was_pending(command_fail(uc->fc->cmd, LIGHTNINGD, "%s", desc)); |
|||
notify_disconnect(uc->peer->ld, &uc->peer->id); |
|||
} |
|||
|
|||
|
|||
void kill_uncommitted_channel(struct uncommitted_channel *uc, |
|||
const char *why) |
|||
{ |
|||
log_info(uc->log, "Killing opening daemon: %s", why); |
|||
|
|||
/* Close opend daemon. */ |
|||
subd_release_channel(uc->open_daemon, uc); |
|||
uc->open_daemon = NULL; |
|||
|
|||
uncommitted_channel_disconnect(uc, LOG_INFORM, why); |
|||
tal_free(uc); |
|||
} |
|||
|
|||
void channel_config(struct lightningd *ld, |
|||
struct channel_config *ours, |
|||
u32 *max_to_self_delay, |
|||
struct amount_msat *min_effective_htlc_capacity) |
|||
{ |
|||
/* FIXME: depend on feerate. */ |
|||
*max_to_self_delay = ld->config.locktime_max; |
|||
|
|||
/* Take minimal effective capacity from config min_capacity_sat */ |
|||
if (!amount_sat_to_msat(min_effective_htlc_capacity, |
|||
amount_sat(ld->config.min_capacity_sat))) |
|||
fatal("amount_msat overflow for config.min_capacity_sat"); |
|||
|
|||
/* BOLT #2:
|
|||
* |
|||
* The sending node SHOULD: |
|||
*... |
|||
* - set `dust_limit_satoshis` to a sufficient value to allow |
|||
* commitment transactions to propagate through the Bitcoin network. |
|||
*/ |
|||
ours->dust_limit = chainparams->dust_limit; |
|||
ours->max_htlc_value_in_flight = AMOUNT_MSAT(UINT64_MAX); |
|||
|
|||
/* Don't care */ |
|||
ours->htlc_minimum = AMOUNT_MSAT(0); |
|||
|
|||
/* BOLT #2:
|
|||
* |
|||
* The sending node SHOULD: |
|||
* - set `to_self_delay` sufficient to ensure the sender can |
|||
* irreversibly spend a commitment transaction output, in case of |
|||
* misbehavior by the receiver. |
|||
*/ |
|||
ours->to_self_delay = ld->config.locktime_blocks; |
|||
|
|||
ours->max_accepted_htlcs = ld->config.max_concurrent_htlcs; |
|||
|
|||
/* This is filled in by lightning_openingd, for consistency. */ |
|||
ours->channel_reserve = AMOUNT_SAT(UINT64_MAX); |
|||
} |
@ -0,0 +1,104 @@ |
|||
#ifndef LIGHTNING_LIGHTNINGD_OPENING_COMMON_H |
|||
#define LIGHTNING_LIGHTNINGD_OPENING_COMMON_H |
|||
#include "config.h" |
|||
#include <bitcoin/pubkey.h> |
|||
#include <common/amount.h> |
|||
#include <common/channel_config.h> |
|||
#include <common/derive_basepoints.h> |
|||
#include <common/status_levels.h> |
|||
|
|||
struct amount_msat; |
|||
struct amount_sat; |
|||
struct basepoints; |
|||
struct channel_config; |
|||
struct command; |
|||
struct lightningd; |
|||
struct log; |
|||
struct peer; |
|||
struct wally_tx; |
|||
|
|||
struct uncommitted_channel { |
|||
/* peer->uncommitted_channel == this */ |
|||
struct peer *peer; |
|||
|
|||
/* opening daemon which is running now */ |
|||
struct subd *open_daemon; |
|||
|
|||
/* Reserved dbid for if we become a real struct channel */ |
|||
u64 dbid; |
|||
|
|||
/* For logging */ |
|||
struct log *log; |
|||
|
|||
/* Openingd can tell us stuff. */ |
|||
const char *transient_billboard; |
|||
|
|||
/* If we offered channel, this contains information, otherwise NULL */ |
|||
struct funding_channel *fc; |
|||
|
|||
/* Our basepoints for the channel. */ |
|||
struct basepoints local_basepoints; |
|||
|
|||
/* Public key for funding tx. */ |
|||
struct pubkey local_funding_pubkey; |
|||
|
|||
/* These are *not* filled in by new_uncommitted_channel: */ |
|||
|
|||
/* Minimum funding depth (if opener == REMOTE). */ |
|||
u32 minimum_depth; |
|||
|
|||
/* Our channel config. */ |
|||
struct channel_config our_config; |
|||
}; |
|||
|
|||
struct funding_channel { |
|||
struct command *cmd; /* Which initially owns us until openingd request */ |
|||
|
|||
struct wallet_tx *wtx; |
|||
struct amount_msat push; |
|||
struct amount_sat funding; |
|||
u8 channel_flags; |
|||
const u8 *our_upfront_shutdown_script; |
|||
|
|||
/* Variables we need to compose fields in cmd's response */ |
|||
const char *hextx; |
|||
|
|||
/* Peer we're trying to reach. */ |
|||
struct pubkey peerid; |
|||
|
|||
/* Channel, subsequent owner of us */ |
|||
struct uncommitted_channel *uc; |
|||
|
|||
/* Whether or not this is in the middle of getting funded */ |
|||
bool inflight; |
|||
|
|||
/* Any commands trying to cancel us. */ |
|||
struct command **cancels; |
|||
}; |
|||
|
|||
struct uncommitted_channel * |
|||
new_uncommitted_channel(struct peer *peer); |
|||
|
|||
void opend_channel_errmsg(struct uncommitted_channel *uc, |
|||
struct per_peer_state *pps, |
|||
const struct channel_id *channel_id UNUSED, |
|||
const char *desc, |
|||
bool soft_error UNUSED, |
|||
const u8 *err_for_them UNUSED); |
|||
|
|||
void opend_channel_set_billboard(struct uncommitted_channel *uc, |
|||
bool perm UNUSED, |
|||
const char *happenings TAKES); |
|||
|
|||
void uncommitted_channel_disconnect(struct uncommitted_channel *uc, |
|||
enum log_level level, |
|||
const char *desc); |
|||
|
|||
void kill_uncommitted_channel(struct uncommitted_channel *uc, |
|||
const char *why); |
|||
|
|||
void channel_config(struct lightningd *ld, |
|||
struct channel_config *ours, |
|||
u32 *max_to_self_delay, |
|||
struct amount_msat *min_effective_htlc_capacity); |
|||
#endif /* LIGHTNING_LIGHTNINGD_OPENING_COMMON_H */ |
Loading…
Reference in new issue