Skip to content

Commit

Permalink
Restore any missing psbt metadata that resource constrained signers s…
Browse files Browse the repository at this point in the history
…trip

Fixes ([#6764])
Changelog-Fixed: Restore any missing metadata that resource constrained signers stripped
  • Loading branch information
ksedgwic committed Oct 24, 2023
1 parent 1a46b37 commit f86efbe
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 3 deletions.
16 changes: 16 additions & 0 deletions bitcoin/psbt.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,22 @@ struct wally_psbt *new_psbt(const tal_t *ctx, const struct wally_tx *wtx)
return psbt;
}

struct wally_psbt *combine_psbt(const tal_t *ctx,
const struct wally_psbt *psbt0,
const struct wally_psbt *psbt1)
{
struct wally_psbt *combined_psbt;
tal_wally_start();
if (wally_psbt_clone_alloc(psbt0, 0, &combined_psbt) != WALLY_OK)
abort();
if (wally_psbt_combine(combined_psbt, psbt1) != WALLY_OK) {
tal_wally_end_onto(ctx, combined_psbt, struct wally_psbt);
return tal_free(combined_psbt);
}
tal_wally_end_onto(ctx, combined_psbt, struct wally_psbt);
return combined_psbt;
}

bool psbt_is_finalized(const struct wally_psbt *psbt)
{
size_t is_finalized;
Expand Down
11 changes: 11 additions & 0 deletions bitcoin/psbt.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,17 @@ struct wally_psbt *new_psbt(const tal_t *ctx,
*/
struct wally_psbt *clone_psbt(const tal_t *ctx, struct wally_psbt *psbt);

/**
* combine_psbt - Combine two PSBT into a cloned copy
*
* @ctx - allocation context
* @psbt0 - one psbt
* @psbt1 - other psbt
*/
struct wally_psbt *combine_psbt(const tal_t *ctx,
const struct wally_psbt *psbt0,
const struct wally_psbt *psbt1);

/**
* psbt_is_finalized - Check if tx is ready to be extracted
*
Expand Down
19 changes: 16 additions & 3 deletions wallet/walletrpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -799,15 +799,28 @@ static struct command_result *json_signpsbt(struct command *cmd,
"HSM gave bad sign_withdrawal_reply %s",
tal_hex(tmpctx, msg));

if (!psbt_set_version(signed_psbt, psbt_version)) {
/* Some signers (VLS) prune the input.utxo data as it's used
* because it is too large to store in the signer. We can
* restore this metadata by combining the signed psbt back
* into a clone of the original psbt. */
struct wally_psbt *combined_psbt;
combined_psbt = combine_psbt(cmd, psbt, signed_psbt);
if (!combined_psbt) {
return command_fail(cmd, LIGHTNINGD,
"Unable to combine signed psbt: %s",
type_to_string(tmpctx, struct wally_psbt,
signed_psbt));
}

if (!psbt_set_version(combined_psbt, psbt_version)) {
return command_fail(cmd, LIGHTNINGD,
"Signed PSBT unable to have version set: %s",
type_to_string(tmpctx, struct wally_psbt,
psbt));
combined_psbt));
}

response = json_stream_success(cmd);
json_add_psbt(response, "signed_psbt", signed_psbt);
json_add_psbt(response, "signed_psbt", combined_psbt);
return command_success(cmd, response);
}

Expand Down

0 comments on commit f86efbe

Please sign in to comment.