projects
/
rust-lightning
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Expose `parse_onion_address` publicly in `no-std`
[rust-lightning]
/
lightning
/
src
/
routing
/
gossip.rs
diff --git
a/lightning/src/routing/gossip.rs
b/lightning/src/routing/gossip.rs
index 90b7bb0eddc6b00977f7c087f1935ab42d636e85..ef776a44dc11c484526f7f5baeb64db06498710b 100644
(file)
--- a/
lightning/src/routing/gossip.rs
+++ b/
lightning/src/routing/gossip.rs
@@
-23,8
+23,9
@@
use bitcoin::network::constants::Network;
use bitcoin::blockdata::constants::genesis_block;
use crate::events::{MessageSendEvent, MessageSendEventsProvider};
use bitcoin::blockdata::constants::genesis_block;
use crate::events::{MessageSendEvent, MessageSendEventsProvider};
+use crate::ln::ChannelId;
use crate::ln::features::{ChannelFeatures, NodeFeatures, InitFeatures};
use crate::ln::features::{ChannelFeatures, NodeFeatures, InitFeatures};
-use crate::ln::msgs::{DecodeError, ErrorAction, Init, LightningError, RoutingMessageHandler,
N
etAddress, MAX_VALUE_MSAT};
+use crate::ln::msgs::{DecodeError, ErrorAction, Init, LightningError, RoutingMessageHandler,
Sock
etAddress, MAX_VALUE_MSAT};
use crate::ln::msgs::{ChannelAnnouncement, ChannelUpdate, NodeAnnouncement, GossipTimestampFilter};
use crate::ln::msgs::{QueryChannelRange, ReplyChannelRange, QueryShortChannelIds, ReplyShortChannelIdsEnd};
use crate::ln::msgs;
use crate::ln::msgs::{ChannelAnnouncement, ChannelUpdate, NodeAnnouncement, GossipTimestampFilter};
use crate::ln::msgs::{QueryChannelRange, ReplyChannelRange, QueryShortChannelIds, ReplyShortChannelIdsEnd};
use crate::ln::msgs;
@@
-88,12
+89,12
@@
impl NodeId {
impl fmt::Debug for NodeId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
impl fmt::Debug for NodeId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "NodeId({})",
log_bytes!(
self.0))
+ write!(f, "NodeId({})",
crate::util::logger::DebugBytes(&
self.0))
}
}
impl fmt::Display for NodeId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
}
}
impl fmt::Display for NodeId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-
write!(f, "{}", log_bytes!(self.0)
)
+
crate::util::logger::DebugBytes(&self.0).fmt(f
)
}
}
}
}
@@
-382,7
+383,7
@@
macro_rules! secp_verify_sig {
err: format!("Invalid signature on {} message", $msg_type),
action: ErrorAction::SendWarningMessage {
msg: msgs::WarningMessage {
err: format!("Invalid signature on {} message", $msg_type),
action: ErrorAction::SendWarningMessage {
msg: msgs::WarningMessage {
- channel_id:
[0; 32]
,
+ channel_id:
ChannelId::new_zero()
,
data: format!("Invalid signature on {} message", $msg_type),
},
log_level: Level::Trace,
data: format!("Invalid signature on {} message", $msg_type),
},
log_level: Level::Trace,
@@
-400,7
+401,7
@@
macro_rules! get_pubkey_from_node_id {
err: format!("Invalid public key on {} message", $msg_type),
action: ErrorAction::SendWarningMessage {
msg: msgs::WarningMessage {
err: format!("Invalid public key on {} message", $msg_type),
action: ErrorAction::SendWarningMessage {
msg: msgs::WarningMessage {
- channel_id:
[0; 32]
,
+ channel_id:
ChannelId::new_zero()
,
data: format!("Invalid public key on {} message", $msg_type),
},
log_level: Level::Trace
data: format!("Invalid public key on {} message", $msg_type),
},
log_level: Level::Trace
@@
-899,7
+900,7
@@
impl ChannelInfo {
impl fmt::Display for ChannelInfo {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
write!(f, "features: {}, node_one: {}, one_to_two: {:?}, node_two: {}, two_to_one: {:?}",
impl fmt::Display for ChannelInfo {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
write!(f, "features: {}, node_one: {}, one_to_two: {:?}, node_two: {}, two_to_one: {:?}",
- log_bytes!(self.features.encode()),
log_bytes!(self.node_one.as_slice()), self.one_to_two, log_bytes!(self.node_two.as_slice())
, self.two_to_one)?;
+ log_bytes!(self.features.encode()),
&self.node_one, self.one_to_two, &self.node_two
, self.two_to_one)?;
Ok(())
}
}
Ok(())
}
}
@@
-1127,7
+1128,7
@@
pub struct NodeAnnouncementInfo {
impl NodeAnnouncementInfo {
/// Internet-level addresses via which one can connect to the node
impl NodeAnnouncementInfo {
/// Internet-level addresses via which one can connect to the node
- pub fn addresses(&self) -> &[
N
etAddress] {
+ pub fn addresses(&self) -> &[
Sock
etAddress] {
self.announcement_message.as_ref()
.map(|msg| msg.contents.addresses.as_slice())
.unwrap_or_default()
self.announcement_message.as_ref()
.map(|msg| msg.contents.addresses.as_slice())
.unwrap_or_default()
@@
-1136,7
+1137,7
@@
impl NodeAnnouncementInfo {
impl Writeable for NodeAnnouncementInfo {
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
impl Writeable for NodeAnnouncementInfo {
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
- let empty_addresses = Vec::<
N
etAddress>::new();
+ let empty_addresses = Vec::<
Sock
etAddress>::new();
write_tlv_fields!(writer, {
(0, self.features, required),
(2, self.last_update, required),
write_tlv_fields!(writer, {
(0, self.features, required),
(2, self.last_update, required),
@@
-1151,7
+1152,7
@@
impl Writeable for NodeAnnouncementInfo {
impl Readable for NodeAnnouncementInfo {
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
impl Readable for NodeAnnouncementInfo {
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
- _init_and_read_tlv_fields!(reader, {
+ _init_and_read_
len_prefixed_
tlv_fields!(reader, {
(0, features, required),
(2, last_update, required),
(4, rgb, required),
(0, features, required),
(2, last_update, required),
(4, rgb, required),
@@
-1159,7
+1160,7
@@
impl Readable for NodeAnnouncementInfo {
(8, announcement_message, option),
(10, _addresses, optional_vec), // deprecated, not used anymore
});
(8, announcement_message, option),
(10, _addresses, optional_vec), // deprecated, not used anymore
});
- let _: Option<Vec<
N
etAddress>> = _addresses;
+ let _: Option<Vec<
Sock
etAddress>> = _addresses;
Ok(Self { features: features.0.unwrap(), last_update: last_update.0.unwrap(), rgb: rgb.0.unwrap(),
alias: alias.0.unwrap(), announcement_message })
}
Ok(Self { features: features.0.unwrap(), last_update: last_update.0.unwrap(), rgb: rgb.0.unwrap(),
alias: alias.0.unwrap(), announcement_message })
}
@@
-1235,7
+1236,7
@@
impl Writeable for NodeInfo {
}
// A wrapper allowing for the optional deserialization of `NodeAnnouncementInfo`. Utilizing this is
}
// A wrapper allowing for the optional deserialization of `NodeAnnouncementInfo`. Utilizing this is
-// necessary to maintain compatibility with previous serializations of `
N
etAddress` that have an
+// necessary to maintain compatibility with previous serializations of `
Sock
etAddress` that have an
// invalid hostname set. We ignore and eat all errors until we are either able to read a
// `NodeAnnouncementInfo` or hit a `ShortRead`, i.e., read the TLV field to the end.
struct NodeAnnouncementInfoDeserWrapper(NodeAnnouncementInfo);
// invalid hostname set. We ignore and eat all errors until we are either able to read a
// `NodeAnnouncementInfo` or hit a `ShortRead`, i.e., read the TLV field to the end.
struct NodeAnnouncementInfoDeserWrapper(NodeAnnouncementInfo);
@@
-1259,7
+1260,7
@@
impl Readable for NodeInfo {
// with zero inbound fees, causing that heuristic to provide little gain. Worse, because it
// requires additional complexity and lookups during routing, it ends up being a
// performance loss. Thus, we simply ignore the old field here and no longer track it.
// with zero inbound fees, causing that heuristic to provide little gain. Worse, because it
// requires additional complexity and lookups during routing, it ends up being a
// performance loss. Thus, we simply ignore the old field here and no longer track it.
- _init_and_read_tlv_fields!(reader, {
+ _init_and_read_
len_prefixed_
tlv_fields!(reader, {
(0, _lowest_inbound_channel_fees, option),
(2, announcement_info_wrap, upgradable_option),
(4, channels, required_vec),
(0, _lowest_inbound_channel_fees, option),
(2, announcement_info_wrap, upgradable_option),
(4, channels, required_vec),
@@
-1350,7
+1351,7
@@
impl<L: Deref> fmt::Display for NetworkGraph<L> where L::Target: Logger {
}
writeln!(f, "[Nodes]")?;
for (&node_id, val) in self.nodes.read().unwrap().unordered_iter() {
}
writeln!(f, "[Nodes]")?;
for (&node_id, val) in self.nodes.read().unwrap().unordered_iter() {
- writeln!(f, " {}: {}",
log_bytes!(node_id.as_slice())
, val)?;
+ writeln!(f, " {}: {}",
&node_id
, val)?;
}
Ok(())
}
}
Ok(())
}
@@
-1553,6
+1554,8
@@
impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
let node_id_a = channel_info.node_one.clone();
let node_id_b = channel_info.node_two.clone();
let node_id_a = channel_info.node_one.clone();
let node_id_b = channel_info.node_two.clone();
+ log_gossip!(self.logger, "Adding channel {} between nodes {} and {}", short_channel_id, node_id_a, node_id_b);
+
match channels.entry(short_channel_id) {
IndexedMapEntry::Occupied(mut entry) => {
//TODO: because asking the blockchain if short_channel_id is valid is only optional
match channels.entry(short_channel_id) {
IndexedMapEntry::Occupied(mut entry) => {
//TODO: because asking the blockchain if short_channel_id is valid is only optional
@@
-1788,16
+1791,23
@@
impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
let mut scids_to_remove = Vec::new();
for (scid, info) in channels.unordered_iter_mut() {
if info.one_to_two.is_some() && info.one_to_two.as_ref().unwrap().last_update < min_time_unix {
let mut scids_to_remove = Vec::new();
for (scid, info) in channels.unordered_iter_mut() {
if info.one_to_two.is_some() && info.one_to_two.as_ref().unwrap().last_update < min_time_unix {
+ log_gossip!(self.logger, "Removing directional update one_to_two (0) for channel {} due to its timestamp {} being below {}",
+ scid, info.one_to_two.as_ref().unwrap().last_update, min_time_unix);
info.one_to_two = None;
}
if info.two_to_one.is_some() && info.two_to_one.as_ref().unwrap().last_update < min_time_unix {
info.one_to_two = None;
}
if info.two_to_one.is_some() && info.two_to_one.as_ref().unwrap().last_update < min_time_unix {
+ log_gossip!(self.logger, "Removing directional update two_to_one (1) for channel {} due to its timestamp {} being below {}",
+ scid, info.two_to_one.as_ref().unwrap().last_update, min_time_unix);
info.two_to_one = None;
}
if info.one_to_two.is_none() || info.two_to_one.is_none() {
// We check the announcement_received_time here to ensure we don't drop
// announcements that we just received and are just waiting for our peer to send a
// channel_update for.
info.two_to_one = None;
}
if info.one_to_two.is_none() || info.two_to_one.is_none() {
// We check the announcement_received_time here to ensure we don't drop
// announcements that we just received and are just waiting for our peer to send a
// channel_update for.
- if info.announcement_received_time < min_time_unix as u64 {
+ let announcement_received_timestamp = info.announcement_received_time;
+ if announcement_received_timestamp < min_time_unix as u64 {
+ log_gossip!(self.logger, "Removing channel {} because both directional updates are missing and its announcement timestamp {} being below {}",
+ scid, announcement_received_timestamp, min_time_unix);
scids_to_remove.push(*scid);
}
}
scids_to_remove.push(*scid);
}
}
@@
-1878,6
+1888,8
@@
impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
}
}
}
}
+ log_gossip!(self.logger, "Updating channel {} in direction {} with timestamp {}", msg.short_channel_id, msg.flags & 1, msg.timestamp);
+
let mut channels = self.channels.write().unwrap();
match channels.get_mut(&msg.short_channel_id) {
None => {
let mut channels = self.channels.write().unwrap();
match channels.get_mut(&msg.short_channel_id) {
None => {
@@
-2027,7
+2039,7
@@
impl ReadOnlyNetworkGraph<'_> {
/// Get network addresses by node id.
/// Returns None if the requested node is completely unknown,
/// or if node announcement for the node was never received.
/// Get network addresses by node id.
/// Returns None if the requested node is completely unknown,
/// or if node announcement for the node was never received.
- pub fn get_addresses(&self, pubkey: &PublicKey) -> Option<Vec<
N
etAddress>> {
+ pub fn get_addresses(&self, pubkey: &PublicKey) -> Option<Vec<
Sock
etAddress>> {
self.nodes.get(&NodeId::from_pubkey(&pubkey))
.and_then(|node| node.announcement_info.as_ref().map(|ann| ann.addresses().to_vec()))
}
self.nodes.get(&NodeId::from_pubkey(&pubkey))
.and_then(|node| node.announcement_info.as_ref().map(|ann| ann.addresses().to_vec()))
}
@@
-3418,6
+3430,12
@@
pub(crate) mod tests {
// This serialized info has an address field but no announcement_message, therefore the addresses returned by our function will still be empty
assert!(ann_info_with_addresses.addresses().is_empty());
}
// This serialized info has an address field but no announcement_message, therefore the addresses returned by our function will still be empty
assert!(ann_info_with_addresses.addresses().is_empty());
}
+
+ #[test]
+ fn test_node_id_display() {
+ let node_id = NodeId([42; 33]);
+ assert_eq!(format!("{}", &node_id), "2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a");
+ }
}
#[cfg(ldk_bench)]
}
#[cfg(ldk_bench)]