diff --git a/devtools/.gitignore b/devtools/.gitignore index 570238049..7b7fa1639 100644 --- a/devtools/.gitignore +++ b/devtools/.gitignore @@ -7,3 +7,4 @@ mkcommit mkfunding mkclose mkgossip +mkencoded diff --git a/devtools/Makefile b/devtools/Makefile index 8f5d127c5..ec416fa3a 100644 --- a/devtools/Makefile +++ b/devtools/Makefile @@ -1,6 +1,6 @@ DEVTOOLS_SRC := devtools/gen_print_wire.c devtools/gen_print_onion_wire.c devtools/print_wire.c DEVTOOLS_OBJS := $(DEVTOOLS_SRC:.c=.o) -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 := 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_TOOL_SRC := $(DEVTOOLS:=.c) DEVTOOLS_TOOL_OBJS := $(DEVTOOLS_TOOL_SRC:.c=.o) @@ -74,6 +74,8 @@ devtools/mkclose: $(DEVTOOLS_COMMON_OBJS) $(CCAN_OBJS) $(BITCOIN_OBJS) wire/from devtools/mkgossip: $(DEVTOOLS_COMMON_OBJS) $(CCAN_OBJS) $(BITCOIN_OBJS) wire/fromwire.o wire/towire.o wire/tlvstream.o common/funding_tx.o common/utxo.o common/permute_tx.o common/key_derive.o devtools/mkgossip.o +devtools/mkencoded: $(DEVTOOLS_COMMON_OBJS) $(CCAN_OBJS) $(BITCOIN_OBJS) wire/fromwire.o wire/towire.o wire/tlvstream.o devtools/mkencoded.o + # Make sure these depend on everything. ALL_PROGRAMS += $(DEVTOOLS) ALL_OBJS += $(DEVTOOLS_OBJS) $(DEVTOOLS_TOOL_OBJS) diff --git a/devtools/mkencoded.c b/devtools/mkencoded.c new file mode 100644 index 000000000..e0bcdab66 --- /dev/null +++ b/devtools/mkencoded.c @@ -0,0 +1,66 @@ +/* Simple wrapper to create zlib or raw encodings of hex. */ +#include +#include +#include +#include +#include +#include +#include +#include + +static NORETURN void usage(void) +{ + errx(1, "Usage: mkencoded , OR\n" + "mkencoded --scids ..."); +} + +int main(int argc, char *argv[]) +{ + u8 encoding, *data; + + setup_locale(); + + if (argv[1] && streq(argv[1], "--scids")) { + argv++; + argc--; + if (argc < 2) + usage(); + data = tal_arr(NULL, u8, 0); + for (size_t i = 2; i < argc; i++) { + struct short_channel_id scid; + if (!short_channel_id_from_str(argv[i], strlen(argv[i]), + &scid)) + errx(1, "Invalid short_channel_id %s", argv[i]); + towire_short_channel_id(&data, &scid); + } + } else { + data = tal_hexdata(NULL, argv[2], strlen(argv[2])); + if (!data) + errx(1, "Invalid hex string %s", argv[2]); + } + if (!hex_decode(argv[1], strlen(argv[1]), &encoding, sizeof(encoding))) + errx(1, "Expected single hex byte not %s", argv[1]); + + if (encoding == SHORTIDS_UNCOMPRESSED) + printf("%02x%s\n", encoding, tal_hex(NULL, data)); + else if (encoding == SHORTIDS_ZLIB) { + /* https://www.zlib.net/zlib_tech.html: + * the only expansion is an overhead of five bytes per 16 KB + * block (about 0.03%), plus a one-time overhead of six bytes + * for the entire stream. + */ + unsigned long compressed_len = tal_bytelen(data) + + 6 + 5*(tal_bytelen(data) + 16384)/16384; + u8 *z = tal_arr(NULL, u8, compressed_len); + if (compress2(z, &compressed_len, data, tal_bytelen(data), + Z_DEFAULT_COMPRESSION) != Z_OK) + errx(1, "Error compressing stream?"); + + printf("%02x%s\n", encoding, + tal_hexstr(NULL, z, compressed_len)); + } else { + errx(1, "Unknown encoding %u", encoding); + } + + return 0; +}