@@ -32,6 +32,7 @@ use rlp::{Encodable, UntrustedRlp};
32
32
use super :: backup:: { backup, restore, BackupView } ;
33
33
use super :: message:: * ;
34
34
use super :: network;
35
+ use super :: params:: TimeGapParams ;
35
36
use super :: types:: { BitSet , Height , Proposal , Step , TendermintSealView , TendermintState , TwoThirdsMajority , View } ;
36
37
use super :: {
37
38
BlockHash , ENGINE_TIMEOUT_BROADCAST_STEP_STATE , ENGINE_TIMEOUT_EMPTY_PROPOSAL , ENGINE_TIMEOUT_TOKEN_NONCE_BASE ,
@@ -52,6 +53,7 @@ use crate::BlockId;
52
53
53
54
type SpawnResult = (
54
55
JoinHandle < ( ) > ,
56
+ crossbeam:: Sender < TimeGapParams > ,
55
57
crossbeam:: Sender < ( crossbeam:: Sender < network:: Event > , Weak < EngineClient > ) > ,
56
58
crossbeam:: Sender < Event > ,
57
59
crossbeam:: Sender < ( ) > ,
@@ -87,7 +89,7 @@ struct Worker {
87
89
validators : Arc < ValidatorSet > ,
88
90
/// Channel to the network extension, must be set later.
89
91
extension : EventSender < network:: Event > ,
90
-
92
+ time_gap_params : TimeGapParams ,
91
93
timeout_token_nonce : usize ,
92
94
}
93
95
@@ -167,7 +169,12 @@ pub enum Event {
167
169
impl Worker {
168
170
#![ cfg_attr( feature = "cargo-clippy" , allow( clippy:: new_ret_no_self) ) ]
169
171
/// Create a new instance of Tendermint engine
170
- fn new ( validators : Arc < ValidatorSet > , extension : EventSender < network:: Event > , client : Weak < EngineClient > ) -> Self {
172
+ fn new (
173
+ validators : Arc < ValidatorSet > ,
174
+ extension : EventSender < network:: Event > ,
175
+ client : Weak < EngineClient > ,
176
+ time_gap_params : TimeGapParams ,
177
+ ) -> Self {
171
178
Worker {
172
179
client,
173
180
height : 1 ,
@@ -182,18 +189,26 @@ impl Worker {
182
189
extension,
183
190
votes_received : BitSet :: new ( ) ,
184
191
votes_received_changed : false ,
185
-
192
+ time_gap_params ,
186
193
timeout_token_nonce : ENGINE_TIMEOUT_TOKEN_NONCE_BASE ,
187
194
}
188
195
}
189
196
190
197
fn spawn ( validators : Arc < ValidatorSet > ) -> SpawnResult {
191
198
let ( sender, receiver) = crossbeam:: unbounded ( ) ;
192
199
let ( quit, quit_receiver) = crossbeam:: bounded ( 1 ) ;
200
+ let ( external_params_initializer, external_params_receiver) = crossbeam:: bounded ( 1 ) ;
193
201
let ( extension_initializer, extension_receiver) = crossbeam:: bounded ( 1 ) ;
194
202
let join = Builder :: new ( )
195
203
. name ( "tendermint" . to_string ( ) )
196
204
. spawn ( move || {
205
+ let time_gap_params = match external_params_receiver. recv ( ) {
206
+ Ok ( time_gap_params) => time_gap_params,
207
+ Err ( crossbeam:: RecvError ) => {
208
+ cerror ! ( ENGINE , "The tendermint external parameters are not initialized" ) ;
209
+ return
210
+ }
211
+ } ;
197
212
let ( extension, client) = crossbeam:: select! {
198
213
recv( extension_receiver) -> msg => {
199
214
match msg {
@@ -215,7 +230,7 @@ impl Worker {
215
230
}
216
231
} ;
217
232
validators. register_client ( Weak :: clone ( & client) ) ;
218
- let mut inner = Self :: new ( validators, extension, client) ;
233
+ let mut inner = Self :: new ( validators, extension, client, time_gap_params ) ;
219
234
loop {
220
235
crossbeam:: select! {
221
236
recv( receiver) -> msg => {
@@ -342,7 +357,7 @@ impl Worker {
342
357
}
343
358
} )
344
359
. unwrap ( ) ;
345
- ( join, extension_initializer, sender, quit)
360
+ ( join, external_params_initializer , extension_initializer, sender, quit)
346
361
}
347
362
348
363
/// The client is a thread-safe struct. Using it in multi-threads is safe.
@@ -693,11 +708,11 @@ impl Worker {
693
708
}
694
709
695
710
fn is_generation_time_relevant ( & self , block_header : & Header ) -> bool {
696
- const ACCEPTABLE_FUTURE_GAP : Duration = Duration :: from_secs ( 5 ) ;
697
- const ACCEPTABLE_PAST_GAP : Duration = Duration :: from_secs ( 30 ) ;
711
+ let acceptable_past_gap = self . time_gap_params . allowed_past_gap ;
712
+ let acceptable_future_gap = self . time_gap_params . allowed_future_gap ;
698
713
let now = SystemTime :: now ( ) ;
699
- let allowed_min = now - ACCEPTABLE_PAST_GAP ;
700
- let allowed_max = now + ACCEPTABLE_FUTURE_GAP ;
714
+ let allowed_min = now - acceptable_past_gap ;
715
+ let allowed_max = now + acceptable_future_gap ;
701
716
let block_generation_time = UNIX_EPOCH . checked_add ( Duration :: from_secs ( block_header. timestamp ( ) ) ) ;
702
717
703
718
match block_generation_time {
0 commit comments