From 6371a49ee314ca35aa19973cce9736da4f462c47 Mon Sep 17 00:00:00 2001 From: niftynei Date: Thu, 13 Aug 2020 18:30:46 -0500 Subject: [PATCH] psbt: sort maps before serializing, to stabilize comparison 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. --- common/psbt_open.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/common/psbt_open.c b/common/psbt_open.c index e168ada82..bfc74bba1 100644 --- a/common/psbt_open.c +++ b/common/psbt_open.c @@ -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); @@ -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);