@@ -32,6 +32,7 @@ use rlp::{Encodable, UntrustedRlp};
3232use super :: backup:: { backup, restore, BackupView } ;
3333use super :: message:: * ;
3434use super :: network;
35+ use super :: params:: TimeGapParams ;
3536use super :: types:: { BitSet , Height , Proposal , Step , TendermintSealView , TendermintState , TwoThirdsMajority , View } ;
3637use super :: {
3738 BlockHash , ENGINE_TIMEOUT_BROADCAST_STEP_STATE , ENGINE_TIMEOUT_EMPTY_PROPOSAL , ENGINE_TIMEOUT_TOKEN_NONCE_BASE ,
@@ -52,6 +53,7 @@ use crate::BlockId;
5253
5354type SpawnResult = (
5455 JoinHandle < ( ) > ,
56+ crossbeam:: Sender < TimeGapParams > ,
5557 crossbeam:: Sender < ( crossbeam:: Sender < network:: Event > , Weak < EngineClient > ) > ,
5658 crossbeam:: Sender < Event > ,
5759 crossbeam:: Sender < ( ) > ,
@@ -87,7 +89,7 @@ struct Worker {
8789 validators : Arc < ValidatorSet > ,
8890 /// Channel to the network extension, must be set later.
8991 extension : EventSender < network:: Event > ,
90-
92+ time_gap_params : TimeGapParams ,
9193 timeout_token_nonce : usize ,
9294}
9395
@@ -167,7 +169,12 @@ pub enum Event {
167169impl Worker {
168170 #![ cfg_attr( feature = "cargo-clippy" , allow( clippy:: new_ret_no_self) ) ]
169171 /// 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 {
171178 Worker {
172179 client,
173180 height : 1 ,
@@ -182,18 +189,26 @@ impl Worker {
182189 extension,
183190 votes_received : BitSet :: new ( ) ,
184191 votes_received_changed : false ,
185-
192+ time_gap_params ,
186193 timeout_token_nonce : ENGINE_TIMEOUT_TOKEN_NONCE_BASE ,
187194 }
188195 }
189196
190197 fn spawn ( validators : Arc < ValidatorSet > ) -> SpawnResult {
191198 let ( sender, receiver) = crossbeam:: unbounded ( ) ;
192199 let ( quit, quit_receiver) = crossbeam:: bounded ( 1 ) ;
200+ let ( external_params_initializer, external_params_receiver) = crossbeam:: bounded ( 1 ) ;
193201 let ( extension_initializer, extension_receiver) = crossbeam:: bounded ( 1 ) ;
194202 let join = Builder :: new ( )
195203 . name ( "tendermint" . to_string ( ) )
196204 . 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+ } ;
197212 let ( extension, client) = crossbeam:: select! {
198213 recv( extension_receiver) -> msg => {
199214 match msg {
@@ -215,7 +230,7 @@ impl Worker {
215230 }
216231 } ;
217232 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 ) ;
219234 loop {
220235 crossbeam:: select! {
221236 recv( receiver) -> msg => {
@@ -342,7 +357,7 @@ impl Worker {
342357 }
343358 } )
344359 . unwrap ( ) ;
345- ( join, extension_initializer, sender, quit)
360+ ( join, external_params_initializer , extension_initializer, sender, quit)
346361 }
347362
348363 /// The client is a thread-safe struct. Using it in multi-threads is safe.
@@ -693,11 +708,11 @@ impl Worker {
693708 }
694709
695710 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 ;
698713 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 ;
701716 let block_generation_time = UNIX_EPOCH . checked_add ( Duration :: from_secs ( block_header. timestamp ( ) ) ) ;
702717
703718 match block_generation_time {
0 commit comments