Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Another minor estimation fix #4133

Merged
merged 6 commits into from
Jan 11, 2017
Merged

Another minor estimation fix #4133

merged 6 commits into from
Jan 11, 2017

Conversation

gavofyork
Copy link
Contributor

No description provided.

@gavofyork gavofyork added A0-pleasereview 🤓 Pull request needs code review. B0-patch M4-core ⛓ Core client code / Rust. labels Jan 11, 2017
@@ -899,6 +900,7 @@ impl BlockChainClient for Client {
}
let options = TransactOptions { tracing: true, vm_tracing: false, check_nonce: false };
let mut tx = t.clone();
tx.gas_price = 0.into();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That kind of breaks the whole purpose of accepting (optional) gas_price in the RPC, shouldn't the caller decide this?

Copy link
Contributor Author

@gavofyork gavofyork Jan 11, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not really relevant for estimate_gas; i guess a slightly nicer solution might be to introduce additional flags to skip the gas payment part of tx execution, but otherwise i don't really see a cleaner way if the sender account doesn't necessarily have enough of a balance to pay.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Balance increase at line 898 is no longer necessary if the gas price is zero.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It affects the value that can be transfered (lower by gas*gas_price) and also may affect executed code (GASPRICE opcode)

Copy link
Contributor Author

@gavofyork gavofyork Jan 11, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah - there is literally nothing we can do to avoid that. unless we alter the state or the transaction, then it becomes impossible to estimate the gas "correctly" and the transaction can always evade an accurate result through the use of GASPRICE, GAS, BALANCE operations. indeed, it is possible to craft a transaction for which estimate_gas could never return a correct result by relying on such things as BLOCKHASH.

the model we assume is simplistic and has issues with certain edge circumstances, however estimate gas is literally unsolvable in the general case (halting problem). for 99% of cases, this approach works. for the rest, the user shouldn't be using it.

Copy link
Contributor Author

@gavofyork gavofyork Jan 11, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok - i'll introduce an alternative way - increasing the sender account balance to the maximum amount possibly needed. slightly better than altering the tx, since we change that already in the case that there's not enough value in it.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just wondering why lowering the gas price is needed at all?

@gavofyork gavofyork changed the title Another miner estimation fix Another minor estimation fix Jan 11, 2017
@@ -893,14 +893,13 @@ impl BlockChainClient for Client {
ExecutionError::TransactionMalformed(message)
})?;
let balance = original_state.balance(&sender);
let needed_balance = t.value + t.gas * t.gas_price;
let needed_balance = t.value + U256::from(UPPER_CEILING) * t.gas_price;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe use saturating ops to avoid overflow panic?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there's already a lot of these in the codebase (e.g. Client::call) - better to sweep them all at once if it's actually required.

@@ -892,7 +893,7 @@ impl BlockChainClient for Client {
ExecutionError::TransactionMalformed(message)
})?;
let balance = original_state.balance(&sender);
let needed_balance = t.value + t.gas * t.gas_price;
let needed_balance = t.value + U256::from(UPPER_CEILING) * t.gas_price;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should probably use saturating_add (if implemented for U256) to avoid overflows.

Copy link
Contributor Author

@gavofyork gavofyork Jan 11, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there's no U256::saturating_add...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

error: no method named `saturating_add` found for type `util::U256` in the current scope
   --> ethcore/src/client/client.rs:903:34
    |
903 | 			let needed_balance = tx.value.saturating_add(tx.gas.saturating_mul(tx.gas_price));
    | 			                              ^^^^^^^^^^^^^^

@coveralls
Copy link

Coverage Status

Changes Unknown when pulling c585cc1 on fix-est into ** on master**.

@arkpar arkpar added A6-mustntgrumble 💦 Pull request has areas for improvement. The author need not address them before merging. and removed A0-pleasereview 🤓 Pull request needs code review. labels Jan 11, 2017
@arkpar arkpar merged commit 56c546f into master Jan 11, 2017
arkpar pushed a commit that referenced this pull request Jan 12, 2017
* Return 0 instead of error with out of gas on estimate_gas

* Fix stuff up.

* Another estimate gas fix.

* Alter balance to maximum possible rather than GP=0.

* Only increase to amount strictly necessary.
arkpar added a commit that referenced this pull request Jan 12, 2017
* Fix broken transfer total balance (#4127)

* Add proper label to method decoding inputs (#4136)

* Another minor estimation fix (#4133)

* Return 0 instead of error with out of gas on estimate_gas

* Fix stuff up.

* Another estimate gas fix.

* Alter balance to maximum possible rather than GP=0.

* Only increase to amount strictly necessary.

* Get rid of unsafe code in ethkey, propagate incorrect Secret errors. (#4119)

* Implementing secret

* Fixing tests

* Refactor VoteCollector (#4101)

* dir

* simple validator list

* stub validator contract

* make the engine hold Weak<Client> instead of IoChannel

* validator set factory

* register weak client with ValidatorContract

* check chain security

* add address array to generator

* register provider contract

* update validator set on notify

* add validator contract spec

* simple list test

* split update and contract test

* contract change

* use client in tendermint

* fix deadlock

* step duration in params

* adapt tendermint tests

* add storage fields to test spec

* constructor spec

* execute under wrong address

* create under correct address

* revert

* validator contract constructor

* move genesis block lookup

* add removal ability to contract

* validator contract adding validators

* fix basic authority

* validator changing test

* more docs

* update sync tests

* remove env_logger

* another env_logger

* cameltoe

* hold EngineClient instead of Client

* return error on misbehaviour

* nicer return

* sprinkle docs

* Reenable mainnet update server. (#4137)

* basic tests for subscribeToEvents (#4115)

* subscribeToEvent fixtures ✅

* subscribeToEvent tests ✅

* temporarily skip failing test (#4138)

* Improvements and optimisations to estimate_gas (#4142)

* Return 0 instead of error with out of gas on estimate_gas

* Fix stuff up.

* Another estimate gas fix.

* Alter balance to maximum possible rather than GP=0.

* Only increase to amount strictly necessary.

* Improvements and optimisations to estimate_gas.

- Introduce proper error type
- Avoid building costly traces

* Fix tests.

* Actually fix testsActually fix tests

* Use estimateGas error (as per updated implementation) (#4131)

* Use estimateGas error (as per updated implementation)

* EXCEPTION_ERROR as per #4142

* Better error log reporting & handling (#4128)

* Don't pop-up notifications after network switch (#4076)

* Better notifications

* Don't pollute with notifs if switched networks

* Better connection close/open events / No more notifs on change network

* PR Grumbles

* Add close and open events to HTTP // Add tests

* Fix tests

* WIP Signer Fix

* Fix Signer // Better reconnection handling

* PR Grumbles

* PR Grumbles

* Fixes wrong fetching of balances + Notifications

* Secure API WIP

* Updated Secure API Connection + Status

* Linting

* Linting

* Updated Secure API Logic

* Proper handling of token updates // Fixing poping notifications

* PR Grumbles

* PR Grumbles

* Fixing tests

* Trim spaces from InputAddress (#4126)

* Trim spaces for addresses

* onSubmit has only value, not event

* onSubmit (again)

* Length check on trimmed value

* Remove bindActionCreators({}, dispatch) (empty) (#4135)
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
A6-mustntgrumble 💦 Pull request has areas for improvement. The author need not address them before merging. M4-core ⛓ Core client code / Rust.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants