Calculate gas for deployment transaction (#9840)
* Calculate gas for deployment transaction * Space fixed * ethcore: style fix in public_creation_transaction
This commit is contained in:
parent
5e9dc185a5
commit
7f5e6b3a0a
@ -82,7 +82,8 @@ use ethcore::executed::{Executed};
|
||||
use transaction::{SignedTransaction, Transaction, Action, UnverifiedTransaction};
|
||||
use ethcore::{contract_address as ethcore_contract_address};
|
||||
use ethcore::client::{
|
||||
Client, ChainNotify, ChainRoute, ChainMessageType, ClientIoMessage, BlockId, CallContract
|
||||
Client, ChainNotify, ChainRoute, ChainMessageType, ClientIoMessage, BlockId,
|
||||
CallContract, Call, BlockInfo
|
||||
};
|
||||
use ethcore::account_provider::AccountProvider;
|
||||
use ethcore::miner::{self, Miner, MinerService, pool_client::NonceCache};
|
||||
@ -550,19 +551,34 @@ impl Provider where {
|
||||
let state = self.client.state_at(block).ok_or(ErrorKind::StatePruned)?;
|
||||
let nonce = state.nonce(&sender)?;
|
||||
let executed = self.execute_private(source, TransactOptions::with_no_tracing(), block)?;
|
||||
let gas: u64 = 650000 +
|
||||
validators.len() as u64 * 30000 +
|
||||
executed.code.as_ref().map_or(0, |c| c.len() as u64) * 8000 +
|
||||
executed.state.len() as u64 * 8000;
|
||||
Ok((Transaction {
|
||||
let header = self.client.block_header(block)
|
||||
.ok_or(ErrorKind::StatePruned)
|
||||
.and_then(|h| h.decode().map_err(|_| ErrorKind::StateIncorrect).into())?;
|
||||
let (executed_code, executed_state) = (executed.code.unwrap_or_default(), executed.state);
|
||||
let tx_data = Self::generate_constructor(validators, executed_code.clone(), executed_state.clone());
|
||||
let mut tx = Transaction {
|
||||
nonce: nonce,
|
||||
action: Action::Create,
|
||||
gas: gas.into(),
|
||||
gas: u64::max_value().into(),
|
||||
gas_price: gas_price,
|
||||
value: source.value,
|
||||
data: Self::generate_constructor(validators, executed.code.unwrap_or_default(), executed.state)
|
||||
},
|
||||
executed.contract_address))
|
||||
data: tx_data,
|
||||
};
|
||||
tx.gas = match self.client.estimate_gas(&tx.clone().fake_sign(sender), &state, &header) {
|
||||
Ok(estimated_gas) => estimated_gas,
|
||||
Err(_) => self.estimate_tx_gas(validators, &executed_code, &executed_state, &[]),
|
||||
};
|
||||
|
||||
Ok((tx, executed.contract_address))
|
||||
}
|
||||
|
||||
fn estimate_tx_gas(&self, validators: &[Address], code: &Bytes, state: &Bytes, signatures: &[Signature]) -> U256 {
|
||||
let default_gas = 650000 +
|
||||
validators.len() as u64 * 30000 +
|
||||
code.len() as u64 * 8000 +
|
||||
signatures.len() as u64 * 50000 +
|
||||
state.len() as u64 * 8000;
|
||||
default_gas.into()
|
||||
}
|
||||
|
||||
/// Create encrypted public contract deployment transaction. Returns updated encrypted state.
|
||||
@ -576,7 +592,7 @@ impl Provider where {
|
||||
|
||||
/// Create encrypted public transaction from private transaction.
|
||||
pub fn public_transaction(&self, state: Bytes, source: &SignedTransaction, signatures: &[Signature], nonce: U256, gas_price: U256) -> Result<Transaction, Error> {
|
||||
let gas: u64 = 650000 + state.len() as u64 * 8000 + signatures.len() as u64 * 50000;
|
||||
let gas = self.estimate_tx_gas(&[], &Vec::new(), &state, signatures);
|
||||
Ok(Transaction {
|
||||
nonce: nonce,
|
||||
action: source.action.clone(),
|
||||
|
Loading…
Reference in New Issue
Block a user