@@ -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 , ShortAsciiString } ;
4444
4545use ln:: { PaymentPreimage , PaymentHash , PaymentSecret } ;
4646
@@ -442,6 +442,14 @@ pub enum NetAddress {
442442 /// The port on which the node is listening
443443 port : u16 ,
444444 } ,
445+ /// A DNS hostname/port on which the peer is listening.
446+ DNSHostname {
447+ /// The hostname as an ASCII string with a variable length below or equal to 255.
448+ /// Can be a Punycode encoding.
449+ hostname : ShortAsciiString ,
450+ /// The port on which the node is listening.
451+ port : u16 ,
452+ } ,
445453}
446454impl NetAddress {
447455 /// Gets the ID of this address type. Addresses in node_announcement messages should be sorted
@@ -452,6 +460,7 @@ impl NetAddress {
452460 & NetAddress :: IPv6 { ..} => { 2 } ,
453461 & NetAddress :: OnionV2 ( _) => { 3 } ,
454462 & NetAddress :: OnionV3 { ..} => { 4 } ,
463+ & NetAddress :: DNSHostname { ..} => { 5 } ,
455464 }
456465 }
457466
@@ -462,11 +471,12 @@ impl NetAddress {
462471 & NetAddress :: IPv6 { .. } => { 18 } ,
463472 & NetAddress :: OnionV2 ( _) => { 12 } ,
464473 & NetAddress :: OnionV3 { .. } => { 37 } ,
474+ & NetAddress :: DNSHostname { ref hostname, .. } => { u16:: from ( hostname. len ( ) ) + 3 } ,
465475 }
466476 }
467477
468478 /// The maximum length of any address descriptor, not including the 1-byte type
469- pub ( crate ) const MAX_LEN : u16 = 37 ;
479+ pub ( crate ) const MAX_LEN : u16 = u8 :: MAX as u16 + 3 ;
470480}
471481
472482impl Writeable for NetAddress {
@@ -492,7 +502,12 @@ impl Writeable for NetAddress {
492502 checksum. write ( writer) ?;
493503 version. write ( writer) ?;
494504 port. write ( writer) ?;
495- }
505+ } ,
506+ & NetAddress :: DNSHostname { ref hostname, ref port } => {
507+ 5u8 . write ( writer) ?;
508+ hostname. write ( writer) ?;
509+ port. write ( writer) ?;
510+ } ,
496511 }
497512 Ok ( ( ) )
498513 }
@@ -523,6 +538,12 @@ impl Readable for Result<NetAddress, u8> {
523538 port : Readable :: read ( reader) ?,
524539 } ) )
525540 } ,
541+ 5 => {
542+ Ok ( Ok ( NetAddress :: DNSHostname {
543+ hostname : Readable :: read ( reader) ?,
544+ port : Readable :: read ( reader) ?,
545+ } ) )
546+ } ,
526547 _ => return Ok ( Err ( byte) ) ,
527548 }
528549 }
@@ -1829,7 +1850,7 @@ mod tests {
18291850 use ln:: features:: { ChannelFeatures , ChannelTypeFeatures , InitFeatures , NodeFeatures } ;
18301851 use ln:: msgs;
18311852 use ln:: msgs:: { FinalOnionHopData , OptionalField , OnionErrorPacket , OnionHopDataFormat } ;
1832- use util:: ser:: { Writeable , Readable } ;
1853+ use util:: ser:: { Writeable , Readable , ShortAsciiString } ;
18331854
18341855 use bitcoin:: hashes:: hex:: FromHex ;
18351856 use bitcoin:: util:: address:: Address ;
@@ -1843,6 +1864,7 @@ mod tests {
18431864
18441865 use io:: Cursor ;
18451866 use prelude:: * ;
1867+ use std:: convert:: TryFrom ;
18461868
18471869 #[ test]
18481870 fn encoding_channel_reestablish_no_secret ( ) {
@@ -1971,7 +1993,7 @@ mod tests {
19711993 do_encoding_channel_announcement ( true , true ) ;
19721994 }
19731995
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 ) {
1996+ fn do_encoding_node_announcement ( unknown_features_bits : bool , ipv4 : bool , ipv6 : bool , onionv2 : bool , onionv3 : bool , dns_hostname : bool , excess_address_data : bool , excess_data : bool ) {
19751997 let secp_ctx = Secp256k1 :: new ( ) ;
19761998 let ( privkey_1, pubkey_1) = get_keys_from ! ( "0101010101010101010101010101010101010101010101010101010101010101" , secp_ctx) ;
19771999 let sig_1 = get_sig_on ! ( privkey_1, secp_ctx, String :: from( "01010101010101010101010101010101" ) ) ;
@@ -2007,6 +2029,12 @@ mod tests {
20072029 port : 9735
20082030 } ) ;
20092031 }
2032+ if dns_hostname {
2033+ addresses. push ( msgs:: NetAddress :: DNSHostname {
2034+ hostname : ShortAsciiString :: try_from ( "host" ) . unwrap ( ) ,
2035+ port : 9735 ,
2036+ } ) ;
2037+ }
20102038 let mut addr_len = 0 ;
20112039 for addr in & addresses {
20122040 addr_len += addr. len ( ) + 1 ;
@@ -2047,6 +2075,9 @@ mod tests {
20472075 if onionv3 {
20482076 target_value. append ( & mut hex:: decode ( "04fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0efeeedecebeae9e8e7e6e5e4e3e2e1e00020102607" ) . unwrap ( ) ) ;
20492077 }
2078+ if dns_hostname {
2079+ target_value. append ( & mut hex:: decode ( "0504686f73742607" ) . unwrap ( ) ) ;
2080+ }
20502081 if excess_address_data {
20512082 target_value. append ( & mut hex:: decode ( "216c280b5395a2546e7e4b2663e04f811622f15a4f92e83aa2e92ba2a573c139142c54ae63072a1ec1ee7dc0c04bde5c847806172aa05c92c22ae8e308d1d269" ) . unwrap ( ) ) ;
20522083 }
@@ -2058,15 +2089,16 @@ mod tests {
20582089
20592090 #[ test]
20602091 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 ) ;
2092+ do_encoding_node_announcement ( true , true , true , true , true , true , true , true ) ;
2093+ do_encoding_node_announcement ( false , false , false , false , false , false , false , false ) ;
2094+ do_encoding_node_announcement ( false , true , false , false , false , false , false , false ) ;
2095+ do_encoding_node_announcement ( false , false , true , false , false , false , false , false ) ;
2096+ do_encoding_node_announcement ( false , false , false , true , false , false , false , false ) ;
2097+ do_encoding_node_announcement ( false , false , false , false , true , false , false , false ) ;
2098+ do_encoding_node_announcement ( false , false , false , false , false , true , false , false ) ;
2099+ do_encoding_node_announcement ( false , false , false , false , false , false , true , false ) ;
2100+ do_encoding_node_announcement ( false , true , false , true , false , false , true , false ) ;
2101+ do_encoding_node_announcement ( false , false , true , false , true , false , false , false ) ;
20702102 }
20712103
20722104 fn do_encoding_channel_update ( direction : bool , disable : bool , htlc_maximum_msat : bool , excess_data : bool ) {
0 commit comments