mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-02-22 14:42:40 +01:00
gossipd: store chainparams internally.
We keep a chain_hash in struct daemon, becayse otherwise we end up with `&peer->daemon->rstate->chainparams->genesis_blockhash` which is a bit ridiculous. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
9088b19ed9
commit
9620393109
7 changed files with 34 additions and 29 deletions
|
@ -35,6 +35,7 @@ LIGHTNINGD_HEADERS_GEN += $(LIGHTNINGD_GOSSIP_HEADERS)
|
|||
|
||||
# Common source we use.
|
||||
GOSSIPD_COMMON_OBJS := \
|
||||
bitcoin/chainparams.o \
|
||||
common/base32.o \
|
||||
common/bech32.o \
|
||||
common/bech32_util.o \
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#include <bitcoin/chainparams.h>
|
||||
#include <ccan/array_size/array_size.h>
|
||||
/*~ Welcome to the gossip daemon: keeper of maps!
|
||||
*
|
||||
|
@ -96,6 +97,9 @@ struct daemon {
|
|||
/* Routing information */
|
||||
struct routing_state *rstate;
|
||||
|
||||
/* chainhash for checking/making gossip msgs */
|
||||
struct bitcoin_blkid chain_hash;
|
||||
|
||||
/* Timers: we batch gossip, and also refresh announcements */
|
||||
struct timers timers;
|
||||
|
||||
|
@ -340,7 +344,7 @@ static void setup_gossip_range(struct peer *peer)
|
|||
* should be much smarter about requesting only what we don't already
|
||||
* have. */
|
||||
msg = towire_gossip_timestamp_filter(peer,
|
||||
&peer->daemon->rstate->chain_hash,
|
||||
&peer->daemon->chain_hash,
|
||||
0, UINT32_MAX);
|
||||
queue_peer_msg(peer, take(msg));
|
||||
}
|
||||
|
@ -527,7 +531,6 @@ static u8 *handle_channel_update_msg(struct peer *peer, const u8 *msg)
|
|||
* called when there's nothing more important to send. */
|
||||
static const u8 *handle_query_short_channel_ids(struct peer *peer, const u8 *msg)
|
||||
{
|
||||
struct routing_state *rstate = peer->daemon->rstate;
|
||||
struct bitcoin_blkid chain;
|
||||
u8 *encoded;
|
||||
struct short_channel_id *scids;
|
||||
|
@ -538,7 +541,7 @@ static const u8 *handle_query_short_channel_ids(struct peer *peer, const u8 *msg
|
|||
tal_hex(tmpctx, msg));
|
||||
}
|
||||
|
||||
if (!bitcoin_blkid_eq(&rstate->chain_hash, &chain)) {
|
||||
if (!bitcoin_blkid_eq(&peer->daemon->chain_hash, &chain)) {
|
||||
status_trace("%s sent query_short_channel_ids chainhash %s",
|
||||
type_to_string(tmpctx, struct pubkey, &peer->id),
|
||||
type_to_string(tmpctx, struct bitcoin_blkid, &chain));
|
||||
|
@ -598,7 +601,7 @@ static u8 *handle_gossip_timestamp_filter(struct peer *peer, const u8 *msg)
|
|||
tal_hex(tmpctx, msg));
|
||||
}
|
||||
|
||||
if (!bitcoin_blkid_eq(&peer->daemon->rstate->chain_hash, &chain_hash)) {
|
||||
if (!bitcoin_blkid_eq(&peer->daemon->chain_hash, &chain_hash)) {
|
||||
status_trace("%s sent gossip_timestamp_filter chainhash %s",
|
||||
type_to_string(tmpctx, struct pubkey, &peer->id),
|
||||
type_to_string(tmpctx, struct bitcoin_blkid,
|
||||
|
@ -645,7 +648,7 @@ static void reply_channel_range(struct peer *peer,
|
|||
* - SHOULD set `complete` to 1.
|
||||
*/
|
||||
u8 *msg = towire_reply_channel_range(NULL,
|
||||
&peer->daemon->rstate->chain_hash,
|
||||
&peer->daemon->chain_hash,
|
||||
first_blocknum,
|
||||
number_of_blocks,
|
||||
1, encoded);
|
||||
|
@ -739,7 +742,7 @@ static u8 *handle_query_channel_range(struct peer *peer, const u8 *msg)
|
|||
|
||||
/* FIXME: if they ask for the wrong chain, we should not ignore it,
|
||||
* but give an empty response with the `complete` flag unset? */
|
||||
if (!bitcoin_blkid_eq(&peer->daemon->rstate->chain_hash, &chain_hash)) {
|
||||
if (!bitcoin_blkid_eq(&peer->daemon->chain_hash, &chain_hash)) {
|
||||
status_trace("%s sent query_channel_range chainhash %s",
|
||||
type_to_string(tmpctx, struct pubkey, &peer->id),
|
||||
type_to_string(tmpctx, struct bitcoin_blkid,
|
||||
|
@ -778,7 +781,7 @@ static const u8 *handle_reply_channel_range(struct peer *peer, const u8 *msg)
|
|||
tal_hex(tmpctx, msg));
|
||||
}
|
||||
|
||||
if (!bitcoin_blkid_eq(&peer->daemon->rstate->chain_hash, &chain)) {
|
||||
if (!bitcoin_blkid_eq(&peer->daemon->chain_hash, &chain)) {
|
||||
return towire_errorfmt(peer, NULL,
|
||||
"reply_channel_range for bad chain: %s",
|
||||
tal_hex(tmpctx, msg));
|
||||
|
@ -924,7 +927,7 @@ static u8 *handle_reply_short_channel_ids_end(struct peer *peer, const u8 *msg)
|
|||
tal_hex(tmpctx, msg));
|
||||
}
|
||||
|
||||
if (!bitcoin_blkid_eq(&peer->daemon->rstate->chain_hash, &chain)) {
|
||||
if (!bitcoin_blkid_eq(&peer->daemon->chain_hash, &chain)) {
|
||||
return towire_errorfmt(peer, NULL,
|
||||
"reply_short_channel_ids_end for bad chain: %s",
|
||||
tal_hex(tmpctx, msg));
|
||||
|
@ -1069,7 +1072,7 @@ static void maybe_create_next_scid_reply(struct peer *peer)
|
|||
*/
|
||||
/* FIXME: We consider ourselves to have complete knowledge. */
|
||||
u8 *end = towire_reply_short_channel_ids_end(peer,
|
||||
&rstate->chain_hash,
|
||||
&peer->daemon->chain_hash,
|
||||
true);
|
||||
queue_peer_msg(peer, take(end));
|
||||
|
||||
|
@ -1205,7 +1208,7 @@ static void update_local_channel(struct daemon *daemon,
|
|||
/* We create an update with a dummy signature, and hand to hsmd to get
|
||||
* it signed. */
|
||||
update = towire_channel_update_option_channel_htlc_max(tmpctx, &dummy_sig,
|
||||
&daemon->rstate->chain_hash,
|
||||
&daemon->chain_hash,
|
||||
&chan->scid,
|
||||
timestamp,
|
||||
message_flags, channel_flags,
|
||||
|
@ -1815,14 +1818,13 @@ static struct io_plan *gossip_init(struct io_conn *conn,
|
|||
struct daemon *daemon,
|
||||
const u8 *msg)
|
||||
{
|
||||
struct bitcoin_blkid chain_hash;
|
||||
u32 update_channel_interval;
|
||||
|
||||
if (!fromwire_gossipctl_init(daemon, msg,
|
||||
/* 60,000 ms
|
||||
* (unless --dev-broadcast-interval) */
|
||||
&daemon->broadcast_interval_msec,
|
||||
&chain_hash,
|
||||
&daemon->chain_hash,
|
||||
&daemon->id, &daemon->globalfeatures,
|
||||
daemon->rgb,
|
||||
daemon->alias,
|
||||
|
@ -1834,7 +1836,9 @@ static struct io_plan *gossip_init(struct io_conn *conn,
|
|||
}
|
||||
|
||||
/* Prune time (usually 2 weeks) is twice update time */
|
||||
daemon->rstate = new_routing_state(daemon, &chain_hash, &daemon->id,
|
||||
daemon->rstate = new_routing_state(daemon,
|
||||
chainparams_by_chainhash(&daemon->chain_hash),
|
||||
&daemon->id,
|
||||
update_channel_interval * 2);
|
||||
|
||||
/* Load stored gossip messages */
|
||||
|
@ -2197,7 +2201,7 @@ static struct io_plan *query_scids_req(struct io_conn *conn,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
msg = towire_query_short_channel_ids(NULL, &daemon->rstate->chain_hash,
|
||||
msg = towire_query_short_channel_ids(NULL, &daemon->chain_hash,
|
||||
encoded);
|
||||
queue_peer_msg(peer, take(msg));
|
||||
peer->num_scid_queries_outstanding++;
|
||||
|
@ -2248,7 +2252,7 @@ static struct io_plan *send_timestamp_filter(struct io_conn *conn,
|
|||
goto out;
|
||||
}
|
||||
|
||||
msg = towire_gossip_timestamp_filter(NULL, &daemon->rstate->chain_hash,
|
||||
msg = towire_gossip_timestamp_filter(NULL, &daemon->chain_hash,
|
||||
first, range);
|
||||
queue_peer_msg(peer, take(msg));
|
||||
out:
|
||||
|
@ -2289,7 +2293,7 @@ static struct io_plan *query_channel_range(struct io_conn *conn,
|
|||
|
||||
status_debug("sending query_channel_range for blocks %u+%u",
|
||||
first_blocknum, number_of_blocks);
|
||||
msg = towire_query_channel_range(NULL, &daemon->rstate->chain_hash,
|
||||
msg = towire_query_channel_range(NULL, &daemon->chain_hash,
|
||||
first_blocknum, number_of_blocks);
|
||||
queue_peer_msg(peer, take(msg));
|
||||
peer->range_first_blocknum = first_blocknum;
|
||||
|
|
|
@ -85,14 +85,14 @@ static struct node_map *empty_node_map(const tal_t *ctx)
|
|||
}
|
||||
|
||||
struct routing_state *new_routing_state(const tal_t *ctx,
|
||||
const struct bitcoin_blkid *chain_hash,
|
||||
const struct chainparams *chainparams,
|
||||
const struct pubkey *local_id,
|
||||
u32 prune_timeout)
|
||||
{
|
||||
struct routing_state *rstate = tal(ctx, struct routing_state);
|
||||
rstate->nodes = empty_node_map(rstate);
|
||||
rstate->broadcasts = new_broadcast_state(rstate);
|
||||
rstate->chain_hash = *chain_hash;
|
||||
rstate->chainparams = chainparams;
|
||||
rstate->local_id = *local_id;
|
||||
rstate->prune_timeout = prune_timeout;
|
||||
rstate->store = gossip_store_new(rstate, rstate, rstate->broadcasts);
|
||||
|
@ -849,7 +849,8 @@ u8 *handle_channel_announcement(struct routing_state *rstate,
|
|||
* - if the specified `chain_hash` is unknown to the receiver:
|
||||
* - MUST ignore the message.
|
||||
*/
|
||||
if (!bitcoin_blkid_eq(&chain_hash, &rstate->chain_hash)) {
|
||||
if (!bitcoin_blkid_eq(&chain_hash,
|
||||
&rstate->chainparams->genesis_blockhash)) {
|
||||
status_trace(
|
||||
"Received channel_announcement %s for unknown chain %s",
|
||||
type_to_string(pending, struct short_channel_id,
|
||||
|
@ -1167,7 +1168,8 @@ u8 *handle_channel_update(struct routing_state *rstate, const u8 *update TAKES,
|
|||
* active on the specified chain):
|
||||
* - MUST ignore the channel update.
|
||||
*/
|
||||
if (!bitcoin_blkid_eq(&chain_hash, &rstate->chain_hash)) {
|
||||
if (!bitcoin_blkid_eq(&chain_hash,
|
||||
&rstate->chainparams->genesis_blockhash)) {
|
||||
status_trace("Received channel_update for unknown chain %s",
|
||||
type_to_string(tmpctx, struct bitcoin_blkid,
|
||||
&chain_hash));
|
||||
|
|
|
@ -172,6 +172,9 @@ static inline int half_chan_to(const struct node *n, const struct chan *chan)
|
|||
}
|
||||
|
||||
struct routing_state {
|
||||
/* Which chain we're on */
|
||||
const struct chainparams *chainparams;
|
||||
|
||||
/* All known nodes. */
|
||||
struct node_map *nodes;
|
||||
|
||||
|
@ -184,8 +187,6 @@ struct routing_state {
|
|||
|
||||
struct broadcast_state *broadcasts;
|
||||
|
||||
struct bitcoin_blkid chain_hash;
|
||||
|
||||
/* Our own ID so we can identify local channels */
|
||||
struct pubkey local_id;
|
||||
|
||||
|
@ -218,7 +219,7 @@ struct route_hop {
|
|||
};
|
||||
|
||||
struct routing_state *new_routing_state(const tal_t *ctx,
|
||||
const struct bitcoin_blkid *chain_hash,
|
||||
const struct chainparams *chainparams,
|
||||
const struct pubkey *local_id,
|
||||
u32 prune_timeout);
|
||||
|
||||
|
|
|
@ -215,7 +215,6 @@ int main(int argc, char *argv[])
|
|||
{
|
||||
setup_locale();
|
||||
|
||||
static const struct bitcoin_blkid zerohash;
|
||||
struct routing_state *rstate;
|
||||
size_t num_nodes = 100, num_runs = 1;
|
||||
struct timemono start, end;
|
||||
|
@ -229,7 +228,7 @@ int main(int argc, char *argv[])
|
|||
| SECP256K1_CONTEXT_SIGN);
|
||||
setup_tmpctx();
|
||||
|
||||
rstate = new_routing_state(tmpctx, &zerohash, &me, 0);
|
||||
rstate = new_routing_state(tmpctx, NULL, &me, 0);
|
||||
opt_register_noarg("--perfme", opt_set_bool, &perfme,
|
||||
"Run perfme-start and perfme-stop around benchmark");
|
||||
|
||||
|
|
|
@ -149,7 +149,6 @@ int main(void)
|
|||
{
|
||||
setup_locale();
|
||||
|
||||
static const struct bitcoin_blkid zerohash;
|
||||
struct half_chan *nc;
|
||||
struct routing_state *rstate;
|
||||
struct pubkey a, b, c, d;
|
||||
|
@ -174,7 +173,7 @@ int main(void)
|
|||
strlen("02cca6c5c966fcf61d121e3a70e03a1cd9eeeea024b26ea666ce974d43b242e636"),
|
||||
&d);
|
||||
|
||||
rstate = new_routing_state(tmpctx, &zerohash, &a, 0);
|
||||
rstate = new_routing_state(tmpctx, NULL, &a, 0);
|
||||
|
||||
/* [{'active': True, 'short_id': '6990:2:1/1', 'fee_per_kw': 10, 'delay': 5, 'message_flags': 0, 'channel_flags': 1, 'destination': '0230ad0e74ea03976b28fda587bb75bdd357a1938af4424156a18265167f5e40ae', 'source': '02ea622d5c8d6143f15ed3ce1d501dd0d3d09d3b1c83a44d0034949f8a9ab60f06', 'last_update': 1504064344}, */
|
||||
|
||||
|
|
|
@ -189,7 +189,6 @@ int main(void)
|
|||
{
|
||||
setup_locale();
|
||||
|
||||
static const struct bitcoin_blkid zerohash;
|
||||
struct routing_state *rstate;
|
||||
struct pubkey a, b, c, d;
|
||||
struct privkey tmp;
|
||||
|
@ -203,7 +202,7 @@ int main(void)
|
|||
|
||||
memset(&tmp, 'a', sizeof(tmp));
|
||||
pubkey_from_privkey(&tmp, &a);
|
||||
rstate = new_routing_state(tmpctx, &zerohash, &a, 0);
|
||||
rstate = new_routing_state(tmpctx, NULL, &a, 0);
|
||||
|
||||
new_node(rstate, &a);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue