Skip to content

Commit 0c9cba6

Browse files
committed
Use 6th bit for reminders.
1 parent ab5ef44 commit 0c9cba6

File tree

1 file changed

+45
-41
lines changed

1 file changed

+45
-41
lines changed

lightning-rapid-gossip-sync/src/processing.rs

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use lightning::routing::gossip::{NetworkGraph, NodeAlias, NodeId};
1010
use lightning::util::logger::Logger;
1111
use lightning::{log_debug, log_warn, log_trace, log_given_level, log_gossip};
1212
use lightning::util::ser::{BigSize, FixedLengthReader, Readable};
13-
use lightning::{io, io::Read};
13+
use lightning::io;
1414

1515
use crate::{GraphSyncError, RapidGossipSync};
1616

@@ -121,7 +121,8 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
121121
/*
122122
We encode additional information in the pubkey parity byte with the following mapping:
123123
124-
7-6: expect extra data after the pubkey (01 => u8, 10 => u16, 11 => u32)
124+
7: expect extra data after the pubkey
125+
6: use this as a reminder without altering anything
125126
5-3: index of new features among default (1-6). If index is 7 (all 3 bits are set, it's
126127
outside the present default range). 0 means no feature changes.
127128
2: addresses have changed
@@ -133,7 +134,8 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
133134

134135
let has_address_details = (node_detail_flag & (1 << 2)) > 0;
135136
let feature_detail_marker = (node_detail_flag & (0b111 << 3)) >> 3;
136-
let additional_data_marker = (node_detail_flag & (0b11 << 6)) >> 6;
137+
let is_reminder = (node_detail_flag & (1 << 6)) > 0;
138+
let has_additional_data = (node_detail_flag & (1 << 7)) > 0;
137139

138140
// extract the relevant bits for pubkey parity
139141
let key_parity = node_detail_flag & 0b_0000_0011;
@@ -143,7 +145,7 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
143145
let current_node_id = NodeId::from_pubkey(&current_pubkey);
144146
node_ids.push(current_pubkey);
145147

146-
if has_address_details || feature_detail_marker > 0 {
148+
if is_reminder || has_address_details || feature_detail_marker > 0 {
147149
let mut synthetic_node_announcement = UnsignedNodeAnnouncement {
148150
features: NodeFeatures::empty(),
149151
timestamp: backdated_timestamp,
@@ -205,25 +207,9 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
205207
node_modifications.push(synthetic_node_announcement);
206208
}
207209

208-
if additional_data_marker > 0 {
209-
let additional_byte_count: u64 = match additional_data_marker {
210-
1 => {
211-
u8::read(read_cursor)? as u64
212-
}
213-
2 => {
214-
u16::read(read_cursor)? as u64
215-
}
216-
3 => {
217-
u32::read(read_cursor)? as u64
218-
}
219-
_ => {
220-
return Err(DecodeError::BadLengthDescriptor.into());
221-
}
222-
};
223-
224-
let mut additional_data_reader = FixedLengthReader::new(&mut read_cursor, additional_byte_count);
225-
let mut additional_data = Vec::new();
226-
additional_data_reader.read_to_end(&mut additional_data)?;
210+
if has_additional_data {
211+
let additional_data: Vec<u8> = Readable::read(read_cursor)?;
212+
log_gossip!(self.logger, "Ignoring {} bytes of additional data in node announcement", additional_data.len());
227213
}
228214
}
229215
} else {
@@ -277,7 +263,8 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
277263

278264
if version >= 2 && has_additional_data {
279265
// forwards compatibility
280-
let _additional_data: Vec<u8> = Readable::read(read_cursor)?;
266+
let additional_data: Vec<u8> = Readable::read(read_cursor)?;
267+
log_gossip!(self.logger, "Ignoring {} bytes of additional data in channel announcement", additional_data.len());
281268
}
282269
}
283270

@@ -329,7 +316,8 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
329316

330317
if scid_delta.0 == 0 && is_same_direction_update {
331318
// this is additional data for forwards compatibility
332-
let _additional_data: Vec<u8> = Readable::read(read_cursor)?;
319+
let additional_data: Vec<u8> = Readable::read(read_cursor)?;
320+
log_gossip!(self.logger, "Ignoring {} bytes of additional data in channel update", additional_data.len());
333321
continue;
334322
}
335323
}
@@ -561,19 +549,20 @@ mod tests {
561549

562550
#[test]
563551
fn update_ignores_v2_additional_data() {
564-
let logger = TestLogger::new();
552+
let mut logger = TestLogger::new();
553+
logger.enable(Level::Gossip);
565554
let network_graph = NetworkGraph::new(Network::Bitcoin, &logger);
566555
let rapid_sync = RapidGossipSync::new(&network_graph, &logger);
567556

568557
let example_input = vec![
569558
76, 68, 75, 2, 111, 226, 140, 10, 182, 241, 179, 114, 193, 166, 162, 70, 174, 99, 247,
570-
79, 147, 30, 131, 101, 225, 90, 8, 156, 104, 214, 25, 0, 0, 0, 0, 0, 102, 105, 15, 48,
571-
0, 0, 0, 0, 2, 127, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5,
572-
101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, 5, 14, 5,
573-
10, 103, 111, 111, 103, 108, 101, 46, 99, 111, 109, 1, 187, 38, 4, 1, 1, 1, 1, 1, 1, 1,
574-
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 3, 0,
575-
4, 19, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 57, 7, 1, 127, 0, 0, 1, 37,
576-
163, 13, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 2, 23, 48, 255, 0, 0, 0, 0, 0, 0,
559+
79, 147, 30, 131, 101, 225, 90, 8, 156, 104, 214, 25, 0, 0, 0, 0, 0, 102, 106, 12, 80,
560+
1, 0, 2, 23, 48, 0, 0, 0, 3, 143, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213,
561+
170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143,
562+
5, 38, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
563+
1, 1, 1, 1, 1, 1, 0, 2, 3, 0, 4, 19, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
564+
5, 57, 13, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 7, 1, 127, 0, 0, 1, 37, 163, 14, 5,
565+
10, 103, 111, 111, 103, 108, 101, 46, 99, 111, 109, 1, 187, 0, 255, 0, 0, 0, 0, 0, 0, 0,
577566
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
578567
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
579568
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -582,9 +571,9 @@ mod tests {
582571
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
583572
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
584573
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
585-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 77, 75, 108, 209, 54, 16, 50,
586-
202, 155, 210, 174, 185, 217, 0, 170, 77, 69, 217, 234, 216, 10, 201, 66, 51, 116, 196,
587-
81, 167, 37, 77, 7, 102, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
574+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 77, 75, 108, 209, 54, 16, 50, 202,
575+
155, 210, 174, 185, 217, 0, 170, 77, 69, 217, 234, 216, 10, 201, 66, 51, 116, 196, 81,
576+
167, 37, 77, 7, 102, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
588577
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
589578
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
590579
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -593,21 +582,36 @@ mod tests {
593582
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
594583
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
595584
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
596-
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 255, 128, 0, 0, 0, 0, 0, 0, 1, 0, 147, 23, 23, 23,
585+
0, 0, 0, 186, 83, 31, 230, 6, 129, 52, 80, 61, 39, 35, 19, 50, 39, 200, 103, 172, 143,
586+
166, 200, 60, 83, 126, 154, 68, 195, 197, 189, 189, 203, 31, 227, 55, 0, 2, 22, 49, 0,
587+
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
588+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
589+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
590+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
591+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
592+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
593+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
594+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
595+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
596+
0, 0, 1, 0, 255, 128, 0, 0, 0, 0, 0, 0, 1, 0, 147, 23, 23, 23, 23, 23, 23, 23, 23, 23,
597597
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
598598
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
599599
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
600600
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
601601
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
602602
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
603-
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
604-
0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 17, 42, 42, 42, 42,
605-
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 1, 0, 1, 0, 17, 42, 42, 42, 42,
606-
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42
603+
23, 23, 23, 23, 23, 23, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
604+
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 17, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
605+
42, 42, 42, 42, 42, 42, 42, 0, 1, 0, 1, 0, 17, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
606+
42, 42, 42, 42, 42, 42, 42
607607
];
608608

609609
let update_result = rapid_sync.update_network_graph_no_std(&example_input[..], None);
610610
assert!(update_result.is_ok());
611+
612+
logger.assert_log_contains("lightning_rapid_gossip_sync::processing", "Ignoring 255 bytes of additional data in node announcement", 3);
613+
logger.assert_log_contains("lightning_rapid_gossip_sync::processing", "Ignoring 147 bytes of additional data in channel announcement", 1);
614+
logger.assert_log_contains("lightning_rapid_gossip_sync::processing", "Ignoring 17 bytes of additional data in channel update", 1);
611615
}
612616

613617
#[test]

0 commit comments

Comments
 (0)