Skip to content

Commit

Permalink
psbt: sort maps before serializing, to stabilize comparison
Browse files Browse the repository at this point in the history
Our psbt input/output comparison functions use serialization to compare
the things, but if there's a map with things in it and the map isn't
sorted exactly the same, it's highly likely you'll mark an identical inputs
as different.

To fix this, we sort all the input/output maps before linearizing them.
  • Loading branch information
niftynei authored and rustyrussell committed Aug 18, 2020
1 parent 24215f8 commit 6371a49
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions common/psbt_open.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,12 @@ static const u8 *linearize_input(const tal_t *ctx,
abort();
psbt->inputs[0] = *in;
psbt->num_inputs++;
/* Blank out unknowns. These are unordered and serializing
* them might have different outputs for identical data */
psbt->inputs[0].unknowns.num_items = 0;


/* Sort the inputs, so serializing them is ok */
wally_map_sort(&psbt->inputs[0].unknowns, 0);
wally_map_sort(&psbt->inputs[0].keypaths, 0);
wally_map_sort(&psbt->inputs[0].signatures, 0);

const u8 *bytes = psbt_get_bytes(ctx, psbt, &byte_len);

Expand All @@ -97,9 +100,9 @@ static const u8 *linearize_output(const tal_t *ctx,

psbt->outputs[0] = *out;
psbt->num_outputs++;
/* Blank out unknowns. These are unordered and serializing
* them might have different outputs for identical data */
psbt->outputs[0].unknowns.num_items = 0;
/* Sort the outputs, so serializing them is ok */
wally_map_sort(&psbt->outputs[0].unknowns, 0);
wally_map_sort(&psbt->outputs[0].keypaths, 0);

const u8 *bytes = psbt_get_bytes(ctx, psbt, &byte_len);

Expand Down

0 comments on commit 6371a49

Please sign in to comment.