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:
parent
59f6931e06
commit
3094ae9df9
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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]]),
|
||||||
|
@ -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) => {
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user