16
16
17
17
//! Everything about outgoing messages sending.
18
18
19
- use crate :: Config ;
19
+ use crate :: { Config , LOG_TARGET } ;
20
20
21
21
use bp_messages:: {
22
22
DeliveredMessages , LaneId , MessageNonce , MessagePayload , OutboundLaneData , UnrewardedRelayer ,
23
23
} ;
24
+ use codec:: { Decode , Encode } ;
24
25
use frame_support:: {
25
26
weights:: { RuntimeDbWeight , Weight } ,
26
- BoundedVec , RuntimeDebug ,
27
+ BoundedVec , PalletError , RuntimeDebug ,
27
28
} ;
28
29
use num_traits:: Zero ;
30
+ use scale_info:: TypeInfo ;
29
31
use sp_std:: collections:: vec_deque:: VecDeque ;
30
32
31
33
/// Outbound lane storage.
@@ -49,13 +51,8 @@ pub trait OutboundLaneStorage {
49
51
pub type StoredMessagePayload < T , I > = BoundedVec < u8 , <T as Config < I > >:: MaximalOutboundPayloadSize > ;
50
52
51
53
/// Result of messages receival confirmation.
52
- #[ derive( RuntimeDebug , PartialEq , Eq ) ]
53
- pub enum ReceivalConfirmationResult {
54
- /// New messages have been confirmed by the confirmation transaction.
55
- ConfirmedMessages ( DeliveredMessages ) ,
56
- /// Confirmation transaction brings no new confirmation. This may be a result of relayer
57
- /// error or several relayers running.
58
- NoNewConfirmations ,
54
+ #[ derive( Encode , Decode , RuntimeDebug , PartialEq , Eq , PalletError , TypeInfo ) ]
55
+ pub enum ReceivalConfirmationError {
59
56
/// Bridged chain is trying to confirm more messages than we have generated. May be a result
60
57
/// of invalid bridged chain storage.
61
58
FailedToConfirmFutureMessages ,
@@ -66,7 +63,7 @@ pub enum ReceivalConfirmationResult {
66
63
/// bridged chain storage.
67
64
NonConsecutiveUnrewardedRelayerEntries ,
68
65
/// The chain has more messages that need to be confirmed than there is in the proof.
69
- TryingToConfirmMoreMessagesThanExpected ( MessageNonce ) ,
66
+ TryingToConfirmMoreMessagesThanExpected ,
70
67
}
71
68
72
69
/// Outbound messages lane.
@@ -105,37 +102,39 @@ impl<S: OutboundLaneStorage> OutboundLane<S> {
105
102
max_allowed_messages : MessageNonce ,
106
103
latest_delivered_nonce : MessageNonce ,
107
104
relayers : & VecDeque < UnrewardedRelayer < RelayerId > > ,
108
- ) -> ReceivalConfirmationResult {
105
+ ) -> Result < Option < DeliveredMessages > , ReceivalConfirmationError > {
109
106
let mut data = self . storage . data ( ) ;
110
- if latest_delivered_nonce <= data. latest_received_nonce {
111
- return ReceivalConfirmationResult :: NoNewConfirmations
107
+ let confirmed_messages = DeliveredMessages {
108
+ begin : data. latest_received_nonce . saturating_add ( 1 ) ,
109
+ end : latest_delivered_nonce,
110
+ } ;
111
+ if confirmed_messages. total_messages ( ) == 0 {
112
+ return Ok ( None )
112
113
}
113
- if latest_delivered_nonce > data. latest_generated_nonce {
114
- return ReceivalConfirmationResult :: FailedToConfirmFutureMessages
114
+ if confirmed_messages . end > data. latest_generated_nonce {
115
+ return Err ( ReceivalConfirmationError :: FailedToConfirmFutureMessages )
115
116
}
116
- if latest_delivered_nonce - data . latest_received_nonce > max_allowed_messages {
117
+ if confirmed_messages . total_messages ( ) > max_allowed_messages {
117
118
// that the relayer has declared correct number of messages that the proof contains (it
118
119
// is checked outside of the function). But it may happen (but only if this/bridged
119
120
// chain storage is corrupted, though) that the actual number of confirmed messages if
120
121
// larger than declared. This would mean that 'reward loop' will take more time than the
121
122
// weight formula accounts, so we can't allow that.
122
- return ReceivalConfirmationResult :: TryingToConfirmMoreMessagesThanExpected (
123
- latest_delivered_nonce - data. latest_received_nonce ,
124
- )
123
+ log:: trace!(
124
+ target: LOG_TARGET ,
125
+ "Messages delivery proof contains too many messages to confirm: {} vs declared {}" ,
126
+ confirmed_messages. total_messages( ) ,
127
+ max_allowed_messages,
128
+ ) ;
129
+ return Err ( ReceivalConfirmationError :: TryingToConfirmMoreMessagesThanExpected )
125
130
}
126
131
127
- if let Err ( e) = ensure_unrewarded_relayers_are_correct ( latest_delivered_nonce, relayers) {
128
- return e
129
- }
132
+ ensure_unrewarded_relayers_are_correct ( confirmed_messages. end , relayers) ?;
130
133
131
- let prev_latest_received_nonce = data. latest_received_nonce ;
132
- data. latest_received_nonce = latest_delivered_nonce;
134
+ data. latest_received_nonce = confirmed_messages. end ;
133
135
self . storage . set_data ( data) ;
134
136
135
- ReceivalConfirmationResult :: ConfirmedMessages ( DeliveredMessages {
136
- begin : prev_latest_received_nonce + 1 ,
137
- end : latest_delivered_nonce,
138
- } )
137
+ Ok ( Some ( confirmed_messages) )
139
138
}
140
139
141
140
/// Prune at most `max_messages_to_prune` already received messages.
@@ -176,27 +175,24 @@ impl<S: OutboundLaneStorage> OutboundLane<S> {
176
175
fn ensure_unrewarded_relayers_are_correct < RelayerId > (
177
176
latest_received_nonce : MessageNonce ,
178
177
relayers : & VecDeque < UnrewardedRelayer < RelayerId > > ,
179
- ) -> Result < ( ) , ReceivalConfirmationResult > {
180
- let mut last_entry_end : Option < MessageNonce > = None ;
178
+ ) -> Result < ( ) , ReceivalConfirmationError > {
179
+ let mut expected_entry_begin = relayers . front ( ) . map ( |entry| entry . messages . begin ) ;
181
180
for entry in relayers {
182
181
// unrewarded relayer entry must have at least 1 unconfirmed message
183
182
// (guaranteed by the `InboundLane::receive_message()`)
184
183
if entry. messages . end < entry. messages . begin {
185
- return Err ( ReceivalConfirmationResult :: EmptyUnrewardedRelayerEntry )
184
+ return Err ( ReceivalConfirmationError :: EmptyUnrewardedRelayerEntry )
186
185
}
187
186
// every entry must confirm range of messages that follows previous entry range
188
187
// (guaranteed by the `InboundLane::receive_message()`)
189
- if let Some ( last_entry_end) = last_entry_end {
190
- let expected_entry_begin = last_entry_end. checked_add ( 1 ) ;
191
- if expected_entry_begin != Some ( entry. messages . begin ) {
192
- return Err ( ReceivalConfirmationResult :: NonConsecutiveUnrewardedRelayerEntries )
193
- }
188
+ if expected_entry_begin != Some ( entry. messages . begin ) {
189
+ return Err ( ReceivalConfirmationError :: NonConsecutiveUnrewardedRelayerEntries )
194
190
}
195
- last_entry_end = Some ( entry. messages . end ) ;
191
+ expected_entry_begin = entry. messages . end . checked_add ( 1 ) ;
196
192
// entry can't confirm messages larger than `inbound_lane_data.latest_received_nonce()`
197
193
// (guaranteed by the `InboundLane::receive_message()`)
198
194
if entry. messages . end > latest_received_nonce {
199
- return Err ( ReceivalConfirmationResult :: FailedToConfirmFutureMessages )
195
+ return Err ( ReceivalConfirmationError :: FailedToConfirmFutureMessages )
200
196
}
201
197
}
202
198
@@ -231,7 +227,7 @@ mod tests {
231
227
fn assert_3_messages_confirmation_fails (
232
228
latest_received_nonce : MessageNonce ,
233
229
relayers : & VecDeque < UnrewardedRelayer < TestRelayer > > ,
234
- ) -> ReceivalConfirmationResult {
230
+ ) -> Result < Option < DeliveredMessages > , ReceivalConfirmationError > {
235
231
run_test ( || {
236
232
let mut lane = outbound_lane :: < TestRuntime , _ > ( TEST_LANE_ID ) ;
237
233
lane. send_message ( outbound_message_data ( REGULAR_PAYLOAD ) ) ;
@@ -268,7 +264,7 @@ mod tests {
268
264
assert_eq ! ( lane. storage. data( ) . latest_received_nonce, 0 ) ;
269
265
assert_eq ! (
270
266
lane. confirm_delivery( 3 , 3 , & unrewarded_relayers( 1 ..=3 ) ) ,
271
- ReceivalConfirmationResult :: ConfirmedMessages ( delivered_messages( 1 ..=3 ) ) ,
267
+ Ok ( Some ( delivered_messages( 1 ..=3 ) ) ) ,
272
268
) ;
273
269
assert_eq ! ( lane. storage. data( ) . latest_generated_nonce, 3 ) ;
274
270
assert_eq ! ( lane. storage. data( ) . latest_received_nonce, 3 ) ;
@@ -286,19 +282,13 @@ mod tests {
286
282
assert_eq ! ( lane. storage. data( ) . latest_received_nonce, 0 ) ;
287
283
assert_eq ! (
288
284
lane. confirm_delivery( 3 , 3 , & unrewarded_relayers( 1 ..=3 ) ) ,
289
- ReceivalConfirmationResult :: ConfirmedMessages ( delivered_messages( 1 ..=3 ) ) ,
290
- ) ;
291
- assert_eq ! (
292
- lane. confirm_delivery( 3 , 3 , & unrewarded_relayers( 1 ..=3 ) ) ,
293
- ReceivalConfirmationResult :: NoNewConfirmations ,
285
+ Ok ( Some ( delivered_messages( 1 ..=3 ) ) ) ,
294
286
) ;
287
+ assert_eq ! ( lane. confirm_delivery( 3 , 3 , & unrewarded_relayers( 1 ..=3 ) ) , Ok ( None ) , ) ;
295
288
assert_eq ! ( lane. storage. data( ) . latest_generated_nonce, 3 ) ;
296
289
assert_eq ! ( lane. storage. data( ) . latest_received_nonce, 3 ) ;
297
290
298
- assert_eq ! (
299
- lane. confirm_delivery( 1 , 2 , & unrewarded_relayers( 1 ..=1 ) ) ,
300
- ReceivalConfirmationResult :: NoNewConfirmations ,
301
- ) ;
291
+ assert_eq ! ( lane. confirm_delivery( 1 , 2 , & unrewarded_relayers( 1 ..=1 ) ) , Ok ( None ) , ) ;
302
292
assert_eq ! ( lane. storage. data( ) . latest_generated_nonce, 3 ) ;
303
293
assert_eq ! ( lane. storage. data( ) . latest_received_nonce, 3 ) ;
304
294
} ) ;
@@ -308,7 +298,7 @@ mod tests {
308
298
fn confirm_delivery_rejects_nonce_larger_than_last_generated ( ) {
309
299
assert_eq ! (
310
300
assert_3_messages_confirmation_fails( 10 , & unrewarded_relayers( 1 ..=10 ) , ) ,
311
- ReceivalConfirmationResult :: FailedToConfirmFutureMessages ,
301
+ Err ( ReceivalConfirmationError :: FailedToConfirmFutureMessages ) ,
312
302
) ;
313
303
}
314
304
@@ -323,7 +313,7 @@ mod tests {
323
313
. chain( unrewarded_relayers( 3 ..=3 ) . into_iter( ) )
324
314
. collect( ) ,
325
315
) ,
326
- ReceivalConfirmationResult :: FailedToConfirmFutureMessages ,
316
+ Err ( ReceivalConfirmationError :: FailedToConfirmFutureMessages ) ,
327
317
) ;
328
318
}
329
319
@@ -339,7 +329,7 @@ mod tests {
339
329
. chain( unrewarded_relayers( 2 ..=3 ) . into_iter( ) )
340
330
. collect( ) ,
341
331
) ,
342
- ReceivalConfirmationResult :: EmptyUnrewardedRelayerEntry ,
332
+ Err ( ReceivalConfirmationError :: EmptyUnrewardedRelayerEntry ) ,
343
333
) ;
344
334
}
345
335
@@ -354,7 +344,7 @@ mod tests {
354
344
. chain( unrewarded_relayers( 2 ..=2 ) . into_iter( ) )
355
345
. collect( ) ,
356
346
) ,
357
- ReceivalConfirmationResult :: NonConsecutiveUnrewardedRelayerEntries ,
347
+ Err ( ReceivalConfirmationError :: NonConsecutiveUnrewardedRelayerEntries ) ,
358
348
) ;
359
349
}
360
350
@@ -383,7 +373,7 @@ mod tests {
383
373
// after confirmation, some messages are received
384
374
assert_eq ! (
385
375
lane. confirm_delivery( 2 , 2 , & unrewarded_relayers( 1 ..=2 ) ) ,
386
- ReceivalConfirmationResult :: ConfirmedMessages ( delivered_messages( 1 ..=2 ) ) ,
376
+ Ok ( Some ( delivered_messages( 1 ..=2 ) ) ) ,
387
377
) ;
388
378
assert_eq ! (
389
379
lane. prune_messages( RocksDbWeight :: get( ) , RocksDbWeight :: get( ) . writes( 101 ) ) ,
@@ -396,7 +386,7 @@ mod tests {
396
386
// after last message is confirmed, everything is pruned
397
387
assert_eq ! (
398
388
lane. confirm_delivery( 1 , 3 , & unrewarded_relayers( 3 ..=3 ) ) ,
399
- ReceivalConfirmationResult :: ConfirmedMessages ( delivered_messages( 3 ..=3 ) ) ,
389
+ Ok ( Some ( delivered_messages( 3 ..=3 ) ) ) ,
400
390
) ;
401
391
assert_eq ! (
402
392
lane. prune_messages( RocksDbWeight :: get( ) , RocksDbWeight :: get( ) . writes( 101 ) ) ,
@@ -418,15 +408,15 @@ mod tests {
418
408
lane. send_message ( outbound_message_data ( REGULAR_PAYLOAD ) ) ;
419
409
assert_eq ! (
420
410
lane. confirm_delivery( 0 , 3 , & unrewarded_relayers( 1 ..=3 ) ) ,
421
- ReceivalConfirmationResult :: TryingToConfirmMoreMessagesThanExpected ( 3 ) ,
411
+ Err ( ReceivalConfirmationError :: TryingToConfirmMoreMessagesThanExpected ) ,
422
412
) ;
423
413
assert_eq ! (
424
414
lane. confirm_delivery( 2 , 3 , & unrewarded_relayers( 1 ..=3 ) ) ,
425
- ReceivalConfirmationResult :: TryingToConfirmMoreMessagesThanExpected ( 3 ) ,
415
+ Err ( ReceivalConfirmationError :: TryingToConfirmMoreMessagesThanExpected ) ,
426
416
) ;
427
417
assert_eq ! (
428
418
lane. confirm_delivery( 3 , 3 , & unrewarded_relayers( 1 ..=3 ) ) ,
429
- ReceivalConfirmationResult :: ConfirmedMessages ( delivered_messages( 1 ..=3 ) ) ,
419
+ Ok ( Some ( delivered_messages( 1 ..=3 ) ) ) ,
430
420
) ;
431
421
} ) ;
432
422
}
0 commit comments