mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 21:35:11 +01:00
bitcoin: expose feerate_floor.
Onchaind will want it. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
4a5cff8490
commit
0e6c0dbba2
@ -20,6 +20,7 @@ BITCOIN_HEADERS := bitcoin/address.h \
|
||||
bitcoin/base58.h \
|
||||
bitcoin/block.h \
|
||||
bitcoin/chainparams.h \
|
||||
bitcoin/feerate.h \
|
||||
bitcoin/locktime.h \
|
||||
bitcoin/preimage.h \
|
||||
bitcoin/privkey.h \
|
||||
|
50
bitcoin/feerate.h
Normal file
50
bitcoin/feerate.h
Normal file
@ -0,0 +1,50 @@
|
||||
#ifndef LIGHTNING_BITCOIN_FEERATE_H
|
||||
#define LIGHTNING_BITCOIN_FEERATE_H
|
||||
#include "config.h"
|
||||
#include <ccan/build_assert/build_assert.h>
|
||||
#include <ccan/short_types/short_types.h>
|
||||
|
||||
/* bitcoind considers 250 satoshi per kw to be the minimum acceptable fee:
|
||||
* less than this won't even relay.
|
||||
*/
|
||||
#define BITCOIND_MINRELAYTXFEE_PER_KW 250
|
||||
/*
|
||||
* But bitcoind uses vbytes (ie. (weight + 3) / 4) for this
|
||||
* calculation, rather than weight, meaning we can disagree since we do
|
||||
* it sanely (as specified in BOLT #3).
|
||||
*/
|
||||
#define FEERATE_BITCOIND_SEES(feerate, weight) \
|
||||
(((feerate) * (weight)) / 1000 * 1000 / ((weight) + 3))
|
||||
/* ie. fee = (feerate * weight) // 1000
|
||||
* bitcoind needs (worst-case): fee * 1000 / (weight + 3) >= 250
|
||||
*
|
||||
* (feerate * weight) // 1000 * 1000 // (weight + 3) >= 250
|
||||
*
|
||||
* The feerate needs to be higher for lower weight, and our minimum tx weight
|
||||
* is 464 (version (4) + count_tx_in (1) + tx_in (32 + 4 + 1 + 4) +
|
||||
* count_tx_out (1) + amount (8) + P2WSH (1 + 1 + 32) + witness 1 + 1 + <sig>
|
||||
* + 1 + <key>). Assume it's 400 to give a significant safety margin (it
|
||||
* only makes 1 difference in the result anyway).
|
||||
*/
|
||||
#define MINIMUM_TX_WEIGHT 400
|
||||
|
||||
/*
|
||||
* This formula is satisfied by a feerate of 253 (hand-search).
|
||||
*/
|
||||
#define FEERATE_FLOOR 253
|
||||
|
||||
static inline u32 feerate_floor(void)
|
||||
{
|
||||
/* Assert that bitcoind will see this as above minRelayTxFee */
|
||||
BUILD_ASSERT(FEERATE_BITCOIND_SEES(FEERATE_FLOOR, MINIMUM_TX_WEIGHT)
|
||||
>= BITCOIND_MINRELAYTXFEE_PER_KW);
|
||||
/* And a lesser value won't do */
|
||||
BUILD_ASSERT(FEERATE_BITCOIND_SEES(FEERATE_FLOOR-1, MINIMUM_TX_WEIGHT)
|
||||
< BITCOIND_MINRELAYTXFEE_PER_KW);
|
||||
/* And I'm right about it being OK for larger txs, too */
|
||||
BUILD_ASSERT(FEERATE_BITCOIND_SEES(FEERATE_FLOOR, (MINIMUM_TX_WEIGHT*2))
|
||||
>= BITCOIND_MINRELAYTXFEE_PER_KW);
|
||||
|
||||
return FEERATE_FLOOR;
|
||||
}
|
||||
#endif /* LIGHTNING_BITCOIN_FEERATE_H */
|
@ -1,4 +1,5 @@
|
||||
#include "bitcoin/block.h"
|
||||
#include "bitcoin/feerate.h"
|
||||
#include "bitcoin/script.h"
|
||||
#include "bitcoin/tx.h"
|
||||
#include "bitcoind.h"
|
||||
@ -229,48 +230,6 @@ static const char *feerate_name(enum feerate feerate)
|
||||
/* Mutual recursion via timer. */
|
||||
static void next_updatefee_timer(struct chain_topology *topo);
|
||||
|
||||
/* bitcoind considers 250 satoshi per kw to be the minimum acceptable fee:
|
||||
* less than this won't even relay.
|
||||
*/
|
||||
#define BITCOIND_MINRELAYTXFEE_PER_KW 250
|
||||
/*
|
||||
* But bitcoind uses vbytes (ie. (weight + 3) / 4) for this
|
||||
* calculation, rather than weight, meaning we can disagree since we do
|
||||
* it sanely (as specified in BOLT #3).
|
||||
*/
|
||||
#define FEERATE_BITCOIND_SEES(feerate, weight) \
|
||||
(((feerate) * (weight)) / 1000 * 1000 / ((weight) + 3))
|
||||
/* ie. fee = (feerate * weight) // 1000
|
||||
* bitcoind needs (worst-case): fee * 1000 / (weight + 3) >= 4000
|
||||
*
|
||||
* (feerate * weight) // 1000 * 1000 // (weight + 3) >= 4000
|
||||
*
|
||||
* The feerate needs to be higher for lower weight, and our minimum tx weight
|
||||
* is 464 (version (4) + count_tx_in (1) + tx_in (32 + 4 + 1 + 4) +
|
||||
* count_tx_out (1) + amount (8) + P2WSH (1 + 1 + 32) + witness 1 + 1 + <sig>
|
||||
* + 1 + <key>). Assume it's 400 to give a significant safety margin (it
|
||||
* only makes 1 difference in the result anyway).
|
||||
*/
|
||||
#define MINIMUM_TX_WEIGHT 400
|
||||
/*
|
||||
* This formula is satisfied by a feerate of 4030 (hand-search).
|
||||
*/
|
||||
#define FEERATE_FLOOR 253
|
||||
u32 feerate_floor(void)
|
||||
{
|
||||
/* Assert that bitcoind will see this as above minRelayTxFee */
|
||||
BUILD_ASSERT(FEERATE_BITCOIND_SEES(FEERATE_FLOOR, MINIMUM_TX_WEIGHT)
|
||||
>= BITCOIND_MINRELAYTXFEE_PER_KW);
|
||||
/* And a lesser value won't do */
|
||||
BUILD_ASSERT(FEERATE_BITCOIND_SEES(FEERATE_FLOOR-1, MINIMUM_TX_WEIGHT)
|
||||
< BITCOIND_MINRELAYTXFEE_PER_KW);
|
||||
/* And I'm right about it being OK for larger txs, too */
|
||||
BUILD_ASSERT(FEERATE_BITCOIND_SEES(FEERATE_FLOOR, (MINIMUM_TX_WEIGHT*2))
|
||||
>= BITCOIND_MINRELAYTXFEE_PER_KW);
|
||||
|
||||
return FEERATE_FLOOR;
|
||||
}
|
||||
|
||||
/* We sanitize feerates if necessary to put them in descending order. */
|
||||
static void update_feerates(struct bitcoind *bitcoind,
|
||||
const u32 *satoshi_per_kw,
|
||||
|
@ -138,9 +138,6 @@ u32 get_block_height(const struct chain_topology *topo);
|
||||
/* Get fee rate in satoshi per kiloweight. */
|
||||
u32 get_feerate(const struct chain_topology *topo, enum feerate feerate);
|
||||
|
||||
/* Get the minimum possible fee to allow relaying by bitcoind */
|
||||
u32 feerate_floor(void);
|
||||
|
||||
/* Broadcast a single tx, and rebroadcast as reqd (copies tx).
|
||||
* If failed is non-NULL, call that and don't rebroadcast. */
|
||||
void broadcast_tx(struct chain_topology *topo,
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include "peer_control.h"
|
||||
#include "subd.h"
|
||||
#include <arpa/inet.h>
|
||||
#include <bitcoin/feerate.h>
|
||||
#include <bitcoin/script.h>
|
||||
#include <bitcoin/tx.h>
|
||||
#include <ccan/array_size/array_size.h>
|
||||
|
@ -73,9 +73,6 @@ bool extract_channel_id(const u8 *in_pkt UNNEEDED, struct channel_id *channel_id
|
||||
/* Generated stub for features_supported */
|
||||
bool features_supported(const u8 *gfeatures UNNEEDED, const u8 *lfeatures UNNEEDED)
|
||||
{ fprintf(stderr, "features_supported called!\n"); abort(); }
|
||||
/* Generated stub for feerate_floor */
|
||||
u32 feerate_floor(void)
|
||||
{ fprintf(stderr, "feerate_floor called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_gossipctl_peer_disconnect_reply */
|
||||
bool fromwire_gossipctl_peer_disconnect_reply(const void *p UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_gossipctl_peer_disconnect_reply called!\n"); abort(); }
|
||||
|
Loading…
Reference in New Issue
Block a user