From c3297567236f8160c2e7779a7ce66b03c3f73ea2 Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Tue, 9 Jan 2024 13:24:19 +0100 Subject: [PATCH] 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 --- bitcoin/script.c | 3 --- bitcoin/script.h | 3 +++ bitcoin/tx.c | 10 ++++++++++ bitcoin/tx.h | 8 ++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/bitcoin/script.c b/bitcoin/script.c index 54c53d82e..8acde8a23 100644 --- a/bitcoin/script.c +++ b/bitcoin/script.c @@ -10,9 +10,6 @@ #include #include -/* 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) { diff --git a/bitcoin/script.h b/bitcoin/script.h index 660c83ad6..c7fd73cb5 100644 --- a/bitcoin/script.h +++ b/bitcoin/script.h @@ -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, diff --git a/bitcoin/tx.c b/bitcoin/tx.c index d86b53c94..62a1d249a 100644 --- a/bitcoin/tx.c +++ b/bitcoin/tx.c @@ -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) { diff --git a/bitcoin/tx.h b/bitcoin/tx.h index 091ecb476..849db6305 100644 --- a/bitcoin/tx.h +++ b/bitcoin/tx.h @@ -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 *