mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-03-26 20:30:59 +01:00
cleanup: make 'u8 *features' and 'struct feature_set *fset' more explicit.
It's almost always "their_features" and "our_features" respectively, so make those names clear. Suggested-by: @cdecker Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
28e3ffc66b
commit
2f1502abf4
31 changed files with 134 additions and 116 deletions
|
@ -8,7 +8,7 @@
|
|||
# Begin! (passes gossipd-client fd)
|
||||
msgtype,channel_init,1000
|
||||
msgdata,channel_init,chainparams,chainparams,
|
||||
msgdata,channel_init,feature_set,feature_set,
|
||||
msgdata,channel_init,our_features,feature_set,
|
||||
msgdata,channel_init,funding_txid,bitcoin_txid,
|
||||
msgdata,channel_init,funding_txout,u16,
|
||||
msgdata,channel_init,funding_satoshi,amount_sat,
|
||||
|
@ -64,8 +64,8 @@ msgdata,channel_init,init_peer_pkt_len,u16,
|
|||
msgdata,channel_init,init_peer_pkt,u8,init_peer_pkt_len
|
||||
msgdata,channel_init,reached_announce_depth,bool,
|
||||
msgdata,channel_init,last_remote_secret,secret,
|
||||
msgdata,channel_init,lflen,u16,
|
||||
msgdata,channel_init,localfeatures,u8,lflen
|
||||
msgdata,channel_init,flen,u16,
|
||||
msgdata,channel_init,their_features,u8,flen
|
||||
msgdata,channel_init,upfront_shutdown_script_len,u16,
|
||||
msgdata,channel_init,upfront_shutdown_script,u8,upfront_shutdown_script_len
|
||||
msgdata,channel_init,remote_ann_node_sig,?secp256k1_ecdsa_signature,
|
||||
|
|
|
|
@ -74,10 +74,10 @@ struct peer {
|
|||
u64 next_index[NUM_SIDES];
|
||||
|
||||
/* Features peer supports. */
|
||||
u8 *features;
|
||||
u8 *their_features;
|
||||
|
||||
/* Features we support. */
|
||||
struct feature_set *fset;
|
||||
struct feature_set *our_features;
|
||||
|
||||
/* Tolerable amounts for feerate (only relevant for fundee). */
|
||||
u32 feerate_min, feerate_max;
|
||||
|
@ -418,7 +418,9 @@ static void send_announcement_signatures(struct peer *peer)
|
|||
static u8 *create_channel_announcement(const tal_t *ctx, struct peer *peer)
|
||||
{
|
||||
int first, second;
|
||||
u8 *cannounce, *features = get_agreed_channelfeatures(tmpctx, peer->fset, peer->features);
|
||||
u8 *cannounce, *features
|
||||
= get_agreed_channelfeatures(tmpctx, peer->our_features,
|
||||
peer->their_features);
|
||||
|
||||
if (peer->channel_direction == 0) {
|
||||
first = LOCAL;
|
||||
|
@ -2328,7 +2330,8 @@ static void peer_reconnect(struct peer *peer,
|
|||
bool dataloss_protect, check_extra_fields;
|
||||
const u8 **premature_msgs = tal_arr(peer, const u8 *, 0);
|
||||
|
||||
dataloss_protect = feature_negotiated(peer->fset, peer->features,
|
||||
dataloss_protect = feature_negotiated(peer->our_features,
|
||||
peer->their_features,
|
||||
OPT_DATA_LOSS_PROTECT);
|
||||
|
||||
/* Both these options give us extra fields to check. */
|
||||
|
@ -3059,7 +3062,7 @@ static void init_channel(struct peer *peer)
|
|||
msg = wire_sync_read(tmpctx, MASTER_FD);
|
||||
if (!fromwire_channel_init(peer, msg,
|
||||
&chainparams,
|
||||
&peer->fset,
|
||||
&peer->our_features,
|
||||
&funding_txid, &funding_txout,
|
||||
&funding,
|
||||
&minimum_depth,
|
||||
|
@ -3105,7 +3108,7 @@ static void init_channel(struct peer *peer)
|
|||
&funding_signed,
|
||||
&peer->announce_depth_reached,
|
||||
&last_remote_per_commit_secret,
|
||||
&peer->features,
|
||||
&peer->their_features,
|
||||
&peer->remote_upfront_shutdown_script,
|
||||
&remote_ann_node_sig,
|
||||
&remote_ann_bitcoin_sig,
|
||||
|
|
|
@ -489,7 +489,7 @@ static void shift_bitmap_down(u8 *bitmap, size_t bits)
|
|||
* See [Feature Bits](#feature-bits).
|
||||
*/
|
||||
static char *decode_9(struct bolt11 *b11,
|
||||
const struct feature_set *fset,
|
||||
const struct feature_set *our_features,
|
||||
struct hash_u5 *hu5,
|
||||
u5 **data, size_t *data_len,
|
||||
size_t data_length)
|
||||
|
@ -512,9 +512,10 @@ static char *decode_9(struct bolt11 *b11,
|
|||
* - if the `9` field contains unknown _even_ bits that are non-zero:
|
||||
* - MUST fail the payment.
|
||||
*/
|
||||
/* We skip this check for the cli tool, which sets fset to NULL */
|
||||
if (fset) {
|
||||
badf = features_unsupported(fset, b11->features, BOLT11_FEATURE);
|
||||
/* We skip this check for the cli tool, which sets our_features to NULL */
|
||||
if (our_features) {
|
||||
badf = features_unsupported(our_features,
|
||||
b11->features, BOLT11_FEATURE);
|
||||
if (badf != -1)
|
||||
return tal_fmt(b11, "9: unknown feature bit %i", badf);
|
||||
}
|
||||
|
@ -545,7 +546,7 @@ struct bolt11 *new_bolt11(const tal_t *ctx,
|
|||
|
||||
/* Decodes and checks signature; returns NULL on error. */
|
||||
struct bolt11 *bolt11_decode(const tal_t *ctx, const char *str,
|
||||
const struct feature_set *fset,
|
||||
const struct feature_set *our_features,
|
||||
const char *description, char **fail)
|
||||
{
|
||||
char *hrp, *amountstr, *prefix;
|
||||
|
@ -740,7 +741,8 @@ struct bolt11 *bolt11_decode(const tal_t *ctx, const char *str,
|
|||
data_length);
|
||||
break;
|
||||
case '9':
|
||||
problem = decode_9(b11, fset, &hu5, &data, &data_len,
|
||||
problem = decode_9(b11, our_features, &hu5,
|
||||
&data, &data_len,
|
||||
data_length);
|
||||
break;
|
||||
case 's':
|
||||
|
|
|
@ -80,7 +80,7 @@ struct bolt11 {
|
|||
* fset is NULL to accept any features (usually not desirable!).
|
||||
*/
|
||||
struct bolt11 *bolt11_decode(const tal_t *ctx, const char *str,
|
||||
const struct feature_set *fset,
|
||||
const struct feature_set *our_features,
|
||||
const char *description, char **fail);
|
||||
|
||||
/* Initialize an empty bolt11 struct with optional amount */
|
||||
|
|
|
@ -158,17 +158,17 @@ static void clear_feature_bit(u8 *features, u32 bit)
|
|||
* it sets.
|
||||
*/
|
||||
u8 *get_agreed_channelfeatures(const tal_t *ctx,
|
||||
const struct feature_set *ours,
|
||||
const u8 *theirfeatures)
|
||||
const struct feature_set *our_features,
|
||||
const u8 *their_features)
|
||||
{
|
||||
u8 *f = tal_dup_talarr(ctx, u8, ours->bits[CHANNEL_FEATURE]);
|
||||
u8 *f = tal_dup_talarr(ctx, u8, our_features->bits[CHANNEL_FEATURE]);
|
||||
size_t max_len = 0;
|
||||
|
||||
/* Clear any features which they didn't offer too */
|
||||
for (size_t i = 0; i < 8 * tal_count(f); i += 2) {
|
||||
if (!feature_offered(f, i))
|
||||
continue;
|
||||
if (!feature_offered(theirfeatures, i)) {
|
||||
if (!feature_offered(their_features, i)) {
|
||||
clear_feature_bit(f, COMPULSORY_FEATURE(i));
|
||||
clear_feature_bit(f, OPTIONAL_FEATURE(i));
|
||||
continue;
|
||||
|
@ -197,11 +197,11 @@ bool feature_offered(const u8 *features, size_t f)
|
|||
|| feature_is_set(features, OPTIONAL_FEATURE(f));
|
||||
}
|
||||
|
||||
bool feature_negotiated(const struct feature_set *ours,
|
||||
const u8 *lfeatures, size_t f)
|
||||
bool feature_negotiated(const struct feature_set *our_features,
|
||||
const u8 *their_features, size_t f)
|
||||
{
|
||||
return feature_offered(lfeatures, f)
|
||||
&& feature_offered(ours->bits[INIT_FEATURE], f);
|
||||
return feature_offered(their_features, f)
|
||||
&& feature_offered(our_features->bits[INIT_FEATURE], f);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -215,7 +215,7 @@ bool feature_negotiated(const struct feature_set *ours,
|
|||
*
|
||||
* Returns -1 on success, or first unsupported feature.
|
||||
*/
|
||||
static int all_supported_features(const struct feature_set *ours,
|
||||
static int all_supported_features(const struct feature_set *our_features,
|
||||
const u8 *bitmap,
|
||||
enum feature_place p)
|
||||
{
|
||||
|
@ -226,7 +226,7 @@ static int all_supported_features(const struct feature_set *ours,
|
|||
if (!test_bit(bitmap, bitnum/8, bitnum%8))
|
||||
continue;
|
||||
|
||||
if (feature_offered(ours->bits[p], bitnum))
|
||||
if (feature_offered(our_features->bits[p], bitnum))
|
||||
continue;
|
||||
|
||||
return bitnum;
|
||||
|
@ -234,16 +234,17 @@ static int all_supported_features(const struct feature_set *ours,
|
|||
return -1;
|
||||
}
|
||||
|
||||
int features_unsupported(const struct feature_set *ours, const u8 *theirs,
|
||||
int features_unsupported(const struct feature_set *our_features,
|
||||
const u8 *their_features,
|
||||
enum feature_place p)
|
||||
{
|
||||
/* BIT 2 would logically be "compulsory initial_routing_sync", but
|
||||
* that does not exist, so we special case it. */
|
||||
if (feature_is_set(theirs,
|
||||
if (feature_is_set(their_features,
|
||||
COMPULSORY_FEATURE(OPT_INITIAL_ROUTING_SYNC)))
|
||||
return COMPULSORY_FEATURE(OPT_INITIAL_ROUTING_SYNC);
|
||||
|
||||
return all_supported_features(ours, theirs, p);
|
||||
return all_supported_features(our_features, their_features, p);
|
||||
}
|
||||
|
||||
static const char *feature_name(const tal_t *ctx, size_t f)
|
||||
|
@ -269,12 +270,12 @@ static const char *feature_name(const tal_t *ctx, size_t f)
|
|||
}
|
||||
|
||||
const char **list_supported_features(const tal_t *ctx,
|
||||
const struct feature_set *ours)
|
||||
const struct feature_set *fset)
|
||||
{
|
||||
const char **list = tal_arr(ctx, const char *, 0);
|
||||
|
||||
for (size_t i = 0; i < tal_bytelen(ours->bits[INIT_FEATURE]) * 8; i++) {
|
||||
if (test_bit(ours->bits[INIT_FEATURE], i / 8, i % 8))
|
||||
for (size_t i = 0; i < tal_bytelen(fset->bits[INIT_FEATURE]) * 8; i++) {
|
||||
if (test_bit(fset->bits[INIT_FEATURE], i / 8, i % 8))
|
||||
tal_arr_expand(&list, feature_name(list, i));
|
||||
}
|
||||
|
||||
|
|
|
@ -32,24 +32,25 @@ bool feature_set_or(struct feature_set *a,
|
|||
|
||||
/* Returns -1 if we're OK with all these offered features, otherwise first
|
||||
* unsupported (even) feature. */
|
||||
int features_unsupported(const struct feature_set *ours, const u8 *theirs,
|
||||
int features_unsupported(const struct feature_set *our_features,
|
||||
const u8 *their_features,
|
||||
enum feature_place p);
|
||||
|
||||
/* For the features in channel_announcement */
|
||||
u8 *get_agreed_channelfeatures(const tal_t *ctx,
|
||||
const struct feature_set *ours,
|
||||
const struct feature_set *our_features,
|
||||
const u8 *theirfeatures);
|
||||
|
||||
/* Is this feature bit requested? (Either compulsory or optional) */
|
||||
bool feature_offered(const u8 *features, size_t f);
|
||||
|
||||
/* Was this feature bit offered by them and us? */
|
||||
bool feature_negotiated(const struct feature_set *ours,
|
||||
const u8 *features, size_t f);
|
||||
bool feature_negotiated(const struct feature_set *our_features,
|
||||
const u8 *their_features, size_t f);
|
||||
|
||||
/* Return a list of what (init) features we advertize. */
|
||||
const char **list_supported_features(const tal_t *ctx,
|
||||
const struct feature_set *ours);
|
||||
const struct feature_set *fset);
|
||||
|
||||
/* Low-level helpers to deal with big-endian bitfields. */
|
||||
bool feature_is_set(const u8 *features, size_t bit);
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
msgtype,connectctl_init,2000
|
||||
msgdata,connectctl_init,chainparams,chainparams,
|
||||
msgdata,connectctl_init,feature_set,feature_set,
|
||||
msgdata,connectctl_init,our_features,feature_set,
|
||||
msgdata,connectctl_init,id,node_id,
|
||||
msgdata,connectctl_init,num_wireaddrs,u16,
|
||||
msgdata,connectctl_init,wireaddrs,wireaddr_internal,num_wireaddrs
|
||||
|
|
|
|
@ -156,7 +156,7 @@ struct daemon {
|
|||
bool use_v3_autotor;
|
||||
|
||||
/* Our features, as lightningd told us */
|
||||
struct feature_set *fset;
|
||||
struct feature_set *our_features;
|
||||
};
|
||||
|
||||
/* Peers we're trying to reach: we iterate through addrs until we succeed
|
||||
|
@ -294,7 +294,7 @@ static void connected_to_peer(struct daemon *daemon,
|
|||
*/
|
||||
static bool get_gossipfds(struct daemon *daemon,
|
||||
const struct node_id *id,
|
||||
const u8 *features,
|
||||
const u8 *their_features,
|
||||
struct per_peer_state *pps)
|
||||
{
|
||||
bool gossip_queries_feature, initial_routing_sync, success;
|
||||
|
@ -303,13 +303,14 @@ static bool get_gossipfds(struct daemon *daemon,
|
|||
/*~ The way features generally work is that both sides need to offer it;
|
||||
* we always offer `gossip_queries`, but this check is explicit. */
|
||||
gossip_queries_feature
|
||||
= feature_negotiated(daemon->fset, features, OPT_GOSSIP_QUERIES);
|
||||
= feature_negotiated(daemon->our_features, their_features,
|
||||
OPT_GOSSIP_QUERIES);
|
||||
|
||||
/*~ `initial_routing_sync` is supported by every node, since it was in
|
||||
* the initial lightning specification: it means the peer wants the
|
||||
* backlog of existing gossip. */
|
||||
initial_routing_sync
|
||||
= feature_offered(features, OPT_INITIAL_ROUTING_SYNC);
|
||||
= feature_offered(their_features, OPT_INITIAL_ROUTING_SYNC);
|
||||
|
||||
/*~ We do this communication sync, since gossipd is our friend and
|
||||
* it's easier. If gossipd fails, we fail. */
|
||||
|
@ -348,7 +349,7 @@ struct peer_reconnected {
|
|||
struct node_id id;
|
||||
struct wireaddr_internal addr;
|
||||
struct crypto_state cs;
|
||||
const u8 *features;
|
||||
const u8 *their_features;
|
||||
};
|
||||
|
||||
/*~ For simplicity, lightningd only ever deals with a single connection per
|
||||
|
@ -365,7 +366,7 @@ static struct io_plan *retry_peer_connected(struct io_conn *conn,
|
|||
/*~ Usually the pattern is to return this directly, but we have to free
|
||||
* our temporary structure. */
|
||||
plan = peer_connected(conn, pr->daemon, &pr->id, &pr->addr, &pr->cs,
|
||||
take(pr->features));
|
||||
take(pr->their_features));
|
||||
tal_free(pr);
|
||||
return plan;
|
||||
}
|
||||
|
@ -377,7 +378,7 @@ static struct io_plan *peer_reconnected(struct io_conn *conn,
|
|||
const struct node_id *id,
|
||||
const struct wireaddr_internal *addr,
|
||||
const struct crypto_state *cs,
|
||||
const u8 *features TAKES)
|
||||
const u8 *their_features TAKES)
|
||||
{
|
||||
u8 *msg;
|
||||
struct peer_reconnected *pr;
|
||||
|
@ -397,7 +398,7 @@ static struct io_plan *peer_reconnected(struct io_conn *conn,
|
|||
|
||||
/*~ Note that tal_dup_talarr() will do handle the take() of features
|
||||
* (turning it into a simply tal_steal() in those cases). */
|
||||
pr->features = tal_dup_talarr(pr, u8, features);
|
||||
pr->their_features = tal_dup_talarr(pr, u8, their_features);
|
||||
|
||||
/*~ ccan/io supports waiting on an address: in this case, the key in
|
||||
* the peer set. When someone calls `io_wake()` on that address, it
|
||||
|
@ -417,18 +418,19 @@ struct io_plan *peer_connected(struct io_conn *conn,
|
|||
const struct node_id *id,
|
||||
const struct wireaddr_internal *addr,
|
||||
struct crypto_state *cs,
|
||||
const u8 *features TAKES)
|
||||
const u8 *their_features TAKES)
|
||||
{
|
||||
u8 *msg;
|
||||
struct per_peer_state *pps;
|
||||
int unsup;
|
||||
|
||||
if (node_set_get(&daemon->peers, id))
|
||||
return peer_reconnected(conn, daemon, id, addr, cs, features);
|
||||
return peer_reconnected(conn, daemon, id, addr, cs,
|
||||
their_features);
|
||||
|
||||
/* We promised we'd take it by marking it TAKEN above; prepare to free it. */
|
||||
if (taken(features))
|
||||
tal_steal(tmpctx, features);
|
||||
if (taken(their_features))
|
||||
tal_steal(tmpctx, their_features);
|
||||
|
||||
/* BOLT #1:
|
||||
*
|
||||
|
@ -439,7 +441,8 @@ struct io_plan *peer_connected(struct io_conn *conn,
|
|||
* - upon receiving unknown _even_ feature bits that are non-zero:
|
||||
* - MUST fail the connection.
|
||||
*/
|
||||
unsup = features_unsupported(daemon->fset, features, INIT_FEATURE);
|
||||
unsup = features_unsupported(daemon->our_features, their_features,
|
||||
INIT_FEATURE);
|
||||
if (unsup != -1) {
|
||||
msg = towire_errorfmt(NULL, NULL, "Unsupported feature %u",
|
||||
unsup);
|
||||
|
@ -454,11 +457,11 @@ struct io_plan *peer_connected(struct io_conn *conn,
|
|||
pps = new_per_peer_state(tmpctx, cs);
|
||||
|
||||
/* If gossipd can't give us a file descriptor, we give up connecting. */
|
||||
if (!get_gossipfds(daemon, id, features, pps))
|
||||
if (!get_gossipfds(daemon, id, their_features, pps))
|
||||
return io_close(conn);
|
||||
|
||||
/* Create message to tell master peer has connected. */
|
||||
msg = towire_connect_peer_connected(NULL, id, addr, pps, features);
|
||||
msg = towire_connect_peer_connected(NULL, id, addr, pps, their_features);
|
||||
|
||||
/*~ daemon_conn is a message queue for inter-daemon communication: we
|
||||
* queue up the `connect_peer_connected` message to tell lightningd
|
||||
|
@ -493,7 +496,8 @@ static struct io_plan *handshake_in_success(struct io_conn *conn,
|
|||
struct node_id id;
|
||||
node_id_from_pubkey(&id, id_key);
|
||||
status_peer_debug(&id, "Connect IN");
|
||||
return peer_exchange_initmsg(conn, daemon, daemon->fset, cs, &id, addr);
|
||||
return peer_exchange_initmsg(conn, daemon, daemon->our_features,
|
||||
cs, &id, addr);
|
||||
}
|
||||
|
||||
/*~ When we get a connection in we set up its network address then call
|
||||
|
@ -554,7 +558,8 @@ static struct io_plan *handshake_out_success(struct io_conn *conn,
|
|||
connect->connstate = "Exchanging init messages";
|
||||
status_peer_debug(&id, "Connect OUT");
|
||||
return peer_exchange_initmsg(conn, connect->daemon,
|
||||
connect->daemon->fset, cs, &id, addr);
|
||||
connect->daemon->our_features,
|
||||
cs, &id, addr);
|
||||
}
|
||||
|
||||
struct io_plan *connection_out(struct io_conn *conn, struct connecting *connect)
|
||||
|
@ -1211,7 +1216,7 @@ static struct io_plan *connect_init(struct io_conn *conn,
|
|||
if (!fromwire_connectctl_init(
|
||||
daemon, msg,
|
||||
&chainparams,
|
||||
&daemon->fset,
|
||||
&daemon->our_features,
|
||||
&daemon->id,
|
||||
&proposed_wireaddr,
|
||||
&proposed_listen_announce,
|
||||
|
|
|
@ -19,6 +19,6 @@ struct io_plan *peer_connected(struct io_conn *conn,
|
|||
const struct node_id *id,
|
||||
const struct wireaddr_internal *addr,
|
||||
struct crypto_state *cs,
|
||||
const u8 *features TAKES);
|
||||
const u8 *their_features TAKES);
|
||||
|
||||
#endif /* LIGHTNING_CONNECTD_CONNECTD_H */
|
||||
|
|
|
@ -135,7 +135,7 @@ static struct io_plan *peer_write_postclose(struct io_conn *conn,
|
|||
|
||||
struct io_plan *peer_exchange_initmsg(struct io_conn *conn,
|
||||
struct daemon *daemon,
|
||||
const struct feature_set *fset,
|
||||
const struct feature_set *our_features,
|
||||
const struct crypto_state *cs,
|
||||
const struct node_id *id,
|
||||
const struct wireaddr_internal *addr)
|
||||
|
@ -182,8 +182,8 @@ struct io_plan *peer_exchange_initmsg(struct io_conn *conn,
|
|||
* Finally, we agreed that bits below 13 could be put in both, but
|
||||
* from now on they'll all go in initfeatures. */
|
||||
peer->msg = towire_init(NULL,
|
||||
fset->bits[GLOBAL_INIT_FEATURE],
|
||||
fset->bits[INIT_FEATURE],
|
||||
our_features->bits[GLOBAL_INIT_FEATURE],
|
||||
our_features->bits[INIT_FEATURE],
|
||||
tlvs);
|
||||
status_peer_io(LOG_IO_OUT, &peer->id, peer->msg);
|
||||
peer->msg = cryptomsg_encrypt_msg(peer, &peer->cs, take(peer->msg));
|
||||
|
|
|
@ -12,7 +12,7 @@ struct wireaddr_internal;
|
|||
/* If successful, calls peer_connected() */
|
||||
struct io_plan *peer_exchange_initmsg(struct io_conn *conn,
|
||||
struct daemon *daemon,
|
||||
const struct feature_set *fset,
|
||||
const struct feature_set *our_features,
|
||||
const struct crypto_state *cs,
|
||||
const struct node_id *id,
|
||||
const struct wireaddr_internal *addr);
|
||||
|
|
|
@ -39,7 +39,8 @@ static u8 *create_node_announcement(const tal_t *ctx, struct daemon *daemon,
|
|||
|
||||
announcement =
|
||||
towire_node_announcement(ctx, sig,
|
||||
daemon->fset->bits[NODE_ANNOUNCE_FEATURE],
|
||||
daemon->our_features->bits
|
||||
[NODE_ANNOUNCE_FEATURE],
|
||||
timestamp,
|
||||
&daemon->id, daemon->rgb, daemon->alias,
|
||||
addresses);
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
# Initialize the gossip daemon.
|
||||
msgtype,gossipctl_init,3000
|
||||
msgdata,gossipctl_init,chainparams,chainparams,
|
||||
msgdata,gossipctl_init,feature_set,feature_set,
|
||||
msgdata,gossipctl_init,our_features,feature_set,
|
||||
msgdata,gossipctl_init,id,node_id,
|
||||
msgdata,gossipctl_init,rgb,u8,3
|
||||
msgdata,gossipctl_init,alias,u8,32
|
||||
|
|
Can't render this file because it has a wrong number of fields in line 7.
|
|
@ -834,7 +834,7 @@ static struct io_plan *gossip_init(struct io_conn *conn,
|
|||
|
||||
if (!fromwire_gossipctl_init(daemon, msg,
|
||||
&chainparams,
|
||||
&daemon->fset,
|
||||
&daemon->our_features,
|
||||
&daemon->id,
|
||||
daemon->rgb,
|
||||
daemon->alias,
|
||||
|
|
|
@ -59,7 +59,7 @@ struct daemon {
|
|||
struct seeker *seeker;
|
||||
|
||||
/* Features lightningd told us to set. */
|
||||
struct feature_set *fset;
|
||||
struct feature_set *our_features;
|
||||
};
|
||||
|
||||
/* This represents each peer we're gossiping with */
|
||||
|
|
|
@ -471,7 +471,7 @@ void peer_start_channeld(struct channel *channel,
|
|||
|
||||
initmsg = towire_channel_init(tmpctx,
|
||||
chainparams,
|
||||
ld->feature_set,
|
||||
ld->our_features,
|
||||
&channel->funding_txid,
|
||||
channel->funding_outnum,
|
||||
channel->funding,
|
||||
|
@ -517,7 +517,7 @@ void peer_start_channeld(struct channel *channel,
|
|||
funding_signed,
|
||||
reached_announce_depth,
|
||||
&last_remote_per_commit_secret,
|
||||
channel->peer->features,
|
||||
channel->peer->their_features,
|
||||
channel->remote_upfront_shutdown_script,
|
||||
remote_ann_node_sig,
|
||||
remote_ann_bitcoin_sig,
|
||||
|
|
|
@ -72,7 +72,7 @@ static struct command_result *connect_cmd_succeed(struct command *cmd,
|
|||
{
|
||||
struct json_stream *response = json_stream_success(cmd);
|
||||
json_add_node_id(response, "id", &peer->id);
|
||||
json_add_hex_talarr(response, "features", peer->features);
|
||||
json_add_hex_talarr(response, "features", peer->their_features);
|
||||
return command_success(cmd, response);
|
||||
}
|
||||
|
||||
|
@ -365,7 +365,7 @@ int connectd_init(struct lightningd *ld)
|
|||
|
||||
msg = towire_connectctl_init(
|
||||
tmpctx, chainparams,
|
||||
ld->feature_set,
|
||||
ld->our_features,
|
||||
&ld->id,
|
||||
wireaddrs,
|
||||
listen_announce,
|
||||
|
|
|
@ -209,7 +209,7 @@ void gossip_init(struct lightningd *ld, int connectd_fd)
|
|||
msg = towire_gossipctl_init(
|
||||
tmpctx,
|
||||
chainparams,
|
||||
ld->feature_set,
|
||||
ld->our_features,
|
||||
&ld->id,
|
||||
ld->rgb,
|
||||
ld->alias,
|
||||
|
|
|
@ -1014,7 +1014,7 @@ static struct command_result *json_invoice(struct command *cmd,
|
|||
info->b11->payment_secret = tal_dup(info->b11, struct secret,
|
||||
&payment_secret);
|
||||
info->b11->features = tal_dup_talarr(info->b11, u8,
|
||||
cmd->ld->feature_set
|
||||
cmd->ld->our_features
|
||||
->bits[BOLT11_FEATURE]);
|
||||
|
||||
#if DEVELOPER
|
||||
|
@ -1321,7 +1321,7 @@ static struct command_result *json_decodepay(struct command *cmd,
|
|||
NULL))
|
||||
return command_param_failed();
|
||||
|
||||
b11 = bolt11_decode(cmd, str, cmd->ld->feature_set, desc, &fail);
|
||||
b11 = bolt11_decode(cmd, str, cmd->ld->our_features, desc, &fail);
|
||||
|
||||
if (!b11) {
|
||||
return command_fail(cmd, LIGHTNINGD, "Invalid bolt11: %s", fail);
|
||||
|
|
|
@ -785,7 +785,7 @@ int main(int argc, char *argv[])
|
|||
errx(1, "Could not find daemons");
|
||||
|
||||
/* Set up the feature bits for what we support */
|
||||
ld->feature_set = default_features(ld);
|
||||
ld->our_features = default_features(ld);
|
||||
|
||||
/*~ Handle early options; this moves us into --lightning-dir.
|
||||
* Plugins may add new options, which is why we are splitting
|
||||
|
|
|
@ -120,7 +120,7 @@ struct lightningd {
|
|||
struct node_id id;
|
||||
|
||||
/* Feature set we offer. */
|
||||
struct feature_set *feature_set;
|
||||
struct feature_set *our_features;
|
||||
|
||||
/* My name is... my favorite color is... */
|
||||
u8 *alias; /* At least 32 bytes (zero-filled) */
|
||||
|
|
|
@ -220,8 +220,9 @@ wallet_commit_channel(struct lightningd *ld,
|
|||
*/
|
||||
/* i.e. We set it now for the channel permanently. */
|
||||
option_static_remotekey
|
||||
= feature_negotiated(ld->feature_set,
|
||||
uc->peer->features, OPT_STATIC_REMOTEKEY);
|
||||
= feature_negotiated(ld->our_features,
|
||||
uc->peer->their_features,
|
||||
OPT_STATIC_REMOTEKEY);
|
||||
|
||||
channel = new_channel(uc->peer, uc->dbid,
|
||||
NULL, /* No shachain yet */
|
||||
|
@ -1000,7 +1001,7 @@ void peer_start_openingd(struct peer *peer,
|
|||
|
||||
msg = towire_opening_init(NULL,
|
||||
chainparams,
|
||||
peer->ld->feature_set,
|
||||
peer->ld->our_features,
|
||||
&uc->our_config,
|
||||
max_to_self_delay,
|
||||
min_effective_htlc_capacity,
|
||||
|
@ -1009,9 +1010,9 @@ void peer_start_openingd(struct peer *peer,
|
|||
uc->minimum_depth,
|
||||
feerate_min(peer->ld, NULL),
|
||||
feerate_max(peer->ld, NULL),
|
||||
peer->features,
|
||||
feature_negotiated(peer->ld->feature_set,
|
||||
peer->features,
|
||||
peer->their_features,
|
||||
feature_negotiated(peer->ld->our_features,
|
||||
peer->their_features,
|
||||
OPT_STATIC_REMOTEKEY),
|
||||
send_msg,
|
||||
IFDEV(peer->ld->dev_force_tmp_channel_id, NULL),
|
||||
|
@ -1199,8 +1200,8 @@ static struct command_result *json_fund_channel_start(struct command *cmd,
|
|||
* - otherwise:
|
||||
* - MUST set `funding_satoshis` to less than 2^24 satoshi.
|
||||
*/
|
||||
if (!feature_negotiated(cmd->ld->feature_set,
|
||||
peer->features, OPT_LARGE_CHANNELS)
|
||||
if (!feature_negotiated(cmd->ld->our_features,
|
||||
peer->their_features, OPT_LARGE_CHANNELS)
|
||||
&& amount_sat_greater(*amount, chainparams->max_funding))
|
||||
return command_fail(cmd, FUND_MAX_EXCEEDED,
|
||||
"Amount exceeded %s",
|
||||
|
|
|
@ -692,7 +692,7 @@ static char *test_subdaemons_and_exit(struct lightningd *ld)
|
|||
|
||||
static char *list_features_and_exit(struct lightningd *ld)
|
||||
{
|
||||
const char **features = list_supported_features(tmpctx, ld->feature_set);
|
||||
const char **features = list_supported_features(tmpctx, ld->our_features);
|
||||
for (size_t i = 0; i < tal_count(features); i++)
|
||||
printf("%s\n", features[i]);
|
||||
exit(0);
|
||||
|
@ -744,7 +744,7 @@ static char *opt_start_daemon(struct lightningd *ld)
|
|||
|
||||
static char *opt_set_wumbo(struct lightningd *ld)
|
||||
{
|
||||
feature_set_or(ld->feature_set,
|
||||
feature_set_or(ld->our_features,
|
||||
take(feature_set_for_feature(NULL,
|
||||
OPTIONAL_FEATURE(OPT_LARGE_CHANNELS))));
|
||||
return NULL;
|
||||
|
@ -1203,7 +1203,8 @@ static void add_config(struct lightningd *ld,
|
|||
json_add_bool(response, "encrypted-hsm", ld->encrypted_hsm);
|
||||
} else if (opt->cb == (void *)opt_set_wumbo) {
|
||||
json_add_bool(response, "wumbo",
|
||||
feature_offered(ld->feature_set->bits[INIT_FEATURE],
|
||||
feature_offered(ld->our_features
|
||||
->bits[INIT_FEATURE],
|
||||
OPT_LARGE_CHANNELS));
|
||||
} else {
|
||||
/* Insert more decodes here! */
|
||||
|
|
|
@ -1406,7 +1406,7 @@ static struct command_result *json_listsendpays(struct command *cmd,
|
|||
struct bolt11 *b11;
|
||||
char *fail;
|
||||
|
||||
b11 = bolt11_decode(cmd, b11str, cmd->ld->feature_set, NULL, &fail);
|
||||
b11 = bolt11_decode(cmd, b11str, cmd->ld->our_features, NULL, &fail);
|
||||
if (!b11) {
|
||||
return command_fail(cmd, JSONRPC2_INVALID_PARAMS,
|
||||
"Invalid bolt11: %s", fail);
|
||||
|
|
|
@ -74,10 +74,11 @@ static void destroy_peer(struct peer *peer)
|
|||
list_del_from(&peer->ld->peers, &peer->list);
|
||||
}
|
||||
|
||||
static void peer_update_features(struct peer *peer, const u8 *features TAKES)
|
||||
static void peer_update_features(struct peer *peer,
|
||||
const u8 *their_features TAKES)
|
||||
{
|
||||
tal_free(peer->features);
|
||||
peer->features = tal_dup_talarr(peer, u8, features);
|
||||
tal_free(peer->their_features);
|
||||
peer->their_features = tal_dup_talarr(peer, u8, their_features);
|
||||
}
|
||||
|
||||
struct peer *new_peer(struct lightningd *ld, u64 dbid,
|
||||
|
@ -92,7 +93,7 @@ struct peer *new_peer(struct lightningd *ld, u64 dbid,
|
|||
peer->id = *id;
|
||||
peer->uncommitted_channel = NULL;
|
||||
peer->addr = *addr;
|
||||
peer->features = NULL;
|
||||
peer->their_features = NULL;
|
||||
list_head_init(&peer->channels);
|
||||
peer->direction = node_id_idx(&peer->ld->id, &peer->id);
|
||||
#if DEVELOPER
|
||||
|
@ -851,7 +852,7 @@ peer_connected_serialize(struct peer_connected_hook_payload *payload,
|
|||
json_add_string(
|
||||
stream, "addr",
|
||||
type_to_string(stream, struct wireaddr_internal, &payload->addr));
|
||||
json_add_hex_talarr(stream, "features", p->features);
|
||||
json_add_hex_talarr(stream, "features", p->their_features);
|
||||
json_object_end(stream); /* .peer */
|
||||
}
|
||||
|
||||
|
@ -980,7 +981,7 @@ void peer_connected(struct lightningd *ld, const u8 *msg,
|
|||
int peer_fd, int gossip_fd, int gossip_store_fd)
|
||||
{
|
||||
struct node_id id;
|
||||
u8 *features;
|
||||
u8 *their_features;
|
||||
struct peer *peer;
|
||||
struct peer_connected_hook_payload *hook_payload;
|
||||
|
||||
|
@ -989,7 +990,7 @@ void peer_connected(struct lightningd *ld, const u8 *msg,
|
|||
if (!fromwire_connect_peer_connected(hook_payload, msg,
|
||||
&id, &hook_payload->addr,
|
||||
&hook_payload->pps,
|
||||
&features))
|
||||
&their_features))
|
||||
fatal("Connectd gave bad CONNECT_PEER_CONNECTED message %s",
|
||||
tal_hex(msg, msg));
|
||||
|
||||
|
@ -1005,7 +1006,7 @@ void peer_connected(struct lightningd *ld, const u8 *msg,
|
|||
tal_steal(peer, hook_payload);
|
||||
hook_payload->peer = peer;
|
||||
|
||||
peer_update_features(peer, features);
|
||||
peer_update_features(peer, their_features);
|
||||
|
||||
/* Complete any outstanding connect commands. */
|
||||
connect_succeeded(ld, peer);
|
||||
|
@ -1173,7 +1174,7 @@ static void json_add_peer(struct lightningd *ld,
|
|||
struct wireaddr_internal,
|
||||
&p->addr));
|
||||
json_array_end(response);
|
||||
json_add_hex_talarr(response, "features", p->features);
|
||||
json_add_hex_talarr(response, "features", p->their_features);
|
||||
}
|
||||
|
||||
json_array_start(response, "channels");
|
||||
|
|
|
@ -40,7 +40,7 @@ struct peer {
|
|||
struct wireaddr_internal addr;
|
||||
|
||||
/* We keep a copy of their feature bits */
|
||||
const u8 *features;
|
||||
const u8 *their_features;
|
||||
|
||||
/* If we open a channel our direction will be this */
|
||||
u8 direction;
|
||||
|
|
|
@ -916,7 +916,7 @@ bool plugin_parse_getmanifest_response(const char *buffer,
|
|||
return true;
|
||||
}
|
||||
|
||||
if (!feature_set_or(plugin->plugins->ld->feature_set, fset)) {
|
||||
if (!feature_set_or(plugin->plugins->ld->our_features, fset)) {
|
||||
plugin_kill(plugin,
|
||||
"Custom featurebits already present");
|
||||
return true;
|
||||
|
@ -1174,7 +1174,7 @@ plugin_populate_init_request(struct plugin *plugin, struct jsonrpc_request *req)
|
|||
if (plugin_feature_place_names[fp]) {
|
||||
json_add_hex_talarr(req->stream,
|
||||
plugin_feature_place_names[fp],
|
||||
ld->feature_set->bits[fp]);
|
||||
ld->our_features->bits[fp]);
|
||||
}
|
||||
}
|
||||
json_object_end(req->stream);
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
msgtype,opening_init,6000
|
||||
# Which network are we configured for?
|
||||
msgdata,opening_init,chainparams,chainparams,
|
||||
msgdata,opening_init,feature_set,feature_set,
|
||||
msgdata,opening_init,our_features,feature_set,
|
||||
# Base configuration we'll offer (channel reserve will vary with amount)
|
||||
msgdata,opening_init,our_config,channel_config,
|
||||
# Minimum/maximum configuration values we'll accept
|
||||
|
|
|
|
@ -67,7 +67,7 @@ struct state {
|
|||
struct per_peer_state *pps;
|
||||
|
||||
/* Features they offered */
|
||||
u8 *features;
|
||||
u8 *their_features;
|
||||
|
||||
/* Constraints on a channel they open. */
|
||||
u32 minimum_depth;
|
||||
|
@ -114,7 +114,7 @@ struct state {
|
|||
|
||||
bool option_static_remotekey;
|
||||
|
||||
struct feature_set *fset;
|
||||
struct feature_set *our_features;
|
||||
};
|
||||
|
||||
static u8 *dev_upfront_shutdown_script(const tal_t *ctx)
|
||||
|
@ -492,7 +492,8 @@ static bool setup_channel_funder(struct state *state)
|
|||
* - otherwise:
|
||||
* - MUST set `funding_satoshis` to less than 2^24 satoshi.
|
||||
*/
|
||||
if (!feature_negotiated(state->fset, state->features, OPT_LARGE_CHANNELS)
|
||||
if (!feature_negotiated(state->our_features,
|
||||
state->their_features, OPT_LARGE_CHANNELS)
|
||||
&& amount_sat_greater(state->funding, chainparams->max_funding)) {
|
||||
status_failed(STATUS_FAIL_MASTER_IO,
|
||||
"funding_satoshis must be < %s, not %s",
|
||||
|
@ -569,7 +570,7 @@ static u8 *funder_channel_start(struct state *state, u8 channel_flags)
|
|||
* `payment_basepoint`, or `delayed_payment_basepoint` are not
|
||||
* valid secp256k1 pubkeys in compressed format.
|
||||
*/
|
||||
if (feature_negotiated(state->fset, state->features,
|
||||
if (feature_negotiated(state->our_features, state->their_features,
|
||||
OPT_UPFRONT_SHUTDOWN_SCRIPT)) {
|
||||
if (!fromwire_accept_channel_option_upfront_shutdown_script(state,
|
||||
msg, &id_in,
|
||||
|
@ -650,8 +651,8 @@ static u8 *funder_channel_start(struct state *state, u8 channel_flags)
|
|||
return towire_opening_funder_start_reply(state,
|
||||
funding_output_script,
|
||||
feature_negotiated(
|
||||
state->fset,
|
||||
state->features,
|
||||
state->our_features,
|
||||
state->their_features,
|
||||
OPT_UPFRONT_SHUTDOWN_SCRIPT));
|
||||
}
|
||||
|
||||
|
@ -911,7 +912,7 @@ static u8 *fundee_channel(struct state *state, const u8 *open_channel_msg)
|
|||
* `payment_basepoint`, or `delayed_payment_basepoint` are not valid
|
||||
* secp256k1 pubkeys in compressed format.
|
||||
*/
|
||||
if (feature_negotiated(state->fset, state->features,
|
||||
if (feature_negotiated(state->our_features, state->their_features,
|
||||
OPT_UPFRONT_SHUTDOWN_SCRIPT)) {
|
||||
if (!fromwire_open_channel_option_upfront_shutdown_script(state,
|
||||
open_channel_msg, &chain_hash,
|
||||
|
@ -980,7 +981,8 @@ static u8 *fundee_channel(struct state *state, const u8 *open_channel_msg)
|
|||
* - `funding_satoshis` is greater than or equal to 2^24 and the receiver does not support
|
||||
* `option_support_large_channel`. */
|
||||
/* We choose to require *negotiation*, not just support! */
|
||||
if (!feature_negotiated(state->fset, state->features, OPT_LARGE_CHANNELS)
|
||||
if (!feature_negotiated(state->our_features, state->their_features,
|
||||
OPT_LARGE_CHANNELS)
|
||||
&& amount_sat_greater(state->funding, chainparams->max_funding)) {
|
||||
negotiation_failed(state, false,
|
||||
"funding_satoshis %s too large",
|
||||
|
@ -1503,7 +1505,7 @@ int main(int argc, char *argv[])
|
|||
msg = wire_sync_read(tmpctx, REQ_FD);
|
||||
if (!fromwire_opening_init(state, msg,
|
||||
&chainparams,
|
||||
&state->fset,
|
||||
&state->our_features,
|
||||
&state->localconf,
|
||||
&state->max_to_self_delay,
|
||||
&state->min_effective_htlc_capacity,
|
||||
|
@ -1512,7 +1514,7 @@ int main(int argc, char *argv[])
|
|||
&state->our_funding_pubkey,
|
||||
&state->minimum_depth,
|
||||
&state->min_feerate, &state->max_feerate,
|
||||
&state->features,
|
||||
&state->their_features,
|
||||
&state->option_static_remotekey,
|
||||
&inner,
|
||||
&force_tmp_channel_id,
|
||||
|
|
|
@ -27,7 +27,7 @@ struct funding_req {
|
|||
struct amount_msat *push_msat;
|
||||
|
||||
/* Features offered by this peer. */
|
||||
const u8 *features;
|
||||
const u8 *their_features;
|
||||
|
||||
bool *announce_channel;
|
||||
u32 *minconf;
|
||||
|
@ -335,7 +335,7 @@ static struct command_result *post_dryrun(struct command *cmd,
|
|||
/* Update funding to actual amount */
|
||||
if (fr->funding_all
|
||||
&& !feature_negotiated(plugin_feature_set(cmd->plugin),
|
||||
fr->features, OPT_LARGE_CHANNELS)
|
||||
fr->their_features, OPT_LARGE_CHANNELS)
|
||||
&& amount_sat_greater(funding, chainparams->max_funding))
|
||||
funding = chainparams->max_funding;
|
||||
|
||||
|
@ -355,8 +355,8 @@ static struct command_result *exec_dryrun(struct command *cmd,
|
|||
t = json_get_member(buf, result, "features");
|
||||
if (!t)
|
||||
plugin_err(cmd->plugin, "No features found in connect response?");
|
||||
fr->features = json_tok_bin_from_hex(fr, buf, t);
|
||||
if (!fr->features)
|
||||
fr->their_features = json_tok_bin_from_hex(fr, buf, t);
|
||||
if (!fr->their_features)
|
||||
plugin_err(cmd->plugin, "Bad features '%.*s' in connect response?",
|
||||
t->end - t->start, buf + t->start);
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ struct plugin {
|
|||
size_t in_timer;
|
||||
|
||||
/* Feature set for lightningd */
|
||||
struct feature_set *fset;
|
||||
struct feature_set *our_features;
|
||||
};
|
||||
|
||||
|
||||
|
@ -154,7 +154,7 @@ jsonrpc_request_start_(struct plugin *plugin, struct command *cmd,
|
|||
|
||||
const struct feature_set *plugin_feature_set(const struct plugin *p)
|
||||
{
|
||||
return p->fset;
|
||||
return p->our_features;
|
||||
}
|
||||
|
||||
static void jsonrpc_finish_and_send(struct plugin *p, struct json_stream *js)
|
||||
|
@ -770,7 +770,7 @@ static struct command_result *handle_init(struct command *cmd,
|
|||
chainparams = chainparams_for_network(network);
|
||||
|
||||
fsettok = json_delve(buf, configtok, ".feature_set");
|
||||
p->fset = json_to_feature_set(p, buf, fsettok);
|
||||
p->our_features = json_to_feature_set(p, buf, fsettok);
|
||||
|
||||
rpctok = json_delve(buf, configtok, ".rpc-file");
|
||||
p->rpc_conn->fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
|
|
Loading…
Add table
Reference in a new issue