From 5b3c02f401af5c34ce50b7936cdc853f700f9310 Mon Sep 17 00:00:00 2001 From: niftynei Date: Thu, 10 Jun 2021 12:54:08 -0500 Subject: [PATCH] liquidity-ads: import from spec Import the wires from spec. Here we go! --- channeld/channeld.c | 3 + common/test/Makefile | 1 + common/test/run-gossmap_local.c | 20 +-- devtools/create-gossipstore.c | 5 +- devtools/mkgossip.c | 21 ++- gossipd/gossip_generation.c | 5 +- gossipd/gossipd.c | 6 +- gossipd/routing.c | 10 +- openingd/dualopend.c | 3 + plugins/topology.c | 5 +- wire/extracted_peer_04_opt_will_fund.patch | 48 ++++++ wire/peer_printgen.c | 146 +++++++++++++++++- wire/peer_printgen.h | 5 +- wire/peer_wire.c | 2 + wire/peer_wire.csv | 18 +++ wire/peer_wiregen.c | 168 ++++++++++++++++++++- wire/peer_wiregen.h | 77 +++++++++- wire/test/run-peer-wire.c | 42 +++++- 18 files changed, 548 insertions(+), 37 deletions(-) create mode 100644 wire/extracted_peer_04_opt_will_fund.patch diff --git a/channeld/channeld.c b/channeld/channeld.c index dc614af9d..f5a052426 100644 --- a/channeld/channeld.c +++ b/channeld/channeld.c @@ -2098,6 +2098,9 @@ static void peer_in(struct peer *peer, const u8 *msg) case WIRE_UPDATE_FEE: handle_peer_feechange(peer, msg); return; + case WIRE_UPDATE_BLOCKHEIGHT: + /* FIXME: do this! */ + break; case WIRE_REVOKE_AND_ACK: handle_peer_revoke_and_ack(peer, msg); return; diff --git a/common/test/Makefile b/common/test/Makefile index b37adfeab..27a6cabcd 100644 --- a/common/test/Makefile +++ b/common/test/Makefile @@ -48,6 +48,7 @@ common/test/run-route common/test/run-route-specific: \ common/test/run-gossmap_local: \ wire/fromwire.o \ wire/peer$(EXP)_wiregen.o \ + wire/tlvstream.o \ wire/towire.o common/test/run-bolt12_merkle: \ diff --git a/common/test/run-gossmap_local.c b/common/test/run-gossmap_local.c index 4973f9de7..c624f93d1 100644 --- a/common/test/run-gossmap_local.c +++ b/common/test/run-gossmap_local.c @@ -9,6 +9,7 @@ #include #include #include +#include /* AUTOGENERATED MOCKS START */ /* Generated stub for fromwire_bigsize */ @@ -18,26 +19,12 @@ bigsize_t fromwire_bigsize(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) void 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_tlv */ -bool fromwire_tlv(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, - const struct tlv_record_type *types UNNEEDED, size_t num_types UNNEEDED, - void *record UNNEEDED, struct tlv_field **fields UNNEEDED) -{ fprintf(stderr, "fromwire_tlv called!\n"); abort(); } -/* Generated stub for tlv_fields_valid */ -bool tlv_fields_valid(const struct tlv_field *fields UNNEEDED, u64 *allow_extra UNNEEDED, - size_t *err_index UNNEEDED) -{ fprintf(stderr, "tlv_fields_valid 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_tlv */ -void towire_tlv(u8 **pptr UNNEEDED, - const struct tlv_record_type *types UNNEEDED, size_t num_types UNNEEDED, - const void *record UNNEEDED) -{ fprintf(stderr, "towire_tlv called!\n"); abort(); } /* Generated stub for type_to_string_ */ const char *type_to_string_(const tal_t *ctx UNNEEDED, const char *typename UNNEEDED, union printable_types u UNNEEDED) @@ -291,13 +278,16 @@ static void check_nannounce(const u8 *nannounce, u32 timestamp; u8 rgb_color[3], alias[32]; struct node_id node_id; + struct tlv_node_ann_tlvs *na_tlvs + = tlv_node_ann_tlvs_new(tmpctx); assert(fromwire_node_announcement(nannounce, nannounce, &sig, &features, ×tamp, &node_id, rgb_color, alias, - &addresses)); + &addresses, + na_tlvs)); assert(node_id_eq(&node_id, n)); } diff --git a/devtools/create-gossipstore.c b/devtools/create-gossipstore.c index 42c9db395..8fde975a5 100644 --- a/devtools/create-gossipstore.c +++ b/devtools/create-gossipstore.c @@ -88,9 +88,12 @@ static u32 get_node_announce_timestamp(const u8 *msg) struct node_id id; u8 rgb_color[3], alias[32]; u8 *features, *addresses; + struct tlv_node_ann_tlvs *na_tlvs; + na_tlvs = tlv_node_ann_tlvs_new(tmpctx); if (fromwire_node_announcement(tmpctx, msg, &sig, &features, ×tamp, - &id, rgb_color, alias, &addresses)) + &id, rgb_color, alias, &addresses, + na_tlvs)) return timestamp; errx(1, "Invalid node_announcement"); diff --git a/devtools/mkgossip.c b/devtools/mkgossip.c index 63d7b51b8..5e732e483 100644 --- a/devtools/mkgossip.c +++ b/devtools/mkgossip.c @@ -201,14 +201,17 @@ static void print_nannounce(const struct node_id *nodeid, struct sha256_double hash; secp256k1_ecdsa_signature sig; char alias[33]; + struct tlv_node_ann_tlvs *tlvs; u8 *nannounce; memset(&sig, 0, sizeof(sig)); assert(hex_str_size(sizeof(*nodeid)) >= sizeof(alias)); hex_encode(nodeid, hex_data_size(sizeof(alias)), alias, sizeof(alias)); + tlvs = tlv_node_ann_tlvs_new(NULL); nannounce = towire_node_announcement(NULL, &sig, NULL, opts->timestamp, nodeid, nodeid->k, (u8 *)alias, - opts->addresses); + opts->addresses, + tlvs); sha256_double(&hash, nannounce + node_announcement_offset, tal_count(nannounce) - node_announcement_offset); sign_hash(privkey, &hash, &sig); @@ -221,6 +224,22 @@ static void print_nannounce(const struct node_id *nodeid, printf(" rgb_color=%s\n", tal_hexstr(NULL, nodeid->k, 3)); printf(" alias=%s\n", tal_hexstr(NULL, alias, 32)); printf(" addresses=%s\n", tal_hex(NULL, opts->addresses)); + + if (tlvs->option_will_fund) { + struct lease_rates *rates = tlvs->option_will_fund; + printf(" TLV option_will_fund\n"); + printf(" lease_fee_basis=%d\n", + rates->lease_fee_basis); + printf(" lease_fee_base_sat=%d\n", + rates->lease_fee_base_sat); + printf(" funding_weight=%d\n", + rates->funding_weight); + printf(" channel_fee_max_proportional_thousandths=%d\n", + rates->channel_fee_max_proportional_thousandths); + printf(" channel_fee_max_base_msat=%d\n", + rates->channel_fee_max_base_msat); + } + tal_free(tlvs); } int main(int argc, char *argv[]) diff --git a/gossipd/gossip_generation.c b/gossipd/gossip_generation.c index 7defae9f4..a3f23c7bc 100644 --- a/gossipd/gossip_generation.c +++ b/gossipd/gossip_generation.c @@ -30,6 +30,7 @@ static u8 *create_node_announcement(const tal_t *ctx, struct daemon *daemon, { u8 *addresses = tal_arr(tmpctx, u8, 0); u8 *announcement; + struct tlv_node_ann_tlvs *na_tlv; size_t i; if (!sig) @@ -38,13 +39,15 @@ static u8 *create_node_announcement(const tal_t *ctx, struct daemon *daemon, for (i = 0; i < tal_count(daemon->announcable); i++) towire_wireaddr(&addresses, &daemon->announcable[i]); + na_tlv = tlv_node_ann_tlvs_new(tmpctx); announcement = towire_node_announcement(ctx, sig, daemon->our_features->bits [NODE_ANNOUNCE_FEATURE], timestamp, &daemon->id, daemon->rgb, daemon->alias, - addresses); + addresses, + na_tlv); return announcement; } diff --git a/gossipd/gossipd.c b/gossipd/gossipd.c index d13ba5e46..a10f3b0ae 100644 --- a/gossipd/gossipd.c +++ b/gossipd/gossipd.c @@ -164,6 +164,7 @@ static bool get_node_announcement(const tal_t *ctx, secp256k1_ecdsa_signature signature; u32 timestamp; u8 *addresses; + struct tlv_node_ann_tlvs *na_tlvs; if (!n->bcast.index) return false; @@ -171,11 +172,13 @@ static bool get_node_announcement(const tal_t *ctx, msg = gossip_store_get(tmpctx, daemon->rstate->gs, n->bcast.index); /* Note: validity of node_id is already checked. */ + na_tlvs = tlv_node_ann_tlvs_new(ctx); if (!fromwire_node_announcement(ctx, msg, &signature, features, ×tamp, &id, rgb_color, alias, - &addresses)) { + &addresses, + na_tlvs)) { status_broken("Bad local node_announcement @%u: %s", n->bcast.index, tal_hex(tmpctx, msg)); return false; @@ -728,6 +731,7 @@ static struct io_plan *peer_msg_in(struct io_conn *conn, case WIRE_COMMITMENT_SIGNED: case WIRE_REVOKE_AND_ACK: case WIRE_UPDATE_FEE: + case WIRE_UPDATE_BLOCKHEIGHT: case WIRE_CHANNEL_REESTABLISH: case WIRE_ANNOUNCEMENT_SIGNATURES: case WIRE_GOSSIP_TIMESTAMP_FILTER: diff --git a/gossipd/routing.c b/gossipd/routing.c index fabb469d6..0fd8c0815 100644 --- a/gossipd/routing.c +++ b/gossipd/routing.c @@ -1598,6 +1598,7 @@ bool routing_add_node_announcement(struct routing_state *rstate, u8 rgb_color[3]; u8 alias[32]; u8 *features, *addresses; + struct tlv_node_ann_tlvs *na_tlv; if (was_unknown) *was_unknown = false; @@ -1607,10 +1608,12 @@ bool routing_add_node_announcement(struct routing_state *rstate, tal_steal(tmpctx, msg); /* Note: validity of node_id is already checked. */ + na_tlv = tlv_node_ann_tlvs_new(tmpctx); if (!fromwire_node_announcement(tmpctx, msg, &signature, &features, ×tamp, &node_id, rgb_color, alias, - &addresses)) { + &addresses, + na_tlv)) { return false; } @@ -1737,15 +1740,18 @@ u8 *handle_node_announcement(struct routing_state *rstate, const u8 *node_ann, u8 *features, *addresses; struct wireaddr *wireaddrs; size_t len = tal_count(node_ann); + struct tlv_node_ann_tlvs *na_tlv; if (was_unknown) *was_unknown = false; serialized = tal_dup_arr(tmpctx, u8, node_ann, len, 0); + na_tlv = tlv_node_ann_tlvs_new(tmpctx); if (!fromwire_node_announcement(tmpctx, serialized, &signature, &features, ×tamp, &node_id, rgb_color, alias, - &addresses)) { + &addresses, + na_tlv)) { /* BOLT #7: * * - if `node_id` is NOT a valid compressed public key: diff --git a/openingd/dualopend.c b/openingd/dualopend.c index ce90d1cec..a92087651 100644 --- a/openingd/dualopend.c +++ b/openingd/dualopend.c @@ -1251,6 +1251,7 @@ static u8 *opening_negotiate_msg(const tal_t *ctx, struct state *state) case WIRE_COMMITMENT_SIGNED: case WIRE_REVOKE_AND_ACK: case WIRE_UPDATE_FEE: + case WIRE_UPDATE_BLOCKHEIGHT: case WIRE_CHANNEL_REESTABLISH: case WIRE_ANNOUNCEMENT_SIGNATURES: case WIRE_GOSSIP_TIMESTAMP_FILTER: @@ -1598,6 +1599,7 @@ static bool run_tx_interactive(struct state *state, case WIRE_COMMITMENT_SIGNED: case WIRE_REVOKE_AND_ACK: case WIRE_UPDATE_FEE: + case WIRE_UPDATE_BLOCKHEIGHT: case WIRE_CHANNEL_REESTABLISH: case WIRE_ANNOUNCEMENT_SIGNATURES: case WIRE_GOSSIP_TIMESTAMP_FILTER: @@ -3344,6 +3346,7 @@ static u8 *handle_peer_in(struct state *state) case WIRE_COMMITMENT_SIGNED: case WIRE_REVOKE_AND_ACK: case WIRE_UPDATE_FEE: + case WIRE_UPDATE_BLOCKHEIGHT: case WIRE_CHANNEL_REESTABLISH: case WIRE_ANNOUNCEMENT_SIGNATURES: case WIRE_GOSSIP_TIMESTAMP_FILTER: diff --git a/plugins/topology.c b/plugins/topology.c index becc242b7..6b81bc456 100644 --- a/plugins/topology.c +++ b/plugins/topology.c @@ -521,7 +521,9 @@ static void json_add_node(struct json_stream *js, struct node_id nid; struct wireaddr *addrs; struct json_escape *esc; + struct tlv_node_ann_tlvs *na_tlvs; + na_tlvs = tlv_node_ann_tlvs_new(tmpctx); if (!fromwire_node_announcement(nannounce, nannounce, &signature, &features, @@ -529,7 +531,8 @@ static void json_add_node(struct json_stream *js, &nid, rgb_color, alias, - &addresses)) { + &addresses, + na_tlvs)) { plugin_log(plugin, LOG_BROKEN, "Cannot parse stored node_announcement" " for %s at %u: %s", diff --git a/wire/extracted_peer_04_opt_will_fund.patch b/wire/extracted_peer_04_opt_will_fund.patch new file mode 100644 index 000000000..c8c279161 --- /dev/null +++ b/wire/extracted_peer_04_opt_will_fund.patch @@ -0,0 +1,48 @@ +--- wire/peer_wire.csv 2021-06-10 12:47:17.225844741 -0500 ++++ - 2021-06-10 12:47:40.960373156 -0500 +@@ -143,6 +139,9 @@ + tlvtype,opening_tlvs,option_upfront_shutdown_script,1 + tlvdata,opening_tlvs,option_upfront_shutdown_script,shutdown_len,u16, + tlvdata,opening_tlvs,option_upfront_shutdown_script,shutdown_scriptpubkey,byte,shutdown_len ++tlvtype,opening_tlvs,request_funds,3 ++tlvdata,opening_tlvs,request_funds,requested_sats,u64, ++tlvdata,opening_tlvs,request_funds,blockheight,u32, + msgtype,accept_channel2,65 + msgdata,accept_channel2,channel_id,channel_id, + msgdata,accept_channel2,funding_satoshis,u64, +@@ -162,6 +161,15 @@ + tlvtype,accept_tlvs,option_upfront_shutdown_script,1 + tlvdata,accept_tlvs,option_upfront_shutdown_script,shutdown_len,u16, + tlvdata,accept_tlvs,option_upfront_shutdown_script,shutdown_scriptpubkey,byte,shutdown_len ++tlvtype,accept_tlvs,will_fund,2 ++tlvdata,accept_tlvs,will_fund,signature,signature, ++tlvdata,accept_tlvs,will_fund,lease_rates,lease_rates, ++subtype,lease_rates ++subtypedata,lease_rates,channel_fee_max_base_msat,u32, ++subtypedata,lease_rates,channel_fee_max_proportional_thousandths,u16, ++subtypedata,lease_rates,funding_weight,u16, ++subtypedata,lease_rates,lease_fee_base_sat,u32, ++subtypedata,lease_rates,lease_fee_basis,tu32, + msgtype,init_rbf,72 + msgdata,init_rbf,channel_id,channel_id, + msgdata,init_rbf,funding_satoshis,u64, +@@ -215,6 +219,9 @@ + msgtype,update_fee,134 + msgdata,update_fee,channel_id,channel_id, + msgdata,update_fee,feerate_per_kw,u32, ++msgtype,update_blockheight,137 ++msgdata,update_blockheight,channel_id,channel_id, ++msgdata,update_blockheight,blockheight,u32, + msgtype,channel_reestablish,136 + msgdata,channel_reestablish,channel_id,channel_id, + msgdata,channel_reestablish,next_commitment_number,u64, +@@ -249,6 +256,9 @@ + msgdata,node_announcement,alias,byte,32 + msgdata,node_announcement,addrlen,u16, + msgdata,node_announcement,addresses,byte,addrlen ++msgdata,node_announcement,tlvs,node_ann_tlvs, ++tlvtype,node_ann_tlvs,option_will_fund,1 ++tlvdata,node_ann_tlvs,option_will_fund,lease_rates,lease_rates, + msgtype,channel_update,258 + msgdata,channel_update,signature,signature, + msgdata,channel_update,chain_hash,chain_hash, diff --git a/wire/peer_printgen.c b/wire/peer_printgen.c index f17e49bdc..e2685809e 100644 --- a/wire/peer_printgen.c +++ b/wire/peer_printgen.c @@ -128,6 +128,10 @@ void printpeer_wire_message(const u8 *msg) printf("WIRE_UPDATE_FEE:\n"); printwire_update_fee("update_fee", msg); return; + case WIRE_UPDATE_BLOCKHEIGHT: + printf("WIRE_UPDATE_BLOCKHEIGHT:\n"); + printwire_update_blockheight("update_blockheight", msg); + return; case WIRE_CHANNEL_REESTABLISH: printf("WIRE_CHANNEL_REESTABLISH:\n"); printwire_channel_reestablish("channel_reestablish", msg); @@ -196,6 +200,52 @@ void printwire_witness_element(const char *fieldname, const u8 **cursor, size_t } +void printwire_lease_rates(const char *fieldname, const u8 **cursor, size_t *plen) +{ + + printf("funding_weight="); + u16 funding_weight = fromwire_u16(cursor, plen); + + printwire_u16(tal_fmt(NULL, "%s.funding_weight", fieldname), &funding_weight); + if (!*cursor) { + printf("**TRUNCATED**\n"); + return; + } + printf("lease_fee_basis="); + u16 lease_fee_basis = fromwire_u16(cursor, plen); + + printwire_u16(tal_fmt(NULL, "%s.lease_fee_basis", fieldname), &lease_fee_basis); + if (!*cursor) { + printf("**TRUNCATED**\n"); + return; + } + printf("channel_fee_max_proportional_thousandths="); + u16 channel_fee_max_proportional_thousandths = fromwire_u16(cursor, plen); + + printwire_u16(tal_fmt(NULL, "%s.channel_fee_max_proportional_thousandths", fieldname), &channel_fee_max_proportional_thousandths); + if (!*cursor) { + printf("**TRUNCATED**\n"); + return; + } + printf("lease_fee_base_sat="); + u32 lease_fee_base_sat = fromwire_u32(cursor, plen); + + printwire_u32(tal_fmt(NULL, "%s.lease_fee_base_sat", fieldname), &lease_fee_base_sat); + if (!*cursor) { + printf("**TRUNCATED**\n"); + return; + } + printf("channel_fee_max_base_msat="); + u32 channel_fee_max_base_msat = fromwire_tu32(cursor, plen); + + printwire_u32(tal_fmt(NULL, "%s.channel_fee_max_base_msat", fieldname), &channel_fee_max_base_msat); + if (!*cursor) { + printf("**TRUNCATED**\n"); + return; + } + +} + void printwire_channel_update_checksums(const char *fieldname, const u8 **cursor, size_t *plen) { @@ -461,10 +511,33 @@ static void printwire_tlv_opening_tlvs_option_upfront_shutdown_script(const char return; } +} +static void printwire_tlv_opening_tlvs_request_funds(const char *fieldname, const u8 **cursor, size_t *plen) +{ + printf("(msg_name=%s)\n", "request_funds"); + + printf("requested_sats="); + u64 requested_sats = fromwire_u64(cursor, plen); + + printwire_u64(tal_fmt(NULL, "%s.requested_sats", fieldname), &requested_sats); + if (!*cursor) { + printf("**TRUNCATED**\n"); + return; + } + printf("blockheight="); + u32 blockheight = fromwire_u32(cursor, plen); + + printwire_u32(tal_fmt(NULL, "%s.blockheight", fieldname), &blockheight); + if (!*cursor) { + printf("**TRUNCATED**\n"); + return; + } + } static const struct tlv_print_record_type print_tlvs_opening_tlvs[] = { { 1, printwire_tlv_opening_tlvs_option_upfront_shutdown_script }, + { 3, printwire_tlv_opening_tlvs_request_funds }, }; static void printwire_tlv_accept_tlvs_option_upfront_shutdown_script(const char *fieldname, const u8 **cursor, size_t *plen) @@ -484,10 +557,30 @@ static void printwire_tlv_accept_tlvs_option_upfront_shutdown_script(const char return; } +} +static void printwire_tlv_accept_tlvs_will_fund(const char *fieldname, const u8 **cursor, size_t *plen) +{ + printf("(msg_name=%s)\n", "will_fund"); + + printf("signature="); + secp256k1_ecdsa_signature signature; + fromwire_secp256k1_ecdsa_signature(cursor, plen, &signature); + + printwire_secp256k1_ecdsa_signature(tal_fmt(NULL, "%s.signature", fieldname), &signature); + if (!*cursor) { + printf("**TRUNCATED**\n"); + return; + } + printf("lease_rates="); + printf("{\n"); + printwire_lease_rates(tal_fmt(NULL, "%s.lease_rates", fieldname), cursor, plen); + printf("}\n"); + } static const struct tlv_print_record_type print_tlvs_accept_tlvs[] = { { 1, printwire_tlv_accept_tlvs_option_upfront_shutdown_script }, + { 2, printwire_tlv_accept_tlvs_will_fund }, }; static void printwire_tlv_shutdown_tlvs_wrong_funding(const char *fieldname, const u8 **cursor, size_t *plen) @@ -518,6 +611,21 @@ static const struct tlv_print_record_type print_tlvs_shutdown_tlvs[] = { { 100, printwire_tlv_shutdown_tlvs_wrong_funding }, }; +static void printwire_tlv_node_ann_tlvs_option_will_fund(const char *fieldname, const u8 **cursor, size_t *plen) +{ + printf("(msg_name=%s)\n", "option_will_fund"); + + printf("lease_rates="); + printf("{\n"); + printwire_lease_rates(tal_fmt(NULL, "%s.lease_rates", fieldname), cursor, plen); + printf("}\n"); + +} + +static const struct tlv_print_record_type print_tlvs_node_ann_tlvs[] = { + { 1, printwire_tlv_node_ann_tlvs_option_will_fund }, +}; + static void printwire_tlv_query_short_channel_ids_tlvs_query_flags(const char *fieldname, const u8 **cursor, size_t *plen) { printf("(msg_name=%s)\n", "query_flags"); @@ -2246,6 +2354,37 @@ void printwire_update_fee(const char *fieldname, const u8 *cursor) } + if (plen != 0) + printf("EXTRA: %s\n", tal_hexstr(NULL, cursor, plen)); +} +void printwire_update_blockheight(const char *fieldname, const u8 *cursor) +{ + + size_t plen = tal_count(cursor); + if (fromwire_u16(&cursor, &plen) != WIRE_UPDATE_BLOCKHEIGHT) { + printf("WRONG TYPE?!\n"); + return; + } + + printf("channel_id="); + struct channel_id channel_id; + fromwire_channel_id(&cursor, &plen, &channel_id); + + printwire_channel_id(tal_fmt(NULL, "%s.channel_id", fieldname), &channel_id); + if (!cursor) { + printf("**TRUNCATED**\n"); + return; + } + printf("blockheight="); + u32 blockheight = fromwire_u32(&cursor, &plen); + + printwire_u32(tal_fmt(NULL, "%s.blockheight", fieldname), &blockheight); + if (!cursor) { + printf("**TRUNCATED**\n"); + return; + } + + if (plen != 0) printf("EXTRA: %s\n", tal_hexstr(NULL, cursor, plen)); } @@ -2545,6 +2684,8 @@ void printwire_node_announcement(const char *fieldname, const u8 *cursor) printf("**TRUNCATED**\n"); return; } + printf("tlvs="); + printwire_tlvs(tal_fmt(NULL, "%s.tlvs", fieldname), &cursor, &plen, print_tlvs_node_ann_tlvs, ARRAY_SIZE(print_tlvs_node_ann_tlvs)); if (plen != 0) @@ -2922,6 +3063,9 @@ void printpeer_wire_tlv_message(const char *tlv_name, const u8 *msg) { if (strcmp(tlv_name, "shutdown_tlvs") == 0) { printwire_tlvs(tlv_name, &msg, &plen, print_tlvs_shutdown_tlvs, ARRAY_SIZE(print_tlvs_shutdown_tlvs)); } + if (strcmp(tlv_name, "node_ann_tlvs") == 0) { + printwire_tlvs(tlv_name, &msg, &plen, print_tlvs_node_ann_tlvs, ARRAY_SIZE(print_tlvs_node_ann_tlvs)); + } if (strcmp(tlv_name, "query_short_channel_ids_tlvs") == 0) { printwire_tlvs(tlv_name, &msg, &plen, print_tlvs_query_short_channel_ids_tlvs, ARRAY_SIZE(print_tlvs_query_short_channel_ids_tlvs)); } @@ -2935,4 +3079,4 @@ void printpeer_wire_tlv_message(const char *tlv_name, const u8 *msg) { printwire_tlvs(tlv_name, &msg, &plen, print_tlvs_onion_message_tlvs, ARRAY_SIZE(print_tlvs_onion_message_tlvs)); } } -// SHA256STAMP:a3a508935b99ff0b985d0774432ae9d98f3ec7660bf4edf64095a3d0a37ba0e8 +// SHA256STAMP:4751c4834d5db7d170f8e1ee40ea8b5e12b5552780d37b099fe5fae6f0342c9e diff --git a/wire/peer_printgen.h b/wire/peer_printgen.h index 2caeaa7bd..a3bd3d333 100644 --- a/wire/peer_printgen.h +++ b/wire/peer_printgen.h @@ -68,6 +68,8 @@ void printwire_revoke_and_ack(const char *fieldname, const u8 *cursor); void printwire_update_fee(const char *fieldname, const u8 *cursor); +void printwire_update_blockheight(const char *fieldname, const u8 *cursor); + void printwire_channel_reestablish(const char *fieldname, const u8 *cursor); void printwire_announcement_signatures(const char *fieldname, const u8 *cursor); @@ -92,8 +94,9 @@ void printwire_onion_message(const char *fieldname, const u8 *cursor); void printwire_witness_element(const char *fieldname, const u8 **cursor, size_t *plen); +void printwire_lease_rates(const char *fieldname, const u8 **cursor, size_t *plen); void printwire_channel_update_checksums(const char *fieldname, const u8 **cursor, size_t *plen); void printwire_channel_update_timestamps(const char *fieldname, const u8 **cursor, size_t *plen); void printwire_witness_stack(const char *fieldname, const u8 **cursor, size_t *plen); #endif /* LIGHTNING_WIRE_PEER_PRINTGEN_H */ -// SHA256STAMP:a3a508935b99ff0b985d0774432ae9d98f3ec7660bf4edf64095a3d0a37ba0e8 +// SHA256STAMP:4751c4834d5db7d170f8e1ee40ea8b5e12b5552780d37b099fe5fae6f0342c9e diff --git a/wire/peer_wire.c b/wire/peer_wire.c index afc60a220..21a6f6e52 100644 --- a/wire/peer_wire.c +++ b/wire/peer_wire.c @@ -21,6 +21,7 @@ static bool unknown_type(enum peer_wire t) case WIRE_COMMITMENT_SIGNED: case WIRE_REVOKE_AND_ACK: case WIRE_UPDATE_FEE: + case WIRE_UPDATE_BLOCKHEIGHT: case WIRE_CHANNEL_REESTABLISH: case WIRE_ANNOUNCEMENT_SIGNATURES: case WIRE_CHANNEL_ANNOUNCEMENT: @@ -83,6 +84,7 @@ bool is_msg_for_gossipd(const u8 *cursor) case WIRE_COMMITMENT_SIGNED: case WIRE_REVOKE_AND_ACK: case WIRE_UPDATE_FEE: + case WIRE_UPDATE_BLOCKHEIGHT: case WIRE_CHANNEL_REESTABLISH: case WIRE_ANNOUNCEMENT_SIGNATURES: case WIRE_GOSSIP_TIMESTAMP_FILTER: diff --git a/wire/peer_wire.csv b/wire/peer_wire.csv index d32b9e42b..6cfe78176 100644 --- a/wire/peer_wire.csv +++ b/wire/peer_wire.csv @@ -143,6 +143,9 @@ msgdata,open_channel2,tlvs,opening_tlvs, tlvtype,opening_tlvs,option_upfront_shutdown_script,1 tlvdata,opening_tlvs,option_upfront_shutdown_script,shutdown_len,u16, tlvdata,opening_tlvs,option_upfront_shutdown_script,shutdown_scriptpubkey,byte,shutdown_len +tlvtype,opening_tlvs,request_funds,3 +tlvdata,opening_tlvs,request_funds,requested_sats,u64, +tlvdata,opening_tlvs,request_funds,blockheight,u32, msgtype,accept_channel2,65 msgdata,accept_channel2,channel_id,channel_id, msgdata,accept_channel2,funding_satoshis,u64, @@ -162,6 +165,15 @@ msgdata,accept_channel2,tlvs,accept_tlvs, tlvtype,accept_tlvs,option_upfront_shutdown_script,1 tlvdata,accept_tlvs,option_upfront_shutdown_script,shutdown_len,u16, tlvdata,accept_tlvs,option_upfront_shutdown_script,shutdown_scriptpubkey,byte,shutdown_len +tlvtype,accept_tlvs,will_fund,2 +tlvdata,accept_tlvs,will_fund,signature,signature, +tlvdata,accept_tlvs,will_fund,lease_rates,lease_rates, +subtype,lease_rates +subtypedata,lease_rates,funding_weight,u16, +subtypedata,lease_rates,lease_fee_basis,u16, +subtypedata,lease_rates,channel_fee_max_proportional_thousandths,u16, +subtypedata,lease_rates,lease_fee_base_sat,u32, +subtypedata,lease_rates,channel_fee_max_base_msat,tu32, msgtype,init_rbf,72 msgdata,init_rbf,channel_id,channel_id, msgdata,init_rbf,funding_satoshis,u64, @@ -215,6 +227,9 @@ msgdata,revoke_and_ack,next_per_commitment_point,point, msgtype,update_fee,134 msgdata,update_fee,channel_id,channel_id, msgdata,update_fee,feerate_per_kw,u32, +msgtype,update_blockheight,137 +msgdata,update_blockheight,channel_id,channel_id, +msgdata,update_blockheight,blockheight,u32, msgtype,channel_reestablish,136 msgdata,channel_reestablish,channel_id,channel_id, msgdata,channel_reestablish,next_commitment_number,u64, @@ -249,6 +264,9 @@ msgdata,node_announcement,rgb_color,byte,3 msgdata,node_announcement,alias,byte,32 msgdata,node_announcement,addrlen,u16, msgdata,node_announcement,addresses,byte,addrlen +msgdata,node_announcement,tlvs,node_ann_tlvs, +tlvtype,node_ann_tlvs,option_will_fund,1 +tlvdata,node_ann_tlvs,option_will_fund,lease_rates,lease_rates, msgtype,channel_update,258 msgdata,channel_update,signature,signature, msgdata,channel_update,chain_hash,chain_hash, diff --git a/wire/peer_wiregen.c b/wire/peer_wiregen.c index cae0d88b0..92c206e9b 100644 --- a/wire/peer_wiregen.c +++ b/wire/peer_wiregen.c @@ -49,6 +49,7 @@ const char *peer_wire_name(int e) case WIRE_COMMITMENT_SIGNED: return "WIRE_COMMITMENT_SIGNED"; case WIRE_REVOKE_AND_ACK: return "WIRE_REVOKE_AND_ACK"; case WIRE_UPDATE_FEE: return "WIRE_UPDATE_FEE"; + case WIRE_UPDATE_BLOCKHEIGHT: return "WIRE_UPDATE_BLOCKHEIGHT"; case WIRE_CHANNEL_REESTABLISH: return "WIRE_CHANNEL_REESTABLISH"; case WIRE_ANNOUNCEMENT_SIGNATURES: return "WIRE_ANNOUNCEMENT_SIGNATURES"; case WIRE_CHANNEL_ANNOUNCEMENT: return "WIRE_CHANNEL_ANNOUNCEMENT"; @@ -98,6 +99,7 @@ bool peer_wire_is_defined(u16 type) case WIRE_COMMITMENT_SIGNED:; case WIRE_REVOKE_AND_ACK:; case WIRE_UPDATE_FEE:; + case WIRE_UPDATE_BLOCKHEIGHT:; case WIRE_CHANNEL_REESTABLISH:; case WIRE_ANNOUNCEMENT_SIGNATURES:; case WIRE_CHANNEL_ANNOUNCEMENT:; @@ -138,6 +140,26 @@ fromwire_u8_array(cursor, plen, witness_element->witness, len); return witness_element; } +/* SUBTYPE: LEASE_RATES */ +void towire_lease_rates(u8 **p, const struct lease_rates *lease_rates) +{ + + towire_u16(p, lease_rates->funding_weight); + towire_u16(p, lease_rates->lease_fee_basis); + towire_u16(p, lease_rates->channel_fee_max_proportional_thousandths); + towire_u32(p, lease_rates->lease_fee_base_sat); + towire_tu32(p, lease_rates->channel_fee_max_base_msat); +} +void fromwire_lease_rates(const u8 **cursor, size_t *plen, struct lease_rates *lease_rates) +{ + + lease_rates->funding_weight = fromwire_u16(cursor, plen); + lease_rates->lease_fee_basis = fromwire_u16(cursor, plen); + lease_rates->channel_fee_max_proportional_thousandths = fromwire_u16(cursor, plen); + lease_rates->lease_fee_base_sat = fromwire_u32(cursor, plen); + lease_rates->channel_fee_max_base_msat = fromwire_tu32(cursor, plen); +} + /* SUBTYPE: CHANNEL_UPDATE_CHECKSUMS */ void towire_channel_update_checksums(u8 **p, const struct channel_update_checksums *channel_update_checksums) { @@ -609,20 +631,46 @@ static void fromwire_tlv_opening_tlvs_option_upfront_shutdown_script(const u8 ** r->option_upfront_shutdown_script->shutdown_scriptpubkey = shutdown_len ? tal_arr(r->option_upfront_shutdown_script, u8, shutdown_len) : NULL; fromwire_u8_array(cursor, plen, r->option_upfront_shutdown_script->shutdown_scriptpubkey, shutdown_len); } +/* OPENING_TLVS MSG: request_funds */ +static u8 *towire_tlv_opening_tlvs_request_funds(const tal_t *ctx, const void *vrecord) +{ + const struct tlv_opening_tlvs *r = vrecord; + u8 *ptr; + + if (!r->request_funds) + return NULL; + + + ptr = tal_arr(ctx, u8, 0); + + towire_u64(&ptr, r->request_funds->requested_sats); + + towire_u32(&ptr, r->request_funds->blockheight); + return ptr; +} +static void fromwire_tlv_opening_tlvs_request_funds(const u8 **cursor, size_t *plen, void *vrecord) +{ + struct tlv_opening_tlvs *r = vrecord; + + r->request_funds = tal(r, struct tlv_opening_tlvs_request_funds); + r->request_funds->requested_sats = fromwire_u64(cursor, plen); + r->request_funds->blockheight = fromwire_u32(cursor, plen); +} static const struct tlv_record_type tlvs_opening_tlvs[] = { { 1, towire_tlv_opening_tlvs_option_upfront_shutdown_script, fromwire_tlv_opening_tlvs_option_upfront_shutdown_script }, + { 3, towire_tlv_opening_tlvs_request_funds, fromwire_tlv_opening_tlvs_request_funds }, }; void towire_opening_tlvs(u8 **pptr, const struct tlv_opening_tlvs *record) { - towire_tlv(pptr, tlvs_opening_tlvs, 1, record); + towire_tlv(pptr, tlvs_opening_tlvs, 2, record); } bool fromwire_opening_tlvs(const u8 **cursor, size_t *max, struct tlv_opening_tlvs *record) { - return fromwire_tlv(cursor, max, tlvs_opening_tlvs, 1, record, &record->fields); + return fromwire_tlv(cursor, max, tlvs_opening_tlvs, 2, record, &record->fields); } bool opening_tlvs_is_valid(const struct tlv_opening_tlvs *record, size_t *err_index) @@ -669,20 +717,46 @@ static void fromwire_tlv_accept_tlvs_option_upfront_shutdown_script(const u8 **c r->option_upfront_shutdown_script->shutdown_scriptpubkey = shutdown_len ? tal_arr(r->option_upfront_shutdown_script, u8, shutdown_len) : NULL; fromwire_u8_array(cursor, plen, r->option_upfront_shutdown_script->shutdown_scriptpubkey, shutdown_len); } +/* ACCEPT_TLVS MSG: will_fund */ +static u8 *towire_tlv_accept_tlvs_will_fund(const tal_t *ctx, const void *vrecord) +{ + const struct tlv_accept_tlvs *r = vrecord; + u8 *ptr; + + if (!r->will_fund) + return NULL; + + + ptr = tal_arr(ctx, u8, 0); + + towire_secp256k1_ecdsa_signature(&ptr, &r->will_fund->signature); + + towire_lease_rates(&ptr, &r->will_fund->lease_rates); + return ptr; +} +static void fromwire_tlv_accept_tlvs_will_fund(const u8 **cursor, size_t *plen, void *vrecord) +{ + struct tlv_accept_tlvs *r = vrecord; + + r->will_fund = tal(r, struct tlv_accept_tlvs_will_fund); + fromwire_secp256k1_ecdsa_signature(cursor, plen, &r->will_fund->signature); + fromwire_lease_rates(cursor, plen, &r->will_fund->lease_rates); +} static const struct tlv_record_type tlvs_accept_tlvs[] = { { 1, towire_tlv_accept_tlvs_option_upfront_shutdown_script, fromwire_tlv_accept_tlvs_option_upfront_shutdown_script }, + { 2, towire_tlv_accept_tlvs_will_fund, fromwire_tlv_accept_tlvs_will_fund }, }; void towire_accept_tlvs(u8 **pptr, const struct tlv_accept_tlvs *record) { - towire_tlv(pptr, tlvs_accept_tlvs, 1, record); + towire_tlv(pptr, tlvs_accept_tlvs, 2, record); } bool fromwire_accept_tlvs(const u8 **cursor, size_t *max, struct tlv_accept_tlvs *record) { - return fromwire_tlv(cursor, max, tlvs_accept_tlvs, 1, record, &record->fields); + return fromwire_tlv(cursor, max, tlvs_accept_tlvs, 2, record, &record->fields); } bool accept_tlvs_is_valid(const struct tlv_accept_tlvs *record, size_t *err_index) @@ -748,6 +822,61 @@ bool shutdown_tlvs_is_valid(const struct tlv_shutdown_tlvs *record, size_t *err_ } +struct tlv_node_ann_tlvs *tlv_node_ann_tlvs_new(const tal_t *ctx) +{ + /* Initialize everything to NULL. (Quiet, C pedants!) */ + struct tlv_node_ann_tlvs *inst = talz(ctx, struct tlv_node_ann_tlvs); + + /* Initialized the fields to an empty array. */ + inst->fields = tal_arr(inst, struct tlv_field, 0); + return inst; +} + +/* NODE_ANN_TLVS MSG: option_will_fund */ +static u8 *towire_tlv_node_ann_tlvs_option_will_fund(const tal_t *ctx, const void *vrecord) +{ + const struct tlv_node_ann_tlvs *r = vrecord; + u8 *ptr; + + if (!r->option_will_fund) + return NULL; + + + ptr = tal_arr(ctx, u8, 0); + + towire_lease_rates(&ptr, r->option_will_fund); + return ptr; +} +static void fromwire_tlv_node_ann_tlvs_option_will_fund(const u8 **cursor, size_t *plen, void *vrecord) +{ + struct tlv_node_ann_tlvs *r = vrecord; + + r->option_will_fund = tal(r, struct lease_rates); + +fromwire_lease_rates(cursor, plen, &*r->option_will_fund); +} + +static const struct tlv_record_type tlvs_node_ann_tlvs[] = { + { 1, towire_tlv_node_ann_tlvs_option_will_fund, fromwire_tlv_node_ann_tlvs_option_will_fund }, +}; + +void towire_node_ann_tlvs(u8 **pptr, const struct tlv_node_ann_tlvs *record) +{ + towire_tlv(pptr, tlvs_node_ann_tlvs, 1, record); +} + + +bool fromwire_node_ann_tlvs(const u8 **cursor, size_t *max, struct tlv_node_ann_tlvs *record) +{ + return fromwire_tlv(cursor, max, tlvs_node_ann_tlvs, 1, record, &record->fields); +} + +bool node_ann_tlvs_is_valid(const struct tlv_node_ann_tlvs *record, size_t *err_index) +{ + return tlv_fields_valid(record->fields, NULL, err_index); +} + + struct tlv_query_short_channel_ids_tlvs *tlv_query_short_channel_ids_tlvs_new(const tal_t *ctx) { /* Initialize everything to NULL. (Quiet, C pedants!) */ @@ -1926,6 +2055,29 @@ bool fromwire_update_fee(const void *p, struct channel_id *channel_id, u32 *feer return cursor != NULL; } +/* WIRE: UPDATE_BLOCKHEIGHT */ +u8 *towire_update_blockheight(const tal_t *ctx, const struct channel_id *channel_id, u32 blockheight) +{ + u8 *p = tal_arr(ctx, u8, 0); + + towire_u16(&p, WIRE_UPDATE_BLOCKHEIGHT); + towire_channel_id(&p, channel_id); + towire_u32(&p, blockheight); + + return memcheck(p, tal_count(p)); +} +bool fromwire_update_blockheight(const void *p, struct channel_id *channel_id, u32 *blockheight) +{ + const u8 *cursor = p; + size_t plen = tal_count(p); + + if (fromwire_u16(&cursor, &plen) != WIRE_UPDATE_BLOCKHEIGHT) + return false; + fromwire_channel_id(&cursor, &plen, channel_id); + *blockheight = fromwire_u32(&cursor, &plen); + return cursor != NULL; +} + /* WIRE: CHANNEL_REESTABLISH */ u8 *towire_channel_reestablish(const tal_t *ctx, const struct channel_id *channel_id, u64 next_commitment_number, u64 next_revocation_number, const struct secret *your_last_per_commitment_secret, const struct pubkey *my_current_per_commitment_point) { @@ -2031,7 +2183,7 @@ bool fromwire_channel_announcement(const tal_t *ctx, const void *p, secp256k1_ec } /* WIRE: NODE_ANNOUNCEMENT */ -u8 *towire_node_announcement(const tal_t *ctx, const secp256k1_ecdsa_signature *signature, const u8 *features, u32 timestamp, const struct node_id *node_id, const u8 rgb_color[3], const u8 alias[32], const u8 *addresses) +u8 *towire_node_announcement(const tal_t *ctx, const secp256k1_ecdsa_signature *signature, const u8 *features, u32 timestamp, const struct node_id *node_id, const u8 rgb_color[3], const u8 alias[32], const u8 *addresses, const struct tlv_node_ann_tlvs *tlvs) { u16 flen = tal_count(features); u16 addrlen = tal_count(addresses); @@ -2047,10 +2199,11 @@ u8 *towire_node_announcement(const tal_t *ctx, const secp256k1_ecdsa_signature * towire_u8_array(&p, alias, 32); towire_u16(&p, addrlen); towire_u8_array(&p, addresses, addrlen); + towire_node_ann_tlvs(&p, tlvs); return memcheck(p, tal_count(p)); } -bool fromwire_node_announcement(const tal_t *ctx, const void *p, secp256k1_ecdsa_signature *signature, u8 **features, u32 *timestamp, struct node_id *node_id, u8 rgb_color[3], u8 alias[32], u8 **addresses) +bool fromwire_node_announcement(const tal_t *ctx, const void *p, secp256k1_ecdsa_signature *signature, u8 **features, u32 *timestamp, struct node_id *node_id, u8 rgb_color[3], u8 alias[32], u8 **addresses, struct tlv_node_ann_tlvs *tlvs) { u16 flen; u16 addrlen; @@ -2073,6 +2226,7 @@ bool fromwire_node_announcement(const tal_t *ctx, const void *p, secp256k1_ecdsa // 2nd case addresses *addresses = addrlen ? tal_arr(ctx, u8, addrlen) : NULL; fromwire_u8_array(&cursor, &plen, *addresses, addrlen); + fromwire_node_ann_tlvs(&cursor, &plen, tlvs); return cursor != NULL; } @@ -2330,4 +2484,4 @@ bool fromwire_channel_update_option_channel_htlc_max(const void *p, secp256k1_ec *htlc_maximum_msat = fromwire_amount_msat(&cursor, &plen); return cursor != NULL; } -// SHA256STAMP:a3a508935b99ff0b985d0774432ae9d98f3ec7660bf4edf64095a3d0a37ba0e8 +// SHA256STAMP:4751c4834d5db7d170f8e1ee40ea8b5e12b5552780d37b099fe5fae6f0342c9e diff --git a/wire/peer_wiregen.h b/wire/peer_wiregen.h index 66d20b975..e063cfb84 100644 --- a/wire/peer_wiregen.h +++ b/wire/peer_wiregen.h @@ -46,6 +46,7 @@ enum peer_wire { WIRE_COMMITMENT_SIGNED = 132, WIRE_REVOKE_AND_ACK = 133, WIRE_UPDATE_FEE = 134, + WIRE_UPDATE_BLOCKHEIGHT = 137, WIRE_CHANNEL_REESTABLISH = 136, WIRE_ANNOUNCEMENT_SIGNATURES = 259, WIRE_CHANNEL_ANNOUNCEMENT = 256, @@ -73,6 +74,13 @@ bool peer_wire_is_defined(u16 type); struct witness_element { u8 *witness; }; +struct lease_rates { + u16 funding_weight; + u16 lease_fee_basis; + u16 channel_fee_max_proportional_thousandths; + u32 lease_fee_base_sat; + u32 channel_fee_max_base_msat; +}; struct channel_update_checksums { u32 checksum_node_id_1; u32 checksum_node_id_2; @@ -92,9 +100,17 @@ struct tlv_n1_tlv3 { struct tlv_opening_tlvs_option_upfront_shutdown_script { u8 *shutdown_scriptpubkey; }; +struct tlv_opening_tlvs_request_funds { + u64 requested_sats; + u32 blockheight; +}; struct tlv_accept_tlvs_option_upfront_shutdown_script { u8 *shutdown_scriptpubkey; }; +struct tlv_accept_tlvs_will_fund { + secp256k1_ecdsa_signature signature; + struct lease_rates lease_rates; +}; struct tlv_shutdown_tlvs_wrong_funding { struct bitcoin_txid txid; u32 outnum; @@ -158,6 +174,7 @@ struct tlv_opening_tlvs { /* TODO The following explicit fields could just point into the * tlv_field entries above to save on memory. */ struct tlv_opening_tlvs_option_upfront_shutdown_script *option_upfront_shutdown_script; + struct tlv_opening_tlvs_request_funds *request_funds; }; struct tlv_accept_tlvs { /* Raw fields including unknown ones. */ @@ -166,6 +183,7 @@ struct tlv_accept_tlvs { /* TODO The following explicit fields could just point into the * tlv_field entries above to save on memory. */ struct tlv_accept_tlvs_option_upfront_shutdown_script *option_upfront_shutdown_script; + struct tlv_accept_tlvs_will_fund *will_fund; }; struct tlv_shutdown_tlvs { /* Raw fields including unknown ones. */ @@ -175,6 +193,14 @@ struct tlv_shutdown_tlvs { * tlv_field entries above to save on memory. */ struct tlv_shutdown_tlvs_wrong_funding *wrong_funding; }; +struct tlv_node_ann_tlvs { + /* Raw fields including unknown ones. */ + struct tlv_field *fields; + + /* TODO The following explicit fields could just point into the + * tlv_field entries above to save on memory. */ + struct lease_rates *option_will_fund; +}; struct tlv_query_short_channel_ids_tlvs { /* Raw fields including unknown ones. */ struct tlv_field *fields; @@ -529,6 +555,43 @@ void towire_shutdown_tlvs(u8 **pptr, const struct tlv_shutdown_tlvs *record); bool shutdown_tlvs_is_valid(const struct tlv_shutdown_tlvs *record, size_t *err_index); +struct tlv_node_ann_tlvs *tlv_node_ann_tlvs_new(const tal_t *ctx); + +/** + * Deserialize a TLV stream for the node_ann_tlvs namespace. + * + * This function will parse any TLV stream, as long as the type, length and + * value fields are formatted correctly. Fields that are not known in the + * current namespace are stored in the `fields` member. Validity can be + * checked using node_ann_tlvs_is_valid. + */ +bool fromwire_node_ann_tlvs(const u8 **cursor, size_t *max, + struct tlv_node_ann_tlvs * record); + +/** + * Serialize a TLV stream for the node_ann_tlvs namespace. + * + * This function only considers known fields from the node_ann_tlvs namespace, + * and will ignore any fields that may be stored in the `fields` member. This + * ensures that the resulting stream is valid according to + * `node_ann_tlvs_is_valid`. + */ +void towire_node_ann_tlvs(u8 **pptr, const struct tlv_node_ann_tlvs *record); + +/** + * Check that the TLV stream is valid. + * + * Enforces the followin validity rules: + * - Types must be in monotonic non-repeating order + * - We must understand all even types + * + * Returns false if an error was detected, otherwise returns true. If err_index + * is non-null and we detect an error it is set to the index of the first error + * detected. + */ +bool node_ann_tlvs_is_valid(const struct tlv_node_ann_tlvs *record, + size_t *err_index); + struct tlv_query_short_channel_ids_tlvs *tlv_query_short_channel_ids_tlvs_new(const tal_t *ctx); /** @@ -681,6 +744,10 @@ bool onion_message_tlvs_is_valid(const struct tlv_onion_message_tlvs *record, void towire_witness_element(u8 **p, const struct witness_element *witness_element); struct witness_element *fromwire_witness_element(const tal_t *ctx, const u8 **cursor, size_t *plen); +/* SUBTYPE: LEASE_RATES */ +void towire_lease_rates(u8 **p, const struct lease_rates *lease_rates); +void fromwire_lease_rates(const u8 **cursor, size_t *plen, struct lease_rates *lease_rates); + /* SUBTYPE: CHANNEL_UPDATE_CHECKSUMS */ void towire_channel_update_checksums(u8 **p, const struct channel_update_checksums *channel_update_checksums); void fromwire_channel_update_checksums(const u8 **cursor, size_t *plen, struct channel_update_checksums *channel_update_checksums); @@ -809,6 +876,10 @@ bool fromwire_revoke_and_ack(const void *p, struct channel_id *channel_id, struc u8 *towire_update_fee(const tal_t *ctx, const struct channel_id *channel_id, u32 feerate_per_kw); bool fromwire_update_fee(const void *p, struct channel_id *channel_id, u32 *feerate_per_kw); +/* WIRE: UPDATE_BLOCKHEIGHT */ +u8 *towire_update_blockheight(const tal_t *ctx, const struct channel_id *channel_id, u32 blockheight); +bool fromwire_update_blockheight(const void *p, struct channel_id *channel_id, u32 *blockheight); + /* WIRE: CHANNEL_REESTABLISH */ u8 *towire_channel_reestablish(const tal_t *ctx, const struct channel_id *channel_id, u64 next_commitment_number, u64 next_revocation_number, const struct secret *your_last_per_commitment_secret, const struct pubkey *my_current_per_commitment_point); bool fromwire_channel_reestablish(const void *p, struct channel_id *channel_id, u64 *next_commitment_number, u64 *next_revocation_number, struct secret *your_last_per_commitment_secret, struct pubkey *my_current_per_commitment_point); @@ -822,8 +893,8 @@ u8 *towire_channel_announcement(const tal_t *ctx, const secp256k1_ecdsa_signatur bool fromwire_channel_announcement(const tal_t *ctx, const void *p, secp256k1_ecdsa_signature *node_signature_1, secp256k1_ecdsa_signature *node_signature_2, secp256k1_ecdsa_signature *bitcoin_signature_1, secp256k1_ecdsa_signature *bitcoin_signature_2, u8 **features, struct bitcoin_blkid *chain_hash, struct short_channel_id *short_channel_id, struct node_id *node_id_1, struct node_id *node_id_2, struct pubkey *bitcoin_key_1, struct pubkey *bitcoin_key_2); /* WIRE: NODE_ANNOUNCEMENT */ -u8 *towire_node_announcement(const tal_t *ctx, const secp256k1_ecdsa_signature *signature, const u8 *features, u32 timestamp, const struct node_id *node_id, const u8 rgb_color[3], const u8 alias[32], const u8 *addresses); -bool fromwire_node_announcement(const tal_t *ctx, const void *p, secp256k1_ecdsa_signature *signature, u8 **features, u32 *timestamp, struct node_id *node_id, u8 rgb_color[3], u8 alias[32], u8 **addresses); +u8 *towire_node_announcement(const tal_t *ctx, const secp256k1_ecdsa_signature *signature, const u8 *features, u32 timestamp, const struct node_id *node_id, const u8 rgb_color[3], const u8 alias[32], const u8 *addresses, const struct tlv_node_ann_tlvs *tlvs); +bool fromwire_node_announcement(const tal_t *ctx, const void *p, secp256k1_ecdsa_signature *signature, u8 **features, u32 *timestamp, struct node_id *node_id, u8 rgb_color[3], u8 alias[32], u8 **addresses, struct tlv_node_ann_tlvs *tlvs); /* WIRE: CHANNEL_UPDATE */ u8 *towire_channel_update(const tal_t *ctx, const secp256k1_ecdsa_signature *signature, const struct bitcoin_blkid *chain_hash, const struct short_channel_id *short_channel_id, u32 timestamp, u8 message_flags, u8 channel_flags, u16 cltv_expiry_delta, struct amount_msat htlc_minimum_msat, u32 fee_base_msat, u32 fee_proportional_millionths); @@ -859,4 +930,4 @@ bool fromwire_channel_update_option_channel_htlc_max(const void *p, secp256k1_ec #endif /* LIGHTNING_WIRE_PEER_WIREGEN_H */ -// SHA256STAMP:a3a508935b99ff0b985d0774432ae9d98f3ec7660bf4edf64095a3d0a37ba0e8 +// SHA256STAMP:4751c4834d5db7d170f8e1ee40ea8b5e12b5552780d37b099fe5fae6f0342c9e diff --git a/wire/test/run-peer-wire.c b/wire/test/run-peer-wire.c index 160a889bb..1f2e4b7a8 100644 --- a/wire/test/run-peer-wire.c +++ b/wire/test/run-peer-wire.c @@ -167,6 +167,7 @@ struct msg_node_announcement { u8 alias[32]; u8 *features; u8 *addresses; + struct tlv_node_ann_tlvs *tlvs; }; struct msg_open_channel { struct bitcoin_blkid chain_hash; @@ -371,12 +372,14 @@ static void *towire_struct_node_announcement(const tal_t *ctx, &s->node_id, s->rgb_color, s->alias, - s->addresses); + s->addresses, + s->tlvs); } static struct msg_node_announcement *fromwire_struct_node_announcement(const tal_t *ctx, const void *p) { struct msg_node_announcement *s = tal(ctx, struct msg_node_announcement); + s->tlvs = tlv_node_ann_tlvs_new(s); if (!fromwire_node_announcement(s, p, &s->signature, &s->features, @@ -384,7 +387,8 @@ static struct msg_node_announcement *fromwire_struct_node_announcement(const tal &s->node_id, s->rgb_color, s->alias, - &s->addresses)) + &s->addresses, + s->tlvs)) return tal_free(s); return s; } @@ -925,9 +929,37 @@ static bool update_add_htlc_eq(const struct msg_update_add_htlc *a, return eq_with(a, b, onion_routing_packet); } +static bool +lease_rates_eq(const struct lease_rates *a, + const struct lease_rates *b) +{ + return eq_field(a, b, channel_fee_max_base_msat) + && eq_field(a, b, channel_fee_max_proportional_thousandths) + && eq_field(a, b, funding_weight) + && eq_field(a, b, lease_fee_base_sat) + && eq_field(a, b, lease_fee_basis); +} + static bool node_announcement_eq(const struct msg_node_announcement *a, const struct msg_node_announcement *b) { + /* Both or neither */ + if (!a->tlvs != !b->tlvs) + return false; + + if (!a->tlvs) + goto body_check; + + /* Both or neither */ + if (!a->tlvs->option_will_fund != !b->tlvs->option_will_fund) + return false; + + if (a->tlvs->option_will_fund + && !lease_rates_eq(a->tlvs->option_will_fund, + b->tlvs->option_will_fund)) + return false; + +body_check: return eq_with(a, b, node_id) && eq_field(a, b, rgb_color) && eq_field(a, b, alias) @@ -1165,11 +1197,15 @@ int main(int argc, char *argv[]) memset(na.features, 2, 2); na.addresses = tal_arr(ctx, u8, 2); memset(na.addresses, 2, 2); + na.tlvs= tlv_node_ann_tlvs_new(ctx); + na.tlvs->option_will_fund = tal(ctx, struct lease_rates); + memset(na.tlvs->option_will_fund, 2, + sizeof(*na.tlvs->option_will_fund)); msg = towire_struct_node_announcement(ctx, &na); na2 = fromwire_struct_node_announcement(ctx, msg); assert(node_announcement_eq(&na, na2)); - test_corruption(&na, na2, node_announcement); + test_corruption_tlv(&na, na2, node_announcement); tal_free(ctx); common_shutdown();