bitcoin: fix tx weight calculation when there are no witnesses, but will be.

We had an out-by-two error when calculating weights, because we grab weights
on unsigned txs.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2022-01-12 13:41:58 +10:30 committed by Christian Decker
parent 4dafeede5c
commit 59f1749967
2 changed files with 13 additions and 2 deletions

View file

@ -457,7 +457,18 @@ size_t wally_tx_weight(const struct wally_tx *wtx)
size_t bitcoin_tx_weight(const struct bitcoin_tx *tx)
{
return wally_tx_weight(tx->wtx);
size_t extra;
size_t num_witnesses;
/* If we don't have witnesses *yet*, libwally doesn't encode
* in BIP 141 style, omitting the flag and marker bytes */
wally_tx_get_witness_count(tx->wtx, &num_witnesses);
if (num_witnesses == 0)
extra = 2;
else
extra = 0;
return extra + wally_tx_weight(tx->wtx);
}
void wally_txid(const struct wally_tx *wtx, struct bitcoin_txid *txid)

View file

@ -57,7 +57,7 @@ void wally_txid(const struct wally_tx *wtx, struct bitcoin_txid *txid);
u8 *linearize_tx(const tal_t *ctx, const struct bitcoin_tx *tx);
u8 *linearize_wtx(const tal_t *ctx, const struct wally_tx *wtx);
/* Get weight of tx in Sipa. */
/* Get weight of tx in Sipa; assumes it will have witnesses! */
size_t bitcoin_tx_weight(const struct bitcoin_tx *tx);
size_t wally_tx_weight(const struct wally_tx *wtx);