mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 18:11:28 +01:00
7283efa5b5
Currently the only source for amount_asset is the value getter on a tx output, and we don't hand it too far around (mainly ignoring it if it isn't the chain's main currency). Eventually we could bubble them up to the wallet, use them to select outputs or actually support assets in the channels. Since we don't hand them around too widely I thought it was ok for them to be pass-by-value rather than having to allocate them and pass them around by reference. They're just 41 bytes currently so the overhead should be ok. Signed-off-by: Christian Decker <@cdecker>
164 lines
4.9 KiB
C
164 lines
4.9 KiB
C
#ifndef LIGHTNING_BITCOIN_TX_H
|
|
#define LIGHTNING_BITCOIN_TX_H
|
|
#include "config.h"
|
|
#include "shadouble.h"
|
|
#include "signature.h"
|
|
#include "varint.h"
|
|
#include <ccan/short_types/short_types.h>
|
|
#include <ccan/structeq/structeq.h>
|
|
#include <ccan/tal/tal.h>
|
|
#include <common/amount.h>
|
|
#include <wally_transaction.h>
|
|
|
|
#define BITCOIN_TX_DEFAULT_SEQUENCE 0xFFFFFFFF
|
|
|
|
struct bitcoin_txid {
|
|
struct sha256_double shad;
|
|
};
|
|
/* Define bitcoin_txid_eq */
|
|
STRUCTEQ_DEF(bitcoin_txid, 0, shad.sha.u);
|
|
|
|
struct bitcoin_tx {
|
|
/* Keep track of input amounts, this is needed for signatures (NULL if
|
|
* unknown) */
|
|
struct amount_sat **input_amounts;
|
|
struct wally_tx *wtx;
|
|
|
|
/* Keep a reference to the ruleset we have to abide by */
|
|
const struct chainparams *chainparams;
|
|
};
|
|
|
|
struct bitcoin_tx_output {
|
|
struct amount_sat amount;
|
|
u8 *script;
|
|
};
|
|
|
|
struct bitcoin_tx_input {
|
|
struct bitcoin_txid txid;
|
|
u32 index; /* output number referred to by above */
|
|
u8 *script;
|
|
u32 sequence_number;
|
|
|
|
/* Only if BIP141 used. */
|
|
u8 **witness;
|
|
};
|
|
|
|
|
|
/* SHA256^2 the tx: simpler than sha256_tx */
|
|
void bitcoin_txid(const struct bitcoin_tx *tx, struct bitcoin_txid *txid);
|
|
|
|
/* Linear bytes of tx. */
|
|
u8 *linearize_tx(const tal_t *ctx, const struct bitcoin_tx *tx);
|
|
|
|
/* Get weight of tx in Sipa. */
|
|
size_t bitcoin_tx_weight(const struct bitcoin_tx *tx);
|
|
|
|
/* Allocate a tx: you just need to fill in inputs and outputs (they're
|
|
* zeroed with inputs' sequence_number set to FFFFFFFF) */
|
|
struct bitcoin_tx *bitcoin_tx(const tal_t *ctx,
|
|
const struct chainparams *chainparams,
|
|
varint_t input_count, varint_t output_count);
|
|
|
|
/* This takes a raw bitcoin tx in hex. */
|
|
struct bitcoin_tx *bitcoin_tx_from_hex(const tal_t *ctx, const char *hex,
|
|
size_t hexlen);
|
|
|
|
/* Parse hex string to get txid (reversed, a-la bitcoind). */
|
|
bool bitcoin_txid_from_hex(const char *hexstr, size_t hexstr_len,
|
|
struct bitcoin_txid *txid);
|
|
|
|
/* Get hex string of txid (reversed, a-la bitcoind). */
|
|
bool bitcoin_txid_to_hex(const struct bitcoin_txid *txid,
|
|
char *hexstr, size_t hexstr_len);
|
|
|
|
/* Internal de-linearization functions. */
|
|
struct bitcoin_tx *pull_bitcoin_tx(const tal_t *ctx,
|
|
const u8 **cursor, size_t *max);
|
|
/* Add one output to tx. */
|
|
int bitcoin_tx_add_output(struct bitcoin_tx *tx, const u8 *script,
|
|
struct amount_sat amount);
|
|
|
|
/* Add mutiple output to tx. */
|
|
int bitcoin_tx_add_multi_outputs(struct bitcoin_tx *tx,
|
|
struct bitcoin_tx_output **outputs);
|
|
|
|
int bitcoin_tx_add_input(struct bitcoin_tx *tx, const struct bitcoin_txid *txid,
|
|
u32 outnum, u32 sequence,
|
|
struct amount_sat amount, u8 *script);
|
|
|
|
|
|
/**
|
|
* Set the output amount on the transaction.
|
|
*
|
|
* Allows changing the amount on the transaction output after it was set on
|
|
* creation. This is useful to grind a feerate or subtract the fee from an
|
|
* existing output.
|
|
*/
|
|
void bitcoin_tx_output_set_amount(struct bitcoin_tx *tx, int outnum,
|
|
struct amount_sat amount);
|
|
|
|
/**
|
|
* Helper to get the script of a script's output as a tal_arr
|
|
*
|
|
* Internally we use a `wally_tx` to represent the transaction. The script
|
|
* attached to a `wally_tx_output` is not a `tal_arr`, so in order to keep the
|
|
* comfort of being able to call `tal_bytelen` and similar on a script we just
|
|
* return a `tal_arr` clone of the original script.
|
|
*/
|
|
const u8 *bitcoin_tx_output_get_script(const tal_t *ctx, const struct bitcoin_tx *tx, int outnum);
|
|
|
|
/**
|
|
* Helper to just get an amount_sat for the output amount.
|
|
*/
|
|
struct amount_asset bitcoin_tx_output_get_amount(const struct bitcoin_tx *tx,
|
|
int outnum);
|
|
|
|
/**
|
|
* Set the input witness.
|
|
*
|
|
* Given that we generate the witness after constructing the transaction
|
|
* itself, we need a way to attach a witness to an existing input.
|
|
*/
|
|
void bitcoin_tx_input_set_witness(struct bitcoin_tx *tx, int innum,
|
|
u8 **witness TAKES);
|
|
|
|
/**
|
|
* Set the input script on the given input.
|
|
*/
|
|
void bitcoin_tx_input_set_script(struct bitcoin_tx *tx, int innum, u8 *script);
|
|
|
|
/**
|
|
* Helper to get a witness as a tal_arr array.
|
|
*/
|
|
const u8 *bitcoin_tx_input_get_witness(const tal_t *ctx,
|
|
const struct bitcoin_tx *tx, int innum,
|
|
int witnum);
|
|
|
|
/**
|
|
* Wrap the raw txhash in the wally_tx_input into a bitcoin_txid
|
|
*/
|
|
void bitcoin_tx_input_get_txid(const struct bitcoin_tx *tx, int innum,
|
|
struct bitcoin_txid *out);
|
|
|
|
/**
|
|
* Check a transaction for consistency.
|
|
*
|
|
* Mainly for the transition from `bitcoin_tx` to the `wally_tx`. Checks that
|
|
* both transactions serialize to two identical representations.
|
|
*/
|
|
bool bitcoin_tx_check(const struct bitcoin_tx *tx);
|
|
|
|
/**
|
|
* Add an explicit fee output if necessary.
|
|
*
|
|
* An explicit fee output is only necessary if we are using an elements
|
|
* transaction, and we have a non-zero fee. This method may be called multiple
|
|
* times.
|
|
*
|
|
* Returns the position of the fee output, or -1 in the case of non-elements
|
|
* transactions.
|
|
*/
|
|
int elements_tx_add_fee_output(struct bitcoin_tx *tx);
|
|
|
|
#endif /* LIGHTNING_BITCOIN_TX_H */
|