Skip to content

Commit

Permalink
bitcoin: Split pull_bitcoin_tx
Browse files Browse the repository at this point in the history
The deserialization of bitcoin transactions in wire/ is rather
annoying in that we first allocate a new bitcoin_tx, then copy it's
contents onto the destination and then still carry the newly allocated
one around due to the tal-tree. This splits `pull_bitcoin_tx` into
two: one part that does the allocation and another one that proceeds
to parse.

Signed-off-by: Christian Decker <[email protected]>
  • Loading branch information
cdecker committed Jan 8, 2018
1 parent 59128a8 commit 524849b
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 3 deletions.
12 changes: 9 additions & 3 deletions bitcoin/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,10 +383,9 @@ static void pull_witness(struct bitcoin_tx_input *inputs, size_t i,
}
}

struct bitcoin_tx *pull_bitcoin_tx(const tal_t *ctx,
const u8 **cursor, size_t *max)
struct bitcoin_tx *pull_bitcoin_tx_onto(const tal_t *ctx, const u8 **cursor,
size_t *max, struct bitcoin_tx *tx)
{
struct bitcoin_tx *tx = tal(ctx, struct bitcoin_tx);
size_t i;
u64 count;
u8 flag = 0;
Expand Down Expand Up @@ -425,6 +424,13 @@ struct bitcoin_tx *pull_bitcoin_tx(const tal_t *ctx,
return tx;
}

struct bitcoin_tx *pull_bitcoin_tx(const tal_t *ctx,
const u8 **cursor, size_t *max)
{
struct bitcoin_tx *tx = tal(ctx, struct bitcoin_tx);
return pull_bitcoin_tx_onto(ctx, cursor, max, tx);
}

struct bitcoin_tx *bitcoin_tx_from_hex(const tal_t *ctx, const char *hex,
size_t hexlen)
{
Expand Down
14 changes: 14 additions & 0 deletions bitcoin/tx.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,18 @@ bool bitcoin_txid_to_hex(const struct bitcoin_txid *txid,
struct bitcoin_tx *pull_bitcoin_tx(const tal_t *ctx,
const u8 **cursor, size_t *max);

/**
* pull_bitcoin_tx_onto - De-serialize a bitcoin tx into tx
*
* Like pull_bitcoin_tx, but skips the allocation of tx. Used by the
* wire implementation where the caller allocates, and the callee only
* fills in values.
*
* @ctx: Allocation context
* @cursor: buffer to read from
* @max: Buffer size left to read
* @tx (out): Destination transaction
*/
struct bitcoin_tx *pull_bitcoin_tx_onto(const tal_t *ctx, const u8 **cursor,
size_t *max, struct bitcoin_tx *tx);
#endif /* LIGHTNING_BITCOIN_TX_H */

0 comments on commit 524849b

Please sign in to comment.