Skip to content

Commit bdfbdf0

Browse files
committed
reestablish: Send announcement sigs when asked
A new TLV in `channel_reestablish` lets our peer request announcement signatures. This updates CLN to (re)send them when requested. As per splice spec PR https://github.com/lightning/bolts/pull/1160/changes#diff-ed04ca2c673fd6aabde69389511fa9ee60cb44d6b2ef6c88b549ffaa753d6afeR3303-R3308 Changelog-None
1 parent 8402b0a commit bdfbdf0

7 files changed

Lines changed: 65 additions & 19 deletions

File tree

channeld/channeld.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5526,6 +5526,7 @@ static void peer_reconnect(struct peer *peer,
55265526
const struct secret *last_remote_per_commit_secret)
55275527
{
55285528
struct channel_id channel_id;
5529+
bool announcement_sigs_requested;
55295530
/* Note: BOLT #2 uses these names! */
55305531
u64 next_commitment_number, next_revocation_number;
55315532
bool retransmit_revoke_and_ack, retransmit_commitment_signed;
@@ -6020,6 +6021,24 @@ static void peer_reconnect(struct peer *peer,
60206021
if (retransmit_revoke_and_ack && peer->last_was_revoke)
60216022
resend_revoke(peer);
60226023

6024+
/* BOLT-??? #2
6025+
* 1. type: 5 (`my_current_funding_locked`)
6026+
* 2. data:
6027+
* * [`sha256`:`my_current_funding_locked_txid`]
6028+
* * [`byte`:`retransmit_flags`]
6029+
*
6030+
* The `retransmit_flags` bitfield is used to let our peer know which messages
6031+
* we expect them to retransmit after the reconnection:
6032+
*
6033+
* | Bit Position | Name |
6034+
* | ------------- | --------------------------|
6035+
* | 0 | `announcement_signatures` |
6036+
*/
6037+
announcement_sigs_requested = false;
6038+
if (recv_tlvs && recv_tlvs->my_current_funding_locked
6039+
&& recv_tlvs->my_current_funding_locked->retransmit_flags & 1)
6040+
announcement_sigs_requested = true;
6041+
60236042
/* BOLT #2:
60246043
*
60256044
* - upon reconnection:
@@ -6032,7 +6051,7 @@ static void peer_reconnect(struct peer *peer,
60326051
tal_free(send_tlvs);
60336052

60346053
/* We've reestablished! */
6035-
wire_sync_write(MASTER_FD, take(towire_channeld_reestablished(NULL)));
6054+
wire_sync_write(MASTER_FD, take(towire_channeld_reestablished(NULL, announcement_sigs_requested)));
60366055

60376056
/* Corner case: we didn't send shutdown before because update_add_htlc
60386057
* pending, but now they're cleared by restart, and we're actually

channeld/channeld_wire.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ msgdata,channeld_init,scid_alias,short_channel_id,
7878

7979
# channeld->lightningd: successfully negotated reestablishment.
8080
msgtype,channeld_reestablished,1101
81+
msgdata,channeld_reestablished,announcement_sigs_requested,bool,
8182

8283
# master->channeld funding hit new depth(funding locked if >= lock depth)
8384
# short_channel_id != NULL once we have 3+ confirmations

lightningd/channel_control.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,6 +1311,17 @@ static void peer_got_shutdown(struct channel *channel, const u8 *msg)
13111311
wallet_channel_save(ld->wallet, channel);
13121312
}
13131313

1314+
static void peer_channeld_reestablished(struct channel *channel, const u8* msg)
1315+
{
1316+
bool announcement_sigs_requested;
1317+
if (!fromwire_channeld_reestablished(msg, &announcement_sigs_requested))
1318+
channel_internal_error(channel,
1319+
"bad channeld_reestablished %s",
1320+
tal_hex(channel, msg));
1321+
1322+
channel_gossip_channel_reestablished(channel, announcement_sigs_requested);
1323+
}
1324+
13141325
void channel_fallen_behind(struct channel *channel)
13151326
{
13161327
channel->has_future_per_commitment_point = true;
@@ -1565,7 +1576,7 @@ static unsigned channel_msg(struct subd *sd, const u8 *msg, const int *fds)
15651576
peer_got_shutdown(sd->channel, msg);
15661577
break;
15671578
case WIRE_CHANNELD_REESTABLISHED:
1568-
channel_gossip_channel_reestablished(sd->channel);
1579+
peer_channeld_reestablished(sd->channel, msg);
15691580
break;
15701581
case WIRE_CHANNELD_SHUTDOWN_COMPLETE:
15711582
/* We expect 1 fd. */
@@ -1923,7 +1934,7 @@ bool peer_start_channeld(struct channel *channel,
19231934

19241935
/* "Reestablished" if we've just opened. */
19251936
if (!reconnected)
1926-
channel_gossip_channel_reestablished(channel);
1937+
channel_gossip_channel_reestablished(channel, false);
19271938

19281939
/* FIXME: DTODO: Use a pointer to a txid instead of zero'ing one out. */
19291940
memset(&txid, 0, sizeof(txid));

lightningd/channel_gossip.c

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -687,25 +687,22 @@ static void stash_remote_announce_sigs(struct channel *channel,
687687
* - MUST NOT send the `announcement_signatures` message.
688688
*/
689689

690-
static void send_channel_announce_sigs(struct channel *channel)
690+
static bool send_channel_announce_sigs(struct channel *channel)
691691
{
692692
/* First 2 + 256 byte are the signatures and msg type, skip them */
693693
const size_t offset = 258;
694694
struct lightningd *ld = channel->peer->ld;
695695
struct sha256_double hash;
696-
secp256k1_ecdsa_signature local_node_sig, local_bitcoin_sig;
697696
struct channel_gossip *cg = channel->channel_gossip;
697+
secp256k1_ecdsa_signature local_node_sig, local_bitcoin_sig;
698698
const u8 *ca, *msg;
699699

700700
/* Wait until we've exchanged reestablish messages */
701701
if (!channel->reestablished) {
702702
log_debug(channel->log, "channel_gossip: not sending channel_announcement_sigs until reestablished");
703-
return;
703+
return false;
704704
}
705705

706-
if (cg->sent_sigs)
707-
return;
708-
709706
ca = create_channel_announcement(tmpctx, channel, *channel->scid,
710707
NULL, NULL, NULL, NULL);
711708

@@ -722,20 +719,30 @@ static void send_channel_announce_sigs(struct channel *channel)
722719
if (!check_signed_hash(&hash, &local_node_sig, &ld->our_pubkey)) {
723720
channel_internal_error(channel,
724721
"HSM returned an invalid node signature");
725-
return;
722+
return false;
726723
}
727724

728725
if (!check_signed_hash(&hash, &local_bitcoin_sig, &channel->local_funding_pubkey)) {
729726
channel_internal_error(channel,
730727
"HSM returned an invalid bitcoin signature");
731-
return;
728+
return false;
732729
}
733730

734731
msg = towire_announcement_signatures(NULL,
735732
&channel->cid, *channel->scid,
736733
&local_node_sig, &local_bitcoin_sig);
737734
msg_to_peer(channel->peer, take(msg));
738-
cg->sent_sigs = true;
735+
return cg->sent_sigs = true;
736+
}
737+
738+
static bool send_channel_announce_sigs_once(struct channel *channel)
739+
{
740+
struct channel_gossip *cg = channel->channel_gossip;
741+
742+
if (cg->sent_sigs)
743+
return false;
744+
745+
return send_channel_announce_sigs(channel);
739746
}
740747

741748
/* Sends channel_announcement */
@@ -829,7 +836,7 @@ static void set_gossip_state(struct channel *channel,
829836
case CGOSSIP_ANNOUNCED:
830837
/* In case this snuck up on us (fast confirmations),
831838
* make sure we sent sigs */
832-
send_channel_announce_sigs(channel);
839+
send_channel_announce_sigs_once(channel);
833840

834841
/* BOLT #7:
835842
* A recipient node:
@@ -897,7 +904,7 @@ static void update_gossip_state(struct channel *channel)
897904
return;
898905
case CGOSSIP_WAITING_FOR_MATCHING_PEER_SIGS:
899906
case CGOSSIP_WAITING_FOR_ANNOUNCE_DEPTH:
900-
send_channel_announce_sigs(channel);
907+
send_channel_announce_sigs_once(channel);
901908
/* fall thru */
902909
case CGOSSIP_WAITING_FOR_SCID:
903910
case CGOSSIP_PRIVATE:
@@ -1005,7 +1012,7 @@ void channel_gossip_got_announcement_sigs(struct channel *channel,
10051012

10061013
send_our_sigs:
10071014
/* This only works once, so we won't spam them. */
1008-
send_channel_announce_sigs(channel);
1015+
send_channel_announce_sigs_once(channel);
10091016
}
10101017

10111018
/* Short channel id changed (splice, or reorg). */
@@ -1198,7 +1205,8 @@ static void channel_reestablished_stable(struct channel *channel)
11981205
}
11991206

12001207
/* Peer has connected and successfully reestablished channel. */
1201-
void channel_gossip_channel_reestablished(struct channel *channel)
1208+
void channel_gossip_channel_reestablished(struct channel *channel,
1209+
bool announcement_sigs_requested)
12021210
{
12031211
channel->reestablished = true;
12041212
tal_free(channel->stable_conn_timer);
@@ -1216,6 +1224,9 @@ void channel_gossip_channel_reestablished(struct channel *channel)
12161224
/* We can re-xmit sigs once per reconnect */
12171225
channel->channel_gossip->sent_sigs = false;
12181226

1227+
if (announcement_sigs_requested)
1228+
send_channel_announce_sigs(channel);
1229+
12191230
/* BOLT #7:
12201231
* - Upon reconnection (once the above timing requirements have
12211232
* been met):
@@ -1236,7 +1247,7 @@ void channel_gossip_channel_reestablished(struct channel *channel)
12361247
check_channel_gossip(channel);
12371248
return;
12381249
case CGOSSIP_WAITING_FOR_MATCHING_PEER_SIGS:
1239-
send_channel_announce_sigs(channel);
1250+
send_channel_announce_sigs_once(channel);
12401251
/* fall thru */
12411252
case CGOSSIP_PRIVATE:
12421253
case CGOSSIP_WAITING_FOR_ANNOUNCE_DEPTH:

lightningd/channel_gossip.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ void channel_gossip_update_from_gossipd(struct channel *channel,
4343
void channel_gossip_init_done(struct lightningd *ld);
4444

4545
/* Peer has connected and successfully reestablished channel. */
46-
void channel_gossip_channel_reestablished(struct channel *channel);
46+
void channel_gossip_channel_reestablished(struct channel *channel,
47+
bool announcement_sigs_requested);
4748

4849
/* Peer has disconnected */
4950
void channel_gossip_channel_disconnect(struct channel *channel);

tests/plugins/channeld_fakenet.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1167,7 +1167,7 @@ static struct channel *handle_init(struct info *info, const u8 *init_msg)
11671167
channel->htlcs = htlc_map;
11681168

11691169
status_debug("Created channel");
1170-
daemon_conn_send(info->dc, take(towire_channeld_reestablished(NULL)));
1170+
daemon_conn_send(info->dc, take(towire_channeld_reestablished(NULL, false)));
11711171

11721172
return channel;
11731173
}

wallet/test/run-wallet.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,9 @@ bool fromwire_onchaind_dev_memleak_reply(const void *p UNNEEDED, bool *leak UNNE
380380
bool fromwire_openingd_dev_memleak_reply(const void *p UNNEEDED, bool *leak UNNEEDED)
381381
{ fprintf(stderr, "fromwire_openingd_dev_memleak_reply called!\n"); abort(); }
382382
/* Generated stub for get_network_blockheight */
383+
bool fromwire_channeld_reestablished(const void *p UNNEEDED, bool *leak UNNEEDED)
384+
{ fprintf(stderr, "fromwire_channeld_reestablished called!\n"); abort(); }
385+
/* Generated stub for get_network_blockheight */
383386
u32 get_network_blockheight(const struct chain_topology *topo UNNEEDED)
384387
{ fprintf(stderr, "get_network_blockheight called!\n"); abort(); }
385388
/* Generated stub for hash_cid */

0 commit comments

Comments
 (0)