Check whether we need resealing in miner and unwrap has_account in account_provider (#8853)

* Remove unused Result wrap in has_account

* Check whether we need to reseal for external transactions

* Fix reference to has_account interface

* typo: missing )

* Refactor duplicates to prepare_and_update_sealing

* Fix build
This commit is contained in:
Wei Tang 2018-06-13 15:58:52 +08:00 committed by Marek Kotewicz
parent 59f6931e06
commit 3094ae9df9
6 changed files with 29 additions and 22 deletions

View File

@ -272,8 +272,8 @@ impl AccountProvider {
} }
/// Checks whether an account with a given address is present. /// Checks whether an account with a given address is present.
pub fn has_account(&self, address: Address) -> Result<bool, Error> { pub fn has_account(&self, address: Address) -> bool {
Ok(self.sstore.account_ref(&address).is_ok() && !self.blacklisted_accounts.contains(&address)) self.sstore.account_ref(&address).is_ok() && !self.blacklisted_accounts.contains(&address)
} }
/// Returns addresses of all accounts. /// Returns addresses of all accounts.

View File

@ -700,6 +700,20 @@ impl Miner {
// Return if we restarted // Return if we restarted
prepare_new prepare_new
} }
/// Prepare pending block, check whether sealing is needed, and then update sealing.
fn prepare_and_update_sealing<C: miner::BlockChainClient>(&self, chain: &C) {
use miner::MinerService;
// Make sure to do it after transaction is imported and lock is dropped.
// We need to create pending block and enable sealing.
if self.engine.seals_internally().unwrap_or(false) || !self.prepare_pending_block(chain) {
// If new block has not been prepared (means we already had one)
// or Engine might be able to seal internally,
// we need to update sealing.
self.update_sealing(chain);
}
}
} }
const SEALING_TIMEOUT_IN_BLOCKS : u64 = 5; const SEALING_TIMEOUT_IN_BLOCKS : u64 = 5;
@ -766,12 +780,12 @@ impl miner::MinerService for Miner {
transactions.into_iter().map(pool::verifier::Transaction::Unverified).collect(), transactions.into_iter().map(pool::verifier::Transaction::Unverified).collect(),
); );
// --------------------------------------------------------------------------
// | NOTE Code below requires sealing locks. |
// | Make sure to release the locks before calling that method. |
// --------------------------------------------------------------------------
if !results.is_empty() && self.options.reseal_on_external_tx && self.sealing.lock().reseal_allowed() { if !results.is_empty() && self.options.reseal_on_external_tx && self.sealing.lock().reseal_allowed() {
// -------------------------------------------------------------------------- self.prepare_and_update_sealing(chain);
// | NOTE Code below requires sealing locks. |
// | Make sure to release the locks before calling that method. |
// --------------------------------------------------------------------------
self.update_sealing(chain);
} }
results results
@ -796,14 +810,7 @@ impl miner::MinerService for Miner {
// | Make sure to release the locks before calling that method. | // | Make sure to release the locks before calling that method. |
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
if imported.is_ok() && self.options.reseal_on_own_tx && self.sealing.lock().reseal_allowed() { if imported.is_ok() && self.options.reseal_on_own_tx && self.sealing.lock().reseal_allowed() {
// Make sure to do it after transaction is imported and lock is droped. self.prepare_and_update_sealing(chain);
// We need to create pending block and enable sealing.
if self.engine.seals_internally().unwrap_or(false) || !self.prepare_pending_block(chain) {
// If new block has not been prepared (means we already had one)
// or Engine might be able to seal internally,
// we need to update sealing.
self.update_sealing(chain);
}
} }
imported imported

View File

@ -124,7 +124,7 @@ impl<'a, C: 'a> pool::client::Client for PoolClient<'a, C> where
pool::client::AccountDetails { pool::client::AccountDetails {
nonce: self.cached_nonces.account_nonce(address), nonce: self.cached_nonces.account_nonce(address),
balance: self.chain.latest_balance(address), balance: self.chain.latest_balance(address),
is_local: self.accounts.map_or(false, |accounts| accounts.has_account(*address).unwrap_or(false)), is_local: self.accounts.map_or(false, |accounts| accounts.has_account(*address)),
} }
} }

View File

@ -214,7 +214,7 @@ fn fixed_to_contract_only() {
secret!("dog42"), secret!("dog42"),
]); ]);
assert!(provider.has_account(*RICH_ADDR).unwrap()); assert!(provider.has_account(*RICH_ADDR));
let client = make_chain(provider, 3, vec![ let client = make_chain(provider, 3, vec![
Transition::Manual(3, vec![addrs[2], addrs[3], addrs[5], addrs[7]]), Transition::Manual(3, vec![addrs[2], addrs[3], addrs[5], addrs[7]]),
@ -247,7 +247,7 @@ fn fixed_to_contract_to_contract() {
secret!("dog42"), secret!("dog42"),
]); ]);
assert!(provider.has_account(*RICH_ADDR).unwrap()); assert!(provider.has_account(*RICH_ADDR));
let client = make_chain(provider, 3, vec![ let client = make_chain(provider, 3, vec![
Transition::Manual(3, vec![addrs[2], addrs[3], addrs[5], addrs[7]]), Transition::Manual(3, vec![addrs[2], addrs[3], addrs[5], addrs[7]]),

View File

@ -533,7 +533,7 @@ fn execute_impl<Cr, Rr>(cmd: RunCmd, logger: Arc<RotatingLogger>, on_client_rq:
let engine_signer = cmd.miner_extras.engine_signer; let engine_signer = cmd.miner_extras.engine_signer;
if engine_signer != Default::default() { if engine_signer != Default::default() {
// Check if engine signer exists // Check if engine signer exists
if !account_provider.has_account(engine_signer).unwrap_or(false) { if !account_provider.has_account(engine_signer) {
return Err(format!("Consensus signer account not found for the current chain. {}", build_create_account_hint(&cmd.spec, &cmd.dirs.keys))); return Err(format!("Consensus signer account not found for the current chain. {}", build_create_account_hint(&cmd.spec, &cmd.dirs.keys)));
} }
@ -1028,7 +1028,7 @@ fn prepare_account_provider(spec: &SpecType, dirs: &Directories, data_dir: &str,
for a in cfg.unlocked_accounts { for a in cfg.unlocked_accounts {
// Check if the account exists // Check if the account exists
if !account_provider.has_account(a).unwrap_or(false) { if !account_provider.has_account(a) {
return Err(format!("Account {} not found for the current chain. {}", a, build_create_account_hint(spec, &dirs.keys))); return Err(format!("Account {} not found for the current chain. {}", a, build_create_account_hint(spec, &dirs.keys)));
} }
@ -1053,7 +1053,7 @@ fn prepare_account_provider(spec: &SpecType, dirs: &Directories, data_dir: &str,
fn insert_dev_account(account_provider: &AccountProvider) { fn insert_dev_account(account_provider: &AccountProvider) {
let secret: ethkey::Secret = "4d5db4107d237df6a3d58ee5f70ae63d73d7658d4026f2eefd2f204c81682cb7".into(); let secret: ethkey::Secret = "4d5db4107d237df6a3d58ee5f70ae63d73d7658d4026f2eefd2f204c81682cb7".into();
let dev_account = ethkey::KeyPair::from_secret(secret.clone()).expect("Valid secret produces valid key;qed"); let dev_account = ethkey::KeyPair::from_secret(secret.clone()).expect("Valid secret produces valid key;qed");
if let Ok(false) = account_provider.has_account(dev_account.address()) { if !account_provider.has_account(dev_account.address()) {
match account_provider.insert_account(secret, "") { match account_provider.insert_account(secret, "") {
Err(e) => warn!("Unable to add development account: {}", e), Err(e) => warn!("Unable to add development account: {}", e),
Ok(address) => { Ok(address) => {

View File

@ -144,7 +144,7 @@ mod server {
KeyPair::from_secret(secret).map_err(|e| format!("invalid secret: {}", e))?)), KeyPair::from_secret(secret).map_err(|e| format!("invalid secret: {}", e))?)),
Some(NodeSecretKey::KeyStore(account)) => { Some(NodeSecretKey::KeyStore(account)) => {
// Check if account exists // Check if account exists
if !deps.account_provider.has_account(account.clone()).unwrap_or(false) { if !deps.account_provider.has_account(account.clone()) {
return Err(format!("Account {} passed as secret store node key is not found", account)); return Err(format!("Account {} passed as secret store node key is not found", account));
} }