seals_internally (#4613)
This commit is contained in:
		
							parent
							
								
									44769fcd4a
								
							
						
					
					
						commit
						ac6180a6fe
					
				@ -220,8 +220,8 @@ impl Engine for AuthorityRound {
 | 
				
			|||||||
		});
 | 
							});
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn is_sealer(&self, author: &Address) -> Option<bool> {
 | 
						fn seals_internally(&self) -> Option<bool> {
 | 
				
			||||||
		Some(self.validators.contains(author))
 | 
							Some(self.validators.contains(&self.signer.address()))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// Attempt to seal the block internally.
 | 
						/// Attempt to seal the block internally.
 | 
				
			||||||
 | 
				
			|||||||
@ -103,8 +103,8 @@ impl Engine for BasicAuthority {
 | 
				
			|||||||
		});
 | 
							});
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn is_sealer(&self, author: &Address) -> Option<bool> {
 | 
						fn seals_internally(&self) -> Option<bool> {
 | 
				
			||||||
		Some(self.validators.contains(author))
 | 
							Some(self.validators.contains(&self.signer.address()))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// Attempt to seal the block internally.
 | 
						/// Attempt to seal the block internally.
 | 
				
			||||||
@ -268,7 +268,8 @@ mod tests {
 | 
				
			|||||||
		let authority = tap.insert_account(Secret::from_slice(&"".sha3()).unwrap(), "").unwrap();
 | 
							let authority = tap.insert_account(Secret::from_slice(&"".sha3()).unwrap(), "").unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		let engine = new_test_authority().engine;
 | 
							let engine = new_test_authority().engine;
 | 
				
			||||||
		assert!(!engine.is_sealer(&Address::default()).unwrap());
 | 
							assert!(!engine.seals_internally().unwrap());
 | 
				
			||||||
		assert!(engine.is_sealer(&authority).unwrap());
 | 
							engine.set_signer(Arc::new(tap), authority, "".into());
 | 
				
			||||||
 | 
							assert!(engine.seals_internally().unwrap());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -56,7 +56,7 @@ impl Engine for InstantSeal {
 | 
				
			|||||||
		Schedule::new_post_eip150(usize::max_value(), true, true, true)
 | 
							Schedule::new_post_eip150(usize::max_value(), true, true, true)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn is_sealer(&self, _author: &Address) -> Option<bool> { Some(true) }
 | 
						fn seals_internally(&self) -> Option<bool> { Some(true) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn generate_seal(&self, _block: &ExecutedBlock) -> Seal {
 | 
						fn generate_seal(&self, _block: &ExecutedBlock) -> Seal {
 | 
				
			||||||
		Seal::Regular(Vec::new())
 | 
							Seal::Regular(Vec::new())
 | 
				
			||||||
 | 
				
			|||||||
@ -128,11 +128,10 @@ pub trait Engine : Sync + Send {
 | 
				
			|||||||
	/// Block transformation functions, after the transactions.
 | 
						/// Block transformation functions, after the transactions.
 | 
				
			||||||
	fn on_close_block(&self, _block: &mut ExecutedBlock) {}
 | 
						fn on_close_block(&self, _block: &mut ExecutedBlock) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// If Some(true) this author is able to generate seals, generate_seal has to be implemented.
 | 
						/// None means that it requires external input (e.g. PoW) to seal a block.
 | 
				
			||||||
	/// None indicates that this Engine never seals internally regardless of author (e.g. PoW).
 | 
						/// Some(true) means the engine is currently prime for seal generation (i.e. node is the current validator).
 | 
				
			||||||
	fn is_sealer(&self, _author: &Address) -> Option<bool> { None }
 | 
						/// Some(false) means that the node might seal internally but is not qualified now.
 | 
				
			||||||
	/// Checks if default address is able to seal.
 | 
						fn seals_internally(&self) -> Option<bool> { None }
 | 
				
			||||||
	fn is_default_sealer(&self) -> Option<bool> { self.is_sealer(&Default::default()) }
 | 
					 | 
				
			||||||
	/// Attempt to seal the block internally.
 | 
						/// Attempt to seal the block internally.
 | 
				
			||||||
	///
 | 
						///
 | 
				
			||||||
	/// If `Some` is returned, then you get a valid seal.
 | 
						/// If `Some` is returned, then you get a valid seal.
 | 
				
			||||||
 | 
				
			|||||||
@ -410,8 +410,8 @@ impl Engine for Tendermint {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// Should this node participate.
 | 
						/// Should this node participate.
 | 
				
			||||||
	fn is_sealer(&self, address: &Address) -> Option<bool> {
 | 
						fn seals_internally(&self) -> Option<bool> {
 | 
				
			||||||
		Some(self.is_authority(address))
 | 
							Some(self.is_authority(&self.signer.address()))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// Attempt to seal generate a proposal seal.
 | 
						/// Attempt to seal generate a proposal seal.
 | 
				
			||||||
 | 
				
			|||||||
@ -215,8 +215,6 @@ pub struct Miner {
 | 
				
			|||||||
	sealing_block_last_request: Mutex<u64>,
 | 
						sealing_block_last_request: Mutex<u64>,
 | 
				
			||||||
	// for sealing...
 | 
						// for sealing...
 | 
				
			||||||
	options: MinerOptions,
 | 
						options: MinerOptions,
 | 
				
			||||||
	/// Does the node perform internal (without work) sealing.
 | 
					 | 
				
			||||||
	pub seals_internally: bool,
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gas_range_target: RwLock<(U256, U256)>,
 | 
						gas_range_target: RwLock<(U256, U256)>,
 | 
				
			||||||
	author: RwLock<Address>,
 | 
						author: RwLock<Address>,
 | 
				
			||||||
@ -275,9 +273,8 @@ impl Miner {
 | 
				
			|||||||
				queue: UsingQueue::new(options.work_queue_size),
 | 
									queue: UsingQueue::new(options.work_queue_size),
 | 
				
			||||||
				enabled: options.force_sealing
 | 
									enabled: options.force_sealing
 | 
				
			||||||
					|| !options.new_work_notify.is_empty()
 | 
										|| !options.new_work_notify.is_empty()
 | 
				
			||||||
					|| spec.engine.is_default_sealer().unwrap_or(false)
 | 
										|| spec.engine.seals_internally().is_some()
 | 
				
			||||||
			}),
 | 
								}),
 | 
				
			||||||
			seals_internally: spec.engine.is_default_sealer().is_some(),
 | 
					 | 
				
			||||||
			gas_range_target: RwLock::new((U256::zero(), U256::zero())),
 | 
								gas_range_target: RwLock::new((U256::zero(), U256::zero())),
 | 
				
			||||||
			author: RwLock::new(Address::default()),
 | 
								author: RwLock::new(Address::default()),
 | 
				
			||||||
			extra_data: RwLock::new(Vec::new()),
 | 
								extra_data: RwLock::new(Vec::new()),
 | 
				
			||||||
@ -455,7 +452,7 @@ impl Miner {
 | 
				
			|||||||
			let last_request = *self.sealing_block_last_request.lock();
 | 
								let last_request = *self.sealing_block_last_request.lock();
 | 
				
			||||||
			let should_disable_sealing = !self.forced_sealing()
 | 
								let should_disable_sealing = !self.forced_sealing()
 | 
				
			||||||
				&& !has_local_transactions
 | 
									&& !has_local_transactions
 | 
				
			||||||
				&& !self.seals_internally
 | 
									&& self.engine.seals_internally().is_none()
 | 
				
			||||||
				&& best_block > last_request
 | 
									&& best_block > last_request
 | 
				
			||||||
				&& best_block - last_request > SEALING_TIMEOUT_IN_BLOCKS;
 | 
									&& best_block - last_request > SEALING_TIMEOUT_IN_BLOCKS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -765,21 +762,21 @@ impl MinerService for Miner {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn set_author(&self, author: Address) {
 | 
						fn set_author(&self, author: Address) {
 | 
				
			||||||
		if self.seals_internally {
 | 
							if self.engine.seals_internally().is_some() {
 | 
				
			||||||
			let mut sealing_work = self.sealing_work.lock();
 | 
								let mut sealing_work = self.sealing_work.lock();
 | 
				
			||||||
			sealing_work.enabled = self.engine.is_sealer(&author).unwrap_or(false);
 | 
								sealing_work.enabled = true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		*self.author.write() = author;
 | 
							*self.author.write() = author;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn set_engine_signer(&self, address: Address, password: String) -> Result<(), AccountError> {
 | 
						fn set_engine_signer(&self, address: Address, password: String) -> Result<(), AccountError> {
 | 
				
			||||||
		if self.seals_internally {
 | 
							if self.engine.seals_internally().is_some() {
 | 
				
			||||||
			if let Some(ref ap) = self.accounts {
 | 
								if let Some(ref ap) = self.accounts {
 | 
				
			||||||
				ap.sign(address.clone(), Some(password.clone()), Default::default())?;
 | 
									ap.sign(address.clone(), Some(password.clone()), Default::default())?;
 | 
				
			||||||
				// Limit the scope of the locks.
 | 
									// Limit the scope of the locks.
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					let mut sealing_work = self.sealing_work.lock();
 | 
										let mut sealing_work = self.sealing_work.lock();
 | 
				
			||||||
					sealing_work.enabled = self.engine.is_sealer(&address).unwrap_or(false);
 | 
										sealing_work.enabled = true;
 | 
				
			||||||
					*self.author.write() = address;
 | 
										*self.author.write() = address;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				// --------------------------------------------------------------------------
 | 
									// --------------------------------------------------------------------------
 | 
				
			||||||
@ -914,7 +911,7 @@ impl MinerService for Miner {
 | 
				
			|||||||
		if imported.is_ok() && self.options.reseal_on_own_tx && self.tx_reseal_allowed() {
 | 
							if imported.is_ok() && self.options.reseal_on_own_tx && self.tx_reseal_allowed() {
 | 
				
			||||||
			// Make sure to do it after transaction is imported and lock is droped.
 | 
								// Make sure to do it after transaction is imported and lock is droped.
 | 
				
			||||||
			// We need to create pending block and enable sealing.
 | 
								// We need to create pending block and enable sealing.
 | 
				
			||||||
			if self.seals_internally || !self.prepare_work_sealing(chain) {
 | 
								if self.engine.seals_internally().unwrap_or(false) || !self.prepare_work_sealing(chain) {
 | 
				
			||||||
				// If new block has not been prepared (means we already had one)
 | 
									// If new block has not been prepared (means we already had one)
 | 
				
			||||||
				// or Engine might be able to seal internally,
 | 
									// or Engine might be able to seal internally,
 | 
				
			||||||
				// we need to update sealing.
 | 
									// we need to update sealing.
 | 
				
			||||||
@ -1071,14 +1068,18 @@ impl MinerService for Miner {
 | 
				
			|||||||
			// --------------------------------------------------------------------------
 | 
								// --------------------------------------------------------------------------
 | 
				
			||||||
			trace!(target: "miner", "update_sealing: preparing a block");
 | 
								trace!(target: "miner", "update_sealing: preparing a block");
 | 
				
			||||||
			let (block, original_work_hash) = self.prepare_block(chain);
 | 
								let (block, original_work_hash) = self.prepare_block(chain);
 | 
				
			||||||
			if self.seals_internally {
 | 
								match self.engine.seals_internally() {
 | 
				
			||||||
				trace!(target: "miner", "update_sealing: engine indicates internal sealing");
 | 
									Some(true) => {
 | 
				
			||||||
				if self.seal_and_import_block_internally(chain, block) {
 | 
										trace!(target: "miner", "update_sealing: engine indicates internal sealing");
 | 
				
			||||||
					trace!(target: "miner", "update_sealing: imported internally sealed block");
 | 
										if self.seal_and_import_block_internally(chain, block) {
 | 
				
			||||||
				}
 | 
											trace!(target: "miner", "update_sealing: imported internally sealed block");
 | 
				
			||||||
			} else {
 | 
										}
 | 
				
			||||||
				trace!(target: "miner", "update_sealing: engine does not seal internally, preparing work");
 | 
									},
 | 
				
			||||||
				self.prepare_work(block, original_work_hash);
 | 
									None => {
 | 
				
			||||||
 | 
										trace!(target: "miner", "update_sealing: engine does not seal internally, preparing work");
 | 
				
			||||||
 | 
										self.prepare_work(block, original_work_hash)
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									_ => trace!(target: "miner", "update_sealing: engine is not keen to seal internally right now")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user