mirror of
https://github.com/aljazceru/lightning.git
synced 2026-02-03 05:04:21 +01:00
daemon: accept feechange packets.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user