Skip to content

Commit 12654e5

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 2bba6f0 commit 12654e5

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
@@ -5499,6 +5499,7 @@ static void peer_reconnect(struct peer *peer,
54995499
const struct secret *last_remote_per_commit_secret)
55005500
{
55015501
struct channel_id channel_id;
5502+
bool announcement_sigs_requested;
55025503
/* Note: BOLT #2 uses these names! */
55035504
u64 next_commitment_number, next_revocation_number;
55045505
bool retransmit_revoke_and_ack, retransmit_commitment_signed;
@@ -5989,6 +5990,24 @@ static void peer_reconnect(struct peer *peer,
59895990
if (retransmit_revoke_and_ack && peer->last_was_revoke)
59905991
resend_revoke(peer);
59915992

5993+
/* BOLT-??? #2
5994+
* 1. type: 5 (`my_current_funding_locked`)
5995+
* 2. data:
5996+
* * [`sha256`:`my_current_funding_locked_txid`]
5997+
* * [`byte`:`retransmit_flags`]
5998+
*
5999+
* The `retransmit_flags` bitfield is used to let our peer know which messages
6000+
* we expect them to retransmit after the reconnection:
6001+
*
6002+
* | Bit Position | Name |
6003+
* | ------------- | --------------------------|
6004+
* | 0 | `announcement_signatures` |
6005+
*/
6006+
announcement_sigs_requested = false;
6007+
if (recv_tlvs && recv_tlvs->my_current_funding_locked
6008+
&& recv_tlvs->my_current_funding_locked->retransmit_flags & 1)
6009+
announcement_sigs_requested = true;
6010+
59926011
/* BOLT #2:
59936012
*
59946013
* - upon reconnection:
@@ -6001,7 +6020,7 @@ static void peer_reconnect(struct peer *peer,
60016020
tal_free(send_tlvs);
60026021

60036022
/* We've reestablished! */
6004-
wire_sync_write(MASTER_FD, take(towire_channeld_reestablished(NULL)));
6023+
wire_sync_write(MASTER_FD, take(towire_channeld_reestablished(NULL, announcement_sigs_requested)));
60056024

60066025
/* Corner case: we didn't send shutdown before because update_add_htlc
60076026
* 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
@@ -1305,6 +1305,17 @@ static void peer_got_shutdown(struct channel *channel, const u8 *msg)
13051305
wallet_channel_save(ld->wallet, channel);
13061306
}
13071307

1308+
static void peer_channeld_reestablished(struct channel *channel, const u8* msg)
1309+
{
1310+
bool announcement_sigs_requested;
1311+
if (!fromwire_channeld_reestablished(tmpctx, &announcement_sigs_requested))
1312+
channel_internal_error(channel,
1313+
"bad channeld_reestablished %s",
1314+
tal_hex(channel, msg));
1315+
1316+
channel_gossip_channel_reestablished(channel, announcement_sigs_requested);
1317+
}
1318+
13081319
void channel_fallen_behind(struct channel *channel)
13091320
{
13101321
channel->has_future_per_commitment_point = true;
@@ -1559,7 +1570,7 @@ static unsigned channel_msg(struct subd *sd, const u8 *msg, const int *fds)
15591570
peer_got_shutdown(sd->channel, msg);
15601571
break;
15611572
case WIRE_CHANNELD_REESTABLISHED:
1562-
channel_gossip_channel_reestablished(sd->channel);
1573+
peer_channeld_reestablished(sd->channel, msg);
15631574
break;
15641575
case WIRE_CHANNELD_SHUTDOWN_COMPLETE:
15651576
/* We expect 1 fd. */
@@ -1917,7 +1928,7 @@ bool peer_start_channeld(struct channel *channel,
19171928

19181929
/* "Reestablished" if we've just opened. */
19191930
if (!reconnected)
1920-
channel_gossip_channel_reestablished(channel);
1931+
channel_gossip_channel_reestablished(channel, false);
19211932

19221933
/* FIXME: DTODO: Use a pointer to a txid instead of zero'ing one out. */
19231934
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). */
@@ -1196,7 +1203,8 @@ static void channel_reestablished_stable(struct channel *channel)
11961203
}
11971204

11981205
/* Peer has connected and successfully reestablished channel. */
1199-
void channel_gossip_channel_reestablished(struct channel *channel)
1206+
void channel_gossip_channel_reestablished(struct channel *channel,
1207+
bool announcement_sigs_requested)
12001208
{
12011209
channel->reestablished = true;
12021210
tal_free(channel->stable_conn_timer);
@@ -1214,6 +1222,9 @@ void channel_gossip_channel_reestablished(struct channel *channel)
12141222
/* We can re-xmit sigs once per reconnect */
12151223
channel->channel_gossip->sent_sigs = false;
12161224

1225+
if (announcement_sigs_requested)
1226+
send_channel_announce_sigs(channel);
1227+
12171228
/* BOLT #7:
12181229
* - Upon reconnection (once the above timing requirements have
12191230
* been met):
@@ -1234,7 +1245,7 @@ void channel_gossip_channel_reestablished(struct channel *channel)
12341245
check_channel_gossip(channel);
12351246
return;
12361247
case CGOSSIP_WAITING_FOR_MATCHING_PEER_SIGS:
1237-
send_channel_announce_sigs(channel);
1248+
send_channel_announce_sigs_once(channel);
12381249
/* fall thru */
12391250
case CGOSSIP_PRIVATE:
12401251
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)