mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-22 00:24:19 +01:00
elements: Fix fee estimation for the htlc success and timeout txs
Signed-off-by: Christian Decker <decker.christian@gmail.com>
This commit is contained in:
committed by
Rusty Russell
parent
e6d5b70e72
commit
83140892fb
@@ -4,6 +4,7 @@
|
|||||||
#include <bitcoin/chainparams.h>
|
#include <bitcoin/chainparams.h>
|
||||||
#include <common/amount.h>
|
#include <common/amount.h>
|
||||||
#include <common/htlc.h>
|
#include <common/htlc.h>
|
||||||
|
#include <common/utils.h>
|
||||||
|
|
||||||
struct bitcoin_signature;
|
struct bitcoin_signature;
|
||||||
struct bitcoin_txid;
|
struct bitcoin_txid;
|
||||||
@@ -12,6 +13,32 @@ struct preimage;
|
|||||||
struct pubkey;
|
struct pubkey;
|
||||||
struct ripemd160;
|
struct ripemd160;
|
||||||
|
|
||||||
|
/** Attempt to compute the elements overhead given a base bitcoin size.
|
||||||
|
*
|
||||||
|
* The overhead consists of 2 empty proofs for the transaction, 6 bytes of
|
||||||
|
* proofs per input and 35 bytes per output. In addition the explicit fee
|
||||||
|
* output will add 9 bytes and the per output overhead as well.
|
||||||
|
*/
|
||||||
|
static inline size_t elements_add_overhead(size_t weight, size_t incount,
|
||||||
|
size_t outcount)
|
||||||
|
{
|
||||||
|
if (is_elements) {
|
||||||
|
/* Each transaction has surjection and rangeproof (both empty
|
||||||
|
* for us as long as we use unblinded L-BTC transactions). */
|
||||||
|
weight += 2 * 4;
|
||||||
|
/* For elements we also need to add the fee output and the
|
||||||
|
* overhead for rangeproofs into the mix. */
|
||||||
|
weight += (8 + 1) * 4; /* Bitcoin style output */
|
||||||
|
|
||||||
|
/* All outputs have a bit of elements overhead */
|
||||||
|
weight += (32 + 1 + 1 + 1) * 4 * (outcount + 1); /* Elements added fields */
|
||||||
|
|
||||||
|
/* Inputs have 6 bytes of blank proofs attached. */
|
||||||
|
weight += 6 * incount;
|
||||||
|
}
|
||||||
|
return weight;
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct amount_sat htlc_timeout_fee(u32 feerate_per_kw)
|
static inline struct amount_sat htlc_timeout_fee(u32 feerate_per_kw)
|
||||||
{
|
{
|
||||||
/* BOLT #3:
|
/* BOLT #3:
|
||||||
@@ -21,7 +48,7 @@ static inline struct amount_sat htlc_timeout_fee(u32 feerate_per_kw)
|
|||||||
* 1. Multiply `feerate_per_kw` by 663 and divide by 1000 (rounding
|
* 1. Multiply `feerate_per_kw` by 663 and divide by 1000 (rounding
|
||||||
* down).
|
* down).
|
||||||
*/
|
*/
|
||||||
return amount_tx_fee(663, feerate_per_kw);
|
return amount_tx_fee(elements_add_overhead(663, 1, 1), feerate_per_kw);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct amount_sat htlc_success_fee(u32 feerate_per_kw)
|
static inline struct amount_sat htlc_success_fee(u32 feerate_per_kw)
|
||||||
@@ -33,7 +60,7 @@ static inline struct amount_sat htlc_success_fee(u32 feerate_per_kw)
|
|||||||
* 1. Multiply `feerate_per_kw` by 703 and divide by 1000 (rounding
|
* 1. Multiply `feerate_per_kw` by 703 and divide by 1000 (rounding
|
||||||
* down).
|
* down).
|
||||||
*/
|
*/
|
||||||
return amount_tx_fee(703, feerate_per_kw);
|
return amount_tx_fee(elements_add_overhead(703, 1, 1), feerate_per_kw);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create HTLC-success tx to spend a received HTLC commitment tx
|
/* Create HTLC-success tx to spend a received HTLC commitment tx
|
||||||
|
|||||||
@@ -165,6 +165,8 @@ static bool set_htlc_timeout_fee(struct bitcoin_tx *tx,
|
|||||||
{
|
{
|
||||||
static struct amount_sat fee = AMOUNT_SAT_INIT(UINT64_MAX);
|
static struct amount_sat fee = AMOUNT_SAT_INIT(UINT64_MAX);
|
||||||
struct amount_sat amount = bitcoin_tx_output_get_amount(tx, 0);
|
struct amount_sat amount = bitcoin_tx_output_get_amount(tx, 0);
|
||||||
|
size_t weight = elements_add_overhead(663, tx->wtx->num_inputs,
|
||||||
|
tx->wtx->num_outputs);
|
||||||
|
|
||||||
/* BOLT #3:
|
/* BOLT #3:
|
||||||
*
|
*
|
||||||
@@ -175,7 +177,7 @@ static bool set_htlc_timeout_fee(struct bitcoin_tx *tx,
|
|||||||
*/
|
*/
|
||||||
if (amount_sat_eq(fee, AMOUNT_SAT(UINT64_MAX))) {
|
if (amount_sat_eq(fee, AMOUNT_SAT(UINT64_MAX))) {
|
||||||
struct amount_sat grindfee;
|
struct amount_sat grindfee;
|
||||||
if (grind_htlc_tx_fee(&grindfee, tx, remotesig, wscript, 663)) {
|
if (grind_htlc_tx_fee(&grindfee, tx, remotesig, wscript, weight)) {
|
||||||
/* Cache this for next time */
|
/* Cache this for next time */
|
||||||
fee = grindfee;
|
fee = grindfee;
|
||||||
return true;
|
return true;
|
||||||
@@ -200,7 +202,8 @@ static void set_htlc_success_fee(struct bitcoin_tx *tx,
|
|||||||
const u8 *wscript)
|
const u8 *wscript)
|
||||||
{
|
{
|
||||||
static struct amount_sat amt, fee = AMOUNT_SAT_INIT(UINT64_MAX);
|
static struct amount_sat amt, fee = AMOUNT_SAT_INIT(UINT64_MAX);
|
||||||
|
size_t weight = elements_add_overhead(703, tx->wtx->num_inputs,
|
||||||
|
tx->wtx->num_outputs);
|
||||||
/* BOLT #3:
|
/* BOLT #3:
|
||||||
*
|
*
|
||||||
* The fee for an HTLC-success transaction:
|
* The fee for an HTLC-success transaction:
|
||||||
@@ -209,7 +212,7 @@ static void set_htlc_success_fee(struct bitcoin_tx *tx,
|
|||||||
* (rounding down).
|
* (rounding down).
|
||||||
*/
|
*/
|
||||||
if (amount_sat_eq(fee, AMOUNT_SAT(UINT64_MAX))) {
|
if (amount_sat_eq(fee, AMOUNT_SAT(UINT64_MAX))) {
|
||||||
if (!grind_htlc_tx_fee(&fee, tx, remotesig, wscript, 703))
|
if (!grind_htlc_tx_fee(&fee, tx, remotesig, wscript, weight))
|
||||||
status_failed(STATUS_FAIL_INTERNAL_ERROR,
|
status_failed(STATUS_FAIL_INTERNAL_ERROR,
|
||||||
"htlc_success_fee can't be found "
|
"htlc_success_fee can't be found "
|
||||||
" for tx %s, signature %s, wscript %s",
|
" for tx %s, signature %s, wscript %s",
|
||||||
|
|||||||
Reference in New Issue
Block a user