From 94711969f9a5f57a99365fa71f579a42bbc75e47 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 11 Dec 2017 14:03:16 +1030 Subject: [PATCH] gossipd: hand out gossip_index to other daemons. When gossipd sends a message, have a gossip_index. When it gets back a peer, the current gossip_index is included, so it can know exactly where it's up to. Most of this is mechanical plumbing through openingd, channeld and closingd, even though openingd and closingd don't (currently) read gossip, so their gossip_index will be unchanged. Signed-off-by: Rusty Russell --- channeld/channel.c | 25 +++++++++---- channeld/channel_wire.csv | 2 ++ closingd/closing.c | 6 ++-- closingd/closing_wire.csv | 2 ++ gossipd/gossip.c | 16 +++++++-- gossipd/gossip_wire.csv | 11 +++++- lightningd/gossip_control.c | 7 ++-- lightningd/peer_control.c | 72 ++++++++++++++++++++++++++----------- lightningd/peer_control.h | 1 + openingd/opening.c | 6 +++- openingd/opening_wire.csv | 4 +++ 11 files changed, 117 insertions(+), 35 deletions(-) diff --git a/channeld/channel.c b/channeld/channel.c index 4d0cbbb70..33e873099 100644 --- a/channeld/channel.c +++ b/channeld/channel.c @@ -160,6 +160,9 @@ struct peer { u8 channel_flags; bool announce_depth_reached; + + /* Where we got up to in gossip broadcasts. */ + u64 gossip_index; }; static u8 *create_channel_announcement(const tal_t *ctx, struct peer *peer); @@ -176,15 +179,23 @@ static void *tal_arr_append_(void **p, size_t size) static void gossip_in(struct peer *peer, const u8 *msg) { - u16 type = fromwire_peektype(msg); + u8 *gossip; + u16 type; - if (type == WIRE_CHANNEL_ANNOUNCEMENT || type == WIRE_CHANNEL_UPDATE || - type == WIRE_NODE_ANNOUNCEMENT) - msg_enqueue(&peer->peer_out, msg); - else + if (!fromwire_gossip_send_gossip(msg, msg, NULL, + &peer->gossip_index, &gossip)) status_failed(STATUS_FAIL_GOSSIP_IO, "Got bad message from gossipd: %s", tal_hex(msg, msg)); + type = fromwire_peektype(gossip); + + if (type == WIRE_CHANNEL_ANNOUNCEMENT || type == WIRE_CHANNEL_UPDATE || + type == WIRE_NODE_ANNOUNCEMENT) + msg_enqueue(&peer->peer_out, gossip); + else + status_failed(STATUS_FAIL_GOSSIP_IO, + "Got bad message type %s from gossipd: %s", + wire_type_name(type), tal_hex(msg, msg)); } static void send_announcement_signatures(struct peer *peer) @@ -2256,6 +2267,7 @@ static void init_channel(struct peer *peer) &peer->feerate_min, &peer->feerate_max, &peer->their_commit_sig, &peer->cs, + &peer->gossip_index, &funding_pubkey[REMOTE], &points[REMOTE].revocation, &points[REMOTE].payment, @@ -2427,7 +2439,8 @@ static void send_shutdown_complete(struct peer *peer) /* Now we can tell master shutdown is complete. */ wire_sync_write(MASTER_FD, take(towire_channel_shutdown_complete(peer, - &peer->cs))); + &peer->cs, + peer->gossip_index))); fdpass_send(MASTER_FD, PEER_FD); fdpass_send(MASTER_FD, GOSSIP_FD); close(MASTER_FD); diff --git a/channeld/channel_wire.csv b/channeld/channel_wire.csv index 2a328102d..bf49cdf0f 100644 --- a/channeld/channel_wire.csv +++ b/channeld/channel_wire.csv @@ -18,6 +18,7 @@ channel_init,,feerate_min,u32 channel_init,,feerate_max,u32 channel_init,,first_commit_sig,secp256k1_ecdsa_signature channel_init,,crypto_state,struct crypto_state +channel_init,,gossip_index,u64 channel_init,,remote_fundingkey,struct pubkey channel_init,,remote_revocation_basepoint,struct pubkey channel_init,,remote_payment_basepoint,struct pubkey @@ -183,6 +184,7 @@ channel_got_shutdown,,scriptpubkey,scriptpubkey_len*u8 # Shutdown is complete, ready for closing negotiation. + peer_fd & gossip_fd. channel_shutdown_complete,1025 channel_shutdown_complete,,crypto_state,struct crypto_state +channel_shutdown_complete,,gossip_index,u64 # Re-enable commit timer. channel_dev_reenable_commit,1026 diff --git a/closingd/closing.c b/closingd/closing.c index 0a1b5df3c..98ba6423d 100644 --- a/closingd/closing.c +++ b/closingd/closing.c @@ -168,6 +168,7 @@ int main(int argc, char *argv[]) secp256k1_ecdsa_signature sig; bool reconnected; u64 next_index[NUM_SIDES], revocations_received; + u64 gossip_index; if (argc == 2 && streq(argv[1], "--version")) { printf("%s\n", version()); @@ -184,7 +185,7 @@ int main(int argc, char *argv[]) msg = wire_sync_read(ctx, REQ_FD); if (!fromwire_closing_init(ctx, msg, NULL, - &cs, &seed, + &cs, &gossip_index, &seed, &funding_txid, &funding_txout, &funding_satoshi, &funding_pubkey[REMOTE], @@ -473,7 +474,8 @@ int main(int argc, char *argv[]) } /* We're done! */ - wire_sync_write(REQ_FD, take(towire_closing_complete(ctx))); + wire_sync_write(REQ_FD, + take(towire_closing_complete(ctx, gossip_index))); tal_free(ctx); return 0; diff --git a/closingd/closing_wire.csv b/closingd/closing_wire.csv index 12ef79312..662e6c620 100644 --- a/closingd/closing_wire.csv +++ b/closingd/closing_wire.csv @@ -3,6 +3,7 @@ # Begin! (passes peer fd, gossipd-client fd) closing_init,2001 closing_init,,crypto_state,struct crypto_state +closing_init,,gossip_index,u64 closing_init,,seed,struct privkey closing_init,,funding_txid,struct sha256_double closing_init,,funding_txout,u16 @@ -33,3 +34,4 @@ closing_received_signature_reply,2102 # Negotiations complete, we're exiting. closing_complete,2004 +closing_complete,,gossip_index,u64 diff --git a/gossipd/gossip.c b/gossipd/gossip.c index e51532e4f..709105b2b 100644 --- a/gossipd/gossip.c +++ b/gossipd/gossip.c @@ -332,6 +332,7 @@ static struct io_plan *peer_init_received(struct io_conn *conn, /* We will not have anything queued, since we're not duplex. */ msg = towire_gossip_peer_connected(peer, &peer->id, &peer->addr, &peer->local->pcs.cs, + peer->broadcast_index, peer->gfeatures, peer->lfeatures); if (!send_peer_with_fds(peer, msg)) return io_close(conn); @@ -509,6 +510,7 @@ static struct io_plan *ready_for_master(struct io_conn *conn, struct peer *peer) msg = towire_gossip_peer_nongossip(peer, &peer->id, &peer->addr, &peer->local->pcs.cs, + peer->broadcast_index, peer->gfeatures, peer->lfeatures, peer->local->nongossip_msg); @@ -516,6 +518,7 @@ static struct io_plan *ready_for_master(struct io_conn *conn, struct peer *peer) msg = towire_gossipctl_release_peer_reply(peer, &peer->addr, &peer->local->pcs.cs, + peer->broadcast_index, peer->gfeatures, peer->lfeatures); @@ -830,7 +833,10 @@ static struct io_plan *nonlocal_dump_gossip(struct io_conn *conn, struct daemon_ return msg_queue_wait(conn, &peer->remote->out, daemon_conn_write_next, dc); } else { - return io_write_wire(conn, next->payload, + u8 *msg = towire_gossip_send_gossip(conn, + peer->broadcast_index, + next->payload); + return io_write_wire(conn, take(msg), nonlocal_gossip_broadcast_done, dc); } } @@ -855,6 +861,7 @@ struct returning_peer { struct daemon *daemon; struct pubkey id; struct crypto_state cs; + u64 gossip_index; u8 *inner_msg; int peer_fd, gossip_fd; }; @@ -871,8 +878,8 @@ static struct io_plan *handle_returning_peer(struct io_conn *conn, "hand_back_peer unknown peer: %s", type_to_string(trc, struct pubkey, &rpeer->id)); - /* We don't need the gossip_fd. We could drain it, so no gossip msgs - * are missed, but that seems overkill. */ + /* We don't need the gossip_fd; we know what gossip it got + * from gossip_index */ close(rpeer->gossip_fd); /* Possible if there's a reconnect: ignore handed back. */ @@ -894,6 +901,7 @@ static struct io_plan *handle_returning_peer(struct io_conn *conn, peer->local = new_local_peer_state(peer, &rpeer->cs); peer->local->fd = rpeer->peer_fd; + peer->broadcast_index = rpeer->gossip_index; /* If they told us to send a message, queue it now */ if (tal_len(rpeer->inner_msg)) @@ -919,6 +927,7 @@ static struct io_plan *hand_back_peer(struct io_conn *conn, rpeer->daemon = daemon; if (!fromwire_gossipctl_hand_back_peer(msg, msg, NULL, &rpeer->id, &rpeer->cs, + &rpeer->gossip_index, &rpeer->inner_msg)) master_badmsg(WIRE_GOSSIPCTL_HAND_BACK_PEER, msg); @@ -1555,6 +1564,7 @@ static struct io_plan *recv_req(struct io_conn *conn, struct daemon_conn *master case WIRE_GOSSIP_PEER_NONGOSSIP: case WIRE_GOSSIP_GET_UPDATE: case WIRE_GOSSIP_GET_UPDATE_REPLY: + case WIRE_GOSSIP_SEND_GOSSIP: break; } diff --git a/gossipd/gossip_wire.csv b/gossipd/gossip_wire.csv index 9c04108fb..2f4651663 100644 --- a/gossipd/gossip_wire.csv +++ b/gossipd/gossip_wire.csv @@ -31,6 +31,7 @@ gossip_peer_connected,3002 gossip_peer_connected,,id,struct pubkey gossip_peer_connected,,addr,struct wireaddr gossip_peer_connected,,crypto_state,struct crypto_state +gossip_peer_connected,,gossip_index,u64 gossip_peer_connected,,gflen,u16 gossip_peer_connected,,gfeatures,gflen*u8 gossip_peer_connected,,lflen,u16 @@ -41,6 +42,7 @@ gossip_peer_nongossip,3003 gossip_peer_nongossip,,id,struct pubkey gossip_peer_nongossip,,addr,struct wireaddr gossip_peer_nongossip,,crypto_state,struct crypto_state +gossip_peer_nongossip,,gossip_index,u64 gossip_peer_nongossip,,gflen,u16 gossip_peer_nongossip,,gfeatures,gflen*u8 gossip_peer_nongossip,,lflen,u16 @@ -56,6 +58,7 @@ gossipctl_release_peer,,id,struct pubkey gossipctl_release_peer_reply,3104 gossipctl_release_peer_reply,,addr,struct wireaddr gossipctl_release_peer_reply,,crypto_state,struct crypto_state +gossipctl_release_peer_reply,,gossip_index,u64 gossipctl_release_peer_reply,,gflen,u16 gossipctl_release_peer_reply,,gfeatures,gflen*u8 gossipctl_release_peer_reply,,lflen,u16 @@ -64,10 +67,11 @@ gossipctl_release_peer_reply,,lfeatures,lflen*u8 # Gossipd -> master: reply to gossip_release_peer if we couldn't find the peer. gossipctl_release_peer_replyfail,3204 -# Gossipd -> master: take back peer, with optional msg. (+peer fd, +gossip fd) +# master -> gossipd: take back peer, with optional msg. (+peer fd, +gossip fd) gossipctl_hand_back_peer,3013 gossipctl_hand_back_peer,,id,struct pubkey gossipctl_hand_back_peer,,crypto_state,struct crypto_state +gossipctl_hand_back_peer,,gossip_index,u64 gossipctl_hand_back_peer,,len,u16 gossipctl_hand_back_peer,,msg,len*u8 @@ -141,3 +145,8 @@ gossip_get_update_reply,3112 gossip_get_update_reply,,len,u16 gossip_get_update_reply,,update,len*u8 +# Gossipd can tell channeld etc about gossip to fwd. +gossip_send_gossip,3016 +gossip_send_gossip,,gossip_index,u64 +gossip_send_gossip,,len,u16 +gossip_send_gossip,,gossip,len*u8 diff --git a/lightningd/gossip_control.c b/lightningd/gossip_control.c index db78963d4..2e9a66d62 100644 --- a/lightningd/gossip_control.c +++ b/lightningd/gossip_control.c @@ -27,9 +27,10 @@ static void peer_nongossip(struct subd *gossip, const u8 *msg, struct crypto_state cs; struct wireaddr addr; u8 *gfeatures, *lfeatures, *in_pkt; + u64 gossip_index; if (!fromwire_gossip_peer_nongossip(msg, msg, NULL, - &id, &addr, &cs, + &id, &addr, &cs, &gossip_index, &gfeatures, &lfeatures, &in_pkt)) @@ -47,7 +48,8 @@ static void peer_nongossip(struct subd *gossip, const u8 *msg, return; } - peer_sent_nongossip(gossip->ld, &id, &addr, &cs, gfeatures, lfeatures, + peer_sent_nongossip(gossip->ld, &id, &addr, &cs, gossip_index, + gfeatures, lfeatures, peer_fd, gossip_fd, in_pkt); } @@ -70,6 +72,7 @@ static unsigned gossip_msg(struct subd *gossip, const u8 *msg, const int *fds) case WIRE_GOSSIPCTL_RELEASE_PEER: case WIRE_GOSSIPCTL_PEER_ADDRHINT: case WIRE_GOSSIP_GET_UPDATE: + case WIRE_GOSSIP_SEND_GOSSIP: /* This is a reply, so never gets through to here. */ case WIRE_GOSSIP_GET_UPDATE_REPLY: case WIRE_GOSSIP_GETNODES_REPLY: diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index f91f3a5a9..c32dcd634 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -61,21 +61,25 @@ static void peer_offer_channel(struct lightningd *ld, struct funding_channel *fc, const struct wireaddr *addr, const struct crypto_state *cs, + u64 gossip_index, const u8 *gfeatures, const u8 *lfeatures, int peer_fd, int gossip_fd); static bool peer_start_channeld(struct peer *peer, const struct crypto_state *cs, + u64 gossip_index, int peer_fd, int gossip_fd, const u8 *funding_signed, bool reconnected); static void peer_start_closingd(struct peer *peer, struct crypto_state *cs, + u64 gossip_index, int peer_fd, int gossip_fd, bool reconnected); static void peer_accept_channel(struct lightningd *ld, const struct pubkey *peer_id, const struct wireaddr *addr, const struct crypto_state *cs, + u64 gossip_index, const u8 *gfeatures, const u8 *lfeatures, int peer_fd, int gossip_fd, const u8 *open_msg); @@ -548,9 +552,10 @@ void peer_connected(struct lightningd *ld, const u8 *msg, u8 *error; struct peer *peer; struct wireaddr addr; + u64 gossip_index; if (!fromwire_gossip_peer_connected(msg, msg, NULL, - &id, &addr, &cs, + &id, &addr, &cs, &gossip_index, &gfeatures, &lfeatures)) fatal("Gossip gave bad GOSSIP_PEER_CONNECTED message %s", tal_hex(msg, msg)); @@ -620,7 +625,8 @@ void peer_connected(struct lightningd *ld, const u8 *msg, peer_set_owner(peer, NULL); peer->addr = addr; - peer_start_channeld(peer, &cs, peer_fd, gossip_fd, NULL, + peer_start_channeld(peer, &cs, gossip_index, + peer_fd, gossip_fd, NULL, true); return; @@ -631,7 +637,8 @@ void peer_connected(struct lightningd *ld, const u8 *msg, peer_set_owner(peer, NULL); peer->addr = addr; - peer_start_closingd(peer, &cs, peer_fd, gossip_fd, + peer_start_closingd(peer, &cs, gossip_index, + peer_fd, gossip_fd, true); return; } @@ -640,7 +647,7 @@ void peer_connected(struct lightningd *ld, const u8 *msg, return_to_gossipd: /* Otherwise, we hand back to gossipd, to continue. */ - msg = towire_gossipctl_hand_back_peer(msg, &id, &cs, NULL); + msg = towire_gossipctl_hand_back_peer(msg, &id, &cs, gossip_index, NULL); subd_send_msg(ld->gossip, take(msg)); subd_send_fd(ld->gossip, peer_fd); subd_send_fd(ld->gossip, gossip_fd); @@ -652,7 +659,8 @@ return_to_gossipd: send_error: /* Hand back to gossipd, with an error packet. */ connect_failed(ld, &id, sanitize_error(msg, error, NULL)); - msg = towire_gossipctl_hand_back_peer(msg, &id, &cs, error); + msg = towire_gossipctl_hand_back_peer(msg, &id, &cs, gossip_index, + error); subd_send_msg(ld->gossip, take(msg)); subd_send_fd(ld->gossip, peer_fd); subd_send_fd(ld->gossip, gossip_fd); @@ -662,6 +670,7 @@ void peer_sent_nongossip(struct lightningd *ld, const struct pubkey *id, const struct wireaddr *addr, const struct crypto_state *cs, + u64 gossip_index, const u8 *gfeatures, const u8 *lfeatures, int peer_fd, int gossip_fd, @@ -689,7 +698,8 @@ void peer_sent_nongossip(struct lightningd *ld, /* Open request? */ if (fromwire_peektype(in_msg) == WIRE_OPEN_CHANNEL) { - peer_accept_channel(ld, id, addr, cs, gfeatures, lfeatures, + peer_accept_channel(ld, id, addr, cs, gossip_index, + gfeatures, lfeatures, peer_fd, gossip_fd, in_msg); return; } @@ -702,7 +712,7 @@ void peer_sent_nongossip(struct lightningd *ld, send_error: /* Hand back to gossipd, with an error packet. */ connect_failed(ld, id, sanitize_error(error, error, NULL)); - msg = towire_gossipctl_hand_back_peer(ld, id, cs, error); + msg = towire_gossipctl_hand_back_peer(ld, id, cs, gossip_index, error); subd_send_msg(ld->gossip, take(msg)); subd_send_fd(ld->gossip, peer_fd); subd_send_fd(ld->gossip, gossip_fd); @@ -1528,7 +1538,8 @@ static enum watch_result funding_lockin_cb(struct peer *peer, static void opening_got_hsm_funding_sig(struct funding_channel *fc, int peer_fd, int gossip_fd, const u8 *resp, - const struct crypto_state *cs) + const struct crypto_state *cs, + u64 gossip_index) { secp256k1_ecdsa_signature *sigs; struct bitcoin_tx *tx = fc->funding_tx; @@ -1580,7 +1591,8 @@ static void opening_got_hsm_funding_sig(struct funding_channel *fc, fc->peer->opening_cmd = NULL; /* Start normal channel daemon. */ - peer_start_channeld(fc->peer, cs, peer_fd, gossip_fd, NULL, false); + peer_start_channeld(fc->peer, cs, gossip_index, + peer_fd, gossip_fd, NULL, false); peer_set_condition(fc->peer, OPENINGD, CHANNELD_AWAITING_LOCKIN); wallet_confirm_utxos(fc->peer->ld->wallet, fc->utxomap); @@ -1829,7 +1841,10 @@ static void peer_received_closing_signature(struct peer *peer, const u8 *msg) static void peer_closing_complete(struct peer *peer, const u8 *msg) { - if (!fromwire_closing_complete(msg, NULL)) { + /* FIXME: We should save this, to return to gossipd */ + u64 gossip_index; + + if (!fromwire_closing_complete(msg, NULL, &gossip_index)) { peer_internal_error(peer, "Bad closing_complete %s", tal_hex(peer, msg)); return; @@ -1867,6 +1882,7 @@ static unsigned closing_msg(struct subd *sd, const u8 *msg, const int *fds) static void peer_start_closingd(struct peer *peer, struct crypto_state *cs, + u64 gossip_index, int peer_fd, int gossip_fd, bool reconnected) { @@ -1942,6 +1958,7 @@ static void peer_start_closingd(struct peer *peer, */ initmsg = towire_closing_init(tmpctx, cs, + gossip_index, peer->seed, peer->funding_txid, peer->funding_outnum, @@ -1970,18 +1987,19 @@ static void peer_start_closingd_after_shutdown(struct peer *peer, const u8 *msg, const int *fds) { struct crypto_state cs; + u64 gossip_index; /* We expect 2 fds. */ assert(tal_count(fds) == 2); - if (!fromwire_channel_shutdown_complete(msg, NULL, &cs)) { + if (!fromwire_channel_shutdown_complete(msg, NULL, &cs, &gossip_index)) { peer_internal_error(peer, "bad shutdown_complete: %s", tal_hex(peer, msg)); return; } /* This sets peer->owner, closes down channeld. */ - peer_start_closingd(peer, &cs, fds[0], fds[1], false); + peer_start_closingd(peer, &cs, gossip_index, fds[0], fds[1], false); peer_set_condition(peer, CHANNELD_SHUTTING_DOWN, CLOSINGD_SIGEXCHANGE); } @@ -2045,6 +2063,7 @@ static unsigned channel_msg(struct subd *sd, const u8 *msg, const int *fds) static bool peer_start_channeld(struct peer *peer, const struct crypto_state *cs, + u64 gossip_index, int peer_fd, int gossip_fd, const u8 *funding_signed, bool reconnected) @@ -2135,7 +2154,7 @@ static bool peer_start_channeld(struct peer *peer, get_feerate(peer->ld->topology, FEERATE_NORMAL), get_feerate(peer->ld->topology, FEERATE_IMMEDIATE) * 5, peer->last_sig, - cs, + cs, gossip_index, &peer->channel_info->remote_fundingkey, &peer->channel_info->theirbase.revocation, &peer->channel_info->theirbase.payment, @@ -2196,6 +2215,7 @@ static void opening_funder_finished(struct subd *opening, const u8 *resp, struct crypto_state cs; secp256k1_ecdsa_signature remote_commit_sig; struct bitcoin_tx *remote_commit; + u64 gossip_index; assert(tal_count(fds) == 2); @@ -2212,6 +2232,7 @@ static void opening_funder_finished(struct subd *opening, const u8 *resp, remote_commit, &remote_commit_sig, &cs, + &gossip_index, &channel_info->theirbase.revocation, &channel_info->theirbase.payment, &channel_info->theirbase.htlc, @@ -2301,7 +2322,7 @@ static void opening_funder_finished(struct subd *opening, const u8 *resp, fatal("Could not write to HSM: %s", strerror(errno)); msg = hsm_sync_read(fc, fc->peer->ld); - opening_got_hsm_funding_sig(fc, fds[0], fds[1], msg, &cs); + opening_got_hsm_funding_sig(fc, fds[0], fds[1], msg, &cs, gossip_index); } static void opening_fundee_finished(struct subd *opening, @@ -2312,6 +2333,7 @@ static void opening_fundee_finished(struct subd *opening, u8 *funding_signed; struct channel_info *channel_info; struct crypto_state cs; + u64 gossip_index; secp256k1_ecdsa_signature remote_commit_sig; struct bitcoin_tx *remote_commit; @@ -2331,6 +2353,7 @@ static void opening_fundee_finished(struct subd *opening, remote_commit, &remote_commit_sig, &cs, + &gossip_index, &channel_info->theirbase.revocation, &channel_info->theirbase.payment, &channel_info->theirbase.htlc, @@ -2376,7 +2399,8 @@ static void opening_fundee_finished(struct subd *opening, peer_set_owner(peer, NULL); /* On to normal operation! */ - peer_start_channeld(peer, &cs, fds[0], fds[1], funding_signed, false); + peer_start_channeld(peer, &cs, gossip_index, + fds[0], fds[1], funding_signed, false); peer_set_condition(peer, OPENINGD, CHANNELD_AWAITING_LOCKIN); } @@ -2386,6 +2410,7 @@ static unsigned int opening_negotiation_failed(struct subd *openingd, const int *fds) { struct crypto_state cs; + u64 gossip_index; struct peer *peer = openingd->peer; u8 *err; const char *why; @@ -2394,14 +2419,16 @@ static unsigned int opening_negotiation_failed(struct subd *openingd, if (tal_count(fds) == 0) return 2; - if (!fromwire_opening_negotiation_failed(msg, msg, NULL, &cs, &err)) { + if (!fromwire_opening_negotiation_failed(msg, msg, NULL, + &cs, &gossip_index, &err)) { peer_internal_error(peer, "bad OPENING_NEGOTIATION_FAILED %s", tal_hex(msg, msg)); return 0; } - msg = towire_gossipctl_hand_back_peer(msg, &peer->id, &cs, NULL); + msg = towire_gossipctl_hand_back_peer(msg, &peer->id, &cs, gossip_index, + NULL); subd_send_msg(openingd->ld->gossip, take(msg)); subd_send_fd(openingd->ld->gossip, fds[0]); subd_send_fd(openingd->ld->gossip, fds[1]); @@ -2419,6 +2446,7 @@ static void peer_accept_channel(struct lightningd *ld, const struct pubkey *peer_id, const struct wireaddr *addr, const struct crypto_state *cs, + u64 gossip_index, const u8 *gfeatures, const u8 *lfeatures, int peer_fd, int gossip_fd, const u8 *open_msg) @@ -2470,7 +2498,7 @@ static void peer_accept_channel(struct lightningd *ld, &peer->our_config, max_to_self_delay, min_effective_htlc_capacity_msat, - cs, peer->seed); + cs, gossip_index, peer->seed); subd_send_msg(peer->owner, take(msg)); @@ -2493,6 +2521,7 @@ static void peer_offer_channel(struct lightningd *ld, struct funding_channel *fc, const struct wireaddr *addr, const struct crypto_state *cs, + u64 gossip_index, const u8 *gfeatures, const u8 *lfeatures, int peer_fd, int gossip_fd) { @@ -2550,7 +2579,7 @@ static void peer_offer_channel(struct lightningd *ld, &fc->peer->our_config, max_to_self_delay, min_effective_htlc_capacity_msat, - cs, fc->peer->seed); + cs, gossip_index, fc->peer->seed); subd_send_msg(fc->peer->owner, take(msg)); utxos = from_utxoptr_arr(fc, fc->utxomap); @@ -2579,6 +2608,7 @@ static void gossip_peer_released(struct subd *gossip, { struct lightningd *ld = gossip->ld; struct crypto_state cs; + u64 gossip_index; u8 *gfeatures, *lfeatures; struct wireaddr addr; @@ -2586,6 +2616,7 @@ static void gossip_peer_released(struct subd *gossip, fc->peer = peer_by_id(ld, &fc->peerid); if (!fromwire_gossipctl_release_peer_reply(fc, resp, NULL, &addr, &cs, + &gossip_index, &gfeatures, &lfeatures)) { if (!fromwire_gossipctl_release_peer_replyfail(resp, NULL)) { fatal("Gossip daemon gave invalid reply %s", @@ -2611,7 +2642,8 @@ static void gossip_peer_released(struct subd *gossip, } /* OK, offer peer a channel. */ - peer_offer_channel(ld, fc, &addr, &cs, gfeatures, lfeatures, + peer_offer_channel(ld, fc, &addr, &cs, gossip_index, + gfeatures, lfeatures, fds[0], fds[1]); } diff --git a/lightningd/peer_control.h b/lightningd/peer_control.h index 20f2e1453..aee2378a9 100644 --- a/lightningd/peer_control.h +++ b/lightningd/peer_control.h @@ -176,6 +176,7 @@ void peer_sent_nongossip(struct lightningd *ld, const struct pubkey *id, const struct wireaddr *addr, const struct crypto_state *cs, + u64 gossip_index, const u8 *gfeatures, const u8 *lfeatures, int peer_fd, int gossip_fd, diff --git a/openingd/opening.c b/openingd/opening.c index f10e3dd7d..3357c3779 100644 --- a/openingd/opening.c +++ b/openingd/opening.c @@ -38,6 +38,7 @@ struct state { struct crypto_state cs; + u64 gossip_index; struct pubkey next_per_commit[NUM_SIDES]; /* Initially temporary, then final channel id. */ @@ -89,6 +90,7 @@ static void negotiation_failed(struct state *state, bool send_error, /* Tell master we should return to gossiping. */ msg = towire_opening_negotiation_failed(state, &state->cs, + state->gossip_index, (const u8 *)errmsg); wire_sync_write(REQ_FD, msg); fdpass_send(REQ_FD, PEER_FD); @@ -502,7 +504,7 @@ static u8 *funder_channel(struct state *state, state->remoteconf, tx, &sig, - &state->cs, + &state->cs, state->gossip_index, &theirs.revocation, &theirs.payment, &theirs.htlc, @@ -726,6 +728,7 @@ static u8 *fundee_channel(struct state *state, their_commit, &theirsig, &state->cs, + state->gossip_index, &theirs.revocation, &theirs.payment, &theirs.htlc, @@ -778,6 +781,7 @@ int main(int argc, char *argv[]) &state->max_to_self_delay, &state->min_effective_htlc_capacity_msat, &state->cs, + &state->gossip_index, &seed)) master_badmsg(WIRE_OPENING_INIT, msg); diff --git a/openingd/opening_wire.csv b/openingd/opening_wire.csv index 2f3d71fbd..598336869 100644 --- a/openingd/opening_wire.csv +++ b/openingd/opening_wire.csv @@ -9,6 +9,7 @@ opening_init,,our_config,struct channel_config opening_init,,max_to_self_delay,u32 opening_init,,min_effective_htlc_capacity_msat,u64 opening_init,,crypto_state,struct crypto_state +opening_init,,gossip_index,u64 # Seed to generate all the keys from opening_init,,seed,struct privkey @@ -34,6 +35,7 @@ opening_funder_reply,,their_config,struct channel_config opening_funder_reply,,first_commit,struct bitcoin_tx opening_funder_reply,,first_commit_sig,secp256k1_ecdsa_signature opening_funder_reply,,crypto_state,struct crypto_state +opening_funder_reply,,gossip_index,u64 opening_funder_reply,,revocation_basepoint,struct pubkey opening_funder_reply,,payment_basepoint,struct pubkey opening_funder_reply,,htlc_basepoint,struct pubkey @@ -58,6 +60,7 @@ opening_fundee_reply,,their_config,struct channel_config opening_fundee_reply,,first_commit,struct bitcoin_tx opening_fundee_reply,,first_commit_sig,secp256k1_ecdsa_signature opening_fundee_reply,,crypto_state,struct crypto_state +opening_fundee_reply,,gossip_index,u64 opening_fundee_reply,,revocation_basepoint,struct pubkey opening_fundee_reply,,payment_basepoint,struct pubkey opening_fundee_reply,,htlc_basepoint,struct pubkey @@ -77,6 +80,7 @@ opening_fundee_reply,,funding_signed_msg,msglen*u8 # We disagreed with opening parameters, but peer is ok for gossip (+ peerfd) opening_negotiation_failed,6010 opening_negotiation_failed,,crypto_state,struct crypto_state +opening_negotiation_failed,,gossip_index,u64 opening_negotiation_failed,,len,u16 # FIXME: string support! opening_negotiation_failed,,msg,len*u8