@@ -40,7 +40,7 @@ use io_extras::read_to_end;
4040
4141use util:: events:: MessageSendEventsProvider ;
4242use util:: logger;
43- use util:: ser:: { Readable , Writeable , Writer , FixedLengthReader , HighZeroBytesDroppedVarInt } ;
43+ use util:: ser:: { Readable , Writeable , Writer , FixedLengthReader , HighZeroBytesDroppedVarInt , Hostname } ;
4444
4545use ln:: { PaymentPreimage , PaymentHash , PaymentSecret } ;
4646
@@ -442,6 +442,13 @@ pub enum NetAddress {
442442 /// The port on which the node is listening
443443 port : u16 ,
444444 } ,
445+ /// A hostname/port on which the peer is listening.
446+ Hostname {
447+ /// The hostname on which the node is listening.
448+ hostname : Hostname ,
449+ /// The port on which the node is listening.
450+ port : u16 ,
451+ } ,
445452}
446453impl NetAddress {
447454 /// Gets the ID of this address type. Addresses in node_announcement messages should be sorted
@@ -452,6 +459,7 @@ impl NetAddress {
452459 & NetAddress :: IPv6 { ..} => { 2 } ,
453460 & NetAddress :: OnionV2 ( _) => { 3 } ,
454461 & NetAddress :: OnionV3 { ..} => { 4 } ,
462+ & NetAddress :: Hostname { ..} => { 5 } ,
455463 }
456464 }
457465
@@ -462,11 +470,15 @@ impl NetAddress {
462470 & NetAddress :: IPv6 { .. } => { 18 } ,
463471 & NetAddress :: OnionV2 ( _) => { 12 } ,
464472 & NetAddress :: OnionV3 { .. } => { 37 } ,
473+ // Consists of 1-byte hostname length, hostname bytes, and 2-byte port.
474+ & NetAddress :: Hostname { ref hostname, .. } => { u16:: from ( hostname. len ( ) ) + 3 } ,
465475 }
466476 }
467477
468- /// The maximum length of any address descriptor, not including the 1-byte type
469- pub ( crate ) const MAX_LEN : u16 = 37 ;
478+ /// The maximum length of any address descriptor, not including the 1-byte type.
479+ /// This maximum length is reached by a hostname address descriptor:
480+ /// a hostname with a maximum length of 255, its 1-byte length and a 2-byte port.
481+ pub ( crate ) const MAX_LEN : u16 = 258 ;
470482}
471483
472484impl Writeable for NetAddress {
@@ -492,7 +504,12 @@ impl Writeable for NetAddress {
492504 checksum. write ( writer) ?;
493505 version. write ( writer) ?;
494506 port. write ( writer) ?;
495- }
507+ } ,
508+ & NetAddress :: Hostname { ref hostname, ref port } => {
509+ 5u8 . write ( writer) ?;
510+ hostname. write ( writer) ?;
511+ port. write ( writer) ?;
512+ } ,
496513 }
497514 Ok ( ( ) )
498515 }
@@ -523,6 +540,12 @@ impl Readable for Result<NetAddress, u8> {
523540 port : Readable :: read ( reader) ?,
524541 } ) )
525542 } ,
543+ 5 => {
544+ Ok ( Ok ( NetAddress :: Hostname {
545+ hostname : Readable :: read ( reader) ?,
546+ port : Readable :: read ( reader) ?,
547+ } ) )
548+ } ,
526549 _ => return Ok ( Err ( byte) ) ,
527550 }
528551 }
@@ -1829,7 +1852,7 @@ mod tests {
18291852 use ln:: features:: { ChannelFeatures , ChannelTypeFeatures , InitFeatures , NodeFeatures } ;
18301853 use ln:: msgs;
18311854 use ln:: msgs:: { FinalOnionHopData , OptionalField , OnionErrorPacket , OnionHopDataFormat } ;
1832- use util:: ser:: { Writeable , Readable } ;
1855+ use util:: ser:: { Writeable , Readable , Hostname } ;
18331856
18341857 use bitcoin:: hashes:: hex:: FromHex ;
18351858 use bitcoin:: util:: address:: Address ;
@@ -1843,6 +1866,7 @@ mod tests {
18431866
18441867 use io:: Cursor ;
18451868 use prelude:: * ;
1869+ use core:: convert:: TryFrom ;
18461870
18471871 #[ test]
18481872 fn encoding_channel_reestablish_no_secret ( ) {
@@ -1971,7 +1995,7 @@ mod tests {
19711995 do_encoding_channel_announcement ( true , true ) ;
19721996 }
19731997
1974- fn do_encoding_node_announcement ( unknown_features_bits : bool , ipv4 : bool , ipv6 : bool , onionv2 : bool , onionv3 : bool , excess_address_data : bool , excess_data : bool ) {
1998+ fn do_encoding_node_announcement ( unknown_features_bits : bool , ipv4 : bool , ipv6 : bool , onionv2 : bool , onionv3 : bool , hostname : bool , excess_address_data : bool , excess_data : bool ) {
19751999 let secp_ctx = Secp256k1 :: new ( ) ;
19762000 let ( privkey_1, pubkey_1) = get_keys_from ! ( "0101010101010101010101010101010101010101010101010101010101010101" , secp_ctx) ;
19772001 let sig_1 = get_sig_on ! ( privkey_1, secp_ctx, String :: from( "01010101010101010101010101010101" ) ) ;
@@ -2007,6 +2031,12 @@ mod tests {
20072031 port : 9735
20082032 } ) ;
20092033 }
2034+ if hostname {
2035+ addresses. push ( msgs:: NetAddress :: Hostname {
2036+ hostname : Hostname :: try_from ( String :: from ( "host" ) ) . unwrap ( ) ,
2037+ port : 9735 ,
2038+ } ) ;
2039+ }
20102040 let mut addr_len = 0 ;
20112041 for addr in & addresses {
20122042 addr_len += addr. len ( ) + 1 ;
@@ -2047,6 +2077,9 @@ mod tests {
20472077 if onionv3 {
20482078 target_value. append ( & mut hex:: decode ( "04fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0efeeedecebeae9e8e7e6e5e4e3e2e1e00020102607" ) . unwrap ( ) ) ;
20492079 }
2080+ if hostname {
2081+ target_value. append ( & mut hex:: decode ( "0504686f73742607" ) . unwrap ( ) ) ;
2082+ }
20502083 if excess_address_data {
20512084 target_value. append ( & mut hex:: decode ( "216c280b5395a2546e7e4b2663e04f811622f15a4f92e83aa2e92ba2a573c139142c54ae63072a1ec1ee7dc0c04bde5c847806172aa05c92c22ae8e308d1d269" ) . unwrap ( ) ) ;
20522085 }
@@ -2058,15 +2091,16 @@ mod tests {
20582091
20592092 #[ test]
20602093 fn encoding_node_announcement ( ) {
2061- do_encoding_node_announcement ( true , true , true , true , true , true , true ) ;
2062- do_encoding_node_announcement ( false , false , false , false , false , false , false ) ;
2063- do_encoding_node_announcement ( false , true , false , false , false , false , false ) ;
2064- do_encoding_node_announcement ( false , false , true , false , false , false , false ) ;
2065- do_encoding_node_announcement ( false , false , false , true , false , false , false ) ;
2066- do_encoding_node_announcement ( false , false , false , false , true , false , false ) ;
2067- do_encoding_node_announcement ( false , false , false , false , false , true , false ) ;
2068- do_encoding_node_announcement ( false , true , false , true , false , true , false ) ;
2069- do_encoding_node_announcement ( false , false , true , false , true , false , false ) ;
2094+ do_encoding_node_announcement ( true , true , true , true , true , true , true , true ) ;
2095+ do_encoding_node_announcement ( false , false , false , false , false , false , false , false ) ;
2096+ do_encoding_node_announcement ( false , true , false , false , false , false , false , false ) ;
2097+ do_encoding_node_announcement ( false , false , true , false , false , false , false , false ) ;
2098+ do_encoding_node_announcement ( false , false , false , true , false , false , false , false ) ;
2099+ do_encoding_node_announcement ( false , false , false , false , true , false , false , false ) ;
2100+ do_encoding_node_announcement ( false , false , false , false , false , true , false , false ) ;
2101+ do_encoding_node_announcement ( false , false , false , false , false , false , true , false ) ;
2102+ do_encoding_node_announcement ( false , true , false , true , false , false , true , false ) ;
2103+ do_encoding_node_announcement ( false , false , true , false , true , false , false , false ) ;
20702104 }
20712105
20722106 fn do_encoding_channel_update ( direction : bool , disable : bool , htlc_maximum_msat : bool , excess_data : bool ) {
0 commit comments