@@ -37,12 +37,9 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
37
37
let mut prefix = [ 0u8 ; 4 ] ;
38
38
read_cursor. read_exact ( & mut prefix) ?;
39
39
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
+ }
46
43
47
44
let chain_hash: BlockHash = Readable :: read ( read_cursor) ?;
48
45
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
75
72
76
73
let node_id_1_index: BigSize = Readable :: read ( read_cursor) ?;
77
74
let node_id_2_index: BigSize = Readable :: read ( read_cursor) ?;
75
+
78
76
if max ( node_id_1_index. 0 , node_id_2_index. 0 ) >= node_id_count as u64 {
79
77
return Err ( DecodeError :: InvalidValue . into ( ) ) ;
80
78
} ;
@@ -123,49 +121,43 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
123
121
// flags are always sent in full, and hence always need updating
124
122
let standard_channel_flags = channel_flags & 0b_0000_0011 ;
125
123
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 {
141
140
// incremental update, field flags will indicate mutated values
142
141
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
144
143
. 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 ;
169
161
}
170
162
} ;
171
163
@@ -194,6 +186,10 @@ impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L
194
186
synthetic_update. htlc_maximum_msat = htlc_maximum_msat;
195
187
}
196
188
189
+ if skip_update_for_unknown_channel {
190
+ continue ;
191
+ }
192
+
197
193
match network_graph. update_channel_unsigned ( & synthetic_update) {
198
194
Ok ( _) => { } ,
199
195
Err ( LightningError { action : ErrorAction :: IgnoreDuplicateGossip , .. } ) => { } ,
@@ -254,7 +250,7 @@ mod tests {
254
250
}
255
251
256
252
#[ test]
257
- fn incremental_only_update_fails_without_prior_announcements ( ) {
253
+ fn incremental_only_update_ignores_missing_channel ( ) {
258
254
let incremental_update_input = vec ! [
259
255
76 , 68 , 75 , 1 , 111 , 226 , 140 , 10 , 182 , 241 , 179 , 114 , 193 , 166 , 162 , 70 , 174 , 99 , 247 ,
260
256
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 {
271
267
272
268
let rapid_sync = RapidGossipSync :: new ( & network_graph) ;
273
269
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( ) ) ;
280
271
}
281
272
282
273
#[ test]
@@ -534,4 +525,39 @@ mod tests {
534
525
assert ! ( after. contains( "619737530008010752" ) ) ;
535
526
assert ! ( after. contains( "783241506229452801" ) ) ;
536
527
}
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
+ }
537
563
}
0 commit comments