@@ -37,12 +37,9 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
3737 let mut prefix = [ 0u8 ; 4 ] ;
3838 read_cursor. read_exact ( & mut prefix) ?;
3939
40- match prefix {
41- GOSSIP_PREFIX => { }
42- _ => {
43- return Err ( DecodeError :: UnknownVersion . into ( ) ) ;
44- }
45- } ;
40+ if prefix != GOSSIP_PREFIX {
41+ return Err ( DecodeError :: UnknownVersion . into ( ) ) ;
42+ }
4643
4744 let chain_hash: BlockHash = Readable :: read ( read_cursor) ?;
4845 let latest_seen_timestamp: u32 = Readable :: read ( read_cursor) ?;
@@ -75,6 +72,7 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
7572
7673 let node_id_1_index: BigSize = Readable :: read ( read_cursor) ?;
7774 let node_id_2_index: BigSize = Readable :: read ( read_cursor) ?;
75+
7876 if max ( node_id_1_index. 0 , node_id_2_index. 0 ) >= node_id_count as u64 {
7977 return Err ( DecodeError :: InvalidValue . into ( ) ) ;
8078 } ;
@@ -123,49 +121,43 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
123121 // flags are always sent in full, and hence always need updating
124122 let standard_channel_flags = channel_flags & 0b_0000_0011 ;
125123
126- let mut synthetic_update = if channel_flags & 0b_1000_0000 == 0 {
127- // full update, field flags will indicate deviations from the default
128- UnsignedChannelUpdate {
129- chain_hash,
130- short_channel_id,
131- timestamp : backdated_timestamp,
132- flags : standard_channel_flags,
133- cltv_expiry_delta : default_cltv_expiry_delta,
134- htlc_minimum_msat : default_htlc_minimum_msat,
135- htlc_maximum_msat : default_htlc_maximum_msat,
136- fee_base_msat : default_fee_base_msat,
137- fee_proportional_millionths : default_fee_proportional_millionths,
138- excess_data : Vec :: new ( ) ,
139- }
140- } else {
124+ let mut synthetic_update = UnsignedChannelUpdate {
125+ chain_hash,
126+ short_channel_id,
127+ timestamp : backdated_timestamp,
128+ flags : standard_channel_flags,
129+ cltv_expiry_delta : default_cltv_expiry_delta,
130+ htlc_minimum_msat : default_htlc_minimum_msat,
131+ htlc_maximum_msat : default_htlc_maximum_msat,
132+ fee_base_msat : default_fee_base_msat,
133+ fee_proportional_millionths : default_fee_proportional_millionths,
134+ excess_data : Vec :: new ( ) ,
135+ } ;
136+
137+ let mut skip_update_for_unknown_channel = false ;
138+
139+ if ( channel_flags & 0b_1000_0000 ) != 0 {
141140 // incremental update, field flags will indicate mutated values
142141 let read_only_network_graph = network_graph. read_only ( ) ;
143- let channel = read_only_network_graph
142+ if let Some ( channel) = read_only_network_graph
144143 . channels ( )
145- . get ( & short_channel_id)
146- . ok_or ( LightningError {
147- err : "Couldn't find channel for update" . to_owned ( ) ,
148- action : ErrorAction :: IgnoreError ,
149- } ) ?;
150-
151- let directional_info = channel
152- . get_directional_info ( channel_flags)
153- . ok_or ( LightningError {
154- err : "Couldn't find previous directional data for update" . to_owned ( ) ,
155- action : ErrorAction :: IgnoreError ,
156- } ) ?;
157-
158- UnsignedChannelUpdate {
159- chain_hash,
160- short_channel_id,
161- timestamp : backdated_timestamp,
162- flags : standard_channel_flags,
163- cltv_expiry_delta : directional_info. cltv_expiry_delta ,
164- htlc_minimum_msat : directional_info. htlc_minimum_msat ,
165- htlc_maximum_msat : directional_info. htlc_maximum_msat ,
166- fee_base_msat : directional_info. fees . base_msat ,
167- fee_proportional_millionths : directional_info. fees . proportional_millionths ,
168- excess_data : Vec :: new ( ) ,
144+ . get ( & short_channel_id) {
145+
146+ let directional_info = channel
147+ . get_directional_info ( channel_flags)
148+ . ok_or ( LightningError {
149+ err : "Couldn't find previous directional data for update" . to_owned ( ) ,
150+ action : ErrorAction :: IgnoreError ,
151+ } ) ?;
152+
153+ synthetic_update. cltv_expiry_delta = directional_info. cltv_expiry_delta ;
154+ synthetic_update. htlc_minimum_msat = directional_info. htlc_minimum_msat ;
155+ synthetic_update. htlc_maximum_msat = directional_info. htlc_maximum_msat ;
156+ synthetic_update. fee_base_msat = directional_info. fees . base_msat ;
157+ synthetic_update. fee_proportional_millionths = directional_info. fees . proportional_millionths ;
158+
159+ } else {
160+ skip_update_for_unknown_channel = true ;
169161 }
170162 } ;
171163
@@ -194,6 +186,10 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
194186 synthetic_update. htlc_maximum_msat = htlc_maximum_msat;
195187 }
196188
189+ if skip_update_for_unknown_channel {
190+ continue ;
191+ }
192+
197193 match network_graph. update_channel_unsigned ( & synthetic_update) {
198194 Ok ( _) => { } ,
199195 Err ( LightningError { action : ErrorAction :: IgnoreDuplicateGossip , .. } ) => { } ,
@@ -254,7 +250,7 @@ mod tests {
254250 }
255251
256252 #[ test]
257- fn incremental_only_update_fails_without_prior_announcements ( ) {
253+ fn incremental_only_update_ignores_missing_channel ( ) {
258254 let incremental_update_input = vec ! [
259255 76 , 68 , 75 , 1 , 111 , 226 , 140 , 10 , 182 , 241 , 179 , 114 , 193 , 166 , 162 , 70 , 174 , 99 , 247 ,
260256 79 , 147 , 30 , 131 , 101 , 225 , 90 , 8 , 156 , 104 , 214 , 25 , 0 , 0 , 0 , 0 , 0 , 97 , 229 , 183 , 167 ,
@@ -271,12 +267,7 @@ mod tests {
271267
272268 let rapid_sync = RapidGossipSync :: new ( & network_graph) ;
273269 let update_result = rapid_sync. update_network_graph ( & incremental_update_input[ ..] ) ;
274- assert ! ( update_result. is_err( ) ) ;
275- if let Err ( GraphSyncError :: LightningError ( lightning_error) ) = update_result {
276- assert_eq ! ( lightning_error. err, "Couldn't find channel for update" ) ;
277- } else {
278- panic ! ( "Unexpected update result: {:?}" , update_result)
279- }
270+ assert ! ( update_result. is_ok( ) ) ;
280271 }
281272
282273 #[ test]
@@ -534,4 +525,39 @@ mod tests {
534525 assert ! ( after. contains( "619737530008010752" ) ) ;
535526 assert ! ( after. contains( "783241506229452801" ) ) ;
536527 }
528+
529+ #[ test]
530+ pub fn update_fails_with_unknown_version ( ) {
531+ let unknown_version_input = vec ! [
532+ 76 , 68 , 75 , 2 , 111 , 226 , 140 , 10 , 182 , 241 , 179 , 114 , 193 , 166 , 162 , 70 , 174 , 99 , 247 ,
533+ 79 , 147 , 30 , 131 , 101 , 225 , 90 , 8 , 156 , 104 , 214 , 25 , 0 , 0 , 0 , 0 , 0 , 97 , 227 , 98 , 218 ,
534+ 0 , 0 , 0 , 4 , 2 , 22 , 7 , 207 , 206 , 25 , 164 , 197 , 231 , 230 , 231 , 56 , 102 , 61 , 250 , 251 ,
535+ 187 , 172 , 38 , 46 , 79 , 247 , 108 , 44 , 155 , 48 , 219 , 238 , 252 , 53 , 192 , 6 , 67 , 2 , 36 , 125 ,
536+ 157 , 176 , 223 , 175 , 234 , 116 , 94 , 248 , 201 , 225 , 97 , 235 , 50 , 47 , 115 , 172 , 63 , 136 ,
537+ 88 , 216 , 115 , 11 , 111 , 217 , 114 , 84 , 116 , 124 , 231 , 107 , 2 , 158 , 1 , 242 , 121 , 152 , 106 ,
538+ 204 , 131 , 186 , 35 , 93 , 70 , 216 , 10 , 237 , 224 , 183 , 89 , 95 , 65 , 3 , 83 , 185 , 58 , 138 ,
539+ 181 , 64 , 187 , 103 , 127 , 68 , 50 , 2 , 201 , 19 , 17 , 138 , 136 , 149 , 185 , 226 , 156 , 137 , 175 ,
540+ 110 , 32 , 237 , 0 , 217 , 90 , 31 , 100 , 228 , 149 , 46 , 219 , 175 , 168 , 77 , 4 , 143 , 38 , 128 ,
541+ 76 , 97 , 0 , 0 , 0 , 2 , 0 , 0 , 255 , 8 , 153 , 192 , 0 , 2 , 27 , 0 , 0 , 0 , 1 , 0 , 0 , 255 , 2 , 68 ,
542+ 226 , 0 , 6 , 11 , 0 , 1 , 2 , 3 , 0 , 0 , 0 , 4 , 0 , 40 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 232 , 0 , 0 , 3 , 232 ,
543+ 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 29 , 129 , 25 , 192 , 255 , 8 , 153 , 192 , 0 , 2 , 27 , 0 , 0 , 60 , 0 , 0 ,
544+ 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 100 , 0 , 0 , 2 , 224 , 0 , 0 , 0 , 0 , 58 , 85 , 116 , 216 , 0 , 29 , 0 ,
545+ 0 , 0 , 1 , 0 , 0 , 0 , 125 , 0 , 0 , 0 , 0 , 58 , 85 , 116 , 216 , 255 , 2 , 68 , 226 , 0 , 6 , 11 , 0 , 1 ,
546+ 0 , 0 , 1 ,
547+ ] ;
548+
549+ let block_hash = genesis_block ( Network :: Bitcoin ) . block_hash ( ) ;
550+ let logger = TestLogger :: new ( ) ;
551+ let network_graph = NetworkGraph :: new ( block_hash, & logger) ;
552+ let rapid_sync = RapidGossipSync :: new ( & network_graph) ;
553+ let update_result = rapid_sync. update_network_graph ( & unknown_version_input[ ..] ) ;
554+
555+ assert ! ( update_result. is_err( ) ) ;
556+
557+ if let Err ( GraphSyncError :: DecodeError ( DecodeError :: UnknownVersion ) ) = update_result {
558+ // this is the expected error type
559+ } else {
560+ panic ! ( "Unexpected update result: {:?}" , update_result)
561+ }
562+ }
537563}
0 commit comments