core: Add a function check if a script is P2WSH without allocating

Processing blocks is rather slow at the moment, but one thing we can
do, is to prevent copying all output scripts, when really all we are
interested in are the couple of outputs that are P2WSH.

This builds the foundation of that by adding a method to introspect
the script without having to clone it first, saving us some
allocations, and deallocations.

Changelog-Changed: core: Processing blocks should now be faster
This commit is contained in:
Christian Decker 2024-01-09 13:24:19 +01:00
parent 052542ea28
commit c329756723
4 changed files with 21 additions and 3 deletions

View file

@ -10,9 +10,6 @@
#include <common/utils.h>
#include <sodium/randombytes.h>
/* To push 0-75 bytes onto stack. */
#define OP_PUSHBYTES(val) (val)
/* Bitcoin's OP_HASH160 is RIPEMD(SHA256()) */
static void hash160(struct ripemd160 *redeemhash, const void *mem, size_t len)
{

View file

@ -13,6 +13,9 @@ struct ripemd160;
struct rel_locktime;
struct abs_locktime;
/* To push 0-75 bytes onto stack. */
#define OP_PUSHBYTES(val) (val)
/* tal_count() gives the length of the script. */
u8 *bitcoin_redeem_2of2(const tal_t *ctx,
const struct pubkey *key1,

View file

@ -324,6 +324,16 @@ const u8 *bitcoin_tx_output_get_script(const tal_t *ctx,
return cln_wally_tx_output_get_script(ctx, output);
}
bool bitcoin_tx_output_script_is_p2wsh(const struct bitcoin_tx *tx, int outnum)
{ const struct wally_tx_output *output;
assert(outnum < tx->wtx->num_outputs);
output = &tx->wtx->outputs[outnum];
return output->script_len == BITCOIN_SCRIPTPUBKEY_P2WSH_LEN &&
output->script[0] == OP_0 &&
output->script[1] == OP_PUSHBYTES(sizeof(struct sha256));
}
u8 *bitcoin_tx_output_get_witscript(const tal_t *ctx, const struct bitcoin_tx *tx,
int outnum)
{

View file

@ -154,6 +154,14 @@ void bitcoin_tx_output_set_amount(struct bitcoin_tx *tx, int outnum,
*/
const u8 *bitcoin_tx_output_get_script(const tal_t *ctx, const struct bitcoin_tx *tx, int outnum);
/**
* Return `true` if the given output is a P2WSH output.
*
* This is useful if you want to peek at the script, without having to
* extract it first.
*/
bool bitcoin_tx_output_script_is_p2wsh(const struct bitcoin_tx *tx, int outnum);
/**
* Helper to get the script of a script's output as a tal_arr
*