@@ -4596,17 +4596,19 @@ impl<Signer: Sign> Channel<Signer> {
4596
4596
} )
4597
4597
}
4598
4598
4599
- /// Gets an UnsignedChannelAnnouncement, as well as a signature covering it using our
4600
- /// bitcoin_key, if available, for this channel. The channel must be publicly announceable and
4601
- /// available for use (have exchanged FundingLocked messages in both directions). Should be used
4602
- /// for both loose and in response to an AnnouncementSignatures message from the remote peer.
4599
+ /// Gets an UnsignedChannelAnnouncement for this channel. The channel must be publicly
4600
+ /// announceable and available for use (have exchanged FundingLocked messages in both
4601
+ /// directions). Should be used for both loose and in response to an AnnouncementSignatures
4602
+ /// message from the remote peer.
4603
+ ///
4603
4604
/// Will only fail if we're not in a state where channel_announcement may be sent (including
4604
4605
/// closing).
4606
+ ///
4605
4607
/// Note that the "channel must be funded" requirement is stricter than BOLT 7 requires - see
4606
4608
/// https://github.com/lightningnetwork/lightning-rfc/issues/468
4607
4609
///
4608
4610
/// This will only return ChannelError::Ignore upon failure.
4609
- pub fn get_channel_announcement ( & self , node_id : PublicKey , chain_hash : BlockHash ) -> Result < ( msgs:: UnsignedChannelAnnouncement , Signature ) , ChannelError > {
4611
+ fn get_channel_announcement ( & self , node_id : PublicKey , chain_hash : BlockHash ) -> Result < msgs:: UnsignedChannelAnnouncement , ChannelError > {
4610
4612
if !self . config . announced_channel {
4611
4613
return Err ( ChannelError :: Ignore ( "Channel is not available for public announcements" . to_owned ( ) ) ) ;
4612
4614
}
@@ -4630,19 +4632,30 @@ impl<Signer: Sign> Channel<Signer> {
4630
4632
excess_data : Vec :: new ( ) ,
4631
4633
} ;
4632
4634
4633
- let sig = self . holder_signer . sign_channel_announcement ( & msg, & self . secp_ctx )
4635
+ Ok ( msg)
4636
+ }
4637
+
4638
+ pub fn get_announcement_sigs ( & self , node_pk : PublicKey , genesis_block_hash : BlockHash ) -> Result < msgs:: AnnouncementSignatures , ChannelError > {
4639
+ let announcement = self . get_channel_announcement ( node_pk, genesis_block_hash) ?;
4640
+ let ( our_node_sig, our_bitcoin_sig) = self . holder_signer . sign_channel_announcement ( & announcement, & self . secp_ctx )
4634
4641
. map_err ( |_| ChannelError :: Ignore ( "Signer rejected channel_announcement" . to_owned ( ) ) ) ?;
4635
4642
4636
- Ok ( ( msg, sig) )
4643
+ Ok ( msgs:: AnnouncementSignatures {
4644
+ channel_id : self . channel_id ( ) ,
4645
+ short_channel_id : self . get_short_channel_id ( ) . unwrap ( ) ,
4646
+ node_signature : our_node_sig,
4647
+ bitcoin_signature : our_bitcoin_sig,
4648
+ } )
4637
4649
}
4638
4650
4639
4651
/// Signs the given channel announcement, returning a ChannelError::Ignore if no keys are
4640
4652
/// available.
4641
- fn sign_channel_announcement ( & self , our_node_secret : & SecretKey , our_node_id : PublicKey , msghash : secp256k1 :: Message , announcement : msgs:: UnsignedChannelAnnouncement , our_bitcoin_sig : Signature ) -> Result < msgs:: ChannelAnnouncement , ChannelError > {
4653
+ fn sign_channel_announcement ( & self , our_node_id : PublicKey , announcement : msgs:: UnsignedChannelAnnouncement ) -> Result < msgs:: ChannelAnnouncement , ChannelError > {
4642
4654
if let Some ( ( their_node_sig, their_bitcoin_sig) ) = self . announcement_sigs {
4643
4655
let were_node_one = announcement. node_id_1 == our_node_id;
4644
4656
4645
- let our_node_sig = self . secp_ctx . sign ( & msghash, our_node_secret) ;
4657
+ let ( our_node_sig, our_bitcoin_sig) = self . holder_signer . sign_channel_announcement ( & announcement, & self . secp_ctx )
4658
+ . map_err ( |_| ChannelError :: Ignore ( "Signer rejected channel_announcement" . to_owned ( ) ) ) ?;
4646
4659
Ok ( msgs:: ChannelAnnouncement {
4647
4660
node_signature_1 : if were_node_one { our_node_sig } else { their_node_sig } ,
4648
4661
node_signature_2 : if were_node_one { their_node_sig } else { our_node_sig } ,
@@ -4658,8 +4671,8 @@ impl<Signer: Sign> Channel<Signer> {
4658
4671
/// Processes an incoming announcement_signatures message, providing a fully-signed
4659
4672
/// channel_announcement message which we can broadcast and storing our counterparty's
4660
4673
/// signatures for later reconstruction/rebroadcast of the channel_announcement.
4661
- pub fn announcement_signatures ( & mut self , our_node_secret : & SecretKey , our_node_id : PublicKey , chain_hash : BlockHash , msg : & msgs:: AnnouncementSignatures ) -> Result < msgs:: ChannelAnnouncement , ChannelError > {
4662
- let ( announcement, our_bitcoin_sig ) = self . get_channel_announcement ( our_node_id. clone ( ) , chain_hash) ?;
4674
+ pub fn announcement_signatures ( & mut self , our_node_id : PublicKey , chain_hash : BlockHash , msg : & msgs:: AnnouncementSignatures ) -> Result < msgs:: ChannelAnnouncement , ChannelError > {
4675
+ let announcement = self . get_channel_announcement ( our_node_id. clone ( ) , chain_hash) ?;
4663
4676
4664
4677
let msghash = hash_to_message ! ( & Sha256d :: hash( & announcement. encode( ) [ ..] ) [ ..] ) ;
4665
4678
@@ -4676,18 +4689,17 @@ impl<Signer: Sign> Channel<Signer> {
4676
4689
4677
4690
self . announcement_sigs = Some ( ( msg. node_signature , msg. bitcoin_signature ) ) ;
4678
4691
4679
- self . sign_channel_announcement ( our_node_secret , our_node_id, msghash , announcement, our_bitcoin_sig )
4692
+ self . sign_channel_announcement ( our_node_id, announcement)
4680
4693
}
4681
4694
4682
4695
/// Gets a signed channel_announcement for this channel, if we previously received an
4683
4696
/// announcement_signatures from our counterparty.
4684
- pub fn get_signed_channel_announcement ( & self , our_node_secret : & SecretKey , our_node_id : PublicKey , chain_hash : BlockHash ) -> Option < msgs:: ChannelAnnouncement > {
4685
- let ( announcement, our_bitcoin_sig ) = match self . get_channel_announcement ( our_node_id. clone ( ) , chain_hash) {
4697
+ pub fn get_signed_channel_announcement ( & self , our_node_id : PublicKey , chain_hash : BlockHash ) -> Option < msgs:: ChannelAnnouncement > {
4698
+ let announcement = match self . get_channel_announcement ( our_node_id. clone ( ) , chain_hash) {
4686
4699
Ok ( res) => res,
4687
4700
Err ( _) => return None ,
4688
4701
} ;
4689
- let msghash = hash_to_message ! ( & Sha256d :: hash( & announcement. encode( ) [ ..] ) [ ..] ) ;
4690
- match self . sign_channel_announcement ( our_node_secret, our_node_id, msghash, announcement, our_bitcoin_sig) {
4702
+ match self . sign_channel_announcement ( our_node_id, announcement) {
4691
4703
Ok ( res) => Some ( res) ,
4692
4704
Err ( _) => None ,
4693
4705
}
@@ -6270,6 +6282,7 @@ mod tests {
6270
6282
6271
6283
let mut signer = InMemorySigner :: new (
6272
6284
& secp_ctx,
6285
+ SecretKey :: from_slice ( & hex:: decode ( "4242424242424242424242424242424242424242424242424242424242424242" ) . unwrap ( ) [ ..] ) . unwrap ( ) ,
6273
6286
SecretKey :: from_slice ( & hex:: decode ( "30ff4956bbdd3222d44cc5e8a1261dab1e07957bdac5ae88fe3261ef321f3749" ) . unwrap ( ) [ ..] ) . unwrap ( ) ,
6274
6287
SecretKey :: from_slice ( & hex:: decode ( "0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" ) . unwrap ( ) [ ..] ) . unwrap ( ) ,
6275
6288
SecretKey :: from_slice ( & hex:: decode ( "1111111111111111111111111111111111111111111111111111111111111111" ) . unwrap ( ) [ ..] ) . unwrap ( ) ,
0 commit comments