@@ -72,6 +72,7 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
7272
7373			let  node_id_1_index:  BigSize  = Readable :: read ( read_cursor) ?; 
7474			let  node_id_2_index:  BigSize  = Readable :: read ( read_cursor) ?; 
75+ 
7576			if  max ( node_id_1_index. 0 ,  node_id_2_index. 0 )  >= node_id_count as  u64  { 
7677				return  Err ( DecodeError :: InvalidValue . into ( ) ) ; 
7778			} ; 
@@ -120,49 +121,43 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
120121			// flags are always sent in full, and hence always need updating 
121122			let  standard_channel_flags = channel_flags &  0b_0000_0011 ; 
122123
123- 			let  mut  synthetic_update = if  channel_flags &  0b_1000_0000  == 0  { 
124- 				// full update, field flags will indicate deviations from the default 
125- 				UnsignedChannelUpdate  { 
126- 					chain_hash, 
127- 					short_channel_id, 
128- 					timestamp :  backdated_timestamp, 
129- 					flags :  standard_channel_flags, 
130- 					cltv_expiry_delta :  default_cltv_expiry_delta, 
131- 					htlc_minimum_msat :  default_htlc_minimum_msat, 
132- 					htlc_maximum_msat :  default_htlc_maximum_msat, 
133- 					fee_base_msat :  default_fee_base_msat, 
134- 					fee_proportional_millionths :  default_fee_proportional_millionths, 
135- 					excess_data :  Vec :: new ( ) , 
136- 				} 
137- 			}  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  { 
138140				// incremental update, field flags will indicate mutated values 
139141				let  read_only_network_graph = network_graph. read_only ( ) ; 
140- 				let  channel = read_only_network_graph
142+ 				if   let  Some ( channel)  = read_only_network_graph
141143					. channels ( ) 
142- 					. get ( & short_channel_id) 
143- 					. ok_or ( LightningError  { 
144- 						err :  "Couldn't find channel for update" . to_owned ( ) , 
145- 						action :  ErrorAction :: IgnoreError , 
146- 					} ) ?; 
147- 
148- 				let  directional_info = channel
149- 					. get_directional_info ( channel_flags) 
150- 					. ok_or ( LightningError  { 
151- 						err :  "Couldn't find previous directional data for update" . to_owned ( ) , 
152- 						action :  ErrorAction :: IgnoreError , 
153- 					} ) ?; 
154- 
155- 				UnsignedChannelUpdate  { 
156- 					chain_hash, 
157- 					short_channel_id, 
158- 					timestamp :  backdated_timestamp, 
159- 					flags :  standard_channel_flags, 
160- 					cltv_expiry_delta :  directional_info. cltv_expiry_delta , 
161- 					htlc_minimum_msat :  directional_info. htlc_minimum_msat , 
162- 					htlc_maximum_msat :  directional_info. htlc_maximum_msat , 
163- 					fee_base_msat :  directional_info. fees . base_msat , 
164- 					fee_proportional_millionths :  directional_info. fees . proportional_millionths , 
165- 					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 ; 
166161				} 
167162			} ; 
168163
@@ -191,6 +186,10 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
191186				synthetic_update. htlc_maximum_msat  = htlc_maximum_msat; 
192187			} 
193188
189+ 			if  skip_update_for_unknown_channel { 
190+ 				continue ; 
191+ 			} 
192+ 
194193			match  network_graph. update_channel_unsigned ( & synthetic_update)  { 
195194				Ok ( _)  => { } , 
196195				Err ( LightningError  {  action :  ErrorAction :: IgnoreDuplicateGossip ,  .. } )  => { } , 
@@ -251,7 +250,7 @@ mod tests {
251250	} 
252251
253252	#[ test]  
254- 	fn  incremental_only_update_fails_without_prior_announcements ( )  { 
253+ 	fn  incremental_only_update_ignores_missing_channel ( )  { 
255254		let  incremental_update_input = vec ! [ 
256255			76 ,  68 ,  75 ,  1 ,  111 ,  226 ,  140 ,  10 ,  182 ,  241 ,  179 ,  114 ,  193 ,  166 ,  162 ,  70 ,  174 ,  99 ,  247 , 
257256			79 ,  147 ,  30 ,  131 ,  101 ,  225 ,  90 ,  8 ,  156 ,  104 ,  214 ,  25 ,  0 ,  0 ,  0 ,  0 ,  0 ,  97 ,  229 ,  183 ,  167 , 
@@ -268,12 +267,7 @@ mod tests {
268267
269268		let  rapid_sync = RapidGossipSync :: new ( & network_graph) ; 
270269		let  update_result = rapid_sync. update_network_graph ( & incremental_update_input[ ..] ) ; 
271- 		assert ! ( update_result. is_err( ) ) ; 
272- 		if  let  Err ( GraphSyncError :: LightningError ( lightning_error) )  = update_result { 
273- 			assert_eq ! ( lightning_error. err,  "Couldn't find channel for update" ) ; 
274- 		}  else  { 
275- 			panic ! ( "Unexpected update result: {:?}" ,  update_result) 
276- 		} 
270+ 		assert ! ( update_result. is_ok( ) ) ; 
277271	} 
278272
279273	#[ test]  
0 commit comments