mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-03-02 18:35:00 +01:00
channeld: save old remote_per_commit and return it in init.
We need the old remote per_commitment_point so we can validate the per_commitment_secret when we get it. We unify this housekeeping in the master daemon using update_per_commit_point(). This patch also saves whether remote funding is locked, and disallows doing that twice (channeld should ignore it). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
e3debe5adb
commit
d236e724a9
6 changed files with 35 additions and 28 deletions
|
@ -1568,6 +1568,7 @@ static void init_channel(struct peer *peer)
|
||||||
&points[REMOTE].payment,
|
&points[REMOTE].payment,
|
||||||
&points[REMOTE].delayed_payment,
|
&points[REMOTE].delayed_payment,
|
||||||
&peer->remote_per_commit,
|
&peer->remote_per_commit,
|
||||||
|
&peer->old_remote_per_commit,
|
||||||
&am_funder,
|
&am_funder,
|
||||||
&peer->fee_base,
|
&peer->fee_base,
|
||||||
&peer->fee_per_satoshi,
|
&peer->fee_per_satoshi,
|
||||||
|
|
|
@ -30,7 +30,8 @@ channel_init,,remote_fundingkey,33
|
||||||
channel_init,,revocation_basepoint,33
|
channel_init,,revocation_basepoint,33
|
||||||
channel_init,,payment_basepoint,33
|
channel_init,,payment_basepoint,33
|
||||||
channel_init,,delayed_payment_basepoint,33
|
channel_init,,delayed_payment_basepoint,33
|
||||||
channel_init,,their_per_commit_point,33
|
channel_init,,remote_per_commit,33
|
||||||
|
channel_init,,old_remote_per_commit,33
|
||||||
channel_init,,am_funder,bool
|
channel_init,,am_funder,bool
|
||||||
channel_init,,fee_base,4
|
channel_init,,fee_base,4
|
||||||
channel_init,,fee_proportional,4
|
channel_init,,fee_proportional,4
|
||||||
|
|
|
|
@ -284,18 +284,18 @@ void add_peer(struct lightningd *ld, u64 unique_id,
|
||||||
peer->ld = ld;
|
peer->ld = ld;
|
||||||
peer->unique_id = unique_id;
|
peer->unique_id = unique_id;
|
||||||
peer->owner = NULL;
|
peer->owner = NULL;
|
||||||
peer->scid = NULL;
|
|
||||||
peer->id = *id;
|
peer->id = *id;
|
||||||
peer->fd = fd;
|
peer->fd = fd;
|
||||||
peer->reconnected = false;
|
peer->reconnected = false;
|
||||||
peer->gossip_client_fd = -1;
|
peer->gossip_client_fd = -1;
|
||||||
peer->cs = tal_dup(peer, struct crypto_state, cs);
|
peer->cs = tal_dup(peer, struct crypto_state, cs);
|
||||||
peer->funding_txid = NULL;
|
peer->funding_txid = NULL;
|
||||||
|
peer->remote_funding_locked = false;
|
||||||
|
peer->scid = NULL;
|
||||||
peer->seed = NULL;
|
peer->seed = NULL;
|
||||||
peer->balance = NULL;
|
peer->balance = NULL;
|
||||||
peer->state = UNINITIALIZED;
|
peer->state = UNINITIALIZED;
|
||||||
peer->channel_info = NULL;
|
peer->channel_info = NULL;
|
||||||
peer->next_per_commitment_point = NULL;
|
|
||||||
peer->last_was_revoke = false;
|
peer->last_was_revoke = false;
|
||||||
peer->last_sent_commit = NULL;
|
peer->last_sent_commit = NULL;
|
||||||
peer->num_commits_sent = peer->num_commits_received
|
peer->num_commits_sent = peer->num_commits_received
|
||||||
|
@ -859,12 +859,14 @@ static int peer_got_funding_locked(struct peer *peer, const u8 *msg)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In case of re-transmit. */
|
if (peer->remote_funding_locked) {
|
||||||
peer->next_per_commitment_point
|
log_broken(peer->log, "channel_got_funding_locked twice");
|
||||||
= tal_free(peer->next_per_commitment_point);
|
return -1;
|
||||||
peer->next_per_commitment_point
|
}
|
||||||
= tal_dup(peer, struct pubkey, &next_per_commitment_point);
|
update_per_commit_point(peer, &next_per_commitment_point);
|
||||||
|
|
||||||
log_debug(peer->log, "Got funding_locked");
|
log_debug(peer->log, "Got funding_locked");
|
||||||
|
peer->remote_funding_locked = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -953,7 +955,7 @@ static bool peer_start_channeld_hsmfd(struct subd *hsm, const u8 *resp,
|
||||||
|
|
||||||
if (peer->scid) {
|
if (peer->scid) {
|
||||||
funding_channel_id = *peer->scid;
|
funding_channel_id = *peer->scid;
|
||||||
log_debug(peer->log, "Got funding confirmations");
|
log_debug(peer->log, "Already have funding locked in");
|
||||||
peer_set_condition(peer, GETTING_HSMFD, CHANNELD_NORMAL);
|
peer_set_condition(peer, GETTING_HSMFD, CHANNELD_NORMAL);
|
||||||
} else {
|
} else {
|
||||||
log_debug(peer->log, "Waiting for funding confirmations");
|
log_debug(peer->log, "Waiting for funding confirmations");
|
||||||
|
@ -974,7 +976,8 @@ static bool peer_start_channeld_hsmfd(struct subd *hsm, const u8 *resp,
|
||||||
&peer->channel_info->theirbase.revocation,
|
&peer->channel_info->theirbase.revocation,
|
||||||
&peer->channel_info->theirbase.payment,
|
&peer->channel_info->theirbase.payment,
|
||||||
&peer->channel_info->theirbase.delayed_payment,
|
&peer->channel_info->theirbase.delayed_payment,
|
||||||
&peer->channel_info->their_per_commit_point,
|
&peer->channel_info->remote_per_commit,
|
||||||
|
&peer->channel_info->old_remote_per_commit,
|
||||||
peer->funder == LOCAL,
|
peer->funder == LOCAL,
|
||||||
cfg->fee_base,
|
cfg->fee_base,
|
||||||
cfg->fee_per_satoshi,
|
cfg->fee_per_satoshi,
|
||||||
|
@ -994,7 +997,7 @@ static bool peer_start_channeld_hsmfd(struct subd *hsm, const u8 *resp,
|
||||||
fulfilled_htlcs, fulfilled_sides,
|
fulfilled_htlcs, fulfilled_sides,
|
||||||
failed_htlcs, failed_sides,
|
failed_htlcs, failed_sides,
|
||||||
peer->scid != NULL,
|
peer->scid != NULL,
|
||||||
peer->next_per_commitment_point != NULL,
|
peer->remote_funding_locked,
|
||||||
&funding_channel_id,
|
&funding_channel_id,
|
||||||
peer->reconnected,
|
peer->reconnected,
|
||||||
peer->funding_signed);
|
peer->funding_signed);
|
||||||
|
@ -1064,7 +1067,7 @@ static bool opening_funder_finished(struct subd *opening, const u8 *resp,
|
||||||
&channel_info->theirbase.revocation,
|
&channel_info->theirbase.revocation,
|
||||||
&channel_info->theirbase.payment,
|
&channel_info->theirbase.payment,
|
||||||
&channel_info->theirbase.delayed_payment,
|
&channel_info->theirbase.delayed_payment,
|
||||||
&channel_info->their_per_commit_point,
|
&channel_info->remote_per_commit,
|
||||||
&fc->peer->minimum_depth,
|
&fc->peer->minimum_depth,
|
||||||
&channel_info->remote_fundingkey,
|
&channel_info->remote_fundingkey,
|
||||||
&funding_txid)) {
|
&funding_txid)) {
|
||||||
|
@ -1074,6 +1077,9 @@ static bool opening_funder_finished(struct subd *opening, const u8 *resp,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* old_remote_per_commit not valid yet, copy valid one. */
|
||||||
|
channel_info->old_remote_per_commit = channel_info->remote_per_commit;
|
||||||
|
|
||||||
/* Generate the funding tx. */
|
/* Generate the funding tx. */
|
||||||
if (fc->change
|
if (fc->change
|
||||||
&& !bip32_pubkey(fc->peer->ld->bip32_base,
|
&& !bip32_pubkey(fc->peer->ld->bip32_base,
|
||||||
|
@ -1145,7 +1151,6 @@ static bool opening_fundee_finished(struct subd *opening,
|
||||||
|
|
||||||
/* At this point, we care about peer */
|
/* At this point, we care about peer */
|
||||||
peer->channel_info = channel_info = tal(peer, struct channel_info);
|
peer->channel_info = channel_info = tal(peer, struct channel_info);
|
||||||
|
|
||||||
peer->funding_txid = tal(peer, struct sha256_double);
|
peer->funding_txid = tal(peer, struct sha256_double);
|
||||||
if (!fromwire_opening_fundee_reply(peer, reply, NULL,
|
if (!fromwire_opening_fundee_reply(peer, reply, NULL,
|
||||||
&channel_info->their_config,
|
&channel_info->their_config,
|
||||||
|
@ -1154,7 +1159,7 @@ static bool opening_fundee_finished(struct subd *opening,
|
||||||
&channel_info->theirbase.revocation,
|
&channel_info->theirbase.revocation,
|
||||||
&channel_info->theirbase.payment,
|
&channel_info->theirbase.payment,
|
||||||
&channel_info->theirbase.delayed_payment,
|
&channel_info->theirbase.delayed_payment,
|
||||||
&channel_info->their_per_commit_point,
|
&channel_info->remote_per_commit,
|
||||||
&channel_info->remote_fundingkey,
|
&channel_info->remote_fundingkey,
|
||||||
peer->funding_txid,
|
peer->funding_txid,
|
||||||
&peer->funding_outnum,
|
&peer->funding_outnum,
|
||||||
|
@ -1165,6 +1170,8 @@ static bool opening_fundee_finished(struct subd *opening,
|
||||||
tal_hex(reply, reply));
|
tal_hex(reply, reply));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
/* old_remote_per_commit not valid yet, copy valid one. */
|
||||||
|
channel_info->old_remote_per_commit = channel_info->remote_per_commit;
|
||||||
|
|
||||||
/* We should have sent and received the first commitsig */
|
/* We should have sent and received the first commitsig */
|
||||||
if (!peer_save_commitsig_received(peer, 0)
|
if (!peer_save_commitsig_received(peer, 0)
|
||||||
|
|
|
@ -60,9 +60,6 @@ struct peer {
|
||||||
/* funding_signed packet for fundee, waiting to send. */
|
/* funding_signed packet for fundee, waiting to send. */
|
||||||
const u8 *funding_signed;
|
const u8 *funding_signed;
|
||||||
|
|
||||||
/* Channel if locked. */
|
|
||||||
struct short_channel_id *scid;
|
|
||||||
|
|
||||||
/* Minimum funding depth (specified by us if they fund). */
|
/* Minimum funding depth (specified by us if they fund). */
|
||||||
u32 minimum_depth;
|
u32 minimum_depth;
|
||||||
|
|
||||||
|
@ -74,6 +71,9 @@ struct peer {
|
||||||
struct sha256_double *funding_txid;
|
struct sha256_double *funding_txid;
|
||||||
u16 funding_outnum;
|
u16 funding_outnum;
|
||||||
u64 funding_satoshi, push_msat;
|
u64 funding_satoshi, push_msat;
|
||||||
|
bool remote_funding_locked;
|
||||||
|
/* Channel if locked locally. */
|
||||||
|
struct short_channel_id *scid;
|
||||||
|
|
||||||
/* Amount going to us, not counting unfinished HTLCs; if we have one. */
|
/* Amount going to us, not counting unfinished HTLCs; if we have one. */
|
||||||
u64 *balance;
|
u64 *balance;
|
||||||
|
@ -81,9 +81,6 @@ struct peer {
|
||||||
/* Keys for channel. */
|
/* Keys for channel. */
|
||||||
struct channel_info *channel_info;
|
struct channel_info *channel_info;
|
||||||
|
|
||||||
/* Their next per-commit point, if known. */
|
|
||||||
struct pubkey *next_per_commitment_point;
|
|
||||||
|
|
||||||
/* Secret seed (FIXME: Move to hsm!) */
|
/* Secret seed (FIXME: Move to hsm!) */
|
||||||
struct privkey *seed;
|
struct privkey *seed;
|
||||||
|
|
||||||
|
|
|
@ -1047,14 +1047,12 @@ int peer_got_commitsig(struct peer *peer, const u8 *msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Shuffle them over, forgetting the ancient one. */
|
/* Shuffle them over, forgetting the ancient one. */
|
||||||
static void update_per_commit_point(struct peer *peer,
|
void update_per_commit_point(struct peer *peer,
|
||||||
const struct pubkey *per_commitment_point)
|
const struct pubkey *per_commitment_point)
|
||||||
{
|
{
|
||||||
peer->channel_info->their_per_commit_point
|
struct channel_info *ci = peer->channel_info;
|
||||||
= *peer->next_per_commitment_point;
|
ci->old_remote_per_commit = ci->remote_per_commit;
|
||||||
tal_free(peer->next_per_commitment_point);
|
ci->remote_per_commit = *per_commitment_point;
|
||||||
peer->next_per_commitment_point = tal_dup(peer, struct pubkey,
|
|
||||||
per_commitment_point);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int peer_got_revoke(struct peer *peer, const u8 *msg)
|
int peer_got_revoke(struct peer *peer, const u8 *msg)
|
||||||
|
|
|
@ -11,7 +11,7 @@ struct channel_info {
|
||||||
struct channel_config their_config;
|
struct channel_config their_config;
|
||||||
struct pubkey remote_fundingkey;
|
struct pubkey remote_fundingkey;
|
||||||
struct basepoints theirbase;
|
struct basepoints theirbase;
|
||||||
struct pubkey their_per_commit_point;
|
struct pubkey remote_per_commit, old_remote_per_commit;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Get all HTLCs for a peer, to send in init message. */
|
/* Get all HTLCs for a peer, to send in init message. */
|
||||||
|
@ -31,6 +31,9 @@ int peer_sending_commitsig(struct peer *peer, const u8 *msg);
|
||||||
int peer_got_commitsig(struct peer *peer, const u8 *msg);
|
int peer_got_commitsig(struct peer *peer, const u8 *msg);
|
||||||
int peer_got_revoke(struct peer *peer, const u8 *msg);
|
int peer_got_revoke(struct peer *peer, const u8 *msg);
|
||||||
|
|
||||||
|
void update_per_commit_point(struct peer *peer,
|
||||||
|
const struct pubkey *per_commitment_point);
|
||||||
|
|
||||||
enum onion_type send_htlc_out(struct peer *out, u64 amount, u32 cltv,
|
enum onion_type send_htlc_out(struct peer *out, u64 amount, u32 cltv,
|
||||||
const struct sha256 *payment_hash,
|
const struct sha256 *payment_hash,
|
||||||
const u8 *onion_routing_packet,
|
const u8 *onion_routing_packet,
|
||||||
|
|
Loading…
Add table
Reference in a new issue