Restore any missing psbt metadata that resource constrained signers strip

Fixes ([#6764])
Changelog-Fixed: Restore any missing metadata that resource constrained signers stripped
This commit is contained in:
Ken Sedgwick 2023-10-11 17:27:48 -07:00 committed by Vincenzo Palazzo
parent 9c5e364f16
commit 39e17ff83b
3 changed files with 43 additions and 3 deletions

View file

@ -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;

View file

@ -50,6 +50,17 @@ struct wally_psbt *new_psbt(const tal_t *ctx,
*/
struct wally_psbt *clone_psbt(const tal_t *ctx, const 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
*

View file

@ -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);
}