diff --git a/common/gossmap.c b/common/gossmap.c index 9fb2a1a2b..6397e1bd7 100644 --- a/common/gossmap.c +++ b/common/gossmap.c @@ -1289,18 +1289,3 @@ int gossmap_node_get_feature(const struct gossmap *map, return map_feature_test(map, COMPULSORY_FEATURE(fbit), n->nann_off + feature_len_off + 2, feature_len); } - -/* There are two 33-byte pubkeys possible: choose the one which appears - * in the graph (otherwise payment will fail anyway). */ -void gossmap_guess_node_id(const struct gossmap *map, - const struct point32 *point32, - struct node_id *id) -{ - struct pubkey pk; - pk.pubkey = point32->pubkey; - node_id_from_pubkey(id, &pk); - - /* If we don't find this, let's assume it's the alternate. */ - if (!gossmap_find_node(map, id)) - id->k[0] |= 1; -} diff --git a/common/gossmap.h b/common/gossmap.h index 6b08ef684..17348adad 100644 --- a/common/gossmap.h +++ b/common/gossmap.h @@ -200,11 +200,4 @@ size_t gossmap_num_chans(const struct gossmap *map); struct gossmap_chan *gossmap_first_chan(const struct gossmap *map); struct gossmap_chan *gossmap_next_chan(const struct gossmap *map, struct gossmap_chan *prev); - -/* Each x-only pubkey has two possible values: we can figure out which by - * examining the gossmap. */ -void gossmap_guess_node_id(const struct gossmap *map, - const struct point32 *point32, - struct node_id *id); - #endif /* LIGHTNING_COMMON_GOSSMAP_H */ diff --git a/common/test/run-gossmap_guess_node_id.c b/common/test/run-gossmap_guess_node_id.c deleted file mode 100644 index bf0f55b79..000000000 --- a/common/test/run-gossmap_guess_node_id.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Test conversion assumptions used by gossmap_guess_node_id */ -#include "config.h" -#include "../node_id.c" -#include -#include -#include -#include - -/* AUTOGENERATED MOCKS START */ -/* Generated stub for amount_asset_is_main */ -bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) -{ fprintf(stderr, "amount_asset_is_main called!\n"); abort(); } -/* Generated stub for amount_asset_to_sat */ -struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) -{ fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } -/* Generated stub for amount_sat */ -struct amount_sat amount_sat(u64 satoshis UNNEEDED) -{ fprintf(stderr, "amount_sat called!\n"); abort(); } -/* Generated stub for amount_sat_add */ - bool amount_sat_add(struct amount_sat *val UNNEEDED, - struct amount_sat a UNNEEDED, - struct amount_sat b UNNEEDED) -{ fprintf(stderr, "amount_sat_add called!\n"); abort(); } -/* Generated stub for amount_sat_eq */ -bool amount_sat_eq(struct amount_sat a UNNEEDED, struct amount_sat b UNNEEDED) -{ fprintf(stderr, "amount_sat_eq called!\n"); abort(); } -/* Generated stub for amount_sat_greater_eq */ -bool amount_sat_greater_eq(struct amount_sat a UNNEEDED, struct amount_sat b UNNEEDED) -{ fprintf(stderr, "amount_sat_greater_eq called!\n"); abort(); } -/* Generated stub for amount_sat_sub */ - bool amount_sat_sub(struct amount_sat *val UNNEEDED, - struct amount_sat a UNNEEDED, - struct amount_sat b UNNEEDED) -{ fprintf(stderr, "amount_sat_sub called!\n"); abort(); } -/* Generated stub for amount_sat_to_asset */ -struct amount_asset amount_sat_to_asset(struct amount_sat *sat UNNEEDED, const u8 *asset UNNEEDED) -{ fprintf(stderr, "amount_sat_to_asset called!\n"); abort(); } -/* Generated stub for amount_tx_fee */ -struct amount_sat amount_tx_fee(u32 fee_per_kw UNNEEDED, size_t weight UNNEEDED) -{ fprintf(stderr, "amount_tx_fee called!\n"); abort(); } -/* Generated stub for fromwire */ -const u8 *fromwire(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, void *copy UNNEEDED, size_t n UNNEEDED) -{ fprintf(stderr, "fromwire called!\n"); abort(); } -/* Generated stub for fromwire_bool */ -bool fromwire_bool(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) -{ fprintf(stderr, "fromwire_bool called!\n"); abort(); } -/* Generated stub for fromwire_fail */ -void *fromwire_fail(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) -{ fprintf(stderr, "fromwire_fail called!\n"); abort(); } -/* Generated stub for fromwire_secp256k1_ecdsa_signature */ -void fromwire_secp256k1_ecdsa_signature(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, - secp256k1_ecdsa_signature *signature UNNEEDED) -{ fprintf(stderr, "fromwire_secp256k1_ecdsa_signature called!\n"); abort(); } -/* Generated stub for fromwire_sha256 */ -void fromwire_sha256(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct sha256 *sha256 UNNEEDED) -{ fprintf(stderr, "fromwire_sha256 called!\n"); abort(); } -/* Generated stub for fromwire_tal_arrn */ -u8 *fromwire_tal_arrn(const tal_t *ctx UNNEEDED, - const u8 **cursor UNNEEDED, size_t *max UNNEEDED, size_t num UNNEEDED) -{ fprintf(stderr, "fromwire_tal_arrn called!\n"); abort(); } -/* Generated stub for fromwire_u32 */ -u32 fromwire_u32(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) -{ fprintf(stderr, "fromwire_u32 called!\n"); abort(); } -/* Generated stub for fromwire_u64 */ -u64 fromwire_u64(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) -{ fprintf(stderr, "fromwire_u64 called!\n"); abort(); } -/* Generated stub for fromwire_u8 */ -u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) -{ fprintf(stderr, "fromwire_u8 called!\n"); abort(); } -/* Generated stub for fromwire_u8_array */ -void fromwire_u8_array(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, u8 *arr UNNEEDED, size_t num UNNEEDED) -{ fprintf(stderr, "fromwire_u8_array called!\n"); abort(); } -/* Generated stub for towire */ -void towire(u8 **pptr UNNEEDED, const void *data UNNEEDED, size_t len UNNEEDED) -{ fprintf(stderr, "towire called!\n"); abort(); } -/* Generated stub for towire_bool */ -void towire_bool(u8 **pptr UNNEEDED, bool v UNNEEDED) -{ fprintf(stderr, "towire_bool called!\n"); abort(); } -/* Generated stub for towire_secp256k1_ecdsa_signature */ -void towire_secp256k1_ecdsa_signature(u8 **pptr UNNEEDED, - const secp256k1_ecdsa_signature *signature UNNEEDED) -{ fprintf(stderr, "towire_secp256k1_ecdsa_signature called!\n"); abort(); } -/* Generated stub for towire_sha256 */ -void towire_sha256(u8 **pptr UNNEEDED, const struct sha256 *sha256 UNNEEDED) -{ fprintf(stderr, "towire_sha256 called!\n"); abort(); } -/* Generated stub for towire_u32 */ -void towire_u32(u8 **pptr UNNEEDED, u32 v UNNEEDED) -{ fprintf(stderr, "towire_u32 called!\n"); abort(); } -/* Generated stub for towire_u64 */ -void towire_u64(u8 **pptr UNNEEDED, u64 v UNNEEDED) -{ fprintf(stderr, "towire_u64 called!\n"); abort(); } -/* Generated stub for towire_u8 */ -void towire_u8(u8 **pptr UNNEEDED, u8 v UNNEEDED) -{ fprintf(stderr, "towire_u8 called!\n"); abort(); } -/* Generated stub for towire_u8_array */ -void towire_u8_array(u8 **pptr UNNEEDED, const u8 *arr UNNEEDED, size_t num UNNEEDED) -{ fprintf(stderr, "towire_u8_array called!\n"); abort(); } -/* AUTOGENERATED MOCKS END */ - -int main(int argc, char *argv[]) -{ - common_setup(argv[0]); - - for (size_t i = 1; i < 255; i++) { - struct privkey priv; - secp256k1_keypair keypair; - secp256k1_pubkey pubkey; - secp256k1_xonly_pubkey xpubkey; - u8 output32[32]; - u8 output33[33]; - size_t len = sizeof(output33); - - memset(&priv, i, sizeof(priv)); - assert(secp256k1_keypair_create(secp256k1_ctx, &keypair, priv.secret.data) == 1); - assert(secp256k1_keypair_pub(secp256k1_ctx, &pubkey, &keypair) == 1); - assert(secp256k1_keypair_xonly_pub(secp256k1_ctx, &xpubkey, NULL, &keypair) == 1); - - assert(secp256k1_xonly_pubkey_serialize(secp256k1_ctx, output32, &xpubkey) == 1); - assert(secp256k1_ec_pubkey_serialize(secp256k1_ctx, output33, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); - assert(memcmp(output32, output33 + 1, sizeof(output32)) == 0); - assert(output33[0] == SECP256K1_TAG_PUBKEY_EVEN - || output33[0] == SECP256K1_TAG_PUBKEY_ODD); - } - common_shutdown(); -} diff --git a/plugins/Makefile b/plugins/Makefile index d9d49c23c..3585a834b 100644 --- a/plugins/Makefile +++ b/plugins/Makefile @@ -1,4 +1,5 @@ -PLUGIN_PAY_SRC := plugins/pay.c +PLUGIN_PAY_SRC := plugins/pay.c plugins/pay_point32.c +PLUGIN_PAY_HEADER := plugins/pay_point32.h PLUGIN_PAY_OBJS := $(PLUGIN_PAY_SRC:.c=.o) PLUGIN_AUTOCLEAN_SRC := plugins/autoclean.c @@ -76,6 +77,7 @@ PLUGIN_ALL_SRC := \ $(PLUGIN_SPENDER_SRC) PLUGIN_ALL_HEADER := \ + $(PLUGIN_PAY_HEADER) \ $(PLUGIN_LIB_HEADER) \ $(PLUGIN_FUNDER_HEADER) \ $(PLUGIN_PAY_LIB_HEADER) \ diff --git a/plugins/pay.c b/plugins/pay.c index 2f99e702c..7c8c1f547 100644 --- a/plugins/pay.c +++ b/plugins/pay.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include diff --git a/plugins/pay_point32.c b/plugins/pay_point32.c new file mode 100644 index 000000000..5884cf311 --- /dev/null +++ b/plugins/pay_point32.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include + +/* There are two 33-byte pubkeys possible: choose the one which appears + * in the graph (otherwise payment will fail anyway). */ +void gossmap_guess_node_id(const struct gossmap *map, + const struct point32 *point32, + struct node_id *id) +{ + struct pubkey pk; + pk.pubkey = point32->pubkey; + node_id_from_pubkey(id, &pk); + + /* If we don't find this, let's assume it's the alternate. */ + if (!gossmap_find_node(map, id)) + id->k[0] |= 1; +} + diff --git a/plugins/pay_point32.h b/plugins/pay_point32.h new file mode 100644 index 000000000..1cc5cc43f --- /dev/null +++ b/plugins/pay_point32.h @@ -0,0 +1,12 @@ +#ifndef LIGHTNING_PLUGINS_PAY_POINT32_H +#define LIGHTNING_PLUGINS_PAY_POINT32_H + +struct gossmap; +struct point32; +struct node_id; + +void gossmap_guess_node_id(const struct gossmap *map, + const struct point32 *point32, + struct node_id *id); + +#endif /* LIGHTNING_PLUGINS_PAY_POINT32_H */ diff --git a/plugins/test/run-gossmap_guess_node_id.c b/plugins/test/run-gossmap_guess_node_id.c new file mode 100644 index 000000000..5c4a7c88e --- /dev/null +++ b/plugins/test/run-gossmap_guess_node_id.c @@ -0,0 +1,68 @@ +/* Test conversion assumptions used by gossmap_guess_node_id */ +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include + #include "../pay_point32.c" + +/* AUTOGENERATED MOCKS START */ +/* Generated stub for fromwire_bigsize */ +bigsize_t fromwire_bigsize(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) +{ fprintf(stderr, "fromwire_bigsize called!\n"); abort(); } +/* Generated stub for fromwire_channel_id */ +bool fromwire_channel_id(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, + struct channel_id *channel_id UNNEEDED) +{ fprintf(stderr, "fromwire_channel_id called!\n"); abort(); } +/* Generated stub for fromwire_node_id */ +void fromwire_node_id(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct node_id *id UNNEEDED) +{ fprintf(stderr, "fromwire_node_id called!\n"); abort(); } +/* Generated stub for gossmap_find_node */ +struct gossmap_node *gossmap_find_node(const struct gossmap *map UNNEEDED, + const struct node_id *id UNNEEDED) +{ fprintf(stderr, "gossmap_find_node called!\n"); abort(); } +/* Generated stub for node_id_from_pubkey */ +void node_id_from_pubkey(struct node_id *id UNNEEDED, const struct pubkey *key UNNEEDED) +{ fprintf(stderr, "node_id_from_pubkey called!\n"); abort(); } +/* Generated stub for towire_bigsize */ +void towire_bigsize(u8 **pptr UNNEEDED, const bigsize_t val UNNEEDED) +{ fprintf(stderr, "towire_bigsize called!\n"); abort(); } +/* Generated stub for towire_channel_id */ +void towire_channel_id(u8 **pptr UNNEEDED, const struct channel_id *channel_id UNNEEDED) +{ fprintf(stderr, "towire_channel_id called!\n"); abort(); } +/* Generated stub for towire_node_id */ +void towire_node_id(u8 **pptr UNNEEDED, const struct node_id *id UNNEEDED) +{ fprintf(stderr, "towire_node_id called!\n"); abort(); } +/* AUTOGENERATED MOCKS END */ + +int main(int argc, char *argv[]) +{ + common_setup(argv[0]); + + for (size_t i = 1; i < 255; i++) { + struct privkey priv; + secp256k1_keypair keypair; + secp256k1_pubkey pubkey; + secp256k1_xonly_pubkey xpubkey; + u8 output32[32]; + u8 output33[33]; + size_t len = sizeof(output33); + + memset(&priv, i, sizeof(priv)); + assert(secp256k1_keypair_create(secp256k1_ctx, &keypair, priv.secret.data) == 1); + assert(secp256k1_keypair_pub(secp256k1_ctx, &pubkey, &keypair) == 1); + assert(secp256k1_keypair_xonly_pub(secp256k1_ctx, &xpubkey, NULL, &keypair) == 1); + + assert(secp256k1_xonly_pubkey_serialize(secp256k1_ctx, output32, &xpubkey) == 1); + assert(secp256k1_ec_pubkey_serialize(secp256k1_ctx, output33, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); + assert(memcmp(output32, output33 + 1, sizeof(output32)) == 0); + assert(output33[0] == SECP256K1_TAG_PUBKEY_EVEN + || output33[0] == SECP256K1_TAG_PUBKEY_ODD); + } + common_shutdown(); +}