From a150bd191a7feb29fcbcda541ebf68af491a4e3d Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 2 May 2016 16:06:56 +0930 Subject: [PATCH] remove_dust: don't ever create dust outputs. This behavior will be specified in BOLT #3. Closes: #14 Signed-off-by: Rusty Russell --- Makefile | 2 ++ commit_tx.c | 3 +++ remove_dust.c | 28 ++++++++++++++++++++++++++++ remove_dust.h | 12 ++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 remove_dust.c create mode 100644 remove_dust.h diff --git a/Makefile b/Makefile index faba78a71..3d035e7ca 100644 --- a/Makefile +++ b/Makefile @@ -44,6 +44,7 @@ CORE_SRC := \ opt_bits.c \ permute_tx.c \ protobuf_convert.c \ + remove_dust.c \ version.c CORE_OBJS := $(CORE_SRC:.c=.o) @@ -152,6 +153,7 @@ CORE_HEADERS := close_tx.h \ overflows.h \ permute_tx.h \ protobuf_convert.h \ + remove_dust.h \ state.h \ state_types.h \ version.h diff --git a/commit_tx.c b/commit_tx.c index a8a6208a6..c20576015 100644 --- a/commit_tx.c +++ b/commit_tx.c @@ -7,6 +7,7 @@ #include "funding.h" #include "overflows.h" #include "permute_tx.h" +#include "remove_dust.h" #include static bool add_htlc(struct bitcoin_tx *tx, size_t n, @@ -98,5 +99,7 @@ struct bitcoin_tx *create_commit_tx(const tal_t *ctx, *map = tal_arr(ctx, int, tx->output_count); permute_outputs(tx->output, tx->output_count, *map); + remove_dust(tx, *map); + return tx; } diff --git a/remove_dust.c b/remove_dust.c new file mode 100644 index 000000000..64122d3cd --- /dev/null +++ b/remove_dust.c @@ -0,0 +1,28 @@ +#include "remove_dust.h" +#include +#include +#include + +void remove_dust(struct bitcoin_tx *tx, int *map) +{ + size_t i, j, num = tx->output_count; + + assert(tal_count(map) == num); + /* Do it in map order so we can remove from map, too */ + for (i = 0; i < num; i++) { + assert(map[i] < tx->output_count); + if (tx->output[map[i]].amount >= DUST_THRESHOLD) + continue; + + /* Eliminate that output from tx */ + tx->output_count--; + memmove(tx->output + map[i], tx->output + map[i] + 1, + (tx->output_count-map[i]) * sizeof(*tx->output)); + + /* Fixup map. */ + for (j = 0; j < num; j++) + if (map[j] > map[i]) + map[j]--; + map[i] = -1; + } +} diff --git a/remove_dust.h b/remove_dust.h new file mode 100644 index 000000000..b8347c138 --- /dev/null +++ b/remove_dust.h @@ -0,0 +1,12 @@ +#ifndef LIGHTNING_REMOVE_DUST_H +#define LIGHTNING_REMOVE_DUST_H +#include "config.h" +#include "bitcoin/tx.h" + +/* Remove all dust outputs from tx */ +void remove_dust(struct bitcoin_tx *tx, int *map); + +/* Less than this is dust. */ +#define DUST_THRESHOLD 546 + +#endif /* LIGHTNING_REMOVE_DUST_H */