mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 18:11:28 +01:00
017d199305
BOLT#2 says we MUST NOT send out commit messages with no changes (and we drop the connection if the peer does). But that's harder than it sounds: we can have changes in theory which cancel out (eg. fee adjustments, not yet implemented) or others which don't change the commit tx (eg. dust outputs). Simplest is to have a generation count, which also allows us to simply show number of pending changes in RPC. It's 32 bit, but you can only use it to screw yourself really (each side can only add 1500 htlcs, so the rest would have to be fee changes; wrapping will only make us hang up on you). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
160 lines
4.8 KiB
C
160 lines
4.8 KiB
C
#ifndef LIGHTNING_FUNDING_H
|
|
#define LIGHTNING_FUNDING_H
|
|
#include "config.h"
|
|
#include "bitcoin/locktime.h"
|
|
#include <ccan/crypto/sha256/sha256.h>
|
|
#include <ccan/tal/tal.h>
|
|
#include <stdbool.h>
|
|
|
|
struct channel_htlc {
|
|
u64 id;
|
|
u64 msatoshis;
|
|
struct abs_locktime expiry;
|
|
struct sha256 rhash;
|
|
};
|
|
|
|
struct channel_oneside {
|
|
/* Payment and fee is in millisatoshi. */
|
|
uint32_t pay_msat, fee_msat;
|
|
/* Use tal_count to get the number */
|
|
struct channel_htlc *htlcs;
|
|
};
|
|
|
|
struct channel_state {
|
|
/* Satoshis paid by anchor. */
|
|
uint64_t anchor;
|
|
/* Satoshis per 1000 bytes. */
|
|
uint32_t fee_rate;
|
|
/* Generation counter (incremented on every change) */
|
|
uint32_t changes;
|
|
struct channel_oneside a, b;
|
|
};
|
|
|
|
/**
|
|
* initial_funding: Given A, B, and anchor, what is initial state?
|
|
* @ctx: tal context to allocate return value from.
|
|
* @am_funder: am I paying for the anchor?
|
|
* @anchor_satoshis: The anchor amount.
|
|
* @fee_rate: amount to pay in fees per kb (in satoshi).
|
|
*
|
|
* Returns state, or NULL if malformed.
|
|
*/
|
|
struct channel_state *initial_funding(const tal_t *ctx,
|
|
bool am_funder,
|
|
uint64_t anchor_satoshis,
|
|
uint32_t fee_rate);
|
|
|
|
/**
|
|
* copy_funding: Make a deep copy of channel_state
|
|
* @ctx: tal context to allocate return value from.
|
|
* @cstate: state to copy.
|
|
*/
|
|
struct channel_state *copy_funding(const tal_t *ctx,
|
|
const struct channel_state *cstate);
|
|
|
|
/**
|
|
* funding_a_add_htlc: append an HTLC to A's side of cstate if it can afford it
|
|
* @cstate: The channel state
|
|
* @msatoshis: Millisatoshi A is putting into a HTLC
|
|
* @expiry: time it expires
|
|
* @rhash: hash of redeem secret
|
|
* @id: 64-bit ID for htlc
|
|
*
|
|
* If A can't afford the HTLC (or still owes its half of the fees),
|
|
* this will return false and leave @cstate unchanged. Otherwise
|
|
* cstate->a.htlcs will have the HTLC appended, and pay_msat and
|
|
* fee_msat are adjusted accordingly.
|
|
*/
|
|
bool funding_a_add_htlc(struct channel_state *cstate,
|
|
u32 msatoshis, const struct abs_locktime *expiry,
|
|
const struct sha256 *rhash, uint64_t id);
|
|
|
|
bool funding_b_add_htlc(struct channel_state *cstate,
|
|
u32 msatoshis, const struct abs_locktime *expiry,
|
|
const struct sha256 *rhash, uint64_t id);
|
|
|
|
/**
|
|
* funding_a_fail_htlc: remove an HTLC from A's side of cstate, funds to A
|
|
* @cstate: The channel state
|
|
* @index: the index into cstate->a.htlcs[].
|
|
*
|
|
* This will remove the @index'th entry in cstate->a.htlcs[], and credit
|
|
* the value of the HTLC (back) to A.
|
|
*/
|
|
void funding_a_fail_htlc(struct channel_state *cstate, size_t index);
|
|
void funding_b_fail_htlc(struct channel_state *cstate, size_t index);
|
|
|
|
/**
|
|
* funding_a_fulfill_htlc: remove an HTLC from A's side of cstate, funds to B
|
|
* @cstate: The channel state
|
|
* @index: the index into cstate->a.htlcs[].
|
|
*
|
|
* This will remove the @index'th entry in cstate->a.htlcs[], and credit
|
|
* the value of the HTLC to B.
|
|
*/
|
|
void funding_a_fulfill_htlc(struct channel_state *cstate, size_t index);
|
|
void funding_b_fulfill_htlc(struct channel_state *cstate, size_t index);
|
|
|
|
/**
|
|
* adjust_fee: Change fee rate.
|
|
* @cstate: The channel state
|
|
* @fee_rate: fee in satoshi per 1000 bytes.
|
|
*/
|
|
void adjust_fee(struct channel_state *cstate, uint32_t fee_rate);
|
|
|
|
/**
|
|
* force_fee: Change fee to a specific value.
|
|
* @cstate: The channel state
|
|
* @fee: fee in satoshi.
|
|
*
|
|
* This is used for the close transaction, which specifies an exact fee.
|
|
* If the fee cannot be paid in full, this return false (but cstate will
|
|
* still be altered).
|
|
*/
|
|
bool force_fee(struct channel_state *cstate, uint64_t fee);
|
|
|
|
/**
|
|
* invert_cstate: Get the other side's state.
|
|
* @cstate: the state to invert.
|
|
*/
|
|
void invert_cstate(struct channel_state *cstate);
|
|
|
|
/**
|
|
* funding_find_htlc: find an HTLC on this side of the channel.
|
|
* @creator: channel_state->a or channel_state->b, whichever originated htlc
|
|
* @rhash: hash of redeem secret
|
|
*
|
|
* Returns a number < tal_count(creator->htlcs), or == tal_count(creator->htlcs)
|
|
* on fail.
|
|
*/
|
|
size_t funding_find_htlc(struct channel_oneside *creator,
|
|
const struct sha256 *rhash);
|
|
|
|
/**
|
|
* funding_htlc_by_id: find an HTLC on this side of the channel by ID.
|
|
* @creator: channel_state->a or channel_state->b, whichever originated htlc
|
|
* @id: id for HTLC.
|
|
*
|
|
* Returns a number < tal_count(creator->htlcs), or == tal_count(creator->htlcs)
|
|
* on fail.
|
|
*/
|
|
size_t funding_htlc_by_id(struct channel_oneside *creator, uint64_t id);
|
|
|
|
/**
|
|
* fee_for_feerate: calculate the fee (in satoshi) for a given fee_rate.
|
|
* @txsize: transaction size in bytes.
|
|
* @fee_rate: satoshi per 1000 bytes.
|
|
*/
|
|
uint64_t fee_by_feerate(size_t txsize, uint32_t fee_rate);
|
|
|
|
/**
|
|
* is_dust_amount: is an output of this value considered dust?
|
|
* @satoshis: number of satoshis.
|
|
*
|
|
* Transactions with dust outputs will not be relayed by the bitcoin
|
|
* network. It's not an exact definition, unfortunately.
|
|
*/
|
|
bool is_dust_amount(uint64_t satoshis);
|
|
|
|
#endif /* LIGHTNING_FUNDING_H */
|