From d8db51d8791afd49059a21cea8511ecd0941a4a4 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 1 Oct 2025 10:48:43 +0930 Subject: [PATCH] devtools: create conversion tool for old gossip stores. Signed-off-by: Rusty Russell --- devtools/Makefile | 5 +- devtools/convert-gossmap.c | 97 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 devtools/convert-gossmap.c diff --git a/devtools/Makefile b/devtools/Makefile index a80ebe4ab..606279146 100644 --- a/devtools/Makefile +++ b/devtools/Makefile @@ -1,4 +1,4 @@ -DEVTOOLS := devtools/bolt11-cli devtools/decodemsg devtools/onion devtools/dump-gossipstore devtools/gossipwith devtools/create-gossipstore devtools/mkcommit devtools/mkfunding devtools/mkclose devtools/mkgossip devtools/mkencoded devtools/mkquery devtools/lightning-checkmessage devtools/topology devtools/route devtools/bolt12-cli devtools/encodeaddr devtools/features devtools/fp16 devtools/rune devtools/gossmap-compress devtools/bip137-verifysignature +DEVTOOLS := devtools/bolt11-cli devtools/decodemsg devtools/onion devtools/dump-gossipstore devtools/gossipwith devtools/create-gossipstore devtools/mkcommit devtools/mkfunding devtools/mkclose devtools/mkgossip devtools/mkencoded devtools/mkquery devtools/lightning-checkmessage devtools/topology devtools/route devtools/bolt12-cli devtools/encodeaddr devtools/features devtools/fp16 devtools/rune devtools/gossmap-compress devtools/bip137-verifysignature devtools/convert-gossmap ifeq ($(HAVE_SQLITE3),1) DEVTOOLS += devtools/checkchannels endif @@ -72,6 +72,9 @@ devtools/dump-gossipstore: $(DEVTOOLS_COMMON_OBJS) $(JSMN_OBJS) $(BITCOIN_OBJS) devtools/dump-gossipstore.o: gossipd/gossip_store_wiregen.h +devtools/convert-gossmap: $(DEVTOOLS_COMMON_OBJS) $(JSMN_OBJS) $(BITCOIN_OBJS) wire/fromwire.o wire/towire.o devtools/convert-gossmap.o +devtools/convert-gossmap.o: gossipd/gossip_store_wiregen.h + devtools/create-gossipstore: $(DEVTOOLS_COMMON_OBJS) $(JSMN_OBJS) $(BITCOIN_OBJS) wire/fromwire.o wire/towire.o devtools/create-gossipstore.o gossipd/gossip_store_wiregen.o devtools/create-gossipstore.o: gossipd/gossip_store_wiregen.h diff --git a/devtools/convert-gossmap.c b/devtools/convert-gossmap.c new file mode 100644 index 000000000..dee2b1f1e --- /dev/null +++ b/devtools/convert-gossmap.c @@ -0,0 +1,97 @@ +/* Tool we can use to convert our testing gossip_store files */ +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Current versions we support */ +#define GSTORE_MAJOR 0 +#define GSTORE_MINOR 15 + +/* Obsolete ZOMBIE bit */ +#define GOSSIP_STORE_ZOMBIE_BIT_V13 0x1000U + +static bool upgrade_field(u8 oldversion, + be16 *hdr_flags, + u8 **msg) +{ + int type = fromwire_peektype(*msg); + + switch (oldversion) { + case 10: + /* Remove old channel_update with no htlc_maximum_msat */ + if (type == WIRE_CHANNEL_UPDATE + && tal_bytelen(*msg) == 130) { + *msg = tal_free(*msg); + return true; + } + /* fall thru */ + case 11: + case 12: + /* Remove private entries */ + if (type == WIRE_GOSSIP_STORE_PRIVATE_CHANNEL_OBS) { + *msg = tal_free(*msg); + return true; + } else if (type == WIRE_GOSSIP_STORE_PRIVATE_UPDATE_OBS) { + *msg = tal_free(*msg); + return true; + } + /* fall thru */ + case 13: + /* Discard any zombies */ + if (be16_to_cpu(*hdr_flags) & GOSSIP_STORE_ZOMBIE_BIT_V13) { + *msg = tal_free(*msg); + return true; + } + case 14: + /* Add completed field */ + *hdr_flags |= CPU_TO_BE16(GOSSIP_STORE_COMPLETED_BIT); + /* fall thru */ + case 15: + /* Noop */ + return true; + } + + return false; +} + +int main(int argc, char *argv[]) +{ + u8 oldversion, version; + struct gossip_hdr hdr; + + setup_locale(); + if (!read_all(STDIN_FILENO, &oldversion, sizeof(oldversion))) + errx(1, "Empty file"); + + if (GOSSIP_STORE_MAJOR_VERSION(oldversion) != GSTORE_MAJOR) + errx(1, "Unsupported major gossip_version %u (expected %u)", + GOSSIP_STORE_MAJOR_VERSION(oldversion), GSTORE_MAJOR); + + version = ((GSTORE_MAJOR << 5) | GSTORE_MINOR); + if (!write_all(STDOUT_FILENO, &version, sizeof(version))) + err(1, "Write error"); + + while (read_all(STDIN_FILENO, &hdr, sizeof(hdr))) { + u8 *msg; + msg = tal_arr(NULL, u8, be16_to_cpu(hdr.len)); + if (!read_all(STDIN_FILENO, msg, tal_bytelen(msg))) + err(1, "truncated file"); + if (!upgrade_field(oldversion, &hdr.flags, &msg)) + errx(1, "Cannot upgrade from version %u", oldversion); + if (msg) { + if (!write_all(STDOUT_FILENO, &hdr, sizeof(hdr)) + || !write_all(STDOUT_FILENO, msg, tal_bytelen(msg))) + err(1, "Write error"); + tal_free(msg); + } + } + return 0; +}