mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-03-26 20:30:59 +01:00
onchaind: a feerate per transaction type
This allows us to set more fine-grained feerate for onchain resolution. We still give it the same feerate for all types, but this will change as we move feerates to bcli.
This commit is contained in:
parent
1aa8c90c73
commit
8cbc0038bc
5 changed files with 41 additions and 44 deletions
|
@ -545,7 +545,7 @@ enum watch_result onchaind_funding_spent(struct channel *channel,
|
|||
* we specify theirs. */
|
||||
channel->channel_info.their_config.to_self_delay,
|
||||
channel->our_config.to_self_delay,
|
||||
feerate,
|
||||
feerate, feerate, feerate,
|
||||
channel->our_config.dust_limit,
|
||||
&our_last_txid,
|
||||
channel->shutdown_scriptpubkey[LOCAL],
|
||||
|
|
|
@ -15,7 +15,9 @@ msgdata,onchain_init,old_remote_per_commitment_point,pubkey,
|
|||
msgdata,onchain_init,remote_per_commitment_point,pubkey,
|
||||
msgdata,onchain_init,local_to_self_delay,u32,
|
||||
msgdata,onchain_init,remote_to_self_delay,u32,
|
||||
msgdata,onchain_init,feerate_per_kw,u32,
|
||||
msgdata,onchain_init,delayed_to_us_feerate,u32,
|
||||
msgdata,onchain_init,htlc_feerate,u32,
|
||||
msgdata,onchain_init,penalty_feerate,u32,
|
||||
msgdata,onchain_init,local_dust_limit_satoshi,amount_sat,
|
||||
# Gives an easy way to tell if it's our unilateral close or theirs...
|
||||
msgdata,onchain_init,our_broadcast_txid,bitcoin_txid,
|
||||
|
|
|
|
@ -41,8 +41,14 @@ static const struct pubkey *remote_per_commitment_point;
|
|||
/* The commitment number we're dealing with (if not mutual close) */
|
||||
static u64 commit_num;
|
||||
|
||||
/* The feerate to use when we generate transactions. */
|
||||
static u32 feerate_per_kw;
|
||||
/* The feerate for the transaction spending our delayed output. */
|
||||
static u32 delayed_to_us_feerate;
|
||||
|
||||
/* The feerate for transactions spending HTLC outputs. */
|
||||
static u32 htlc_feerate;
|
||||
|
||||
/* The feerate for transactions spending from revoked transactions. */
|
||||
static u32 penalty_feerate;
|
||||
|
||||
/* Min and max feerates we ever used */
|
||||
static u32 min_possible_feerate, max_possible_feerate;
|
||||
|
@ -321,7 +327,8 @@ static struct bitcoin_tx *tx_to_us(const tal_t *ctx,
|
|||
u32 locktime,
|
||||
const void *elem, size_t elemsize,
|
||||
const u8 *wscript,
|
||||
enum tx_type *tx_type)
|
||||
enum tx_type *tx_type,
|
||||
u32 feerate)
|
||||
{
|
||||
struct bitcoin_tx *tx;
|
||||
struct amount_sat fee, min_out, amt;
|
||||
|
@ -340,7 +347,7 @@ static struct bitcoin_tx *tx_to_us(const tal_t *ctx,
|
|||
/* Worst-case sig is 73 bytes */
|
||||
weight = bitcoin_tx_weight(tx) + 1 + 3 + 73 + 0 + tal_count(wscript);
|
||||
weight = elements_add_overhead(weight, 1, 1);
|
||||
fee = amount_tx_fee(feerate_per_kw, weight);
|
||||
fee = amount_tx_fee(feerate, weight);
|
||||
|
||||
/* Result is trivial? Spend with small feerate, but don't wait
|
||||
* around for it as it might not confirm. */
|
||||
|
@ -977,10 +984,8 @@ static void resolve_htlc_tx(const struct chainparams *chainparams,
|
|||
* nSequence `to_self_delay` and a witness stack `<local_delayedsig>
|
||||
* 0`
|
||||
*/
|
||||
tx = tx_to_us(*outs, delayed_payment_to_us,
|
||||
out, to_self_delay[LOCAL], 0, NULL, 0,
|
||||
wscript,
|
||||
&tx_type);
|
||||
tx = tx_to_us(*outs, delayed_payment_to_us, out, to_self_delay[LOCAL],
|
||||
0, NULL, 0, wscript, &tx_type, htlc_feerate);
|
||||
|
||||
propose_resolution(out, tx, to_self_delay[LOCAL], tx_type);
|
||||
}
|
||||
|
@ -1002,10 +1007,8 @@ static void steal_htlc_tx(struct tracked_output *out)
|
|||
* To spend this via penalty, the remote node uses a witness stack
|
||||
* `<revocationsig> 1`
|
||||
*/
|
||||
tx = tx_to_us(out, penalty_to_us, out, 0xFFFFFFFF, 0,
|
||||
&ONE, sizeof(ONE),
|
||||
out->wscript,
|
||||
&tx_type);
|
||||
tx = tx_to_us(out, penalty_to_us, out, 0xFFFFFFFF, 0, &ONE,
|
||||
sizeof(ONE), out->wscript, &tx_type, penalty_feerate);
|
||||
propose_resolution(out, tx, 0, tx_type);
|
||||
}
|
||||
|
||||
|
@ -1326,11 +1329,10 @@ static void handle_preimage(const struct chainparams *chainparams,
|
|||
* - MUST *resolve* the output by spending it to a
|
||||
* convenient address.
|
||||
*/
|
||||
tx = tx_to_us(outs[i], remote_htlc_to_us,
|
||||
outs[i], 0, 0,
|
||||
preimage, sizeof(*preimage),
|
||||
outs[i]->wscript,
|
||||
&tx_type);
|
||||
tx = tx_to_us(outs[i], remote_htlc_to_us, outs[i], 0,
|
||||
0, preimage, sizeof(*preimage),
|
||||
outs[i]->wscript, &tx_type,
|
||||
htlc_feerate);
|
||||
propose_resolution(outs[i], tx, 0, tx_type);
|
||||
}
|
||||
}
|
||||
|
@ -1606,10 +1608,8 @@ static size_t resolve_our_htlc_theircommit(struct tracked_output *out,
|
|||
* - MUST *resolve* the output, by spending it to a convenient
|
||||
* address.
|
||||
*/
|
||||
tx = tx_to_us(out, remote_htlc_to_us,
|
||||
out, 0, cltv_expiry, NULL, 0,
|
||||
htlc_scripts[matches[0]],
|
||||
&tx_type);
|
||||
tx = tx_to_us(out, remote_htlc_to_us, out, 0, cltv_expiry, NULL, 0,
|
||||
htlc_scripts[matches[0]], &tx_type, htlc_feerate);
|
||||
|
||||
propose_resolution_at_block(out, tx, cltv_expiry, tx_type);
|
||||
|
||||
|
@ -1868,11 +1868,10 @@ static void handle_our_unilateral(const struct bitcoin_tx *tx,
|
|||
*
|
||||
* <local_delayedsig> 0
|
||||
*/
|
||||
to_us = tx_to_us(out, delayed_payment_to_us,
|
||||
out, to_self_delay[LOCAL], 0,
|
||||
NULL, 0,
|
||||
local_wscript,
|
||||
&tx_type);
|
||||
to_us = tx_to_us(out, delayed_payment_to_us, out,
|
||||
to_self_delay[LOCAL], 0, NULL, 0,
|
||||
local_wscript, &tx_type,
|
||||
delayed_to_us_feerate);
|
||||
|
||||
/* BOLT #5:
|
||||
*
|
||||
|
@ -1988,12 +1987,8 @@ static void steal_to_them_output(struct tracked_output *out)
|
|||
&keyset->self_revocation_key,
|
||||
&keyset->self_delayed_payment_key);
|
||||
|
||||
tx = tx_to_us(tmpctx,
|
||||
penalty_to_us,
|
||||
out, 0xFFFFFFFF, 0,
|
||||
&ONE, sizeof(ONE),
|
||||
wscript,
|
||||
&tx_type);
|
||||
tx = tx_to_us(tmpctx, penalty_to_us, out, 0xFFFFFFFF, 0, &ONE,
|
||||
sizeof(ONE), wscript, &tx_type, penalty_feerate);
|
||||
|
||||
propose_resolution(out, tx, 0, tx_type);
|
||||
}
|
||||
|
@ -2012,12 +2007,8 @@ static void steal_htlc(struct tracked_output *out)
|
|||
* <revocation_sig> <revocationpubkey>
|
||||
*/
|
||||
pubkey_to_der(der, &keyset->self_revocation_key);
|
||||
tx = tx_to_us(out,
|
||||
penalty_to_us,
|
||||
out, 0xFFFFFFFF, 0,
|
||||
der, sizeof(der),
|
||||
out->wscript,
|
||||
&tx_type);
|
||||
tx = tx_to_us(out, penalty_to_us, out, 0xFFFFFFFF, 0, der, sizeof(der),
|
||||
out->wscript, &tx_type, penalty_feerate);
|
||||
|
||||
propose_resolution(out, tx, 0, tx_type);
|
||||
}
|
||||
|
@ -2687,7 +2678,9 @@ int main(int argc, char *argv[])
|
|||
&remote_per_commit_point,
|
||||
&to_self_delay[LOCAL],
|
||||
&to_self_delay[REMOTE],
|
||||
&feerate_per_kw,
|
||||
&delayed_to_us_feerate,
|
||||
&htlc_feerate,
|
||||
&penalty_feerate,
|
||||
&dust_limit,
|
||||
&our_broadcast_txid,
|
||||
&scriptpubkey[LOCAL],
|
||||
|
@ -2710,7 +2703,9 @@ int main(int argc, char *argv[])
|
|||
|
||||
tx->chainparams = chainparams;
|
||||
|
||||
status_debug("feerate_per_kw = %u", feerate_per_kw);
|
||||
status_debug("delayed_to_us_feerate = %u, htlc_feerate = %u, "
|
||||
"penalty_feerate = %u", delayed_to_us_feerate,
|
||||
htlc_feerate, penalty_feerate);
|
||||
bitcoin_txid(tx, &txid);
|
||||
/* We need to keep tx around, but there's only one: not really a leak */
|
||||
tal_steal(ctx, notleak(tx));
|
||||
|
|
|
@ -43,7 +43,7 @@ bool fromwire_onchain_dev_memleak(const void *p UNNEEDED)
|
|||
bool fromwire_onchain_htlc(const void *p UNNEEDED, struct htlc_stub *htlc UNNEEDED, bool *tell_if_missing UNNEEDED, bool *tell_immediately UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_onchain_htlc called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_onchain_init */
|
||||
bool fromwire_onchain_init(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, struct shachain *shachain UNNEEDED, const struct chainparams **chainparams UNNEEDED, struct amount_sat *funding_amount_satoshi UNNEEDED, struct pubkey *old_remote_per_commitment_point UNNEEDED, struct pubkey *remote_per_commitment_point UNNEEDED, u32 *local_to_self_delay UNNEEDED, u32 *remote_to_self_delay UNNEEDED, u32 *feerate_per_kw UNNEEDED, struct amount_sat *local_dust_limit_satoshi UNNEEDED, struct bitcoin_txid *our_broadcast_txid UNNEEDED, u8 **local_scriptpubkey UNNEEDED, u8 **remote_scriptpubkey UNNEEDED, struct pubkey *ourwallet_pubkey UNNEEDED, enum side *funder UNNEEDED, struct basepoints *local_basepoints UNNEEDED, struct basepoints *remote_basepoints UNNEEDED, struct bitcoin_tx **tx UNNEEDED, u32 *tx_blockheight UNNEEDED, u32 *reasonable_depth UNNEEDED, secp256k1_ecdsa_signature **htlc_signature UNNEEDED, u64 *num_htlcs UNNEEDED, u32 *min_possible_feerate UNNEEDED, u32 *max_possible_feerate UNNEEDED, struct pubkey **possible_remote_per_commit_point UNNEEDED, bool *option_static_remotekey UNNEEDED)
|
||||
bool fromwire_onchain_init(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, struct shachain *shachain UNNEEDED, const struct chainparams **chainparams UNNEEDED, struct amount_sat *funding_amount_satoshi UNNEEDED, struct pubkey *old_remote_per_commitment_point UNNEEDED, struct pubkey *remote_per_commitment_point UNNEEDED, u32 *local_to_self_delay UNNEEDED, u32 *remote_to_self_delay UNNEEDED, u32 *delayed_to_us_feerate UNNEEDED, u32 *htlc_feerate UNNEEDED, u32 *penalty_feerate UNNEEDED, struct amount_sat *local_dust_limit_satoshi UNNEEDED, struct bitcoin_txid *our_broadcast_txid UNNEEDED, u8 **local_scriptpubkey UNNEEDED, u8 **remote_scriptpubkey UNNEEDED, struct pubkey *ourwallet_pubkey UNNEEDED, enum side *funder UNNEEDED, struct basepoints *local_basepoints UNNEEDED, struct basepoints *remote_basepoints UNNEEDED, struct bitcoin_tx **tx UNNEEDED, u32 *tx_blockheight UNNEEDED, u32 *reasonable_depth UNNEEDED, secp256k1_ecdsa_signature **htlc_signature UNNEEDED, u64 *num_htlcs UNNEEDED, u32 *min_possible_feerate UNNEEDED, u32 *max_possible_feerate UNNEEDED, struct pubkey **possible_remote_per_commit_point UNNEEDED, bool *option_static_remotekey UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_onchain_init called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_onchain_known_preimage */
|
||||
bool fromwire_onchain_known_preimage(const void *p UNNEEDED, struct preimage *preimage UNNEEDED)
|
||||
|
|
|
@ -47,7 +47,7 @@ bool fromwire_onchain_dev_memleak(const void *p UNNEEDED)
|
|||
bool fromwire_onchain_htlc(const void *p UNNEEDED, struct htlc_stub *htlc UNNEEDED, bool *tell_if_missing UNNEEDED, bool *tell_immediately UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_onchain_htlc called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_onchain_init */
|
||||
bool fromwire_onchain_init(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, struct shachain *shachain UNNEEDED, const struct chainparams **chainparams UNNEEDED, struct amount_sat *funding_amount_satoshi UNNEEDED, struct pubkey *old_remote_per_commitment_point UNNEEDED, struct pubkey *remote_per_commitment_point UNNEEDED, u32 *local_to_self_delay UNNEEDED, u32 *remote_to_self_delay UNNEEDED, u32 *feerate_per_kw UNNEEDED, struct amount_sat *local_dust_limit_satoshi UNNEEDED, struct bitcoin_txid *our_broadcast_txid UNNEEDED, u8 **local_scriptpubkey UNNEEDED, u8 **remote_scriptpubkey UNNEEDED, struct pubkey *ourwallet_pubkey UNNEEDED, enum side *funder UNNEEDED, struct basepoints *local_basepoints UNNEEDED, struct basepoints *remote_basepoints UNNEEDED, struct bitcoin_tx **tx UNNEEDED, u32 *tx_blockheight UNNEEDED, u32 *reasonable_depth UNNEEDED, secp256k1_ecdsa_signature **htlc_signature UNNEEDED, u64 *num_htlcs UNNEEDED, u32 *min_possible_feerate UNNEEDED, u32 *max_possible_feerate UNNEEDED, struct pubkey **possible_remote_per_commit_point UNNEEDED, bool *option_static_remotekey UNNEEDED)
|
||||
bool fromwire_onchain_init(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, struct shachain *shachain UNNEEDED, const struct chainparams **chainparams UNNEEDED, struct amount_sat *funding_amount_satoshi UNNEEDED, struct pubkey *old_remote_per_commitment_point UNNEEDED, struct pubkey *remote_per_commitment_point UNNEEDED, u32 *local_to_self_delay UNNEEDED, u32 *remote_to_self_delay UNNEEDED, u32 *delayed_to_us_feerate UNNEEDED, u32 *htlc_feerate UNNEEDED, u32 *penalty_feerate UNNEEDED, struct amount_sat *local_dust_limit_satoshi UNNEEDED, struct bitcoin_txid *our_broadcast_txid UNNEEDED, u8 **local_scriptpubkey UNNEEDED, u8 **remote_scriptpubkey UNNEEDED, struct pubkey *ourwallet_pubkey UNNEEDED, enum side *funder UNNEEDED, struct basepoints *local_basepoints UNNEEDED, struct basepoints *remote_basepoints UNNEEDED, struct bitcoin_tx **tx UNNEEDED, u32 *tx_blockheight UNNEEDED, u32 *reasonable_depth UNNEEDED, secp256k1_ecdsa_signature **htlc_signature UNNEEDED, u64 *num_htlcs UNNEEDED, u32 *min_possible_feerate UNNEEDED, u32 *max_possible_feerate UNNEEDED, struct pubkey **possible_remote_per_commit_point UNNEEDED, bool *option_static_remotekey UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_onchain_init called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_onchain_known_preimage */
|
||||
bool fromwire_onchain_known_preimage(const void *p UNNEEDED, struct preimage *preimage UNNEEDED)
|
||||
|
|
Loading…
Add table
Reference in a new issue