fix(light eth_gasPrice): ask network if not in cache (#10535)
* fix(light eth_gasPrice): ask N/W if not in cache * fix(bad rebase)
This commit is contained in:
		
							parent
							
								
									7b2afdfc8c
								
							
						
					
					
						commit
						95236d25b2
					
				@ -43,7 +43,7 @@ use light::request::Field;
 | 
			
		||||
 | 
			
		||||
use sync::{LightNetworkDispatcher, ManageNetwork, LightSyncProvider};
 | 
			
		||||
 | 
			
		||||
use ethereum_types::Address;
 | 
			
		||||
use ethereum_types::{Address, U256};
 | 
			
		||||
use hash::H256;
 | 
			
		||||
use parking_lot::Mutex;
 | 
			
		||||
use fastmap::H256FastMap;
 | 
			
		||||
@ -55,6 +55,7 @@ use v1::types::{BlockNumber, CallRequest, Log, Transaction};
 | 
			
		||||
 | 
			
		||||
const NO_INVALID_BACK_REFS_PROOF: &str = "Fails only on invalid back-references; back-references here known to be valid; qed";
 | 
			
		||||
const WRONG_RESPONSE_AMOUNT_TYPE_PROOF: &str = "responses correspond directly with requests in amount and type; qed";
 | 
			
		||||
const DEFAULT_GAS_PRICE: u64 = 21_000;
 | 
			
		||||
 | 
			
		||||
pub fn light_all_transactions<S, OD>(dispatch: &Arc<dispatch::LightDispatcher<S, OD>>) -> impl Iterator<Item=PendingTransaction>
 | 
			
		||||
where
 | 
			
		||||
@ -231,7 +232,6 @@ where
 | 
			
		||||
 | 
			
		||||
	/// Helper for getting proved execution.
 | 
			
		||||
	pub fn proved_read_only_execution(&self, req: CallRequest, num: Option<BlockNumber>) -> impl Future<Item = ExecutionResult, Error = Error> + Send {
 | 
			
		||||
		const DEFAULT_GAS_PRICE: u64 = 21_000;
 | 
			
		||||
		// (21000 G_transaction + 32000 G_create + some marginal to allow a few operations)
 | 
			
		||||
		const START_GAS: u64 = 60_000;
 | 
			
		||||
 | 
			
		||||
@ -257,18 +257,9 @@ where
 | 
			
		||||
			None => Either::B(self.account(from, id).map(|acc| acc.map(|a| a.nonce))),
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		let gas_price_percentile = self.gas_price_percentile;
 | 
			
		||||
		let gas_price_fut = match req.gas_price {
 | 
			
		||||
			Some(price) => Either::A(future::ok(price)),
 | 
			
		||||
			None => Either::B(dispatch::light::fetch_gas_price_corpus(
 | 
			
		||||
				self.sync.clone(),
 | 
			
		||||
				self.client.clone(),
 | 
			
		||||
				self.on_demand.clone(),
 | 
			
		||||
				self.cache.clone(),
 | 
			
		||||
			).map(move |corp| match corp.percentile(gas_price_percentile) {
 | 
			
		||||
				Some(percentile) => *percentile,
 | 
			
		||||
				None => DEFAULT_GAS_PRICE.into(),
 | 
			
		||||
			}))
 | 
			
		||||
			None => Either::B(self.gas_price()),
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		// if nonce resolves, this should too since it'll be in the LRU-cache.
 | 
			
		||||
@ -307,6 +298,23 @@ where
 | 
			
		||||
		}))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// Helper to fetch the corpus gas price from 1) the cache 2) the network then it tries to estimate the percentile
 | 
			
		||||
	/// using `gas_price_percentile` if the estimated percentile is zero the `DEFAULT_GAS_PRICE` is returned
 | 
			
		||||
	pub fn gas_price(&self) -> impl Future<Item = U256, Error = Error> + Send {
 | 
			
		||||
		let gas_price_percentile = self.gas_price_percentile;
 | 
			
		||||
 | 
			
		||||
		dispatch::light::fetch_gas_price_corpus(
 | 
			
		||||
			self.sync.clone(),
 | 
			
		||||
			self.client.clone(),
 | 
			
		||||
			self.on_demand.clone(),
 | 
			
		||||
			self.cache.clone(),
 | 
			
		||||
		)
 | 
			
		||||
		.map(move |corp| {
 | 
			
		||||
			corp.percentile(gas_price_percentile)
 | 
			
		||||
				.map_or_else(|| DEFAULT_GAS_PRICE.into(), |percentile| *percentile)
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// Get a block itself. Fails on unknown block ID.
 | 
			
		||||
	pub fn block(&self, id: BlockId) -> impl Future<Item = encoded::Block, Error = Error> + Send {
 | 
			
		||||
		let mut reqs = Vec::new();
 | 
			
		||||
 | 
			
		||||
@ -552,8 +552,8 @@ impl<C, SN: ?Sized, S: ?Sized, M, EM, T: StateInfo + 'static> Eth for EthClient<
 | 
			
		||||
		Ok(self.external_miner.hashrate())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn gas_price(&self) -> Result<U256> {
 | 
			
		||||
		Ok(default_gas_price(&*self.client, &*self.miner, self.options.gas_price_percentile))
 | 
			
		||||
	fn gas_price(&self) -> BoxFuture<U256> {
 | 
			
		||||
		Box::new(future::ok(default_gas_price(&*self.client, &*self.miner, self.options.gas_price_percentile)))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn accounts(&self) -> Result<Vec<H160>> {
 | 
			
		||||
 | 
			
		||||
@ -38,8 +38,7 @@ use types::filter::Filter as EthcoreFilter;
 | 
			
		||||
use types::ids::BlockId;
 | 
			
		||||
 | 
			
		||||
use v1::impls::eth_filter::Filterable;
 | 
			
		||||
use v1::helpers::{errors, limit_logs};
 | 
			
		||||
use v1::helpers::{SyncPollFilter, PollManager};
 | 
			
		||||
use v1::helpers::{errors, limit_logs, SyncPollFilter, PollManager};
 | 
			
		||||
use v1::helpers::deprecated::{self, DeprecationNotice};
 | 
			
		||||
use v1::helpers::light_fetch::{self, LightFetch};
 | 
			
		||||
use v1::traits::Eth;
 | 
			
		||||
@ -271,11 +270,8 @@ where
 | 
			
		||||
		Ok(Default::default())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn gas_price(&self) -> Result<U256> {
 | 
			
		||||
		Ok(self.cache.lock().gas_price_corpus()
 | 
			
		||||
			.and_then(|c| c.percentile(self.gas_price_percentile).cloned())
 | 
			
		||||
			.map(U256::from)
 | 
			
		||||
			.unwrap_or_else(Default::default))
 | 
			
		||||
	fn gas_price(&self) -> BoxFuture<U256> {
 | 
			
		||||
		Box::new(self.fetcher().gas_price())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn accounts(&self) -> Result<Vec<H160>> {
 | 
			
		||||
 | 
			
		||||
@ -56,7 +56,7 @@ pub trait Eth {
 | 
			
		||||
 | 
			
		||||
	/// Returns current gas_price.
 | 
			
		||||
	#[rpc(name = "eth_gasPrice")]
 | 
			
		||||
	fn gas_price(&self) -> Result<U256>;
 | 
			
		||||
	fn gas_price(&self) -> BoxFuture<U256>;
 | 
			
		||||
 | 
			
		||||
	/// Returns accounts list.
 | 
			
		||||
	#[rpc(name = "eth_accounts")]
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user