Files
palladum-lightning/common/utxo.h
Rusty Russell 74e7264d54 bitcoin: make input witness weight calculation explicit.
This is inspired by a patch from @whitslack, which overlapped with this series.
Most importantly, there was only one call to bitcoin_tx_simple_input_weight(),
and it is better to be explicit with that one.

This also changes our funder calculation to assume our own input is taproot,
which it is likely to be given we've defaulted to taproot for outputs for
change addresses since 23.08.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2025-05-06 12:27:53 +09:30

96 lines
2.8 KiB
C

#ifndef LIGHTNING_COMMON_UTXO_H
#define LIGHTNING_COMMON_UTXO_H
#include "config.h"
#include <assert.h>
#include <bitcoin/tx.h>
#include <common/node_id.h>
struct ext_key;
/* Information needed for their_unilateral/to-us outputs */
struct unilateral_close_info {
u64 channel_id;
struct node_id peer_id;
bool option_anchors;
/* NULL if this is an option_static_remotekey commitment */
struct pubkey *commitment_point;
u32 csv;
};
/* Possible states for tracked outputs in the database. Not sure yet
* whether we really want to have reservations reflected in the
* database, it would simplify queries at the cost of some IO ops */
/* /!\ This is a DB ENUM, please do not change the numbering of any
* already defined elements (adding is ok) /!\ */
enum output_status {
OUTPUT_STATE_AVAILABLE = 0,
OUTPUT_STATE_RESERVED = 1,
OUTPUT_STATE_SPENT = 2,
/* Special status used to express that we don't care in
* queries */
OUTPUT_STATE_ANY = 255
};
const char *utxotype_to_str(enum utxotype utxotype);
struct utxo {
struct bitcoin_outpoint outpoint;
struct amount_sat amount;
u32 keyindex;
enum utxotype utxotype;
enum output_status status;
/* Optional unilateral close information, NULL if this is just
* a HD key */
struct unilateral_close_info *close_info;
/* NULL if we haven't seen it in a block, otherwise the block it's in */
const u32 *blockheight;
/* NULL if not spent yet, otherwise, the block the spending transaction is in */
const u32 *spendheight;
/* Block this utxo becomes unreserved, if applicable */
u32 reserved_til;
/* The scriptPubkey if it is known */
u8 *scriptPubkey;
/* Is this utxo a coinbase output */
bool is_in_coinbase;
};
/* We lazy-evaluate whether a utxo is really still reserved. */
static inline bool utxo_is_reserved(const struct utxo *utxo, u32 current_height)
{
if (utxo->status != OUTPUT_STATE_RESERVED)
return false;
return utxo->reserved_til > current_height;
}
static inline bool utxo_is_csv_locked(const struct utxo *utxo, u32 current_height)
{
if (!utxo->close_info)
return false;
/* BOLT #3:
* If `option_anchors` applies to the commitment transaction, the
* `to_remote` output is encumbered by a one block csv lock.
*/
if (!utxo->blockheight && utxo->close_info->option_anchors)
return true;
assert(*utxo->blockheight + utxo->close_info->csv > *utxo->blockheight);
return *utxo->blockheight + utxo->close_info->csv > current_height;
}
/* Estimate of (signed) UTXO weight in transaction */
size_t utxo_spend_weight(const struct utxo *utxo, size_t min_witness_weight);
/**
* Determine how many blocks until a UTXO becomes mature.
*
* Returns 0 for non-coinbase outputs or the number of blocks to mature.
*/
u32 utxo_is_immature(const struct utxo *utxo, u32 blockheight);
#endif /* LIGHTNING_COMMON_UTXO_H */