From a25ba452f34f190ec54966cc610db22ef2462fb9 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 8 Jun 2015 08:29:53 +0930 Subject: [PATCH] permute_tx: fix horrible thinko. Map needs to be inverted, otherwise non-trivial shuffles get confused. Signed-off-by: Rusty Russell --- permute_tx.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/permute_tx.c b/permute_tx.c index 0eed1825a..06295ef16 100644 --- a/permute_tx.c +++ b/permute_tx.c @@ -45,6 +45,21 @@ static void init_map(size_t *map, size_t len) map[i] = i; } +/* This map says where things ended up, eg. 0 might be in slot 3. we + * want to change it so map[0] = 3. */ +static void invert_map(size_t *map, size_t len) +{ + if (map) { + size_t i, newmap[len]; + + memset(newmap, 0, sizeof(newmap)); + for (i = 0; i < len; i++) { + newmap[map[i]] = i; + } + memcpy(map, newmap, sizeof(newmap)); + } +} + static bool input_better(const struct bitcoin_tx_input *a, const struct bitcoin_tx_input *b) { @@ -117,6 +132,8 @@ void permute_inputs(uint64_t seed1, uint64_t seed2, uint64_t tx_num, size_t r = get_next_rand(&h, &randidx) % (num_inputs - i - 1); swap_inputs(inputs, map, i, i + 1 + r); } + + invert_map(map, num_inputs); } static void swap_outputs(struct bitcoin_tx_output *outputs, size_t *map, @@ -183,4 +200,6 @@ void permute_outputs(uint64_t seed1, uint64_t seed2, size_t tx_num, size_t r = get_next_rand(&h, &randidx) % (num_outputs - i - 1); swap_outputs(outputs, map, i, i + 1 + r); } + + invert_map(map, num_outputs); }