crate::ix!();
impl NetAddr {
pub fn set_internal(&mut self, name: &str) -> bool {
trace!(target: "netaddr", "SetInternal invoked");
if name.is_empty() {
debug!(target: "netaddr", "SetInternal: empty name rejected");
return false;
}
*self.net_mut() = Network::NET_INTERNAL;
let digest_u256: u256 = bitcoin_hash::hash1(name.as_bytes());
let digest_bytes: &[u8; 32] = digest_u256.as_ref();
*self.addr_mut() = PreVector::from(&digest_bytes[..ADDR_INTERNAL_SIZE]);
debug!(target: "netaddr", "SetInternal: derived INTERNAL address from name hash");
true
}
}
#[cfg(test)]
mod internal_address_spec {
use super::*;
#[traced_test]
fn set_internal_works_and_is_deterministic() {
let mut a = NetAddr::default();
assert!(a.set_internal("dnsseed.example.org"));
assert!(a.is_internal());
assert_eq!(a.addr().len(), ADDR_INTERNAL_SIZE);
let mut b = NetAddr::default();
assert!(b.set_internal("dnsseed.example.org"));
assert_eq!(a.addr().as_slice(), b.addr().as_slice());
}
#[traced_test]
fn empty_name_is_rejected() {
let mut a = NetAddr::default();
assert!(!a.set_internal(""));
}
}