diff --git a/daemon/db.c b/daemon/db.c index 27de6c2c8..5d60160d3 100644 --- a/daemon/db.c +++ b/daemon/db.c @@ -510,7 +510,6 @@ static void load_peer_htlcs(struct peer *peer) struct htlc *htlc; struct sha256 rhash; enum htlc_state hstate; - u64 id; if (err != SQLITE_ROW) fatal("load_peer_htlcs:step gave %s:%s", diff --git a/daemon/packets.c b/daemon/packets.c index f266937bf..9f7d78f74 100644 --- a/daemon/packets.c +++ b/daemon/packets.c @@ -483,6 +483,14 @@ Pkt *accept_pkt_htlc_fulfill(struct peer *peer, const Pkt *pkt, struct htlc **h, return NULL; } +Pkt *accept_pkt_update_fee(struct peer *peer, const Pkt *pkt, u64 *feerate) +{ + const UpdateFee *f = pkt->update_fee; + + *feerate = f->fee_rate; + return NULL; +} + Pkt *accept_pkt_commit(struct peer *peer, const Pkt *pkt, struct bitcoin_signature *sig) { diff --git a/daemon/packets.h b/daemon/packets.h index f30bb0575..1823ea1c5 100644 --- a/daemon/packets.h +++ b/daemon/packets.h @@ -49,6 +49,8 @@ Pkt *accept_pkt_htlc_fail(struct peer *peer, const Pkt *pkt, struct htlc **h); Pkt *accept_pkt_htlc_fulfill(struct peer *peer, const Pkt *pkt, struct htlc **h, bool *was_already_fulfilled); +Pkt *accept_pkt_update_fee(struct peer *peer, const Pkt *pkt, u64 *feerate); + Pkt *accept_pkt_update_accept(struct peer *peer, const Pkt *pkt); Pkt *accept_pkt_commit(struct peer *peer, const Pkt *pkt, diff --git a/daemon/peer.c b/daemon/peer.c index 8a0e38864..c983a8306 100644 --- a/daemon/peer.c +++ b/daemon/peer.c @@ -1091,6 +1091,45 @@ static Pkt *handle_pkt_htlc_fulfill(struct peer *peer, const Pkt *pkt) return NULL; } +static void set_feechange(struct peer *peer, u64 fee_rate, + enum feechange_state state) +{ + /* If we already have a feechange for this commit, simply update it. */ + if (peer->feechanges[state]) { + log_debug(peer->log, "Feechange: fee %"PRIu64" to %"PRIu64, + peer->feechanges[state]->fee_rate, + fee_rate); + peer->feechanges[state]->fee_rate = fee_rate; + } else { + log_debug(peer->log, "Feechange: New fee %"PRIu64, fee_rate); + peer->feechanges[state] = new_feechange(peer, fee_rate, state); + } +} + +static Pkt *handle_pkt_feechange(struct peer *peer, const Pkt *pkt) +{ + u64 feerate; + Pkt *err; + + err = accept_pkt_update_fee(peer, pkt, &feerate); + if (err) + return err; + + /* BOLT #2: + * + * The sending node MUST NOT send a `fee_rate` which it could not + * afford (see "Fee Calculation), were it applied to the receiving + * node's commitment transaction. The receiving node SHOULD fail the + * connection if this occurs. + */ + if (!can_afford_feerate(peer->local.staging_cstate, feerate, REMOTE)) + return pkt_err(peer, "Cannot afford feerate %"PRIu64, + feerate); + + set_feechange(peer, feerate, RCVD_FEECHANGE); + return NULL; +} + static Pkt *handle_pkt_revocation(struct peer *peer, const Pkt *pkt, enum state next_state) { @@ -1262,6 +1301,9 @@ static bool shutdown_pkt_in(struct peer *peer, const Pkt *pkt) case PKT__PKT_UPDATE_FAIL_HTLC: err = handle_pkt_htlc_fail(peer, pkt); break; + case PKT__PKT_UPDATE_FEE: + err = handle_pkt_feechange(peer, pkt); + break; case PKT__PKT_UPDATE_COMMIT: err = handle_pkt_commit(peer, pkt); break; @@ -1368,6 +1410,10 @@ static bool normal_pkt_in(struct peer *peer, const Pkt *pkt) err = handle_pkt_htlc_fail(peer, pkt); break; + case PKT__PKT_UPDATE_FEE: + err = handle_pkt_feechange(peer, pkt); + break; + case PKT_UPDATE_COMMIT: err = handle_pkt_commit(peer, pkt); break;